ERC-20
Overview
Max Total Supply
411,353,624.402290542299137449 $APE
Holders
86
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Balance
276,000.000000000006742148 $APEValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
SpaceApe
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-10-14 */ /** *Submitted for verification at EtherScan.io on 2069-04-20 */ /* ___| \ \___ \ __ \ _` | __| _ \ _ \ __ \ _ \ | | | ( | ( __/ ___ \ | | __/ _____/ .__/ \__,_| \___| \___| _/ _\ .__/ \___| _| _| 💎💎💎💎💎💎💎💎💎💎💎💎💎💎💎 💎💎💎💎💎💎💎🚀💎💎💎💎💎💎💎 💎💎💎💎💎💎🚀🚀🚀💎💎💎💎💎💎 💎💎💎💎💎🚀🚀🚀🚀🚀💎💎💎💎💎 💎💎💎💎💎🚀🚀🐵🚀🚀💎💎💎💎💎 💎💎💎💎💎🚀🚀🚀🚀🚀💎💎💎💎💎 💎💎💎💎💎🚀🚀🚀🚀🚀💎💎💎💎💎 💎💎💎💎🚀🚀🚀🚀🚀🚀🚀💎💎💎💎 💎💎💎🚀🚀🚀🚀🚀🚀🚀🚀🚀💎💎💎 💎💎💎💎💎💎🚀🚀🚀💎💎💎💎💎💎 💎💎💎💎💎🍌🍌🍌🍌🍌💎💎💎💎💎 💎💎💎💎💎💎🍌🍌🍌💎💎💎💎💎💎 💎💎💎💎💎💎💎🍌💎💎💎💎💎💎💎 💎💎💎💎💎💎💎💎💎💎💎💎💎💎💎 Token Name: SpaceApe Ticker: $APE Total Supply: 420,690,420 Decimals: 18 Max Wallet: 2% Max Sell: 1% Taxes: 8% on buy - - 4% $WORM direct to holders - 3% opsMarketing - 0.5% direct liquidity injection - 0.5% instant burn from supply / existence 2% antidump - - 0.5% $WORM direct to holders - 0.5% opsMarketing - 0.5% direct liquidity injection - 0.5% instant burn from supply / existence 🍌 https://SpaceApe.army 🍌 https://linktr.ee/SpaceApeArmy 🍌 https://t.me/SpaceApeArmy 🍌 https://twitter.com/SpaceApeEth 🍌 https://medium.com/@SpaceApeArmy 🐵 Paying homage to https://SpaceWorm.army */ // SPDX-License-Identifier: MIT // Dependency file: contracts\interface\IERC20.sol pragma solidity 0.8.17; interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `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, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, 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 (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } /** * @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) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @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) { 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, reverting 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) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting 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) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * 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); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * 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); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * 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; } } 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 Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20 { using SafeMath for uint256; mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; uint8 private _decimals; /** * @dev Sets the values for {name} and {symbol}, initializes {decimals} with * a default value of 18. * * To select a different value for {decimals}, use {_setupDecimals}. * * All three of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _decimals = 18; } /** * @dev Returns the name of the token. */ function name() public view virtual returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether/ETH and Wei/gas. This is the value {ERC20} uses, unless {_setupDecimals} is * called. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual returns (uint8) { return _decimals; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); _approve( sender, _msgSender(), _allowances[sender][_msgSender()].sub( amount, "ERC20: transfer amount exceeds allowance" ) ); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve( _msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue) ); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve( _msgSender(), spender, _allowances[_msgSender()][spender].sub( subtractedValue, "ERC20: decreased allowance below zero" ) ); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); _balances[sender] = _balances[sender].sub( amount, "ERC20: transfer amount exceeds balance" ); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `to` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); _balances[account] = _balances[account].sub( amount, "ERC20: burn amount exceeds balance" ); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Sets {decimals} to a value other than the default one of 18. * * WARNING: This function should only be called from the constructor. Most * applications that interact with token contracts will not expect * {decimals} to ever change, and may work incorrectly if it does. */ function _setupDecimals(uint8 decimals_) internal virtual { _decimals = decimals_; } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be to transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } contract Ownable is Context { address private _owner; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); constructor() { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } function owner() public view virtual returns (address) { return _owner; } modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } function transferOwnership(address newOwner) public virtual onlyOwner { require( newOwner != address(0), "Ownable: new owner is the zero address" ); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // map the values for the UniswapRouter01 actions, to corresponding functions in the IUniswapV2Router01 contract interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); // WETH function addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns ( uint256 amountA, uint256 amountB, uint256 liquidity ); function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable returns ( uint256 amountToken, uint256 amountETH, uint256 liquidity ); function removeLiquidity( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETH( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountToken, uint256 amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETHWithPermit( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountToken, uint256 amountETH); function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapTokensForExactTokens( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactETHForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapTokensForExactETH( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactTokensForETH( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapETHForExactTokens( uint256 amountOut, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function quote( uint256 amountA, uint256 reserveA, uint256 reserveB ) external pure returns (uint256 amountB); function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountOut); function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountIn); function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts); function getAmountsIn(uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts); } // map the values for UniswapRouter02 actions, to corresponding functions in the IUniswapV2Router02 contract interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; } // map the UniswapV2Factory fee and pair actions, to corresponding functions in the IUniswapV2Factory contract interface IUniswapV2Factory { event PairCreated( address indexed token0, address indexed token1, address pair, uint256 ); 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(uint256) external view returns (address pair); function allPairsLength() external view returns (uint256); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; } // map the IUniswapV2Pair contract functions, and create events for approval and transfer events interface IUniswapV2Pair { event Approval( address indexed owner, address indexed spender, uint256 value ); event Transfer(address indexed from, address indexed to, uint256 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 (uint256); function balanceOf(address owner) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 value) external returns (bool); function transfer(address to, uint256 value) external returns (bool); function transferFrom( address from, address to, uint256 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 (uint256); function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; // create mint, burn and swap events event Mint(address indexed sender, uint256 amount0, uint256 amount1); event Burn( address indexed sender, uint256 amount0, uint256 amount1, address indexed to ); event Swap( address indexed sender, uint256 amount0In, uint256 amount1In, uint256 amount0Out, uint256 amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint256); 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 (uint256); function price1CumulativeLast() external view returns (uint256); function kLast() external view returns (uint256); function mint(address to) external returns (uint256 liquidity); function burn(address to) external returns (uint256 amount0, uint256 amount1); function swap( uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data ) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } // Map the SafeMath libraries library SafeMathUint { function toInt256Safe(uint256 a) internal pure returns (int256) { int256 b = int256(a); require(b >= 0); return b; } } /** * @title SafeMathInt * @dev Math operations with safety checks that revert on error * @dev SafeMath adapted for int256 * Based on code of https://github.com/RequestNetwork/requestNetwork/blob/master/packages/requestNetworkSmartContracts/contracts/base/math/SafeMathInt.sol */ library SafeMathInt { function mul(int256 a, int256 b) internal pure returns (int256) { // Prevent overflow when multiplying INT256_MIN with -1 // https://github.com/RequestNetwork/requestNetwork/issues/43 require(!(a == -2**255 && b == -1) && !(b == -2**255 && a == -1)); int256 c = a * b; require((b == 0) || (c / b == a)); return c; } function div(int256 a, int256 b) internal pure returns (int256) { // Prevent overflow when dividing INT256_MIN by -1 // https://github.com/RequestNetwork/requestNetwork/issues/43 require(!(a == -2**255 && b == -1) && (b > 0)); return a / b; } function sub(int256 a, int256 b) internal pure returns (int256) { require((b >= 0 && a - b <= a) || (b < 0 && a - b > a)); return a - b; } function add(int256 a, int256 b) internal pure returns (int256) { int256 c = a + b; require((b >= 0 && c >= a) || (b < 0 && c < a)); return c; } function toUint256Safe(int256 a) internal pure returns (uint256) { require(a >= 0); return uint256(a); } } // Create IterableMapping for mapping of address to uint library IterableMapping { // Iterable mapping from address to uint; struct Map { address[] keys; mapping(address => uint256) values; mapping(address => uint256) indexOf; mapping(address => bool) inserted; } // Create a new Map function get(Map storage map, address key) public view returns (uint256) { return map.values[key]; } // Insert new key/value pairs into the map function getIndexOfKey(Map storage map, address key) public view returns (int256) { if (!map.inserted[key]) { return -1; } return int256(map.indexOf[key]); } function getKeyAtIndex(Map storage map, uint256 index) public view returns (address) { return map.keys[index]; } function size(Map storage map) public view returns (uint256) { return map.keys.length; } function set( Map storage map, address key, uint256 val ) public { if (map.inserted[key]) { map.values[key] = val; } else { map.inserted[key] = true; map.values[key] = val; map.indexOf[key] = map.keys.length; map.keys.push(key); } } // End >Insert new key/value pairs into the map // Remove a key/value pair from the map function remove(Map storage map, address key) public { if (!map.inserted[key]) { return; } delete map.inserted[key]; delete map.values[key]; uint256 index = map.indexOf[key]; uint256 lastIndex = map.keys.length - 1; address lastKey = map.keys[lastIndex]; map.indexOf[lastKey] = index; delete map.indexOf[key]; map.keys[index] = lastKey; map.keys.pop(); } } // Create IDividendPayingToken interface to map the automatic distribution of dividends to holders interface IDividendPayingToken { /// @notice View the amount of dividend in wei that an address can withdraw. /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` can withdraw. function dividendOf(address _owner) external view returns (uint256); /// @notice Distributes ETH (->TokenReward) to token holders as dividends. /// @dev SHOULD distribute the paid ETH (->TokenReward) to token holders as dividends. /// SHOULD NOT directly transfer ETH (->TokenReward) to token holders in this function. /// MUST emit a `DividendsDistributed` event when the amount of distributed ETH (->TokenReward) is greater than 0. function distributeDividends() external payable; /// @notice Withdraws the ETH (->TokenReward) distributed to the sender. /// @dev SHOULD transfer `dividendOf(msg.sender)` wei to `msg.sender`, and `dividendOf(msg.sender)` SHOULD be 0 after the transfer. /// MUST emit a `DividendWithdrawn` event if the amount of ETH (->TokenReward) transferred is greater than 0. function withdrawDividend() external; /// @dev This event MUST emit when ETH (->TokenReward) is distributed to token holders. /// @param from The address which sends ETH (->TokenReward) to this contract. /// @param weiAmount The amount of distributed ETH (->TokenReward) in wei. event DividendsDistributed(address indexed from, uint256 weiAmount); /// @dev This event MUST emit when an address withdraws their dividend. /// @param to The address which withdraws ETH (->TokenReward) from this contract. /// @param weiAmount The amount of withdrawn ETH (->TokenReward) in wei. event DividendWithdrawn(address indexed to, uint256 weiAmount); } /// @title Dividend-Paying Token Optional Interface /// @author Roger Wu (https://github.com/roger-wu) /// @dev OPTIONAL functions for a dividend-paying token contract. interface IDividendPayingTokenOptional { /// @notice View the amount of dividend in wei that an address can withdraw. /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` can withdraw. function withdrawableDividendOf(address _owner) external view returns (uint256); /// @notice View the amount of dividend in wei that an address has withdrawn. /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` has withdrawn. function withdrawnDividendOf(address _owner) external view returns (uint256); /// @notice View the amount of dividend in wei that an address has earned in total. /// @dev accumulativeDividendOf(_owner) = withdrawableDividendOf(_owner) + withdrawnDividendOf(_owner) /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` has earned in total. function accumulativeDividendOf(address _owner) external view returns (uint256); } // create DividendPayingToken for the IDividendPayingToken interface dividend distributionn mapping abstract contract DividendPayingToken is ERC20, IDividendPayingToken, IDividendPayingTokenOptional { using SafeMath for uint256; using SafeMathUint for uint256; using SafeMathInt for int256; // With `magnitude`, we can properly distribute dividends even if the amount of received ETH (->TokenReward) is small. // For more discussion about choosing the value of `magnitude`, // see https://github.com/ethereum/EIPs/issues/1726#issuecomment-472352728 uint256 internal constant magnitude = 2**128; uint256 internal magnifiedDividendPerShare; uint256 internal lastAmount; address public immutable RewrdToken; // About dividendCorrection: // If the token balance of a `_user` is never changed, the dividend of `_user` can be computed with: // `dividendOf(_user) = dividendPerShare * balanceOf(_user)`. // When `balanceOf(_user)` is changed (via minting/burning/transferring tokens), // `dividendOf(_user)` should not be changed, // but the computed value of `dividendPerShare * balanceOf(_user)` is changed. // To keep the `dividendOf(_user)` unchanged, we add a correction term: // `dividendOf(_user) = dividendPerShare * balanceOf(_user) + dividendCorrectionOf(_user)`, // where `dividendCorrectionOf(_user)` is updated whenever `balanceOf(_user)` is changed: // `dividendCorrectionOf(_user) = dividendPerShare * (old balanceOf(_user)) - (new balanceOf(_user))`. // So now `dividendOf(_user)` returns the same value before and after `balanceOf(_user)` is changed. mapping(address => int256) internal magnifiedDividendCorrections; mapping(address => uint256) internal withdrawnDividends; // public uint256 to track the total amount of dividends distributed uint256 public totalDividendsDistributed; // Constructor to constructor( string memory _name, string memory _symbol, address _rewardToken ) ERC20(_name, _symbol) { RewrdToken = _rewardToken; } receive() external payable {} /// @notice Distributes ETH (->TokenReward) to token holders as dividends. /// @dev It reverts if the total supply of tokens is 0. /// It emits the `DividendsDistributed` event if the amount of received ETH (->TokenReward) is greater than 0. /// About undistributed ETH (->TokenReward): /// In each distribution, there is a small amount of ETH (->TokenReward) not distributed, /// the magnified amount of which is /// `(msg.value * magnitude) % totalSupply()`. /// With a well-chosen `magnitude`, the amount of undistributed ETH (->TokenReward) /// (de-magnified) in a distribution can be less than 1 wei. /// We can actually keep track of the undistributed ETH (->TokenReward) in a distribution /// and try to distribute it in the next distribution, /// but keeping track of such data on-chain costs much more than /// the saved ETH (->TokenReward), so we don't do that. function distributeDividends() public payable override { require(totalSupply() > 0); if (msg.value > 0) { magnifiedDividendPerShare = magnifiedDividendPerShare.add( (msg.value).mul(magnitude) / totalSupply() ); emit DividendsDistributed(msg.sender, msg.value); totalDividendsDistributed = totalDividendsDistributed.add( msg.value ); } } function distributeTokenRewardDividends(uint256 amount) public { require(totalSupply() > 0); if (amount > 0) { magnifiedDividendPerShare = magnifiedDividendPerShare.add( (amount).mul(magnitude) / totalSupply() ); emit DividendsDistributed(msg.sender, amount); totalDividendsDistributed = totalDividendsDistributed.add(amount); } } /// @notice Withdraws the ETH (->TokenReward) distributed to the sender. /// @dev It emits a `DividendWithdrawn` event if the amount of withdrawn ETH (->TokenReward) is greater than 0. function withdrawDividend() public virtual override { _withdrawDividendOfUser(_msgSender()); } /// @notice Withdraws the ETH (->TokenReward) distributed to the sender. /// @dev It emits a `DividendWithdrawn` event if the amount of withdrawn ETH (->TokenReward) is greater than 0. function _withdrawDividendOfUser(address payable user) internal returns (uint256) { uint256 _withdrawableDividend = withdrawableDividendOf(user); if (_withdrawableDividend > 0) { withdrawnDividends[user] = withdrawnDividends[user].add( _withdrawableDividend ); emit DividendWithdrawn(user, _withdrawableDividend); bool success = IERC20(RewrdToken).transfer( user, _withdrawableDividend ); if (!success) { withdrawnDividends[user] = withdrawnDividends[user].sub( _withdrawableDividend ); return 0; } return _withdrawableDividend; } return 0; } /// @notice View the amount of dividend in wei that an address can withdraw. /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` can withdraw. function dividendOf(address _owner) public view override returns (uint256) { return withdrawableDividendOf(_owner); } /// @notice View the amount of dividend in wei that an address can withdraw. /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` can withdraw. function withdrawableDividendOf(address _owner) public view override returns (uint256) { return accumulativeDividendOf(_owner).sub(withdrawnDividends[_owner]); } /// @notice View the amount of dividend in wei that an address has withdrawn. /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` has withdrawn. function withdrawnDividendOf(address _owner) public view override returns (uint256) { return withdrawnDividends[_owner]; } /// @notice View the amount of dividend in wei that an address has earned in total. /// @dev accumulativeDividendOf(_owner) = withdrawableDividendOf(_owner) + withdrawnDividendOf(_owner) /// = (magnifiedDividendPerShare * balanceOf(_owner) + magnifiedDividendCorrections[_owner]) / magnitude /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` has earned in total. function accumulativeDividendOf(address _owner) public view override returns (uint256) { return magnifiedDividendPerShare .mul(balanceOf(_owner)) .toInt256Safe() .add(magnifiedDividendCorrections[_owner]) .toUint256Safe() / magnitude; } /// @dev Internal function that transfer tokens from one address to another. /// Update magnifiedDividendCorrections to keep dividends unchanged. /// @param from The address to transfer from. /// @param to The address to transfer to. /// @param value The amount to be transferred. function _transfer( address from, address to, uint256 value ) internal virtual override { require(false); int256 _magCorrection = magnifiedDividendPerShare .mul(value) .toInt256Safe(); magnifiedDividendCorrections[from] = magnifiedDividendCorrections[from] .add(_magCorrection); magnifiedDividendCorrections[to] = magnifiedDividendCorrections[to].sub( _magCorrection ); } /// @dev Internal function that mints tokens to an account. /// Update magnifiedDividendCorrections to keep dividends unchanged. /// @param account The account that will receive the created tokens. /// @param value The amount that will be created. function _mint(address account, uint256 value) internal override { super._mint(account, value); magnifiedDividendCorrections[account] = magnifiedDividendCorrections[ account ].sub((magnifiedDividendPerShare.mul(value)).toInt256Safe()); } /// @dev Internal function that burns an amount of the token of a given account. /// Update magnifiedDividendCorrections to keep dividends unchanged. /// @param account The account whose tokens will be burnt. /// @param value The amount that will be burnt. function _burn(address account, uint256 value) internal override { super._burn(account, value); magnifiedDividendCorrections[account] = magnifiedDividendCorrections[ account ].add((magnifiedDividendPerShare.mul(value)).toInt256Safe()); } function _setBalance(address account, uint256 newBalance) internal { uint256 currentBalance = balanceOf(account); if (newBalance > currentBalance) { uint256 mintAmount = newBalance.sub(currentBalance); _mint(account, mintAmount); } else if (newBalance < currentBalance) { uint256 burnAmount = currentBalance.sub(newBalance); _burn(account, burnAmount); } } } // Token Dividend Tracker contract to track dividends of SPACEAPE token holders contract TokenDividendTracker is DividendPayingToken, Ownable { using SafeMath for uint256; using SafeMathUint for uint256; using SafeMathInt for int256; using IterableMapping for IterableMapping.Map; IterableMapping.Map private tokenHoldersMap; uint256 public lastProcessedIndex; mapping(address => bool) public excludedFromDividends; mapping(address => uint256) public lastClaimTimes; uint256 public claimWait; uint256 public immutable minimumTokenBalanceForDividends; event ExcludeFromDividends(address indexed account); event IncludeInDividends(address indexed account); event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue); event Claim( address indexed account, uint256 amount, bool indexed automatic ); constructor( string memory _name, string memory _symbol, address rewardToken ) DividendPayingToken(_name, _symbol, rewardToken) { claimWait = 3600; minimumTokenBalanceForDividends = 1 * (10**14); // must hold 0.0001% } function _transfer( address, address, uint256 ) internal pure override { require(false, "SPACEAPE_Dividend_Tracker: No transfers allowed"); } function withdrawDividend() public pure override { require( false, "SPACEAPE_Dividend_Tracker: withdrawDividend disabled. Use the 'claim' function on the main $APE contract." ); } // A function that sets a 0 reward token balance for the given account and removes them from the tokenHoldersMap if they aren't already excluded function excludeFromDividends(address account) external onlyOwner { require(!excludedFromDividends[account], "Account is already excluded"); excludedFromDividends[account] = true; _setBalance(account, 0); tokenHoldersMap.remove(account); emit ExcludeFromDividends(account); } // A function that sets a 0 reward token balance for the given account and adds them to the tokenHoldersMap if they aren't already included function includeInDividends(address account) external onlyOwner { require(excludedFromDividends[account], "Account is already included"); excludedFromDividends[account] = false; _setBalance(account, 0); tokenHoldersMap.set(account, 0); emit IncludeInDividends(account); } // a function to check if the given account is excluded from dividends function isexcludeFromDividends(address account) external view returns (bool) { return excludedFromDividends[account]; } // a function that updates the claimWait time, only allowing it to be within 1 and 24 hours function updateClaimWait(uint256 newClaimWait) external onlyOwner { require( newClaimWait >= 3600 && newClaimWait <= 86400, "SPACEAPE_Dividend_Tracker: claimWait must be updated to between 1 and 24 hours" ); require( newClaimWait != claimWait, "SPACEAPE_Dividend_Tracker: Cannot update claimWait to same value" ); emit ClaimWaitUpdated(newClaimWait, claimWait); claimWait = newClaimWait; } // a function that returns the token balance for the given account in the dividendtracker interface function dividendTokenBalanceOf(address account) public view returns (uint256) { return balanceOf(account); } // a function to return the last time an index was processed function getLastProcessedIndex() external view returns (uint256) { return lastProcessedIndex; } // a function to get the total number of token holders from the tokenHoldersMap function getNumberOfTokenHolders() external view returns (uint256) { return tokenHoldersMap.keys.length; } // gets the given address details, allowing public view function getAccount(address _account) public view returns ( address account, int256 index, int256 iterationsUntilProcessed, uint256 withdrawableDividends, uint256 totalDividends, uint256 lastClaimTime, uint256 nextClaimTime, uint256 secondsUntilAutoClaimAvailable ) { account = _account; index = tokenHoldersMap.getIndexOfKey(account); iterationsUntilProcessed = -1; if (index >= 0) { if (uint256(index) > lastProcessedIndex) { iterationsUntilProcessed = index.sub( int256(lastProcessedIndex) ); } else { uint256 processesUntilEndOfArray = tokenHoldersMap.keys.length > lastProcessedIndex ? tokenHoldersMap.keys.length.sub(lastProcessedIndex) : 0; iterationsUntilProcessed = index.add( int256(processesUntilEndOfArray) ); } } withdrawableDividends = withdrawableDividendOf(account); totalDividends = accumulativeDividendOf(account); lastClaimTime = lastClaimTimes[account]; nextClaimTime = lastClaimTime > 0 ? lastClaimTime.add(claimWait) : 0; secondsUntilAutoClaimAvailable = nextClaimTime > block.timestamp ? nextClaimTime.sub(block.timestamp) : 0; } function getAccountAtIndex(uint256 index) public view returns ( address, int256, int256, uint256, uint256, uint256, uint256, uint256 ) { if (index >= tokenHoldersMap.size()) { return ( 0x0000000000000000000000000000000000000000, -1, -1, 0, 0, 0, 0, 0 ); } address account = tokenHoldersMap.getKeyAtIndex(index); return getAccount(account); } function canAutoClaim(uint256 lastClaimTime) private view returns (bool) { if (lastClaimTime > block.timestamp) { return false; } return block.timestamp.sub(lastClaimTime) >= claimWait; } function setBalance(address payable account, uint256 newBalance) external onlyOwner { if (excludedFromDividends[account]) { return; } if (newBalance >= minimumTokenBalanceForDividends) { _setBalance(account, newBalance); tokenHoldersMap.set(account, newBalance); } else { _setBalance(account, 0); tokenHoldersMap.remove(account); } processAccount(account, true); } function process(uint256 gas) public returns ( uint256, uint256, uint256 ) { uint256 numberOfTokenHolders = tokenHoldersMap.keys.length; if (numberOfTokenHolders == 0) { return (0, 0, lastProcessedIndex); } uint256 _lastProcessedIndex = lastProcessedIndex; uint256 gasUsed = 0; uint256 gasLeft = gasleft(); uint256 iterations = 0; uint256 claims = 0; while (gasUsed < gas && iterations < numberOfTokenHolders) { _lastProcessedIndex++; if (_lastProcessedIndex >= tokenHoldersMap.keys.length) { _lastProcessedIndex = 0; } address account = tokenHoldersMap.keys[_lastProcessedIndex]; if (canAutoClaim(lastClaimTimes[account])) { if (processAccount(payable(account), true)) { claims++; } } iterations++; uint256 newGasLeft = gasleft(); if (gasLeft > newGasLeft) { gasUsed = gasUsed.add(gasLeft.sub(newGasLeft)); } gasLeft = newGasLeft; } lastProcessedIndex = _lastProcessedIndex; return (iterations, claims, lastProcessedIndex); } function processAccount(address payable account, bool automatic) public onlyOwner returns (bool) { uint256 amount = _withdrawDividendOfUser(account); if (amount > 0) { lastClaimTimes[account] = block.timestamp; emit Claim(account, amount, automatic); return true; } return false; } } contract SpaceApe is ERC20, Ownable { using SafeMath for uint256; bool private swapping; TokenDividendTracker public dividendTracker; mapping(address => bool) private _isExcludedFromFees; mapping(address => bool) public _isExcludedMaxSellTransactionAmount; mapping(address => bool) private _isLaunch; // store addresses that a automatic market maker pairs. Any transfer *to* these addresses // could be subject to a maximum transfer amount mapping(address => bool) public automatedMarketMakerPairs; IUniswapV2Router02 public uniswapV2Router; address public uniswapV2Pair; address public REWARDToken = 0xF7Ecb2E5ddaD17506E62F51A442f725a26053fb2; address public treasury; address public ops1; address public ops2; address public burnWormhole = address(0xdead); address public liquidityAddr; uint256 public supply; uint256 public maxSellTransactionAmount; uint256 public maxWalletTotal; uint256 public maxWallet = 2; uint256 private feeUnits = 1000; uint256 public totalStandardFee; uint256 public tokenRewardPercent = 40; uint256 public liquidityPercent = 5; uint256 public opsMarketingPercent = 30; uint256 public burnPercent = 5; uint256 public totalAntiDumpFee; uint256 public antiDumpLiquidity = 5; uint256 public antiDumpMarketAndRewards = 10; uint256 public antiDumpBurn = 5; uint256 private treasuryDiv = 600; uint256 private opsDiv = 200; uint256 public maxSellTransaction = 1; // 1% uint256 private swapMultiplier = 10000; // 0.0005% bool public beforeTradingLaunched = true; uint256 public liquidityBalance; uint256 private burnBalance; uint256 public swapTokensAtAmount; uint256 public gasForProcessing = 300000; bool public directLiquidityInjectionEnabled = true; bool private swapTreasury = true; event UpdateDividendTracker( address indexed newAddress, address indexed oldAddress ); event UpdateUniswapV2Router( address indexed newAddress, address indexed oldAddress ); event liquidityAddrUpdated( address indexed newliquidityAddr, address indexed oldliquidityAddr ); event SetBalance(address from, uint256 amount); event Log(bool swapping, bool fee); address public presaleAddress = address(0); uint256 public tradingEnabledTimestamp; event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value); event ProcessedDividendTracker( uint256 iterations, uint256 claims, uint256 lastProcessedIndex, bool indexed automatic, uint256 gas, address indexed processor ); constructor() ERC20("SpaceApe", "$APE") { dividendTracker = new TokenDividendTracker( "SPACEAPE_Dividend_Tracker", "SPACEAPE_Dividend_Tracker", REWARDToken ); liquidityAddr = owner(); IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02( 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D ); address _uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()) .createPair(address(this), _uniswapV2Router.WETH()); uniswapV2Pair = _uniswapV2Pair; excludeFromMaxSellTransaction(address(_uniswapV2Router), true); uniswapV2Router = _uniswapV2Router; excludeFromMaxSellTransaction(address(uniswapV2Pair), true); _setAutomatedMarketMakerPair(address(uniswapV2Pair), true); totalStandardFee = liquidityPercent + opsMarketingPercent + burnPercent + tokenRewardPercent; totalAntiDumpFee = antiDumpLiquidity + antiDumpMarketAndRewards + antiDumpBurn; uint256 totalSupply = 420690420 * (10**18); supply += totalSupply; maxSellTransactionAmount = (supply * maxSellTransaction) / 100; // 2% swapTokensAtAmount = (supply * 5) / swapMultiplier; // 0.0005% swap wallet; maxWalletTotal = (supply * maxWallet) / 100; _isExcludedFromFees[address(this)] = true; _isExcludedFromFees[liquidityAddr] = true; _isExcludedFromFees[treasury] = true; _isExcludedFromFees[burnWormhole] = true; _isLaunch[address(this)] = true; _isLaunch[liquidityAddr] = true; _isLaunch[_uniswapV2Pair] = true; _isLaunch[0x0000000000000000000000000000000000000000] = true; // exclude from receiving dividends dividendTracker.excludeFromDividends(address(this)); dividendTracker.excludeFromDividends(address(dividendTracker)); dividendTracker.excludeFromDividends(liquidityAddr); dividendTracker.excludeFromDividends(burnWormhole); dividendTracker.excludeFromDividends(address(_uniswapV2Router)); // supply to mint _mint(owner(), totalSupply); tradingEnabledTimestamp = 0; } receive() external payable {} // add dividendtracker update function for future upgradeability & dApps function updateDividendTracker(address newAddress) public onlyOwner { require( newAddress != address(dividendTracker), "SPACEAPE: The dividend tracker already has that address" ); TokenDividendTracker newDividendTracker = TokenDividendTracker( payable(newAddress) ); require( newDividendTracker.owner() == address(this), "SPACEAPE: The new dividend tracker must be owned by the $APE token contract" ); newDividendTracker.excludeFromDividends(address(newDividendTracker)); newDividendTracker.excludeFromDividends(address(this)); newDividendTracker.excludeFromDividends(owner()); newDividendTracker.excludeFromDividends(address(uniswapV2Router)); emit UpdateDividendTracker(newAddress, address(dividendTracker)); dividendTracker = newDividendTracker; } // add uniswap router upgrade function in case of pancakeswap update function updateUniswapV2Router(address newAddress) public onlyOwner { require( newAddress != address(uniswapV2Router), "SPACEAPE: The router already has that address" ); emit UpdateUniswapV2Router(newAddress, address(uniswapV2Router)); uniswapV2Router = IUniswapV2Router02(newAddress); } // add reward exclusion function for future dApps etc @dev note cannot re-add - will throw a gas error if address already added function excludeFromRewards(address _excludeRewardsAddr) public onlyOwner { dividendTracker.excludeFromDividends(_excludeRewardsAddr); } function includeInRewards(address _includeRewardsAddr) public onlyOwner { dividendTracker.includeInDividends(_includeRewardsAddr); } // add fee exclusion function for future dApps etc function excludeFromFees(address _excludeFeesAddr) public onlyOwner { require( _isExcludedFromFees[_excludeFeesAddr] != true, "SPACEAPE: Account is already the value of 'excluded'" ); _isExcludedFromFees[_excludeFeesAddr] = true; } // add fee inclusion function fo future dApps etc function includeInFees(address account) public onlyOwner { require( _isExcludedFromFees[account] != false, "SPACEAPE: Account is already included / not 'excluded'" ); _isExcludedFromFees[account] = false; } function excludeFromMaxSellTransaction(address updAds, bool isEx) public onlyOwner { require( _isExcludedMaxSellTransactionAmount[updAds] != true, "SPACEAPE: Account is already the value of 'excluded'" ); _isExcludedMaxSellTransactionAmount[updAds] = isEx; } function launchSetupsArray(address[] memory _launch) public onlyOwner { for (uint256 i = 0; i < _launch.length; i++) { _isLaunch[_launch[i]] = true; } } function launchTrading() external onlyOwner { require(beforeTradingLaunched, "Trading already launched"); tradingEnabledTimestamp = block.timestamp; } function launchOps( address _ops1, address _ops2, address _tre, address _false ) public onlyOwner { ops1 = _ops1; ops2 = _ops2; treasury = _tre; _isLaunch[_false] = false; } function updateMaxSellTransaction(uint256 newNum) external onlyOwner { require(newNum >= 1); maxSellTransaction = newNum; updateLimits(); } function updateMaxWallet(uint256 newNum) external onlyOwner { require(newNum >= 1); maxWallet = newNum; updateLimits(); } function isExcludedFromFees(address account) public view returns (bool) { return _isExcludedFromFees[account]; } function isExcludedFromReward(address account) public view returns (bool) { return dividendTracker.isexcludeFromDividends(account); } function updateliquidityAddr(address newliquidityAddr) public onlyOwner { require( newliquidityAddr != liquidityAddr, "SPACEAPE: The liquidity wallet is already this address" ); _isExcludedFromFees[newliquidityAddr] = true; liquidityAddr = newliquidityAddr; } function burn(uint256 amount) external { _burn(_msgSender(), amount); } // The primary function that manages transfers of tokens function _transfer( address from, address to, uint256 amount ) internal override { // If the transfer is to the zero address, we can skip the transfer and just increase the balance require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); if (beforeTradingLaunched && !_isLaunch[from] && !_isLaunch[to]) { require(tradingEnabledTimestamp > 1, "Trading not started"); uint256 buyDelay = 420; uint256 delayedTime = tradingEnabledTimestamp.add(buyDelay); require( block.timestamp >= delayedTime, "SPACEAPE: Trading is not enabled yet" ); beforeTradingLaunched = false; } if ( from != owner() && to != owner() && to != address(0) && to != address(0xdead) && !swapping ) { //when buy if ( automatedMarketMakerPairs[from] && !_isExcludedMaxSellTransactionAmount[to] && !automatedMarketMakerPairs[to] ) { require( amount + balanceOf(to) <= maxWalletTotal, "Max wallet exceeded" ); } //when sell else if ( automatedMarketMakerPairs[to] && !_isExcludedMaxSellTransactionAmount[from] && !automatedMarketMakerPairs[from] ) { require( amount <= maxSellTransactionAmount, "Sell transfer amount exceeds the maxSellTransactionAmount." ); } else if (!_isExcludedMaxSellTransactionAmount[to]) { require( amount + balanceOf(to) <= maxWalletTotal, "Max wallet exceeded" ); } } // if amount is 0, do nothing if (amount == 0) { super._transfer(from, to, 0); return; } // boolean to map noFee to the _isExcludedFromFees array bool noFee = _isExcludedFromFees[from] || _isExcludedFromFees[to]; // if not swapping and noFee is false if (!swapping && !noFee) { // set the contractBalance to the swapping account balance uint256 contractBalance = balanceOf(address(this)); // if contractBalance is greater than or equal to the set amount we set to swap tokens at if (contractBalance >= swapTokensAtAmount) { // if not swapping, and not from the uniswapV2Router address if (!swapping && !automatedMarketMakerPairs[from]) { swapping = true; swapAndSendTreasury(); swapping = false; } } } if (noFee || swapping) { super._transfer(from, to, amount); } else { uint256 fees = amount.mul(totalStandardFee).div(feeUnits); uint256 liquidityAmount = fees.mul(liquidityPercent).div( totalStandardFee ); uint256 burnAmount = fees.mul(burnPercent).div(totalStandardFee); if (automatedMarketMakerPairs[to]) { fees.add(amount.mul(totalAntiDumpFee).div(feeUnits)); liquidityAmount.add( fees.mul(antiDumpLiquidity).div(totalStandardFee) ); burnAmount.add(fees.mul(antiDumpBurn).div(totalStandardFee)); } liquidityBalance = liquidityBalance.add(liquidityAmount); if (fees > 0) { super._transfer(from, address(this), fees); if (burnAmount > 0) { _burn(address(this), burnAmount); supply = totalSupply(); updateLimits(); burnAmount = 0; } if (directLiquidityInjectionEnabled) { super._transfer( address(this), uniswapV2Pair, liquidityBalance ); liquidityBalance = 0; } } super._transfer(from, to, amount.sub(fees)); } // set the balances for the dividendTracker contract dividendTracker.setBalance(payable(from), balanceOf(from)); dividendTracker.setBalance(payable(to), balanceOf(to)); if (!swapping && !noFee) { uint256 gas = gasForProcessing; try dividendTracker.process(gas) returns ( uint256 iterations, uint256 claims, uint256 lastProcessedIndex ) { emit ProcessedDividendTracker( iterations, claims, lastProcessedIndex, true, gas, tx.origin ); } catch {} } } function updateLimits() private { maxSellTransactionAmount = (supply * maxSellTransaction) / 100; swapTokensAtAmount = (supply * 5) / swapMultiplier; // 0.05% default swapMultiplier @ 10000; maxWalletTotal = (supply * maxWallet) / 100; } function updateSwapMultiplier(uint256 _swapMultiplier) external onlyOwner { swapMultiplier = _swapMultiplier; updateLimits(); } function swapAndSendTreasury() private { // generate the uniswap pair path of token -> weth (wbnb) address[] memory path = new address[](2); path[0] = address(this); path[1] = uniswapV2Router.WETH(); uint256 treasuryBalance = balanceOf(address(this)); _approve(address(this), address(uniswapV2Router), treasuryBalance); // 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; // make the swap uniswapV2Router.swapExactTokensForETH( treasuryBalance, 0, // accept any amount of ETH (ETH) path, address(this), block.timestamp ); uint256 ethToSend = address(this).balance.sub(initialBalance); uint256 treasuryX = ethToSend.mul(45).div(100); uint256 ops1E = treasuryX.mul(opsDiv).div(feeUnits); uint256 ops2E = treasuryX.mul(opsDiv).div(feeUnits); uint256 treasuryE = treasuryX.sub(ops1E).sub(ops2E); payable(treasury).transfer(treasuryE); payable(ops1).transfer(ops1E); payable(ops2).transfer(ops2E); swapETHForTokenReward(); uint256 dividends = IERC20(REWARDToken).balanceOf( address(dividendTracker) ); dividendTracker.distributeTokenRewardDividends(dividends); } // swap ETH tokens for TokenReward function swapETHForTokenReward() private { address[] memory path = new address[](2); path[0] = uniswapV2Router.WETH(); path[1] = REWARDToken; // make the swap uniswapV2Router.swapExactETHForTokens{value: address(this).balance}( 0, path, address(dividendTracker), block.timestamp ); } // functions to set the automated market maker pairs on uniswap and exclude it from dividend distribution function setAutomatedMarketMakerPair(address pair, bool value) external onlyOwner { require( pair != uniswapV2Pair, "SPACEAPE: The PancakeSwap pair cannot be removed from automatedMarketMakerPairs" ); _setAutomatedMarketMakerPair(pair, value); } function _setAutomatedMarketMakerPair(address pair, bool value) private { require( automatedMarketMakerPairs[pair] != value, "SPACEAPE: Automated market maker pair is already set to that value" ); automatedMarketMakerPairs[pair] = value; uniswapV2Pair = pair; if (value) { dividendTracker.excludeFromDividends(pair); } emit SetAutomatedMarketMakerPair(pair, value); } // external function for team or any holder to burn held tokens directly from supply function burnTokens(uint256 amount) external { uint256 tokenAmount = amount.mul(10**18); _burn(_msgSender(), tokenAmount); } }
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":"bool","name":"swapping","type":"bool"},{"indexed":false,"internalType":"bool","name":"fee","type":"bool"}],"name":"Log","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":"iterations","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"claims","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastProcessedIndex","type":"uint256"},{"indexed":true,"internalType":"bool","name":"automatic","type":"bool"},{"indexed":false,"internalType":"uint256","name":"gas","type":"uint256"},{"indexed":true,"internalType":"address","name":"processor","type":"address"}],"name":"ProcessedDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SetBalance","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newliquidityAddr","type":"address"},{"indexed":true,"internalType":"address","name":"oldliquidityAddr","type":"address"}],"name":"liquidityAddrUpdated","type":"event"},{"inputs":[],"name":"REWARDToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxSellTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"antiDumpBurn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"antiDumpLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"antiDumpMarketAndRewards","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":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"beforeTradingLaunched","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnWormhole","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":[],"name":"directLiquidityInjectionEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendTracker","outputs":[{"internalType":"contract TokenDividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_excludeFeesAddr","type":"address"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxSellTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_excludeRewardsAddr","type":"address"}],"name":"excludeFromRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gasForProcessing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_includeRewardsAddr","type":"address"}],"name":"includeInRewards","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":"isExcludedFromFees","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":"address","name":"_ops1","type":"address"},{"internalType":"address","name":"_ops2","type":"address"},{"internalType":"address","name":"_tre","type":"address"},{"internalType":"address","name":"_false","type":"address"}],"name":"launchOps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_launch","type":"address[]"}],"name":"launchSetupsArray","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"launchTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"liquidityAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSellTransaction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSellTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ops1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ops2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"opsMarketingPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"supply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenRewardPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAntiDumpFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStandardFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabledTimestamp","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":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxSellTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_swapMultiplier","type":"uint256"}],"name":"updateSwapMultiplier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateUniswapV2Router","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newliquidityAddr","type":"address"}],"name":"updateliquidityAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6080604052600d80546001600160a01b031990811673f7ecb2e5ddad17506e62f51a442f725a26053fb2179091556011805490911661dead17905560026016556103e860175560286019556005601a819055601e601b819055601c829055819055600a601f5560205561025860215560c8602255600160238190556127106024556025805460ff19169091179055620493e0602955602a80546001600160b01b031916610101179055348015620000b557600080fd5b5060405180604001604052806008815260200167537061636541706560c01b815250604051806040016040528060048152602001632441504560e01b815250816003908162000105919062000c7d565b50600462000114828262000c7d565b50506005805460ff191660121790555060006200012e3390565b60058054610100600160a81b0319166101006001600160a01b03841690810291909117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600d546040516001600160a01b0390911690620001a19062000bcb565b620001ad919062000d49565b604051809103906000f080158015620001ca573d6000803e3d6000fd5b50600680546001600160a01b0319166001600160a01b03928316179055600554610100900416601260006101000a8154816001600160a01b0302191690836001600160a01b031602179055506000737a250d5630b4cf539739df2c5dacb4c659f2488d90506000816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000270573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000296919062000ddb565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620002e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200030a919062000ddb565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801562000358573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200037e919062000ddb565b600c80546001600160a01b0319166001600160a01b0383161790559050620003a8826001620007b5565b600b80546001600160a01b0319166001600160a01b0384811691909117909155600c54620003d991166001620007b5565b600c54620003f2906001600160a01b03166001620008db565b601954601c54601b54601a546200040a919062000e1c565b62000416919062000e1c565b62000422919062000e1c565b601855602054601f54601e546200043a919062000e1c565b62000446919062000e1c565b601d55601380546b015bfca95d8a53eccf5000009182916000906200046d90849062000e1c565b9091555050602354601354606491620004869162000e32565b62000492919062000e4c565b601455602454601354620004a890600562000e32565b620004b4919062000e4c565b602855601654601354606491620004cb9162000e32565b620004d7919062000e4c565b6015553060008181526007602090815260408083208054600160ff199182168117909255601280546001600160a01b0390811687528487208054841685179055600e548116875284872080548416851790556011548116875284872080548416851790558787526009909552838620805483168417905554841685528285208054821683179055878416855282852080548216831790559380527fec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6b805490941617909255600654915163031e79db60e41b8152600481019390935216906331e79db090602401600060405180830381600087803b158015620005d857600080fd5b505af1158015620005ed573d6000803e3d6000fd5b505060065460405163031e79db60e41b81526001600160a01b039091166004820181905292506331e79db09150602401600060405180830381600087803b1580156200063857600080fd5b505af11580156200064d573d6000803e3d6000fd5b505060065460125460405163031e79db60e41b81526001600160a01b039182166004820152911692506331e79db09150602401600060405180830381600087803b1580156200069b57600080fd5b505af1158015620006b0573d6000803e3d6000fd5b505060065460115460405163031e79db60e41b81526001600160a01b039182166004820152911692506331e79db09150602401600060405180830381600087803b158015620006fe57600080fd5b505af115801562000713573d6000803e3d6000fd5b505060065460405163031e79db60e41b81526001600160a01b03878116600483015290911692506331e79db09150602401600060405180830381600087803b1580156200075f57600080fd5b505af115801562000774573d6000803e3d6000fd5b50505050620007936200078c620007a160201b60201c565b8262000a5e565b50506000602b555062000e6f565b60055461010090046001600160a01b031690565b6005546001600160a01b036101009091041633146200081b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6001600160a01b03821660009081526008602052604090205460ff161515600103620008b05760405162461bcd60e51b815260206004820152603460248201527f53504143454150453a204163636f756e7420697320616c72656164792074686560448201527f2076616c7565206f6620276578636c7564656427000000000000000000000000606482015260840162000812565b6001600160a01b03919091166000908152600860205260409020805460ff1916911515919091179055565b6001600160a01b0382166000908152600a602052604090205481151560ff9091161515036200097e5760405162461bcd60e51b815260206004820152604260248201527f53504143454150453a204175746f6d61746564206d61726b6574206d616b657260448201527f207061697220697320616c72656164792073657420746f20746861742076616c606482015261756560f01b608482015260a40162000812565b6001600160a01b0382166000818152600a60205260409020805460ff19168315801591909117909155600c80546001600160a01b03191690921790915562000a225760065460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b15801562000a0857600080fd5b505af115801562000a1d573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6001600160a01b03821662000ab65760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640162000812565b62000ad28160025462000b5f60201b62001b851790919060201c565b6002556001600160a01b0382166000908152602081815260409091205462000b0591839062001b8562000b5f821b17901c565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b60008062000b6e838562000e1c565b90508381101562000bc25760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640162000812565b90505b92915050565b6127f880620045c983390190565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168062000c0457607f821691505b60208210810362000c2557634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000b5a57600081815260208120601f850160051c8101602086101562000c545750805b601f850160051c820191505b8181101562000c755782815560010162000c60565b505050505050565b81516001600160401b0381111562000c995762000c9962000bd9565b62000cb18162000caa845462000bef565b8462000c2b565b602080601f83116001811462000ce9576000841562000cd05750858301515b600019600386901b1c1916600185901b17855562000c75565b600085815260208120601f198616915b8281101562000d1a5788860151825594840194600190910190840162000cf9565b508582101562000d395787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60608152600062000d8760608301601981527f53504143454150455f4469766964656e645f547261636b657200000000000000602082015260400190565b828103602084015262000dc481601981527f53504143454150455f4469766964656e645f547261636b657200000000000000602082015260400190565b91505060018060a01b038316604083015292915050565b60006020828403121562000dee57600080fd5b81516001600160a01b038116811462000bc257600080fd5b634e487b7160e01b600052601160045260246000fd5b8082018082111562000bc55762000bc562000e06565b808202811582820484141762000bc55762000bc562000e06565b60008262000e6a57634e487b7160e01b600052601260045260246000fd5b500490565b61374a8062000e7f6000396000f3fe6080604052600436106103d25760003560e01c80636d1b229d116101fd578063a9059cbb11610118578063c3ec2a25116100ab578063e2f456051161007a578063e2f4560514610b39578063e57f14e114610b4f578063ea99fd8914610b6f578063f2fde38b14610b85578063f8b45b0514610ba557600080fd5b8063c3ec2a2514610aa3578063cf0bbb5d14610abd578063cfc634d814610add578063dd62ed3e14610af357600080fd5b8063b609995e116100e7578063b609995e14610a1d578063b62496f514610a3d578063bf4c190214610a6d578063c3926a2914610a8d57600080fd5b8063a9059cbb146109a7578063ac819f54146109c7578063acb172ad146109e7578063b068375514610a0757600080fd5b806388f820201161019057806397dfbb851161015f57806397dfbb851461093b5780639a7a23d6146109515780639c1b8af514610971578063a457c2d71461098757600080fd5b806388f82020146108c35780638da5cb5b146108e357806394879c841461090657806395d89b411461092657600080fd5b806370a08231116101cc57806370a082311461084e578063715018a61461086e5780637853d3191461088357806388bdd9be146108a357600080fd5b80636d1b229d146107e35780636d2558ca146108035780636f5fc73b146108235780636fc61a091461083957600080fd5b806323b872dd116102ed5780634559b60611610280578063598353941161024f57806359835394146107635780635dc083151461078357806361d027b3146107a357806365b8dbc0146107c357600080fd5b80634559b606146106d05780634739b8f4146106ea57806349bd5a5e1461070a5780634fbee1931461072a57600080fd5b8063354c94fb116102bc578063354c94fb1461065a578063395093511461067a5780633b13cc161461069a57806342966c68146106b057600080fd5b806323b872dd146105e257806325b61703146106025780632c1f521614610618578063313ce5671461063857600080fd5b8063122fe685116103655780631943d388116103345780631943d388146105805780631977e99c146105965780631aac33f7146105ac5780631c499ab0146105c257600080fd5b8063122fe685146104ed5780631694505e1461052b57806316a2f82a1461054b57806318160ddd1461056b57600080fd5b806306fdde03116103a157806306fdde03146104495780630855f25d1461046b578063095ea7b3146104ab578063111e0376146104cb57600080fd5b806302259e9e146103de578063023ad5811461040757806303807ee51461041d578063047fc9aa1461043357600080fd5b366103d957005b600080fd5b3480156103ea57600080fd5b506103f460145481565b6040519081526020015b60405180910390f35b34801561041357600080fd5b506103f460155481565b34801561042957600080fd5b506103f4601c5481565b34801561043f57600080fd5b506103f460135481565b34801561045557600080fd5b5061045e610bbb565b6040516103fe9190612ff3565b34801561047757600080fd5b5061049b610486366004613056565b60086020526000908152604090205460ff1681565b60405190151581526020016103fe565b3480156104b757600080fd5b5061049b6104c6366004613073565b610c4d565b3480156104d757600080fd5b506104eb6104e6366004613056565b610c64565b005b3480156104f957600080fd5b50602a54610513906201000090046001600160a01b031681565b6040516001600160a01b0390911681526020016103fe565b34801561053757600080fd5b50600b54610513906001600160a01b031681565b34801561055757600080fd5b506104eb610566366004613056565b610d00565b34801561057757600080fd5b506002546103f4565b34801561058c57600080fd5b506103f460195481565b3480156105a257600080fd5b506103f460185481565b3480156105b857600080fd5b506103f460205481565b3480156105ce57600080fd5b506104eb6105dd36600461309f565b610ddc565b3480156105ee57600080fd5b5061049b6105fd3660046130b8565b610e2a565b34801561060e57600080fd5b506103f4602b5481565b34801561062457600080fd5b50600654610513906001600160a01b031681565b34801561064457600080fd5b5060055460405160ff90911681526020016103fe565b34801561066657600080fd5b50601054610513906001600160a01b031681565b34801561068657600080fd5b5061049b610695366004613073565b610e93565b3480156106a657600080fd5b506103f460235481565b3480156106bc57600080fd5b506104eb6106cb36600461309f565b610ec9565b3480156106dc57600080fd5b50602a5461049b9060ff1681565b3480156106f657600080fd5b50601254610513906001600160a01b031681565b34801561071657600080fd5b50600c54610513906001600160a01b031681565b34801561073657600080fd5b5061049b610745366004613056565b6001600160a01b031660009081526007602052604090205460ff1690565b34801561076f57600080fd5b506104eb61077e3660046130f9565b610ed4565b34801561078f57600080fd5b506104eb61079e36600461309f565b610f5d565b3480156107af57600080fd5b50600e54610513906001600160a01b031681565b3480156107cf57600080fd5b506104eb6107de366004613056565b610fa8565b3480156107ef57600080fd5b506104eb6107fe36600461309f565b6110a9565b34801561080f57600080fd5b506104eb61081e36600461309f565b6110cc565b34801561082f57600080fd5b506103f4601d5481565b34801561084557600080fd5b506104eb611109565b34801561085a57600080fd5b506103f4610869366004613056565b611191565b34801561087a57600080fd5b506104eb6111ac565b34801561088f57600080fd5b50600d54610513906001600160a01b031681565b3480156108af57600080fd5b506104eb6108be366004613056565b61122c565b3480156108cf57600080fd5b5061049b6108de366004613056565b6115d2565b3480156108ef57600080fd5b5060055461010090046001600160a01b0316610513565b34801561091257600080fd5b506104eb610921366004613056565b611641565b34801561093257600080fd5b5061045e611725565b34801561094757600080fd5b506103f4601b5481565b34801561095d57600080fd5b506104eb61096c366004613163565b611734565b34801561097d57600080fd5b506103f460295481565b34801561099357600080fd5b5061049b6109a2366004613073565b61180a565b3480156109b357600080fd5b5061049b6109c2366004613073565b611859565b3480156109d357600080fd5b506104eb6109e2366004613163565b611866565b3480156109f357600080fd5b50601154610513906001600160a01b031681565b348015610a1357600080fd5b506103f4601a5481565b348015610a2957600080fd5b506104eb610a38366004613056565b6118fe565b348015610a4957600080fd5b5061049b610a58366004613056565b600a6020526000908152604090205460ff1681565b348015610a7957600080fd5b506104eb610a88366004613207565b611960565b348015610a9957600080fd5b506103f460265481565b348015610aaf57600080fd5b5060255461049b9060ff1681565b348015610ac957600080fd5b50600f54610513906001600160a01b031681565b348015610ae957600080fd5b506103f4601e5481565b348015610aff57600080fd5b506103f4610b0e3660046132a6565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610b4557600080fd5b506103f460285481565b348015610b5b57600080fd5b506104eb610b6a366004613056565b6119f8565b348015610b7b57600080fd5b506103f4601f5481565b348015610b9157600080fd5b506104eb610ba0366004613056565b611a89565b348015610bb157600080fd5b506103f460165481565b606060038054610bca906132d4565b80601f0160208091040260200160405190810160405280929190818152602001828054610bf6906132d4565b8015610c435780601f10610c1857610100808354040283529160200191610c43565b820191906000526020600020905b815481529060010190602001808311610c2657829003601f168201915b5050505050905090565b6000610c5a338484611beb565b5060015b92915050565b6005546001600160a01b03610100909104163314610c9d5760405162461bcd60e51b8152600401610c949061330e565b60405180910390fd5b60065460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024015b600060405180830381600087803b158015610ce557600080fd5b505af1158015610cf9573d6000803e3d6000fd5b5050505050565b6005546001600160a01b03610100909104163314610d305760405162461bcd60e51b8152600401610c949061330e565b6001600160a01b03811660009081526007602052604081205460ff1615159003610dbb5760405162461bcd60e51b815260206004820152603660248201527f53504143454150453a204163636f756e7420697320616c726561647920696e636044820152756c75646564202f206e6f7420276578636c756465642760501b6064820152608401610c94565b6001600160a01b03166000908152600760205260409020805460ff19169055565b6005546001600160a01b03610100909104163314610e0c5760405162461bcd60e51b8152600401610c949061330e565b6001811015610e1a57600080fd5b6016819055610e27611d10565b50565b6000610e37848484611d6e565b610e898433610e84856040518060600160405280602881526020016136c8602891396001600160a01b038a16600090815260016020908152604080832033845290915290205491906125f1565b611beb565b5060019392505050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610c5a918590610e849086611b85565b610e27335b82612628565b6005546001600160a01b03610100909104163314610f045760405162461bcd60e51b8152600401610c949061330e565b600f80546001600160a01b03199081166001600160a01b039687161790915560108054821694861694909417909355600e805490931691841691909117909155166000908152600960205260409020805460ff19169055565b6005546001600160a01b03610100909104163314610f8d5760405162461bcd60e51b8152600401610c949061330e565b6001811015610f9b57600080fd5b6023819055610e27611d10565b6005546001600160a01b03610100909104163314610fd85760405162461bcd60e51b8152600401610c949061330e565b600b546001600160a01b039081169082160361104c5760405162461bcd60e51b815260206004820152602d60248201527f53504143454150453a2054686520726f7574657220616c72656164792068617360448201526c2074686174206164647265737360981b6064820152608401610c94565b600b546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3600b80546001600160a01b0319166001600160a01b0392909216919091179055565b60006110bd82670de0b6b3a7640000612733565b90506110c833610ece565b5050565b6005546001600160a01b036101009091041633146110fc5760405162461bcd60e51b8152600401610c949061330e565b6024819055610e27611d10565b6005546001600160a01b036101009091041633146111395760405162461bcd60e51b8152600401610c949061330e565b60255460ff1661118b5760405162461bcd60e51b815260206004820152601860248201527f54726164696e6720616c7265616479206c61756e6368656400000000000000006044820152606401610c94565b42602b55565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b036101009091041633146111dc5760405162461bcd60e51b8152600401610c949061330e565b60055460405160009161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360058054610100600160a81b0319169055565b6005546001600160a01b0361010090910416331461125c5760405162461bcd60e51b8152600401610c949061330e565b6006546001600160a01b03908116908216036112e05760405162461bcd60e51b815260206004820152603760248201527f53504143454150453a20546865206469766964656e6420747261636b6572206160448201527f6c726561647920686173207468617420616464726573730000000000000000006064820152608401610c94565b6000819050306001600160a01b0316816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561132d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113519190613343565b6001600160a01b0316146113e15760405162461bcd60e51b815260206004820152604b60248201527f53504143454150453a20546865206e6577206469766964656e6420747261636b60448201527f6572206d757374206265206f776e656420627920746865202441504520746f6b60648201526a195b8818dbdb9d1c9858dd60aa1b608482015260a401610c94565b60405163031e79db60e41b81526001600160a01b03821660048201819052906331e79db090602401600060405180830381600087803b15801561142357600080fd5b505af1158015611437573d6000803e3d6000fd5b505060405163031e79db60e41b81523060048201526001600160a01b03841692506331e79db09150602401600060405180830381600087803b15801561147c57600080fd5b505af1158015611490573d6000803e3d6000fd5b50505050806001600160a01b03166331e79db06114bb6005546001600160a01b036101009091041690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b1580156114fc57600080fd5b505af1158015611510573d6000803e3d6000fd5b5050600b5460405163031e79db60e41b81526001600160a01b03918216600482015290841692506331e79db09150602401600060405180830381600087803b15801561155b57600080fd5b505af115801561156f573d6000803e3d6000fd5b50506006546040516001600160a01b03918216935090851691507f90c7d74461c613da5efa97d90740869367d74ab3aa5837aa4ae9a975f954b7a890600090a3600680546001600160a01b0319166001600160a01b039290921691909117905550565b600654604051634fcdeee760e01b81526001600160a01b0383811660048301526000921690634fcdeee790602401602060405180830381865afa15801561161d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c5e9190613360565b6005546001600160a01b036101009091041633146116715760405162461bcd60e51b8152600401610c949061330e565b6012546001600160a01b03908116908216036116ee5760405162461bcd60e51b815260206004820152603660248201527f53504143454150453a20546865206c69717569646974792077616c6c657420696044820152757320616c72656164792074686973206164647265737360501b6064820152608401610c94565b6001600160a01b03166000818152600760205260409020805460ff19166001179055601280546001600160a01b0319169091179055565b606060048054610bca906132d4565b6005546001600160a01b036101009091041633146117645760405162461bcd60e51b8152600401610c949061330e565b600c546001600160a01b03908116908316036118005760405162461bcd60e51b815260206004820152604f60248201527f53504143454150453a205468652050616e63616b65537761702070616972206360448201527f616e6e6f742062652072656d6f7665642066726f6d206175746f6d617465644d60648201526e61726b65744d616b6572506169727360881b608482015260a401610c94565b6110c882826127b5565b6000610c5a3384610e84856040518060600160405280602581526020016136f0602591393360009081526001602090815260408083206001600160a01b038d16845290915290205491906125f1565b6000610c5a338484611d6e565b6005546001600160a01b036101009091041633146118965760405162461bcd60e51b8152600401610c949061330e565b6001600160a01b03821660009081526008602052604090205460ff1615156001036118d35760405162461bcd60e51b8152600401610c949061337d565b6001600160a01b03919091166000908152600860205260409020805460ff1916911515919091179055565b6005546001600160a01b0361010090910416331461192e5760405162461bcd60e51b8152600401610c949061330e565b60065460405163c0f306ef60e01b81526001600160a01b0383811660048301529091169063c0f306ef90602401610ccb565b6005546001600160a01b036101009091041633146119905760405162461bcd60e51b8152600401610c949061330e565b60005b81518110156110c8576001600960008484815181106119b4576119b46133d1565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055806119f0816133fd565b915050611993565b6005546001600160a01b03610100909104163314611a285760405162461bcd60e51b8152600401610c949061330e565b6001600160a01b03811660009081526007602052604090205460ff161515600103611a655760405162461bcd60e51b8152600401610c949061337d565b6001600160a01b03166000908152600760205260409020805460ff19166001179055565b6005546001600160a01b03610100909104163314611ab95760405162461bcd60e51b8152600401610c949061330e565b6001600160a01b038116611b1e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c94565b6005546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b600080611b928385613416565b905083811015611be45760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610c94565b9392505050565b6001600160a01b038316611c4d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610c94565b6001600160a01b038216611cae5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610c94565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6064602354601354611d229190613429565b611d2c9190613440565b601455602454601354611d40906005613429565b611d4a9190613440565b602855601654601354606491611d5f91613429565b611d699190613440565b601555565b6001600160a01b038316611d945760405162461bcd60e51b8152600401610c9490613462565b6001600160a01b038216611dba5760405162461bcd60e51b8152600401610c94906134a7565b60255460ff168015611de557506001600160a01b03831660009081526009602052604090205460ff16155b8015611e0a57506001600160a01b03821660009081526009602052604090205460ff16155b15611ed6576001602b5411611e575760405162461bcd60e51b8152602060048201526013602482015272151c98591a5b99c81b9bdd081cdd185c9d1959606a1b6044820152606401610c94565b602b546101a490600090611e6b9083611b85565b905080421015611ec95760405162461bcd60e51b8152602060048201526024808201527f53504143454150453a2054726164696e67206973206e6f7420656e61626c6564604482015263081e595d60e21b6064820152608401610c94565b50506025805460ff191690555b6005546001600160a01b038481166101009092041614801590611f0c57506005546001600160a01b038381166101009092041614155b8015611f2057506001600160a01b03821615155b8015611f3757506001600160a01b03821661dead14155b8015611f4d5750600554600160a81b900460ff16155b15612179576001600160a01b0383166000908152600a602052604090205460ff168015611f9357506001600160a01b03821660009081526008602052604090205460ff16155b8015611fb857506001600160a01b0382166000908152600a602052604090205460ff16155b1561201c57601554611fc983611191565b611fd39083613416565b11156120175760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610c94565b612179565b6001600160a01b0382166000908152600a602052604090205460ff16801561205d57506001600160a01b03831660009081526008602052604090205460ff16155b801561208257506001600160a01b0383166000908152600a602052604090205460ff16155b156120ff576014548111156120175760405162461bcd60e51b815260206004820152603a60248201527f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560448201527f206d617853656c6c5472616e73616374696f6e416d6f756e742e0000000000006064820152608401610c94565b6001600160a01b03821660009081526008602052604090205460ff166121795760155461212b83611191565b6121359083613416565b11156121795760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610c94565b806000036121925761218d83836000612933565b505050565b6001600160a01b03831660009081526007602052604081205460ff16806121d157506001600160a01b03831660009081526007602052604090205460ff165b600554909150600160a81b900460ff161580156121ec575080155b1561226a5760006121fc30611191565b9050602854811061226857600554600160a81b900460ff1615801561223a57506001600160a01b0385166000908152600a602052604090205460ff16155b15612268576005805460ff60a81b1916600160a81b17905561225a612a3c565b6005805460ff60a81b191690555b505b808061227f5750600554600160a81b900460ff165b156122945761228f848484612933565b612415565b60006122b76017546122b16018548661273390919063ffffffff16565b90612dd7565b905060006122d66018546122b1601a548561273390919063ffffffff16565b905060006122f56018546122b1601c548661273390919063ffffffff16565b6001600160a01b0387166000908152600a602052604090205490915060ff161561238c5761233e6123376017546122b1601d548961273390919063ffffffff16565b8490611b85565b5061236461235d6018546122b1601e548761273390919063ffffffff16565b8390611b85565b5061238a6123836018546122b16020548761273390919063ffffffff16565b8290611b85565b505b6026546123999083611b85565b60265582156123fd576123ad873085612933565b80156123cf576123bd3082612628565b6002546013556123cb611d10565b5060005b602a5460ff16156123fd57600c546026546123f79130916001600160a01b0390911690612933565b60006026555b612411878761240c8887612e32565b612933565b5050505b6006546001600160a01b031663e30443bc8561243081611191565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561247657600080fd5b505af115801561248a573d6000803e3d6000fd5b50506006546001600160a01b0316915063e30443bc9050846124ab81611191565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156124f157600080fd5b505af1158015612505573d6000803e3d6000fd5b5050600554600160a81b900460ff16159150508015612522575080155b156125eb576029546006546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c479906024016060604051808303816000875af1925050508015612594575060408051601f3d908101601f19168201909252612591918101906134ea565b60015b15610cf95760408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a3505050505b50505050565b600081848411156126155760405162461bcd60e51b8152600401610c949190612ff3565b506126208385613518565b949350505050565b6001600160a01b0382166126885760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610c94565b6126c581604051806060016040528060228152602001613680602291396001600160a01b03851660009081526020819052604090205491906125f1565b6001600160a01b0383166000908152602081905260409020556002546126eb9082612e32565b6002556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b60008260000361274557506000610c5e565b60006127518385613429565b90508261275e8583613440565b14611be45760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610c94565b6001600160a01b0382166000908152600a602052604090205481151560ff9091161515036128565760405162461bcd60e51b815260206004820152604260248201527f53504143454150453a204175746f6d61746564206d61726b6574206d616b657260448201527f207061697220697320616c72656164792073657420746f20746861742076616c606482015261756560f01b608482015260a401610c94565b6001600160a01b0382166000818152600a60205260409020805460ff19168315801591909117909155600c80546001600160a01b0319169092179091556128f75760065460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b1580156128de57600080fd5b505af11580156128f2573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6001600160a01b0383166129595760405162461bcd60e51b8152600401610c9490613462565b6001600160a01b03821661297f5760405162461bcd60e51b8152600401610c94906134a7565b6129bc816040518060600160405280602681526020016136a2602691396001600160a01b03861660009081526020819052604090205491906125f1565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546129eb9082611b85565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101611d03565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612a7157612a716133d1565b6001600160a01b03928316602091820292909201810191909152600b54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612aca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aee9190613343565b81600181518110612b0157612b016133d1565b60200260200101906001600160a01b031690816001600160a01b0316815250506000612b2c30611191565b600b54909150612b479030906001600160a01b031683611beb565b600b546040516318cbafe560e01b815247916001600160a01b0316906318cbafe590612b8090859060009088903090429060040161356f565b6000604051808303816000875af1158015612b9f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612bc791908101906135ab565b506000612bd44783612e32565b90506000612be860646122b184602d612733565b90506000612c076017546122b16022548561273390919063ffffffff16565b90506000612c266017546122b16022548661273390919063ffffffff16565b90506000612c3e82612c388686612e32565b90612e32565b600e546040519192506001600160a01b03169082156108fc029083906000818181858888f19350505050158015612c79573d6000803e3d6000fd5b50600f546040516001600160a01b039091169084156108fc029085906000818181858888f19350505050158015612cb4573d6000803e3d6000fd5b506010546040516001600160a01b039091169083156108fc029084906000818181858888f19350505050158015612cef573d6000803e3d6000fd5b50612cf8612e8e565b600d546006546040516370a0823160e01b81526001600160a01b03918216600482015260009291909116906370a0823190602401602060405180830381865afa158015612d49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d6d9190613631565b600654604051638ac1f42560e01b8152600481018390529192506001600160a01b031690638ac1f42590602401600060405180830381600087803b158015612db457600080fd5b505af1158015612dc8573d6000803e3d6000fd5b50505050505050505050505050565b6000808211612e285760405162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f0000000000006044820152606401610c94565b611be48284613440565b600082821115612e845760405162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006044820152606401610c94565b611be48284613518565b6040805160028082526060820183526000926020830190803683375050600b54604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015612ef8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f1c9190613343565b81600081518110612f2f57612f2f6133d1565b6001600160a01b039283166020918202929092010152600d54825191169082906001908110612f6057612f606133d1565b6001600160a01b039283166020918202929092010152600b54600654604051637ff36ab560e01b815291831692637ff36ab5924792612fac92600092889290911690429060040161364a565b60006040518083038185885af1158015612fca573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f191682016040526110c891908101906135ab565b600060208083528351808285015260005b8181101561302057858101830151858201604001528201613004565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610e2757600080fd5b60006020828403121561306857600080fd5b8135611be481613041565b6000806040838503121561308657600080fd5b823561309181613041565b946020939093013593505050565b6000602082840312156130b157600080fd5b5035919050565b6000806000606084860312156130cd57600080fd5b83356130d881613041565b925060208401356130e881613041565b929592945050506040919091013590565b6000806000806080858703121561310f57600080fd5b843561311a81613041565b9350602085013561312a81613041565b9250604085013561313a81613041565b9150606085013561314a81613041565b939692955090935050565b8015158114610e2757600080fd5b6000806040838503121561317657600080fd5b823561318181613041565b9150602083013561319181613155565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156131db576131db61319c565b604052919050565b600067ffffffffffffffff8211156131fd576131fd61319c565b5060051b60200190565b6000602080838503121561321a57600080fd5b823567ffffffffffffffff81111561323157600080fd5b8301601f8101851361324257600080fd5b8035613255613250826131e3565b6131b2565b81815260059190911b8201830190838101908783111561327457600080fd5b928401925b8284101561329b57833561328c81613041565b82529284019290840190613279565b979650505050505050565b600080604083850312156132b957600080fd5b82356132c481613041565b9150602083013561319181613041565b600181811c908216806132e857607f821691505b60208210810361330857634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60006020828403121561335557600080fd5b8151611be481613041565b60006020828403121561337257600080fd5b8151611be481613155565b60208082526034908201527f53504143454150453a204163636f756e7420697320616c7265616479207468656040820152732076616c7565206f6620276578636c756465642760601b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161340f5761340f6133e7565b5060010190565b80820180821115610c5e57610c5e6133e7565b8082028115828204841417610c5e57610c5e6133e7565b60008261345d57634e487b7160e01b600052601260045260246000fd5b500490565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6000806000606084860312156134ff57600080fd5b8351925060208401519150604084015190509250925092565b81810381811115610c5e57610c5e6133e7565b600081518084526020808501945080840160005b838110156135645781516001600160a01b03168752958201959082019060010161353f565b509495945050505050565b85815284602082015260a06040820152600061358e60a083018661352b565b6001600160a01b0394909416606083015250608001529392505050565b600060208083850312156135be57600080fd5b825167ffffffffffffffff8111156135d557600080fd5b8301601f810185136135e657600080fd5b80516135f4613250826131e3565b81815260059190911b8201830190838101908783111561361357600080fd5b928401925b8284101561329b57835182529284019290840190613618565b60006020828403121561364357600080fd5b5051919050565b848152608060208201526000613663608083018661352b565b6001600160a01b0394909416604083015250606001529291505056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212200de0f0d3b55e188991b9f0ca9fac87845eee79208a6c20c0ee0ab97494cf3a3064736f6c6343000811003360c06040523480156200001157600080fd5b50604051620027f8380380620027f88339810160408190526200003491620001ab565b82828282826003620000478382620002c7565b506004620000568282620002c7565b50506005805460ff19166012179055506001600160a01b031660805250600090506200007f3390565b600b80546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35050610e106013555050655af3107a400060a05262000393565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200010e57600080fd5b81516001600160401b03808211156200012b576200012b620000e6565b604051601f8301601f19908116603f01168101908282118183101715620001565762000156620000e6565b816040528381526020925086838588010111156200017357600080fd5b600091505b8382101562000197578582018301518183018401529082019062000178565b600093810190920192909252949350505050565b600080600060608486031215620001c157600080fd5b83516001600160401b0380821115620001d957600080fd5b620001e787838801620000fc565b94506020860151915080821115620001fe57600080fd5b506200020d86828701620000fc565b604086015190935090506001600160a01b03811681146200022d57600080fd5b809150509250925092565b600181811c908216806200024d57607f821691505b6020821081036200026e57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620002c257600081815260208120601f850160051c810160208610156200029d5750805b601f850160051c820191505b81811015620002be57828155600101620002a9565b5050505b505050565b81516001600160401b03811115620002e357620002e3620000e6565b620002fb81620002f4845462000238565b8462000274565b602080601f8311600181146200033357600084156200031a5750858301515b600019600386901b1c1916600185901b178555620002be565b600085815260208120601f198616915b82811015620003645788860151825594840194600190910190840162000343565b5085821015620003835787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a051612431620003c7600039600081816106ca01526111e20152600081816103db0152611c7f01526124316000f3fe60806040526004361061023f5760003560e01c8063715018a61161012e578063bc4c4b37116100ab578063e7841ec01161006f578063e7841ec014610772578063e98030c714610787578063f2fde38b146107a7578063fbcbc0f1146107c7578063ffb2c479146107e757600080fd5b8063bc4c4b3714610698578063be10b614146106b8578063c0f306ef146106ec578063dd62ed3e1461070c578063e30443bc1461075257600080fd5b806395d89b41116100f257806395d89b41146105ed578063a457c2d714610602578063a8b9d24014610622578063a9059cbb14610642578063aafd847a1461066257600080fd5b8063715018a61461056457806385a6b3ae146105795780638ac1f4251461058f5780638da5cb5b146105af57806391b89fba146105cd57600080fd5b806331e79db0116101bc5780635183d6fd116101805780635183d6fd1461047e5780636843cd84146104e35780636a474002146105035780636f2789ec1461051857806370a082311461052e57600080fd5b806331e79db01461038957806339509351146103a9578063419dbf3b146103c95780634e7b827f146104155780634fcdeee71461044557600080fd5b8063226cfa3d11610203578063226cfa3d146102e457806323b872dd1461031157806327ce0147146103315780633009a60914610351578063313ce5671461036757600080fd5b806303c833021461024b57806306fdde0314610255578063095ea7b31461028057806309bbedde146102b057806318160ddd146102cf57600080fd5b3661024657005b600080fd5b610253610822565b005b34801561026157600080fd5b5061026a6108b5565b6040516102779190612063565b60405180910390f35b34801561028c57600080fd5b506102a061029b3660046120c6565b610947565b6040519015158152602001610277565b3480156102bc57600080fd5b50600c545b604051908152602001610277565b3480156102db57600080fd5b506002546102c1565b3480156102f057600080fd5b506102c16102ff3660046120f2565b60126020526000908152604090205481565b34801561031d57600080fd5b506102a061032c36600461210f565b61095e565b34801561033d57600080fd5b506102c161034c3660046120f2565b6109c7565b34801561035d57600080fd5b506102c160105481565b34801561037357600080fd5b5060055460405160ff9091168152602001610277565b34801561039557600080fd5b506102536103a43660046120f2565b610a23565b3480156103b557600080fd5b506102a06103c43660046120c6565b610b96565b3480156103d557600080fd5b506103fd7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610277565b34801561042157600080fd5b506102a06104303660046120f2565b60116020526000908152604090205460ff1681565b34801561045157600080fd5b506102a06104603660046120f2565b6001600160a01b031660009081526011602052604090205460ff1690565b34801561048a57600080fd5b5061049e610499366004612150565b610bcc565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e082015261010001610277565b3480156104ef57600080fd5b506102c16104fe3660046120f2565b610d20565b34801561050f57600080fd5b50610253610d3e565b34801561052457600080fd5b506102c160135481565b34801561053a57600080fd5b506102c16105493660046120f2565b6001600160a01b031660009081526020819052604090205490565b34801561057057600080fd5b50610253610de4565b34801561058557600080fd5b506102c1600a5481565b34801561059b57600080fd5b506102536105aa366004612150565b610e58565b3480156105bb57600080fd5b50600b546001600160a01b03166103fd565b3480156105d957600080fd5b506102c16105e83660046120f2565b610ed9565b3480156105f957600080fd5b5061026a610ee4565b34801561060e57600080fd5b506102a061061d3660046120c6565b610ef3565b34801561062e57600080fd5b506102c161063d3660046120f2565b610f42565b34801561064e57600080fd5b506102a061065d3660046120c6565b610f6e565b34801561066e57600080fd5b506102c161067d3660046120f2565b6001600160a01b031660009081526009602052604090205490565b3480156106a457600080fd5b506102a06106b3366004612177565b610f7b565b3480156106c457600080fd5b506102c17f000000000000000000000000000000000000000000000000000000000000000081565b3480156106f857600080fd5b506102536107073660046120f2565b611029565b34801561071857600080fd5b506102c16107273660046121b0565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561075e57600080fd5b5061025361076d3660046120c6565b611196565b34801561077e57600080fd5b506010546102c1565b34801561079357600080fd5b506102536107a2366004612150565b61131e565b3480156107b357600080fd5b506102536107c23660046120f2565b611492565b3480156107d357600080fd5b5061049e6107e23660046120f2565b61157d565b3480156107f357600080fd5b50610807610802366004612150565b6116e6565b60408051938452602084019290925290820152606001610277565b600061082d60025490565b1161083757600080fd5b34156108b35761086a61084960025490565b61085734600160801b611803565b61086191906121f4565b6006549061188c565b60065560405134815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a2600a546108af903461188c565b600a555b565b6060600380546108c490612216565b80601f01602080910402602001604051908101604052809291908181526020018280546108f090612216565b801561093d5780601f106109125761010080835404028352916020019161093d565b820191906000526020600020905b81548152906001019060200180831161092057829003601f168201915b5050505050905090565b60006109543384846118eb565b5060015b92915050565b600061096b848484611a0f565b6109bd84336109b8856040518060600160405280602881526020016123af602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190611a6f565b6118eb565b5060019392505050565b6001600160a01b03811660009081526008602090815260408083205491839052822054600654600160801b92610a1992610a1492610a0e91610a099190611803565b611aa6565b90611ab6565b611af4565b61095891906121f4565b600b546001600160a01b03163314610a565760405162461bcd60e51b8152600401610a4d90612250565b60405180910390fd5b6001600160a01b03811660009081526011602052604090205460ff1615610abf5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610a4d565b6001600160a01b0381166000908152601160205260408120805460ff19166001179055610aed908290611b07565b60405163131836e760e21b8152600c60048201526001600160a01b0382166024820152730349c2a6db6c3368d7066e3d2b20f395a64ee77d90634c60db9c9060440160006040518083038186803b158015610b4757600080fd5b505af4158015610b5b573d6000803e3d6000fd5b50506040516001600160a01b03841692507fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b259150600090a250565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916109549185906109b8908661188c565b600080600080600080600080600c730349c2a6db6c3368d7066e3d2b20f395a64ee77d63deb3d89690916040518263ffffffff1660e01b8152600401610c1491815260200190565b602060405180830381865af4158015610c31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c559190612285565b8910610c7a575060009650600019955085945086935083925082915081905080610d15565b6040516368d54f3f60e11b8152600c6004820152602481018a9052600090730349c2a6db6c3368d7066e3d2b20f395a64ee77d9063d1aa9e7e90604401602060405180830381865af4158015610cd4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf8919061229e565b9050610d038161157d565b98509850985098509850985098509850505b919395975091939597565b6001600160a01b038116600090815260208190526040812054610958565b60405162461bcd60e51b815260206004820152606960248201527f53504143454150455f4469766964656e645f547261636b65723a20776974686460448201527f7261774469766964656e642064697361626c65642e205573652074686520276360648201527f6c61696d272066756e6374696f6e206f6e20746865206d61696e20244150452060848201526831b7b73a3930b1ba1760b91b60a482015260c401610a4d565b600b546001600160a01b03163314610e0e5760405162461bcd60e51b8152600401610a4d90612250565b600b546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600b80546001600160a01b0319169055565b6000610e6360025490565b11610e6d57600080fd5b8015610ed657610e8d610e7f60025490565b61085783600160801b611803565b60065560405181815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a2600a54610ed2908261188c565b600a555b50565b600061095882610f42565b6060600480546108c490612216565b600061095433846109b8856040518060600160405280602581526020016123d7602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190611a6f565b6001600160a01b03811660009081526009602052604081205461095890610f68846109c7565b90611b6c565b6000610954338484611a0f565b600b546000906001600160a01b03163314610fa85760405162461bcd60e51b8152600401610a4d90612250565b6000610fb384611bc8565b9050801561101f576001600160a01b038416600081815260126020526040908190204290555184151591907fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf0929061100d9085815260200190565b60405180910390a36001915050610958565b5060009392505050565b600b546001600160a01b031633146110535760405162461bcd60e51b8152600401610a4d90612250565b6001600160a01b03811660009081526011602052604090205460ff166110bb5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c726561647920696e636c7564656400000000006044820152606401610a4d565b6001600160a01b0381166000908152601160205260408120805460ff191690556110e6908290611b07565b604051632f0ad01760e21b8152600c60048201526001600160a01b038216602482015260006044820152730349c2a6db6c3368d7066e3d2b20f395a64ee77d9063bc2b405c9060640160006040518083038186803b15801561114757600080fd5b505af415801561115b573d6000803e3d6000fd5b50506040516001600160a01b03841692507f40a78dcf8526b72f2eaf598af1c7e49c8d5fc577f6c8f1bed887f3e4dfa289329150600090a250565b600b546001600160a01b031633146111c05760405162461bcd60e51b8152600401610a4d90612250565b6001600160a01b03821660009081526011602052604090205460ff1661131a577f0000000000000000000000000000000000000000000000000000000000000000811061128f576112118282611b07565b604051632f0ad01760e21b8152600c60048201526001600160a01b038316602482015260448101829052730349c2a6db6c3368d7066e3d2b20f395a64ee77d9063bc2b405c9060640160006040518083038186803b15801561127257600080fd5b505af4158015611286573d6000803e3d6000fd5b5050505061130d565b61129a826000611b07565b60405163131836e760e21b8152600c60048201526001600160a01b0383166024820152730349c2a6db6c3368d7066e3d2b20f395a64ee77d90634c60db9c9060440160006040518083038186803b1580156112f457600080fd5b505af4158015611308573d6000803e3d6000fd5b505050505b611318826001610f7b565b505b5050565b600b546001600160a01b031633146113485760405162461bcd60e51b8152600401610a4d90612250565b610e10811015801561135d5750620151808111155b6113e65760405162461bcd60e51b815260206004820152604e60248201527f53504143454150455f4469766964656e645f547261636b65723a20636c61696d60448201527f57616974206d757374206265207570646174656420746f206265747765656e2060648201526d3120616e6420323420686f75727360901b608482015260a401610a4d565b601354810361145f576040805162461bcd60e51b81526020600482015260248101919091527f53504143454150455f4469766964656e645f547261636b65723a2043616e6e6f60448201527f742075706461746520636c61696d5761697420746f2073616d652076616c75656064820152608401610a4d565b60135460405182907f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f90600090a3601355565b600b546001600160a01b031633146114bc5760405162461bcd60e51b8152600401610a4d90612250565b6001600160a01b0381166115215760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a4d565b600b546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516317e142d160e01b8152600c60048201526001600160a01b03821660248201528190600090819081908190819081908190730349c2a6db6c3368d7066e3d2b20f395a64ee77d906317e142d190604401602060405180830381865af41580156115ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116119190612285565b96506000199550600087126116735760105487111561163f57601054611638908890611d4d565b9550611673565b601054600c5460009110611654576000611663565b601054600c5461166391611b6c565b905061166f8882611ab6565b9650505b61167c88610f42565b9450611687886109c7565b6001600160a01b0389166000908152601260205260409020549094509250826116b15760006116bf565b6013546116bf90849061188c565b91504282116116cf5760006116d9565b6116d98242611b6c565b9050919395975091939597565b600c5460009081908190808203611708575050601054600092508291506117fc565b6010546000805a90506000805b898410801561172357508582105b156117eb5784611732816122bb565b600c549096508610905061174557600094505b6000600c600001868154811061175d5761175d6122d4565b60009182526020808320909101546001600160a01b0316808352601290915260409091205490915061178e90611d99565b156117b15761179e816001610f7b565b156117b157816117ad816122bb565b9250505b826117bb816122bb565b93505060005a9050808511156117e2576117df6117d88683611b6c565b879061188c565b95505b93506117159050565b601085905590975095509193505050505b9193909250565b60008260000361181557506000610958565b600061182183856122ea565b90508261182e85836121f4565b146118855760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610a4d565b9392505050565b6000806118998385612301565b9050838110156118855760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610a4d565b6001600160a01b03831661194d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a4d565b6001600160a01b0382166119ae5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a4d565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60405162461bcd60e51b815260206004820152602f60248201527f53504143454150455f4469766964656e645f547261636b65723a204e6f20747260448201526e185b9cd9995c9cc8185b1b1bddd959608a1b6064820152608401610a4d565b60008184841115611a935760405162461bcd60e51b8152600401610a4d9190612063565b50611a9e8385612314565b949350505050565b6000818181121561095857600080fd5b600080611ac38385612327565b905060008312158015611ad65750838112155b80611aeb5750600083128015611aeb57508381125b61188557600080fd5b600080821215611b0357600080fd5b5090565b6001600160a01b03821660009081526020819052604090205480821115611b46576000611b348383611b6c565b9050611b408482611dc0565b50611318565b80821015611318576000611b5a8284611b6c565b9050611b668482611e24565b50505050565b600082821115611bbe5760405162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006044820152606401610a4d565b6118858284612314565b600080611bd483610f42565b90508015611d44576001600160a01b038316600090815260096020526040902054611bff908261188c565b6001600160a01b038416600081815260096020526040908190209290925590517fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d90611c4e9084815260200190565b60405180910390a260405163a9059cbb60e01b81526001600160a01b038481166004830152602482018390526000917f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303816000875af1158015611cca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cee919061234f565b905080611d3d576001600160a01b038416600090815260096020526040902054611d189083611b6c565b6001600160a01b03909416600090815260096020526040812094909455509192915050565b5092915050565b50600092915050565b6000808212158015611d68575082611d65838261236c565b13155b80611d865750600082128015611d86575082611d84838261236c565b135b611d8f57600080fd5b611885828461236c565b600042821115611dab57506000919050565b601354611db84284611b6c565b101592915050565b611dca8282611e68565b611e04611de5610a098360065461180390919063ffffffff16565b6001600160a01b03841660009081526008602052604090205490611d4d565b6001600160a01b0390921660009081526008602052604090209190915550565b611e2e8282611f53565b611e04611e49610a098360065461180390919063ffffffff16565b6001600160a01b03841660009081526008602052604090205490611ab6565b6001600160a01b038216611ebe5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610a4d565b611eca60008383611318565b600254611ed7908261188c565b6002556001600160a01b038216600090815260208190526040902054611efd908261188c565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b6001600160a01b038216611fb35760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610a4d565b611fbf82600083611318565b611ffc8160405180606001604052806022815260200161238d602291396001600160a01b0385166000908152602081905260409020549190611a6f565b6001600160a01b0383166000908152602081905260409020556002546120229082611b6c565b6002556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611f47565b600060208083528351808285015260005b8181101561209057858101830151858201604001528201612074565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610ed657600080fd5b600080604083850312156120d957600080fd5b82356120e4816120b1565b946020939093013593505050565b60006020828403121561210457600080fd5b8135611885816120b1565b60008060006060848603121561212457600080fd5b833561212f816120b1565b9250602084013561213f816120b1565b929592945050506040919091013590565b60006020828403121561216257600080fd5b5035919050565b8015158114610ed657600080fd5b6000806040838503121561218a57600080fd5b8235612195816120b1565b915060208301356121a581612169565b809150509250929050565b600080604083850312156121c357600080fd5b82356121ce816120b1565b915060208301356121a5816120b1565b634e487b7160e01b600052601160045260246000fd5b60008261221157634e487b7160e01b600052601260045260246000fd5b500490565b600181811c9082168061222a57607f821691505b60208210810361224a57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60006020828403121561229757600080fd5b5051919050565b6000602082840312156122b057600080fd5b8151611885816120b1565b6000600182016122cd576122cd6121de565b5060010190565b634e487b7160e01b600052603260045260246000fd5b8082028115828204841417610958576109586121de565b80820180821115610958576109586121de565b81810381811115610958576109586121de565b8082018281126000831280158216821582161715612347576123476121de565b505092915050565b60006020828403121561236157600080fd5b815161188581612169565b8181036000831280158383131683831282161715611d3d57611d3d6121de56fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212202efe860eb22e6755eb1e44d95bd62d08bbc58a7ff4a2bea8aacbc4b37c0a430764736f6c63430008110033
Deployed Bytecode
0x6080604052600436106103d25760003560e01c80636d1b229d116101fd578063a9059cbb11610118578063c3ec2a25116100ab578063e2f456051161007a578063e2f4560514610b39578063e57f14e114610b4f578063ea99fd8914610b6f578063f2fde38b14610b85578063f8b45b0514610ba557600080fd5b8063c3ec2a2514610aa3578063cf0bbb5d14610abd578063cfc634d814610add578063dd62ed3e14610af357600080fd5b8063b609995e116100e7578063b609995e14610a1d578063b62496f514610a3d578063bf4c190214610a6d578063c3926a2914610a8d57600080fd5b8063a9059cbb146109a7578063ac819f54146109c7578063acb172ad146109e7578063b068375514610a0757600080fd5b806388f820201161019057806397dfbb851161015f57806397dfbb851461093b5780639a7a23d6146109515780639c1b8af514610971578063a457c2d71461098757600080fd5b806388f82020146108c35780638da5cb5b146108e357806394879c841461090657806395d89b411461092657600080fd5b806370a08231116101cc57806370a082311461084e578063715018a61461086e5780637853d3191461088357806388bdd9be146108a357600080fd5b80636d1b229d146107e35780636d2558ca146108035780636f5fc73b146108235780636fc61a091461083957600080fd5b806323b872dd116102ed5780634559b60611610280578063598353941161024f57806359835394146107635780635dc083151461078357806361d027b3146107a357806365b8dbc0146107c357600080fd5b80634559b606146106d05780634739b8f4146106ea57806349bd5a5e1461070a5780634fbee1931461072a57600080fd5b8063354c94fb116102bc578063354c94fb1461065a578063395093511461067a5780633b13cc161461069a57806342966c68146106b057600080fd5b806323b872dd146105e257806325b61703146106025780632c1f521614610618578063313ce5671461063857600080fd5b8063122fe685116103655780631943d388116103345780631943d388146105805780631977e99c146105965780631aac33f7146105ac5780631c499ab0146105c257600080fd5b8063122fe685146104ed5780631694505e1461052b57806316a2f82a1461054b57806318160ddd1461056b57600080fd5b806306fdde03116103a157806306fdde03146104495780630855f25d1461046b578063095ea7b3146104ab578063111e0376146104cb57600080fd5b806302259e9e146103de578063023ad5811461040757806303807ee51461041d578063047fc9aa1461043357600080fd5b366103d957005b600080fd5b3480156103ea57600080fd5b506103f460145481565b6040519081526020015b60405180910390f35b34801561041357600080fd5b506103f460155481565b34801561042957600080fd5b506103f4601c5481565b34801561043f57600080fd5b506103f460135481565b34801561045557600080fd5b5061045e610bbb565b6040516103fe9190612ff3565b34801561047757600080fd5b5061049b610486366004613056565b60086020526000908152604090205460ff1681565b60405190151581526020016103fe565b3480156104b757600080fd5b5061049b6104c6366004613073565b610c4d565b3480156104d757600080fd5b506104eb6104e6366004613056565b610c64565b005b3480156104f957600080fd5b50602a54610513906201000090046001600160a01b031681565b6040516001600160a01b0390911681526020016103fe565b34801561053757600080fd5b50600b54610513906001600160a01b031681565b34801561055757600080fd5b506104eb610566366004613056565b610d00565b34801561057757600080fd5b506002546103f4565b34801561058c57600080fd5b506103f460195481565b3480156105a257600080fd5b506103f460185481565b3480156105b857600080fd5b506103f460205481565b3480156105ce57600080fd5b506104eb6105dd36600461309f565b610ddc565b3480156105ee57600080fd5b5061049b6105fd3660046130b8565b610e2a565b34801561060e57600080fd5b506103f4602b5481565b34801561062457600080fd5b50600654610513906001600160a01b031681565b34801561064457600080fd5b5060055460405160ff90911681526020016103fe565b34801561066657600080fd5b50601054610513906001600160a01b031681565b34801561068657600080fd5b5061049b610695366004613073565b610e93565b3480156106a657600080fd5b506103f460235481565b3480156106bc57600080fd5b506104eb6106cb36600461309f565b610ec9565b3480156106dc57600080fd5b50602a5461049b9060ff1681565b3480156106f657600080fd5b50601254610513906001600160a01b031681565b34801561071657600080fd5b50600c54610513906001600160a01b031681565b34801561073657600080fd5b5061049b610745366004613056565b6001600160a01b031660009081526007602052604090205460ff1690565b34801561076f57600080fd5b506104eb61077e3660046130f9565b610ed4565b34801561078f57600080fd5b506104eb61079e36600461309f565b610f5d565b3480156107af57600080fd5b50600e54610513906001600160a01b031681565b3480156107cf57600080fd5b506104eb6107de366004613056565b610fa8565b3480156107ef57600080fd5b506104eb6107fe36600461309f565b6110a9565b34801561080f57600080fd5b506104eb61081e36600461309f565b6110cc565b34801561082f57600080fd5b506103f4601d5481565b34801561084557600080fd5b506104eb611109565b34801561085a57600080fd5b506103f4610869366004613056565b611191565b34801561087a57600080fd5b506104eb6111ac565b34801561088f57600080fd5b50600d54610513906001600160a01b031681565b3480156108af57600080fd5b506104eb6108be366004613056565b61122c565b3480156108cf57600080fd5b5061049b6108de366004613056565b6115d2565b3480156108ef57600080fd5b5060055461010090046001600160a01b0316610513565b34801561091257600080fd5b506104eb610921366004613056565b611641565b34801561093257600080fd5b5061045e611725565b34801561094757600080fd5b506103f4601b5481565b34801561095d57600080fd5b506104eb61096c366004613163565b611734565b34801561097d57600080fd5b506103f460295481565b34801561099357600080fd5b5061049b6109a2366004613073565b61180a565b3480156109b357600080fd5b5061049b6109c2366004613073565b611859565b3480156109d357600080fd5b506104eb6109e2366004613163565b611866565b3480156109f357600080fd5b50601154610513906001600160a01b031681565b348015610a1357600080fd5b506103f4601a5481565b348015610a2957600080fd5b506104eb610a38366004613056565b6118fe565b348015610a4957600080fd5b5061049b610a58366004613056565b600a6020526000908152604090205460ff1681565b348015610a7957600080fd5b506104eb610a88366004613207565b611960565b348015610a9957600080fd5b506103f460265481565b348015610aaf57600080fd5b5060255461049b9060ff1681565b348015610ac957600080fd5b50600f54610513906001600160a01b031681565b348015610ae957600080fd5b506103f4601e5481565b348015610aff57600080fd5b506103f4610b0e3660046132a6565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610b4557600080fd5b506103f460285481565b348015610b5b57600080fd5b506104eb610b6a366004613056565b6119f8565b348015610b7b57600080fd5b506103f4601f5481565b348015610b9157600080fd5b506104eb610ba0366004613056565b611a89565b348015610bb157600080fd5b506103f460165481565b606060038054610bca906132d4565b80601f0160208091040260200160405190810160405280929190818152602001828054610bf6906132d4565b8015610c435780601f10610c1857610100808354040283529160200191610c43565b820191906000526020600020905b815481529060010190602001808311610c2657829003601f168201915b5050505050905090565b6000610c5a338484611beb565b5060015b92915050565b6005546001600160a01b03610100909104163314610c9d5760405162461bcd60e51b8152600401610c949061330e565b60405180910390fd5b60065460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024015b600060405180830381600087803b158015610ce557600080fd5b505af1158015610cf9573d6000803e3d6000fd5b5050505050565b6005546001600160a01b03610100909104163314610d305760405162461bcd60e51b8152600401610c949061330e565b6001600160a01b03811660009081526007602052604081205460ff1615159003610dbb5760405162461bcd60e51b815260206004820152603660248201527f53504143454150453a204163636f756e7420697320616c726561647920696e636044820152756c75646564202f206e6f7420276578636c756465642760501b6064820152608401610c94565b6001600160a01b03166000908152600760205260409020805460ff19169055565b6005546001600160a01b03610100909104163314610e0c5760405162461bcd60e51b8152600401610c949061330e565b6001811015610e1a57600080fd5b6016819055610e27611d10565b50565b6000610e37848484611d6e565b610e898433610e84856040518060600160405280602881526020016136c8602891396001600160a01b038a16600090815260016020908152604080832033845290915290205491906125f1565b611beb565b5060019392505050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610c5a918590610e849086611b85565b610e27335b82612628565b6005546001600160a01b03610100909104163314610f045760405162461bcd60e51b8152600401610c949061330e565b600f80546001600160a01b03199081166001600160a01b039687161790915560108054821694861694909417909355600e805490931691841691909117909155166000908152600960205260409020805460ff19169055565b6005546001600160a01b03610100909104163314610f8d5760405162461bcd60e51b8152600401610c949061330e565b6001811015610f9b57600080fd5b6023819055610e27611d10565b6005546001600160a01b03610100909104163314610fd85760405162461bcd60e51b8152600401610c949061330e565b600b546001600160a01b039081169082160361104c5760405162461bcd60e51b815260206004820152602d60248201527f53504143454150453a2054686520726f7574657220616c72656164792068617360448201526c2074686174206164647265737360981b6064820152608401610c94565b600b546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3600b80546001600160a01b0319166001600160a01b0392909216919091179055565b60006110bd82670de0b6b3a7640000612733565b90506110c833610ece565b5050565b6005546001600160a01b036101009091041633146110fc5760405162461bcd60e51b8152600401610c949061330e565b6024819055610e27611d10565b6005546001600160a01b036101009091041633146111395760405162461bcd60e51b8152600401610c949061330e565b60255460ff1661118b5760405162461bcd60e51b815260206004820152601860248201527f54726164696e6720616c7265616479206c61756e6368656400000000000000006044820152606401610c94565b42602b55565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b036101009091041633146111dc5760405162461bcd60e51b8152600401610c949061330e565b60055460405160009161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360058054610100600160a81b0319169055565b6005546001600160a01b0361010090910416331461125c5760405162461bcd60e51b8152600401610c949061330e565b6006546001600160a01b03908116908216036112e05760405162461bcd60e51b815260206004820152603760248201527f53504143454150453a20546865206469766964656e6420747261636b6572206160448201527f6c726561647920686173207468617420616464726573730000000000000000006064820152608401610c94565b6000819050306001600160a01b0316816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561132d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113519190613343565b6001600160a01b0316146113e15760405162461bcd60e51b815260206004820152604b60248201527f53504143454150453a20546865206e6577206469766964656e6420747261636b60448201527f6572206d757374206265206f776e656420627920746865202441504520746f6b60648201526a195b8818dbdb9d1c9858dd60aa1b608482015260a401610c94565b60405163031e79db60e41b81526001600160a01b03821660048201819052906331e79db090602401600060405180830381600087803b15801561142357600080fd5b505af1158015611437573d6000803e3d6000fd5b505060405163031e79db60e41b81523060048201526001600160a01b03841692506331e79db09150602401600060405180830381600087803b15801561147c57600080fd5b505af1158015611490573d6000803e3d6000fd5b50505050806001600160a01b03166331e79db06114bb6005546001600160a01b036101009091041690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b1580156114fc57600080fd5b505af1158015611510573d6000803e3d6000fd5b5050600b5460405163031e79db60e41b81526001600160a01b03918216600482015290841692506331e79db09150602401600060405180830381600087803b15801561155b57600080fd5b505af115801561156f573d6000803e3d6000fd5b50506006546040516001600160a01b03918216935090851691507f90c7d74461c613da5efa97d90740869367d74ab3aa5837aa4ae9a975f954b7a890600090a3600680546001600160a01b0319166001600160a01b039290921691909117905550565b600654604051634fcdeee760e01b81526001600160a01b0383811660048301526000921690634fcdeee790602401602060405180830381865afa15801561161d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c5e9190613360565b6005546001600160a01b036101009091041633146116715760405162461bcd60e51b8152600401610c949061330e565b6012546001600160a01b03908116908216036116ee5760405162461bcd60e51b815260206004820152603660248201527f53504143454150453a20546865206c69717569646974792077616c6c657420696044820152757320616c72656164792074686973206164647265737360501b6064820152608401610c94565b6001600160a01b03166000818152600760205260409020805460ff19166001179055601280546001600160a01b0319169091179055565b606060048054610bca906132d4565b6005546001600160a01b036101009091041633146117645760405162461bcd60e51b8152600401610c949061330e565b600c546001600160a01b03908116908316036118005760405162461bcd60e51b815260206004820152604f60248201527f53504143454150453a205468652050616e63616b65537761702070616972206360448201527f616e6e6f742062652072656d6f7665642066726f6d206175746f6d617465644d60648201526e61726b65744d616b6572506169727360881b608482015260a401610c94565b6110c882826127b5565b6000610c5a3384610e84856040518060600160405280602581526020016136f0602591393360009081526001602090815260408083206001600160a01b038d16845290915290205491906125f1565b6000610c5a338484611d6e565b6005546001600160a01b036101009091041633146118965760405162461bcd60e51b8152600401610c949061330e565b6001600160a01b03821660009081526008602052604090205460ff1615156001036118d35760405162461bcd60e51b8152600401610c949061337d565b6001600160a01b03919091166000908152600860205260409020805460ff1916911515919091179055565b6005546001600160a01b0361010090910416331461192e5760405162461bcd60e51b8152600401610c949061330e565b60065460405163c0f306ef60e01b81526001600160a01b0383811660048301529091169063c0f306ef90602401610ccb565b6005546001600160a01b036101009091041633146119905760405162461bcd60e51b8152600401610c949061330e565b60005b81518110156110c8576001600960008484815181106119b4576119b46133d1565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055806119f0816133fd565b915050611993565b6005546001600160a01b03610100909104163314611a285760405162461bcd60e51b8152600401610c949061330e565b6001600160a01b03811660009081526007602052604090205460ff161515600103611a655760405162461bcd60e51b8152600401610c949061337d565b6001600160a01b03166000908152600760205260409020805460ff19166001179055565b6005546001600160a01b03610100909104163314611ab95760405162461bcd60e51b8152600401610c949061330e565b6001600160a01b038116611b1e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c94565b6005546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b600080611b928385613416565b905083811015611be45760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610c94565b9392505050565b6001600160a01b038316611c4d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610c94565b6001600160a01b038216611cae5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610c94565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6064602354601354611d229190613429565b611d2c9190613440565b601455602454601354611d40906005613429565b611d4a9190613440565b602855601654601354606491611d5f91613429565b611d699190613440565b601555565b6001600160a01b038316611d945760405162461bcd60e51b8152600401610c9490613462565b6001600160a01b038216611dba5760405162461bcd60e51b8152600401610c94906134a7565b60255460ff168015611de557506001600160a01b03831660009081526009602052604090205460ff16155b8015611e0a57506001600160a01b03821660009081526009602052604090205460ff16155b15611ed6576001602b5411611e575760405162461bcd60e51b8152602060048201526013602482015272151c98591a5b99c81b9bdd081cdd185c9d1959606a1b6044820152606401610c94565b602b546101a490600090611e6b9083611b85565b905080421015611ec95760405162461bcd60e51b8152602060048201526024808201527f53504143454150453a2054726164696e67206973206e6f7420656e61626c6564604482015263081e595d60e21b6064820152608401610c94565b50506025805460ff191690555b6005546001600160a01b038481166101009092041614801590611f0c57506005546001600160a01b038381166101009092041614155b8015611f2057506001600160a01b03821615155b8015611f3757506001600160a01b03821661dead14155b8015611f4d5750600554600160a81b900460ff16155b15612179576001600160a01b0383166000908152600a602052604090205460ff168015611f9357506001600160a01b03821660009081526008602052604090205460ff16155b8015611fb857506001600160a01b0382166000908152600a602052604090205460ff16155b1561201c57601554611fc983611191565b611fd39083613416565b11156120175760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610c94565b612179565b6001600160a01b0382166000908152600a602052604090205460ff16801561205d57506001600160a01b03831660009081526008602052604090205460ff16155b801561208257506001600160a01b0383166000908152600a602052604090205460ff16155b156120ff576014548111156120175760405162461bcd60e51b815260206004820152603a60248201527f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560448201527f206d617853656c6c5472616e73616374696f6e416d6f756e742e0000000000006064820152608401610c94565b6001600160a01b03821660009081526008602052604090205460ff166121795760155461212b83611191565b6121359083613416565b11156121795760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610c94565b806000036121925761218d83836000612933565b505050565b6001600160a01b03831660009081526007602052604081205460ff16806121d157506001600160a01b03831660009081526007602052604090205460ff165b600554909150600160a81b900460ff161580156121ec575080155b1561226a5760006121fc30611191565b9050602854811061226857600554600160a81b900460ff1615801561223a57506001600160a01b0385166000908152600a602052604090205460ff16155b15612268576005805460ff60a81b1916600160a81b17905561225a612a3c565b6005805460ff60a81b191690555b505b808061227f5750600554600160a81b900460ff165b156122945761228f848484612933565b612415565b60006122b76017546122b16018548661273390919063ffffffff16565b90612dd7565b905060006122d66018546122b1601a548561273390919063ffffffff16565b905060006122f56018546122b1601c548661273390919063ffffffff16565b6001600160a01b0387166000908152600a602052604090205490915060ff161561238c5761233e6123376017546122b1601d548961273390919063ffffffff16565b8490611b85565b5061236461235d6018546122b1601e548761273390919063ffffffff16565b8390611b85565b5061238a6123836018546122b16020548761273390919063ffffffff16565b8290611b85565b505b6026546123999083611b85565b60265582156123fd576123ad873085612933565b80156123cf576123bd3082612628565b6002546013556123cb611d10565b5060005b602a5460ff16156123fd57600c546026546123f79130916001600160a01b0390911690612933565b60006026555b612411878761240c8887612e32565b612933565b5050505b6006546001600160a01b031663e30443bc8561243081611191565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561247657600080fd5b505af115801561248a573d6000803e3d6000fd5b50506006546001600160a01b0316915063e30443bc9050846124ab81611191565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156124f157600080fd5b505af1158015612505573d6000803e3d6000fd5b5050600554600160a81b900460ff16159150508015612522575080155b156125eb576029546006546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c479906024016060604051808303816000875af1925050508015612594575060408051601f3d908101601f19168201909252612591918101906134ea565b60015b15610cf95760408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a3505050505b50505050565b600081848411156126155760405162461bcd60e51b8152600401610c949190612ff3565b506126208385613518565b949350505050565b6001600160a01b0382166126885760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610c94565b6126c581604051806060016040528060228152602001613680602291396001600160a01b03851660009081526020819052604090205491906125f1565b6001600160a01b0383166000908152602081905260409020556002546126eb9082612e32565b6002556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b60008260000361274557506000610c5e565b60006127518385613429565b90508261275e8583613440565b14611be45760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610c94565b6001600160a01b0382166000908152600a602052604090205481151560ff9091161515036128565760405162461bcd60e51b815260206004820152604260248201527f53504143454150453a204175746f6d61746564206d61726b6574206d616b657260448201527f207061697220697320616c72656164792073657420746f20746861742076616c606482015261756560f01b608482015260a401610c94565b6001600160a01b0382166000818152600a60205260409020805460ff19168315801591909117909155600c80546001600160a01b0319169092179091556128f75760065460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b1580156128de57600080fd5b505af11580156128f2573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6001600160a01b0383166129595760405162461bcd60e51b8152600401610c9490613462565b6001600160a01b03821661297f5760405162461bcd60e51b8152600401610c94906134a7565b6129bc816040518060600160405280602681526020016136a2602691396001600160a01b03861660009081526020819052604090205491906125f1565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546129eb9082611b85565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101611d03565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612a7157612a716133d1565b6001600160a01b03928316602091820292909201810191909152600b54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612aca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aee9190613343565b81600181518110612b0157612b016133d1565b60200260200101906001600160a01b031690816001600160a01b0316815250506000612b2c30611191565b600b54909150612b479030906001600160a01b031683611beb565b600b546040516318cbafe560e01b815247916001600160a01b0316906318cbafe590612b8090859060009088903090429060040161356f565b6000604051808303816000875af1158015612b9f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612bc791908101906135ab565b506000612bd44783612e32565b90506000612be860646122b184602d612733565b90506000612c076017546122b16022548561273390919063ffffffff16565b90506000612c266017546122b16022548661273390919063ffffffff16565b90506000612c3e82612c388686612e32565b90612e32565b600e546040519192506001600160a01b03169082156108fc029083906000818181858888f19350505050158015612c79573d6000803e3d6000fd5b50600f546040516001600160a01b039091169084156108fc029085906000818181858888f19350505050158015612cb4573d6000803e3d6000fd5b506010546040516001600160a01b039091169083156108fc029084906000818181858888f19350505050158015612cef573d6000803e3d6000fd5b50612cf8612e8e565b600d546006546040516370a0823160e01b81526001600160a01b03918216600482015260009291909116906370a0823190602401602060405180830381865afa158015612d49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d6d9190613631565b600654604051638ac1f42560e01b8152600481018390529192506001600160a01b031690638ac1f42590602401600060405180830381600087803b158015612db457600080fd5b505af1158015612dc8573d6000803e3d6000fd5b50505050505050505050505050565b6000808211612e285760405162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f0000000000006044820152606401610c94565b611be48284613440565b600082821115612e845760405162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006044820152606401610c94565b611be48284613518565b6040805160028082526060820183526000926020830190803683375050600b54604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015612ef8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f1c9190613343565b81600081518110612f2f57612f2f6133d1565b6001600160a01b039283166020918202929092010152600d54825191169082906001908110612f6057612f606133d1565b6001600160a01b039283166020918202929092010152600b54600654604051637ff36ab560e01b815291831692637ff36ab5924792612fac92600092889290911690429060040161364a565b60006040518083038185885af1158015612fca573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f191682016040526110c891908101906135ab565b600060208083528351808285015260005b8181101561302057858101830151858201604001528201613004565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610e2757600080fd5b60006020828403121561306857600080fd5b8135611be481613041565b6000806040838503121561308657600080fd5b823561309181613041565b946020939093013593505050565b6000602082840312156130b157600080fd5b5035919050565b6000806000606084860312156130cd57600080fd5b83356130d881613041565b925060208401356130e881613041565b929592945050506040919091013590565b6000806000806080858703121561310f57600080fd5b843561311a81613041565b9350602085013561312a81613041565b9250604085013561313a81613041565b9150606085013561314a81613041565b939692955090935050565b8015158114610e2757600080fd5b6000806040838503121561317657600080fd5b823561318181613041565b9150602083013561319181613155565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156131db576131db61319c565b604052919050565b600067ffffffffffffffff8211156131fd576131fd61319c565b5060051b60200190565b6000602080838503121561321a57600080fd5b823567ffffffffffffffff81111561323157600080fd5b8301601f8101851361324257600080fd5b8035613255613250826131e3565b6131b2565b81815260059190911b8201830190838101908783111561327457600080fd5b928401925b8284101561329b57833561328c81613041565b82529284019290840190613279565b979650505050505050565b600080604083850312156132b957600080fd5b82356132c481613041565b9150602083013561319181613041565b600181811c908216806132e857607f821691505b60208210810361330857634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60006020828403121561335557600080fd5b8151611be481613041565b60006020828403121561337257600080fd5b8151611be481613155565b60208082526034908201527f53504143454150453a204163636f756e7420697320616c7265616479207468656040820152732076616c7565206f6620276578636c756465642760601b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161340f5761340f6133e7565b5060010190565b80820180821115610c5e57610c5e6133e7565b8082028115828204841417610c5e57610c5e6133e7565b60008261345d57634e487b7160e01b600052601260045260246000fd5b500490565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6000806000606084860312156134ff57600080fd5b8351925060208401519150604084015190509250925092565b81810381811115610c5e57610c5e6133e7565b600081518084526020808501945080840160005b838110156135645781516001600160a01b03168752958201959082019060010161353f565b509495945050505050565b85815284602082015260a06040820152600061358e60a083018661352b565b6001600160a01b0394909416606083015250608001529392505050565b600060208083850312156135be57600080fd5b825167ffffffffffffffff8111156135d557600080fd5b8301601f810185136135e657600080fd5b80516135f4613250826131e3565b81815260059190911b8201830190838101908783111561361357600080fd5b928401925b8284101561329b57835182529284019290840190613618565b60006020828403121561364357600080fd5b5051919050565b848152608060208201526000613663608083018661352b565b6001600160a01b0394909416604083015250606001529291505056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212200de0f0d3b55e188991b9f0ca9fac87845eee79208a6c20c0ee0ab97494cf3a3064736f6c63430008110033
Deployed Bytecode Sourcemap
61042:18779:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61967:39;;;;;;;;;;;;;;;;;;;160:25:1;;;148:2;133:18;61967:39:0;;;;;;;;62013:29;;;;;;;;;;;;;;;;62295:30;;;;;;;;;;;;;;;;61937:21;;;;;;;;;;;;;;;;14835:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;61261:67::-;;;;;;;;;;-1:-1:-1;61261:67:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1302:14:1;;1295:22;1277:41;;1265:2;1250:18;61261:67:0;1137:187:1;17130:210:0;;;;;;;;;;-1:-1:-1;17130:210:0;;;;;:::i;:::-;;:::i;67727:150::-;;;;;;;;;;-1:-1:-1;67727:150:0;;;;;:::i;:::-;;:::i;:::-;;63453:42;;;;;;;;;;-1:-1:-1;63453:42:0;;;;;;;-1:-1:-1;;;;;63453:42:0;;;;;;-1:-1:-1;;;;;1813:32:1;;;1795:51;;1783:2;1768:18;63453:42:0;1649:203:1;61601:41:0;;;;;;;;;;-1:-1:-1;61601:41:0;;;;-1:-1:-1;;;;;61601:41:0;;;68447:264;;;;;;;;;;-1:-1:-1;68447:264:0;;;;;:::i;:::-;;:::i;15942:108::-;;;;;;;;;;-1:-1:-1;16030:12:0;;15942:108;;62162:38;;;;;;;;;;;;;;;;62124:31;;;;;;;;;;;;;;;;62466;;;;;;;;;;;;;;;;69887:153;;;;;;;;;;-1:-1:-1;69887:153:0;;;;;:::i;:::-;;:::i;17822:454::-;;;;;;;;;;-1:-1:-1;17822:454:0;;;;;:::i;:::-;;:::i;63504:38::-;;;;;;;;;;;;;;;;61150:43;;;;;;;;;;-1:-1:-1;61150:43:0;;;;-1:-1:-1;;;;;61150:43:0;;;15786:91;;;;;;;;;;-1:-1:-1;15860:9:0;;15786:91;;15860:9;;;;3125:36:1;;3113:2;3098:18;15786:91:0;2983:184:1;61822:19:0;;;;;;;;;;-1:-1:-1;61822:19:0;;;;-1:-1:-1;;;;;61822:19:0;;;18685:300;;;;;;;;;;-1:-1:-1;18685:300:0;;;;;:::i;:::-;;:::i;62583:37::-;;;;;;;;;;;;;;;;70671:85;;;;;;;;;;-1:-1:-1;70671:85:0;;;;;:::i;:::-;;:::i;62903:50::-;;;;;;;;;;-1:-1:-1;62903:50:0;;;;;;;;61900:28;;;;;;;;;;-1:-1:-1;61900:28:0;;;;-1:-1:-1;;;;;61900:28:0;;;61649;;;;;;;;;;-1:-1:-1;61649:28:0;;;;-1:-1:-1;;;;;61649:28:0;;;70048:126;;;;;;;;;;-1:-1:-1;70048:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;70138:28:0;70114:4;70138:28;;;:19;:28;;;;;;;;;70048:126;69443:257;;;;;;;;;;-1:-1:-1;69443:257:0;;;;;:::i;:::-;;:::i;69708:171::-;;;;;;;;;;-1:-1:-1;69708:171:0;;;;;:::i;:::-;;:::i;61766:23::-;;;;;;;;;;-1:-1:-1;61766:23:0;;;;-1:-1:-1;;;;;61766:23:0;;;67232:354;;;;;;;;;;-1:-1:-1;67232:354:0;;;;;:::i;:::-;;:::i;79671:147::-;;;;;;;;;;-1:-1:-1;79671:147:0;;;;;:::i;:::-;;:::i;76423:150::-;;;;;;;;;;-1:-1:-1;76423:150:0;;;;;:::i;:::-;;:::i;62334:31::-;;;;;;;;;;;;;;;;69262:173;;;;;;;;;;;;;:::i;16113:177::-;;;;;;;;;;-1:-1:-1;16113:177:0;;;;;:::i;:::-;;:::i;24986:148::-;;;;;;;;;;;;;:::i;61686:71::-;;;;;;;;;;-1:-1:-1;61686:71:0;;;;-1:-1:-1;;;;;61686:71:0;;;66212:938;;;;;;;;;;-1:-1:-1;66212:938:0;;;;;:::i;:::-;;:::i;70182:147::-;;;;;;;;;;-1:-1:-1;70182:147:0;;;;;:::i;:::-;;:::i;24763:87::-;;;;;;;;;;-1:-1:-1;24836:6:0;;;;;-1:-1:-1;;;;;24836:6:0;24763:87;;70337:326;;;;;;;;;;-1:-1:-1;70337:326:0;;;;;:::i;:::-;;:::i;15045:95::-;;;;;;;;;;;;;:::i;62249:39::-;;;;;;;;;;;;;;;;78761:326;;;;;;;;;;-1:-1:-1;78761:326:0;;;;;:::i;:::-;;:::i;62854:40::-;;;;;;;;;;;;;;;;19488:400;;;;;;;;;;-1:-1:-1;19488:400:0;;;;;:::i;:::-;;:::i;16503:216::-;;;;;;;;;;-1:-1:-1;16503:216:0;;;;;:::i;:::-;;:::i;68719:339::-;;;;;;;;;;-1:-1:-1;68719:339:0;;;;;:::i;:::-;;:::i;61848:45::-;;;;;;;;;;-1:-1:-1;61848:45:0;;;;-1:-1:-1;;;;;61848:45:0;;;62207:35;;;;;;;;;;;;;;;;67885:146;;;;;;;;;;-1:-1:-1;67885:146:0;;;;;:::i;:::-;;:::i;61535:57::-;;;;;;;;;;-1:-1:-1;61535:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;69066:188;;;;;;;;;;-1:-1:-1;69066:188:0;;;;;:::i;:::-;;:::i;62740:31::-;;;;;;;;;;;;;;;;62691:40;;;;;;;;;;-1:-1:-1;62691:40:0;;;;;;;;61796:19;;;;;;;;;;-1:-1:-1;61796:19:0;;;;-1:-1:-1;;;;;61796:19:0;;;62372:36;;;;;;;;;;;;;;;;16782:201;;;;;;;;;;-1:-1:-1;16782:201:0;;;;;:::i;:::-;-1:-1:-1;;;;;16948:18:0;;;16916:7;16948:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;16782:201;62812:33;;;;;;;;;;;;;;;;68095:289;;;;;;;;;;-1:-1:-1;68095:289:0;;;;;:::i;:::-;;:::i;62415:44::-;;;;;;;;;;;;;;;;25142:281;;;;;;;;;;-1:-1:-1;25142:281:0;;;;;:::i;:::-;;:::i;62049:28::-;;;;;;;;;;;;;;;;14835:91;14880:13;14913:5;14906:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14835:91;:::o;17130:210::-;17249:4;17271:39;12505:10;17294:7;17303:6;17271:8;:39::i;:::-;-1:-1:-1;17328:4:0;17130:210;;;;;:::o;67727:150::-;24836:6;;-1:-1:-1;;;;;24836:6:0;;;;;12505:10;24898:23;24890:68;;;;-1:-1:-1;;;24890:68:0;;;;;;;:::i;:::-;;;;;;;;;67812:15:::1;::::0;:57:::1;::::0;-1:-1:-1;;;67812:57:0;;-1:-1:-1;;;;;1813:32:1;;;67812:57:0::1;::::0;::::1;1795:51:1::0;67812:15:0;;::::1;::::0;:36:::1;::::0;1768:18:1;;67812:57:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;67727:150:::0;:::o;68447:264::-;24836:6;;-1:-1:-1;;;;;24836:6:0;;;;;12505:10;24898:23;24890:68;;;;-1:-1:-1;;;24890:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;68537:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;::::1;;:37;;::::0;;68515:141:::1;;;::::0;-1:-1:-1;;;68515:141:0;;7270:2:1;68515:141:0::1;::::0;::::1;7252:21:1::0;7309:2;7289:18;;;7282:30;7348:34;7328:18;;;7321:62;-1:-1:-1;;;7399:18:1;;;7392:52;7461:19;;68515:141:0::1;7068:418:1::0;68515:141:0::1;-1:-1:-1::0;;;;;68667:28:0::1;68698:5;68667:28:::0;;;:19:::1;:28;::::0;;;;:36;;-1:-1:-1;;68667:36:0::1;::::0;;68447:264::o;69887:153::-;24836:6;;-1:-1:-1;;;;;24836:6:0;;;;;12505:10;24898:23;24890:68;;;;-1:-1:-1;;;24890:68:0;;;;;;;:::i;:::-;69976:1:::1;69966:6;:11;;69958:20;;;::::0;::::1;;69989:9;:18:::0;;;70018:14:::1;:12;:14::i;:::-;69887:153:::0;:::o;17822:454::-;17962:4;17979:36;17989:6;17997:9;18008:6;17979:9;:36::i;:::-;18026:220;18049:6;12505:10;18097:138;18153:6;18097:138;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18097:19:0;;;;;;:11;:19;;;;;;;;12505:10;18097:33;;;;;;;;;;:37;:138::i;:::-;18026:8;:220::i;:::-;-1:-1:-1;18264:4:0;17822:454;;;;;:::o;18685:300::-;12505:10;18800:4;18894:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;18894:34:0;;;;;;;;;;18800:4;;18822:133;;18872:7;;18894:50;;18933:10;18894:38;:50::i;70671:85::-;70721:27;12505:10;70727:12;70741:6;70721:5;:27::i;69443:257::-;24836:6;;-1:-1:-1;;;;;24836:6:0;;;;;12505:10;24898:23;24890:68;;;;-1:-1:-1;;;24890:68:0;;;;;;;:::i;:::-;69593:4:::1;:12:::0;;-1:-1:-1;;;;;;69593:12:0;;::::1;-1:-1:-1::0;;;;;69593:12:0;;::::1;;::::0;;;69616:4:::1;:12:::0;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;69639:8:::1;:15:::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;69667:17:::1;-1:-1:-1::0;69667:17:0;;;:9:::1;:17;::::0;;;;:25;;-1:-1:-1;;69667:25:0::1;::::0;;69443:257::o;69708:171::-;24836:6;;-1:-1:-1;;;;;24836:6:0;;;;;12505:10;24898:23;24890:68;;;;-1:-1:-1;;;24890:68:0;;;;;;;:::i;:::-;69806:1:::1;69796:6;:11;;69788:20;;;::::0;::::1;;69819:18;:27:::0;;;69857:14:::1;:12;:14::i;67232:354::-:0;24836:6;;-1:-1:-1;;;;;24836:6:0;;;;;12505:10;24898:23;24890:68;;;;-1:-1:-1;;;24890:68:0;;;;;;;:::i;:::-;67355:15:::1;::::0;-1:-1:-1;;;;;67355:15:0;;::::1;67333:38:::0;;::::1;::::0;67311:133:::1;;;::::0;-1:-1:-1;;;67311:133:0;;7693:2:1;67311:133:0::1;::::0;::::1;7675:21:1::0;7732:2;7712:18;;;7705:30;7771:34;7751:18;;;7744:62;-1:-1:-1;;;7822:18:1;;;7815:43;7875:19;;67311:133:0::1;7491:409:1::0;67311:133:0::1;67502:15;::::0;67460:59:::1;::::0;-1:-1:-1;;;;;67502:15:0;;::::1;::::0;67460:59;::::1;::::0;::::1;::::0;67502:15:::1;::::0;67460:59:::1;67530:15;:48:::0;;-1:-1:-1;;;;;;67530:48:0::1;-1:-1:-1::0;;;;;67530:48:0;;;::::1;::::0;;;::::1;::::0;;67232:354::o;79671:147::-;79727:19;79749:18;:6;79760;79749:10;:18::i;:::-;79727:40;-1:-1:-1;79778:32:0;12505:10;79784:12;12409:115;79778:32;79716:102;79671:147;:::o;76423:150::-;24836:6;;-1:-1:-1;;;;;24836:6:0;;;;;12505:10;24898:23;24890:68;;;;-1:-1:-1;;;24890:68:0;;;;;;;:::i;:::-;76508:14:::1;:32:::0;;;76551:14:::1;:12;:14::i;69262:173::-:0;24836:6;;-1:-1:-1;;;;;24836:6:0;;;;;12505:10;24898:23;24890:68;;;;-1:-1:-1;;;24890:68:0;;;;;;;:::i;:::-;69325:21:::1;::::0;::::1;;69317:58;;;::::0;-1:-1:-1;;;69317:58:0;;8107:2:1;69317:58:0::1;::::0;::::1;8089:21:1::0;8146:2;8126:18;;;8119:30;8185:26;8165:18;;;8158:54;8229:18;;69317:58:0::1;7905:348:1::0;69317:58:0::1;69412:15;69386:23;:41:::0;69262:173::o;16113:177::-;-1:-1:-1;;;;;16264:18:0;16232:7;16264:18;;;;;;;;;;;;16113:177::o;24986:148::-;24836:6;;-1:-1:-1;;;;;24836:6:0;;;;;12505:10;24898:23;24890:68;;;;-1:-1:-1;;;24890:68:0;;;;;;;:::i;:::-;25077:6:::1;::::0;25056:40:::1;::::0;25093:1:::1;::::0;25077:6:::1;::::0;::::1;-1:-1:-1::0;;;;;25077:6:0::1;::::0;25056:40:::1;::::0;25093:1;;25056:40:::1;25107:6;:19:::0;;-1:-1:-1;;;;;;25107:19:0::1;::::0;;24986:148::o;66212:938::-;24836:6;;-1:-1:-1;;;;;24836:6:0;;;;;12505:10;24898:23;24890:68;;;;-1:-1:-1;;;24890:68:0;;;;;;;:::i;:::-;66335:15:::1;::::0;-1:-1:-1;;;;;66335:15:0;;::::1;66313:38:::0;;::::1;::::0;66291:143:::1;;;::::0;-1:-1:-1;;;66291:143:0;;8460:2:1;66291:143:0::1;::::0;::::1;8442:21:1::0;8499:2;8479:18;;;8472:30;8538:34;8518:18;;;8511:62;8609:25;8589:18;;;8582:53;8652:19;;66291:143:0::1;8258:419:1::0;66291:143:0::1;66447:39;66532:10;66447:107;;66627:4;-1:-1:-1::0;;;;;66589:43:0::1;:18;-1:-1:-1::0;;;;;66589:24:0::1;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;66589:43:0::1;;66567:168;;;::::0;-1:-1:-1;;;66567:168:0;;9140:2:1;66567:168:0::1;::::0;::::1;9122:21:1::0;9179:2;9159:18;;;9152:30;9218:34;9198:18;;;9191:62;9289:34;9269:18;;;9262:62;-1:-1:-1;;;9340:19:1;;;9333:42;9392:19;;66567:168:0::1;8938:479:1::0;66567:168:0::1;66748:68;::::0;-1:-1:-1;;;66748:68:0;;-1:-1:-1;;;;;66748:39:0;::::1;:68;::::0;::::1;1795:51:1::0;;;66748:39:0;::::1;::::0;1768:18:1;;66748:68:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;66827:54:0::1;::::0;-1:-1:-1;;;66827:54:0;;66875:4:::1;66827:54;::::0;::::1;1795:51:1::0;-1:-1:-1;;;;;66827:39:0;::::1;::::0;-1:-1:-1;66827:39:0::1;::::0;-1:-1:-1;1768:18:1;;66827:54:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;66892:18;-1:-1:-1::0;;;;;66892:39:0::1;;66932:7;24836:6:::0;;-1:-1:-1;;;;;24836:6:0;;;;;;24763:87;66932:7:::1;66892:48;::::0;-1:-1:-1;;;;;;66892:48:0::1;::::0;;;;;;-1:-1:-1;;;;;1813:32:1;;;66892:48:0::1;::::0;::::1;1795:51:1::0;1768:18;;66892:48:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;66999:15:0::1;::::0;66951:65:::1;::::0;-1:-1:-1;;;66951:65:0;;-1:-1:-1;;;;;66999:15:0;;::::1;66951:65;::::0;::::1;1795:51:1::0;66951:39:0;;::::1;::::0;-1:-1:-1;66951:39:0::1;::::0;-1:-1:-1;1768:18:1;;66951:65:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;67076:15:0::1;::::0;67034:59:::1;::::0;-1:-1:-1;;;;;67076:15:0;;::::1;::::0;-1:-1:-1;67034:59:0;;::::1;::::0;-1:-1:-1;67034:59:0::1;::::0;67076:15:::1;::::0;67034:59:::1;67106:15;:36:::0;;-1:-1:-1;;;;;;67106:36:0::1;-1:-1:-1::0;;;;;67106:36:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;66212:938:0:o;70182:147::-;70274:15;;:47;;-1:-1:-1;;;70274:47:0;;-1:-1:-1;;;;;1813:32:1;;;70274:47:0;;;1795:51:1;70250:4:0;;70274:15;;:38;;1768:18:1;;70274:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;70337:326::-;24836:6;;-1:-1:-1;;;;;24836:6:0;;;;;12505:10;24898:23;24890:68;;;;-1:-1:-1;;;24890:68:0;;;;;;;:::i;:::-;70462:13:::1;::::0;-1:-1:-1;;;;;70462:13:0;;::::1;70442:33:::0;;::::1;::::0;70420:137:::1;;;::::0;-1:-1:-1;;;70420:137:0;;9874:2:1;70420:137:0::1;::::0;::::1;9856:21:1::0;9913:2;9893:18;;;9886:30;9952:34;9932:18;;;9925:62;-1:-1:-1;;;10003:18:1;;;9996:52;10065:19;;70420:137:0::1;9672:418:1::0;70420:137:0::1;-1:-1:-1::0;;;;;70568:37:0::1;;::::0;;;:19:::1;:37;::::0;;;;:44;;-1:-1:-1;;70568:44:0::1;70608:4;70568:44;::::0;;70623:13:::1;:32:::0;;-1:-1:-1;;;;;;70623:32:0::1;::::0;;::::1;::::0;;70337:326::o;15045:95::-;15092:13;15125:7;15118:14;;;;;:::i;78761:326::-;24836:6;;-1:-1:-1;;;;;24836:6:0;;;;;12505:10;24898:23;24890:68;;;;-1:-1:-1;;;24890:68:0;;;;;;;:::i;:::-;78907:13:::1;::::0;-1:-1:-1;;;;;78907:13:0;;::::1;78899:21:::0;;::::1;::::0;78877:150:::1;;;::::0;-1:-1:-1;;;78877:150:0;;10297:2:1;78877:150:0::1;::::0;::::1;10279:21:1::0;10336:2;10316:18;;;10309:30;10375:34;10355:18;;;10348:62;10446:34;10426:18;;;10419:62;-1:-1:-1;;;10497:19:1;;;10490:46;10553:19;;78877:150:0::1;10095:483:1::0;78877:150:0::1;79038:41;79067:4;79073:5;79038:28;:41::i;19488:400::-:0;19608:4;19630:228;12505:10;19680:7;19702:145;19759:15;19702:145;;;;;;;;;;;;;;;;;12505:10;19702:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;19702:34:0;;;;;;;;;;;;:38;:145::i;16503:216::-;16625:4;16647:42;12505:10;16671:9;16682:6;16647:9;:42::i;68719:339::-;24836:6;;-1:-1:-1;;;;;24836:6:0;;;;;12505:10;24898:23;24890:68;;;;-1:-1:-1;;;24890:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;68858:43:0;::::1;;::::0;;;:35:::1;:43;::::0;;;;;::::1;;:51;;:43:::0;:51;68836:153:::1;;;;-1:-1:-1::0;;;68836:153:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;69000:43:0;;;::::1;;::::0;;;:35:::1;:43;::::0;;;;:50;;-1:-1:-1;;69000:50:0::1;::::0;::::1;;::::0;;;::::1;::::0;;68719:339::o;67885:146::-;24836:6;;-1:-1:-1;;;;;24836:6:0;;;;;12505:10;24898:23;24890:68;;;;-1:-1:-1;;;24890:68:0;;;;;;;:::i;:::-;67968:15:::1;::::0;:55:::1;::::0;-1:-1:-1;;;67968:55:0;;-1:-1:-1;;;;;1813:32:1;;;67968:55:0::1;::::0;::::1;1795:51:1::0;67968:15:0;;::::1;::::0;:34:::1;::::0;1768:18:1;;67968:55:0::1;1649:203:1::0;69066:188:0;24836:6;;-1:-1:-1;;;;;24836:6:0;;;;;12505:10;24898:23;24890:68;;;;-1:-1:-1;;;24890:68:0;;;;;;;:::i;:::-;69152:9:::1;69147:100;69171:7;:14;69167:1;:18;69147:100;;;69231:4;69207:9;:21;69217:7;69225:1;69217:10;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;69207:21:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;69207:21:0;:28;;-1:-1:-1;;69207:28:0::1;::::0;::::1;;::::0;;;::::1;::::0;;69187:3;::::1;::::0;::::1;:::i;:::-;;;;69147:100;;68095:289:::0;24836:6;;-1:-1:-1;;;;;24836:6:0;;;;;12505:10;24898:23;24890:68;;;;-1:-1:-1;;;24890:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;68196:37:0;::::1;;::::0;;;:19:::1;:37;::::0;;;;;::::1;;:45;;:37:::0;:45;68174:147:::1;;;;-1:-1:-1::0;;;68174:147:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;68332:37:0::1;;::::0;;;:19:::1;:37;::::0;;;;:44;;-1:-1:-1;;68332:44:0::1;68372:4;68332:44;::::0;;68095:289::o;25142:281::-;24836:6;;-1:-1:-1;;;;;24836:6:0;;;;;12505:10;24898:23;24890:68;;;;-1:-1:-1;;;24890:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;25245:22:0;::::1;25223:110;;;::::0;-1:-1:-1;;;25223:110:0;;11610:2:1;25223:110:0::1;::::0;::::1;11592:21:1::0;11649:2;11629:18;;;11622:30;11688:34;11668:18;;;11661:62;-1:-1:-1;;;11739:18:1;;;11732:36;11785:19;;25223:110:0::1;11408:402:1::0;25223:110:0::1;25370:6;::::0;25349:38:::1;::::0;-1:-1:-1;;;;;25349:38:0;;::::1;::::0;25370:6:::1;::::0;::::1;;::::0;25349:38:::1;::::0;;;::::1;25398:6;:17:::0;;-1:-1:-1;;;;;25398:17:0;;::::1;;;-1:-1:-1::0;;;;;;25398:17:0;;::::1;::::0;;;::::1;::::0;;25142:281::o;7607:179::-;7665:7;;7697:5;7701:1;7697;:5;:::i;:::-;7685:17;;7726:1;7721;:6;;7713:46;;;;-1:-1:-1;;;7713:46:0;;12147:2:1;7713:46:0;;;12129:21:1;12186:2;12166:18;;;12159:30;12225:29;12205:18;;;12198:57;12272:18;;7713:46:0;11945:351:1;7713:46:0;7777:1;7607:179;-1:-1:-1;;;7607:179:0:o;22874:380::-;-1:-1:-1;;;;;23010:19:0;;23002:68;;;;-1:-1:-1;;;23002:68:0;;12503:2:1;23002:68:0;;;12485:21:1;12542:2;12522:18;;;12515:30;12581:34;12561:18;;;12554:62;-1:-1:-1;;;12632:18:1;;;12625:34;12676:19;;23002:68:0;12301:400:1;23002:68:0;-1:-1:-1;;;;;23089:21:0;;23081:68;;;;-1:-1:-1;;;23081:68:0;;12908:2:1;23081:68:0;;;12890:21:1;12947:2;12927:18;;;12920:30;12986:34;12966:18;;;12959:62;-1:-1:-1;;;13037:18:1;;;13030:32;13079:19;;23081:68:0;12706:398:1;23081:68:0;-1:-1:-1;;;;;23162:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;23214:32;;160:25:1;;;23214:32:0;;133:18:1;23214:32:0;;;;;;;;22874:380;;;:::o;76146:269::-;76248:3;76226:18;;76217:6;;:27;;;;:::i;:::-;76216:35;;;;:::i;:::-;76189:24;:62;76298:14;;76284:6;;:10;;76293:1;76284:10;:::i;:::-;76283:29;;;;:::i;:::-;76262:18;:50;76391:9;;76382:6;;76404:3;;76382:18;;;:::i;:::-;76381:26;;;;:::i;:::-;76364:14;:43;76146:269::o;70826:5312::-;-1:-1:-1;;;;;71065:18:0;;71057:68;;;;-1:-1:-1;;;71057:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;71144:16:0;;71136:64;;;;-1:-1:-1;;;71136:64:0;;;;;;;:::i;:::-;71217:21;;;;:41;;;;-1:-1:-1;;;;;;71243:15:0;;;;;;:9;:15;;;;;;;;71242:16;71217:41;:59;;;;-1:-1:-1;;;;;;71263:13:0;;;;;;:9;:13;;;;;;;;71262:14;71217:59;71213:449;;;71327:1;71301:23;;:27;71293:59;;;;-1:-1:-1;;;71293:59:0;;14516:2:1;71293:59:0;;;14498:21:1;14555:2;14535:18;;;14528:30;-1:-1:-1;;;14574:18:1;;;14567:49;14633:18;;71293:59:0;14314:343:1;71293:59:0;71426:23;;71386:3;;71367:16;;71426:37;;71386:3;71426:27;:37::i;:::-;71404:59;;71523:11;71504:15;:30;;71478:128;;;;-1:-1:-1;;;71478:128:0;;14864:2:1;71478:128:0;;;14846:21:1;14903:2;14883:18;;;14876:30;14942:34;14922:18;;;14915:62;-1:-1:-1;;;14993:18:1;;;14986:34;15037:19;;71478:128:0;14662:400:1;71478:128:0;-1:-1:-1;;71621:21:0;:29;;-1:-1:-1;;71621:29:0;;;71213:449;24836:6;;-1:-1:-1;;;;;71690:15:0;;;24836:6;;;;;71690:15;;;;:45;;-1:-1:-1;24836:6:0;;-1:-1:-1;;;;;71722:13:0;;;24836:6;;;;;71722:13;;71690:45;:78;;;;-1:-1:-1;;;;;;71752:16:0;;;;71690:78;:116;;;;-1:-1:-1;;;;;;71785:21:0;;71799:6;71785:21;;71690:116;:142;;;;-1:-1:-1;71824:8:0;;-1:-1:-1;;;71824:8:0;;;;71823:9;71690:142;71672:1219;;;-1:-1:-1;;;;;71905:31:0;;;;;;:25;:31;;;;;;;;:92;;;;-1:-1:-1;;;;;;71958:39:0;;;;;;:35;:39;;;;;;;;71957:40;71905:92;:143;;;;-1:-1:-1;;;;;;72019:29:0;;;;;;:25;:29;;;;;;;;72018:30;71905:143;71883:997;;;72139:14;;72122:13;72132:2;72122:9;:13::i;:::-;72113:22;;:6;:22;:::i;:::-;:40;;72083:133;;;;-1:-1:-1;;;72083:133:0;;15269:2:1;72083:133:0;;;15251:21:1;15308:2;15288:18;;;15281:30;-1:-1:-1;;;15327:18:1;;;15320:49;15386:18;;72083:133:0;15067:343:1;72083:133:0;71883:997;;;-1:-1:-1;;;;;72298:29:0;;;;;;:25;:29;;;;;;;;:92;;;;-1:-1:-1;;;;;;72349:41:0;;;;;;:35;:41;;;;;;;;72348:42;72298:92;:145;;;;-1:-1:-1;;;;;;72412:31:0;;;;;;:25;:31;;;;;;;;72411:32;72298:145;72276:604;;;72518:24;;72508:6;:34;;72478:166;;;;-1:-1:-1;;;72478:166:0;;15617:2:1;72478:166:0;;;15599:21:1;15656:2;15636:18;;;15629:30;15695:34;15675:18;;;15668:62;15766:28;15746:18;;;15739:56;15812:19;;72478:166:0;15415:422:1;72276:604:0;-1:-1:-1;;;;;72671:39:0;;;;;;:35;:39;;;;;;;;72666:214;;72787:14;;72770:13;72780:2;72770:9;:13::i;:::-;72761:22;;:6;:22;:::i;:::-;:40;;72731:133;;;;-1:-1:-1;;;72731:133:0;;15269:2:1;72731:133:0;;;15251:21:1;15308:2;15288:18;;;15281:30;-1:-1:-1;;;15327:18:1;;;15320:49;15386:18;;72731:133:0;15067:343:1;72731:133:0;72946:6;72956:1;72946:11;72942:93;;72974:28;72990:4;72996:2;73000:1;72974:15;:28::i;:::-;70826:5312;;;:::o;72942:93::-;-1:-1:-1;;;;;73126:25:0;;73113:10;73126:25;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;73155:23:0;;;;;;:19;:23;;;;;;;;73126:52;73243:8;;73113:65;;-1:-1:-1;;;;73243:8:0;;;;73242:9;:19;;;;;73256:5;73255:6;73242:19;73238:638;;;73350:23;73376:24;73394:4;73376:9;:24::i;:::-;73350:50;;73541:18;;73522:15;:37;73518:347;;73663:8;;-1:-1:-1;;;73663:8:0;;;;73662:9;:45;;;;-1:-1:-1;;;;;;73676:31:0;;;;;;:25;:31;;;;;;;;73675:32;73662:45;73658:192;;;73732:8;:15;;-1:-1:-1;;;;73732:15:0;-1:-1:-1;;;73732:15:0;;;73770:21;:19;:21::i;:::-;73814:8;:16;;-1:-1:-1;;;;73814:16:0;;;73658:192;73263:613;73238:638;73892:5;:17;;;-1:-1:-1;73901:8:0;;-1:-1:-1;;;73901:8:0;;;;73892:17;73888:1485;;;73926:33;73942:4;73948:2;73952:6;73926:15;:33::i;:::-;73888:1485;;;73992:12;74007:42;74040:8;;74007:28;74018:16;;74007:6;:10;;:28;;;;:::i;:::-;:32;;:42::i;:::-;73992:57;;74064:23;74090:80;74139:16;;74090:26;74099:16;;74090:4;:8;;:26;;;;:::i;:80::-;74064:106;;74185:18;74206:43;74232:16;;74206:21;74215:11;;74206:4;:8;;:21;;;;:::i;:43::-;-1:-1:-1;;;;;74268:29:0;;;;;;:25;:29;;;;;;74185:64;;-1:-1:-1;74268:29:0;;74264:330;;;74318:52;74327:42;74360:8;;74327:28;74338:16;;74327:6;:10;;:28;;;;:::i;:42::-;74318:4;;:8;:52::i;:::-;;74389:110;74431:49;74463:16;;74431:27;74440:17;;74431:4;:8;;:27;;;;:::i;:49::-;74389:15;;:19;:110::i;:::-;;74518:60;74533:44;74560:16;;74533:22;74542:12;;74533:4;:8;;:22;;;;:::i;:44::-;74518:10;;:14;:60::i;:::-;;74264:330;74627:16;;:37;;74648:15;74627:20;:37::i;:::-;74608:16;:56;74683:8;;74679:625;;74712:42;74728:4;74742;74749;74712:15;:42::i;:::-;74777:14;;74773:214;;74816:32;74830:4;74837:10;74816:5;:32::i;:::-;16030:12;;74871:6;:22;74916:14;:12;:14::i;:::-;-1:-1:-1;74966:1:0;74773:214;75009:31;;;;75005:284;;;75147:13;;75187:16;;75065:161;;75115:4;;-1:-1:-1;;;;;75147:13:0;;;;75065:15;:161::i;:::-;75268:1;75249:16;:20;75005:284;75318:43;75334:4;75340:2;75344:16;:6;75355:4;75344:10;:16::i;:::-;75318:15;:43::i;:::-;73977:1396;;;73888:1485;75447:15;;-1:-1:-1;;;;;75447:15:0;:26;75482:4;75489:15;75482:4;75489:9;:15::i;:::-;75447:58;;-1:-1:-1;;;;;;75447:58:0;;;;;;;-1:-1:-1;;;;;16050:32:1;;;75447:58:0;;;16032:51:1;16099:18;;;16092:34;16005:18;;75447:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;75516:15:0;;-1:-1:-1;;;;;75516:15:0;;-1:-1:-1;75516:26:0;;-1:-1:-1;75551:2:0;75556:13;75551:2;75556:9;:13::i;:::-;75516:54;;-1:-1:-1;;;;;;75516:54:0;;;;;;;-1:-1:-1;;;;;16050:32:1;;;75516:54:0;;;16032:51:1;16099:18;;;16092:34;16005:18;;75516:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;75588:8:0;;-1:-1:-1;;;75588:8:0;;;;75587:9;;-1:-1:-1;;75587:19:0;;;;;75601:5;75600:6;75587:19;75583:548;;;75637:16;;75672:15;;:28;;-1:-1:-1;;;;;;75672:28:0;;;;;160:25:1;;;-1:-1:-1;;;;;75672:15:0;;;;:23;;133:18:1;;75672:28:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;75672:28:0;;;;;;;;-1:-1:-1;;75672:28:0;;;;;;;;;;;;:::i;:::-;;;75668:452;;;75864:231;;;16679:25:1;;;16735:2;16720:18;;16713:34;;;16763:18;;;16756:34;;;16821:2;16806:18;;16799:34;;;76067:9:0;;76014:4;;75864:231;;16666:3:1;16651:19;75864:231:0;;;;;;;75701:410;;;75608:523;75583:548;70939:5199;70826:5312;;;:::o;10434:200::-;10554:7;10590:12;10582:6;;;;10574:29;;;;-1:-1:-1;;;10574:29:0;;;;;;;;:::i;:::-;-1:-1:-1;10621:5:0;10625:1;10621;:5;:::i;:::-;10614:12;10434:200;-1:-1:-1;;;;10434:200:0:o;21981:455::-;-1:-1:-1;;;;;22065:21:0;;22057:67;;;;-1:-1:-1;;;22057:67:0;;17179:2:1;22057:67:0;;;17161:21:1;17218:2;17198:18;;;17191:30;17257:34;17237:18;;;17230:62;-1:-1:-1;;;17308:18:1;;;17301:31;17349:19;;22057:67:0;16977:397:1;22057:67:0;22220:105;22257:6;22220:105;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22220:18:0;;:9;:18;;;;;;;;;;;;:105;:22;:105::i;:::-;-1:-1:-1;;;;;22199:18:0;;:9;:18;;;;;;;;;;:126;22351:12;;:24;;22368:6;22351:16;:24::i;:::-;22336:12;:39;22391:37;;160:25:1;;;22417:1:0;;-1:-1:-1;;;;;22391:37:0;;;;;148:2:1;133:18;22391:37:0;;;;;;;21981:455;;:::o;8486:220::-;8544:7;8568:1;8573;8568:6;8564:20;;-1:-1:-1;8583:1:0;8576:8;;8564:20;8595:9;8607:5;8611:1;8607;:5;:::i;:::-;8595:17;-1:-1:-1;8640:1:0;8631:5;8635:1;8595:17;8631:5;:::i;:::-;:10;8623:56;;;;-1:-1:-1;;;8623:56:0;;17581:2:1;8623:56:0;;;17563:21:1;17620:2;17600:18;;;17593:30;17659:34;17639:18;;;17632:62;-1:-1:-1;;;17710:18:1;;;17703:31;17751:19;;8623:56:0;17379:397:1;79095:478:0;-1:-1:-1;;;;;79200:31:0;;;;;;:25;:31;;;;;;:40;;;:31;;;;:40;;;79178:156;;;;-1:-1:-1;;;79178:156:0;;17983:2:1;79178:156:0;;;17965:21:1;18022:2;18002:18;;;17995:30;18061:34;18041:18;;;18034:62;18132:34;18112:18;;;18105:62;-1:-1:-1;;;18183:19:1;;;18176:33;18226:19;;79178:156:0;17781:470:1;79178:156:0;-1:-1:-1;;;;;79345:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;79345:39:0;;;;;;;;;;;;79395:13;:20;;-1:-1:-1;;;;;;79395:20:0;;;;;;;79428:80;;79454:15;;:42;;-1:-1:-1;;;79454:42:0;;-1:-1:-1;;;;;1813:32:1;;;79454:42:0;;;1795:51:1;79454:15:0;;;;:36;;1768:18:1;;79454:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79428:80;79525:40;;;;;;-1:-1:-1;;;;;79525:40:0;;;;;;;;79095:478;;:::o;20378:610::-;-1:-1:-1;;;;;20518:20:0;;20510:70;;;;-1:-1:-1;;;20510:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;20599:23:0;;20591:71;;;;-1:-1:-1;;;20591:71:0;;;;;;;:::i;:::-;20755:108;20791:6;20755:108;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20755:17:0;;:9;:17;;;;;;;;;;;;:108;:21;:108::i;:::-;-1:-1:-1;;;;;20735:17:0;;;:9;:17;;;;;;;;;;;:128;;;;20897:20;;;;;;;:32;;20922:6;20897:24;:32::i;:::-;-1:-1:-1;;;;;20874:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;20945:35;160:25:1;;;20874:20:0;;20945:35;;;;;;133:18:1;20945:35:0;14:177:1;76581:1619:0;76722:16;;;76736:1;76722:16;;;;;;;;76698:21;;76722:16;;;;;;;;;;-1:-1:-1;76722:16:0;76698:40;;76767:4;76749;76754:1;76749:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;76749:23:0;;;:7;;;;;;;;;;:23;;;;76793:15;;:22;;;-1:-1:-1;;;76793:22:0;;;;:15;;;;;:20;;:22;;;;;76749:7;;76793:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;76783:4;76788:1;76783:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1;;;;;76783:32:0;;;-1:-1:-1;;;;;76783:32:0;;;;;76828:23;76854:24;76872:4;76854:9;:24::i;:::-;76923:15;;76828:50;;-1:-1:-1;76891:66:0;;76908:4;;-1:-1:-1;;;;;76923:15:0;76828:50;76891:8;:66::i;:::-;77320:15;;:205;;-1:-1:-1;;;77320:205:0;;77260:21;;-1:-1:-1;;;;;77320:15:0;;:37;;:205;;77372:15;;77235:22;;77452:4;;77479;;77499:15;;77320:205;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;77320:205:0;;;;;;;;;;;;:::i;:::-;-1:-1:-1;77538:17:0;77558:41;:21;77584:14;77558:25;:41::i;:::-;77538:61;-1:-1:-1;77612:17:0;77632:26;77654:3;77632:17;77538:61;77646:2;77632:13;:17::i;:26::-;77612:46;;77671:13;77687:35;77713:8;;77687:21;77701:6;;77687:9;:13;;:21;;;;:::i;:35::-;77671:51;;77733:13;77749:35;77775:8;;77749:21;77763:6;;77749:9;:13;;:21;;;;:::i;:35::-;77733:51;-1:-1:-1;77795:17:0;77815:31;77733:51;77815:20;:9;77829:5;77815:13;:20::i;:::-;:24;;:31::i;:::-;77867:8;;77859:37;;77795:51;;-1:-1:-1;;;;;;77867:8:0;;77859:37;;;;;77795:51;;77867:8;77859:37;77867:8;77859:37;77795:51;77867:8;77859:37;;;;;;;;;;;;;;;;;;;;-1:-1:-1;77915:4:0;;77907:29;;-1:-1:-1;;;;;77915:4:0;;;;77907:29;;;;;77930:5;;77915:4;77907:29;77915:4;77907:29;77930:5;77915:4;77907:29;;;;;;;;;;;;;;;;;;;;-1:-1:-1;77955:4:0;;77947:29;;-1:-1:-1;;;;;77955:4:0;;;;77947:29;;;;;77970:5;;77955:4;77947:29;77955:4;77947:29;77970:5;77955:4;77947:29;;;;;;;;;;;;;;;;;;;;;77989:23;:21;:23::i;:::-;78052:11;;78097:15;;78045:79;;-1:-1:-1;;;78045:79:0;;-1:-1:-1;;;;;78097:15:0;;;78045:79;;;1795:51:1;78025:17:0;;78052:11;;;;;78045:29;;1768:18:1;;78045:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;78135:15;;:57;;-1:-1:-1;;;78135:57:0;;;;;160:25:1;;;78025:99:0;;-1:-1:-1;;;;;;78135:15:0;;:46;;133:18:1;;78135:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76620:1580;;;;;;;;;76581:1619::o;9184:153::-;9242:7;9274:1;9270;:5;9262:44;;;;-1:-1:-1;;;9262:44:0;;20586:2:1;9262:44:0;;;20568:21:1;20625:2;20605:18;;;20598:30;20664:28;20644:18;;;20637:56;20710:18;;9262:44:0;20384:350:1;9262:44:0;9324:5;9328:1;9324;:5;:::i;8069:158::-;8127:7;8160:1;8155;:6;;8147:49;;;;-1:-1:-1;;;8147:49:0;;20941:2:1;8147:49:0;;;20923:21:1;20980:2;20960:18;;;20953:30;21019:32;20999:18;;;20992:60;21069:18;;8147:49:0;20739:354:1;8147:49:0;8214:5;8218:1;8214;:5;:::i;78248:394::-;78324:16;;;78338:1;78324:16;;;;;;;;78300:21;;78324:16;;;;;;;;-1:-1:-1;;78361:15:0;;:22;;;-1:-1:-1;;;78361:22:0;;;;78300:40;;-1:-1:-1;;;;;;78361:15:0;;;;:20;;-1:-1:-1;78361:22:0;;;;;;;;;;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;78351:4;78356:1;78351:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;78351:32:0;;;:7;;;;;;;;;:32;78404:11;;78394:7;;78404:11;;;78394:4;;78404:11;;78394:7;;;;;;:::i;:::-;-1:-1:-1;;;;;78394:21:0;;;:7;;;;;;;;;:21;78452:15;;78577;;78452:182;;-1:-1:-1;;;78452:182:0;;:15;;;;:37;;78497:21;;78452:182;;:15;;78550:4;;78577:15;;;;78608;;78452:182;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;78452:182:0;;;;;;;;;;;;:::i;196:548:1:-;308:4;337:2;366;355:9;348:21;398:6;392:13;441:6;436:2;425:9;421:18;414:34;466:1;476:140;490:6;487:1;484:13;476:140;;;585:14;;;581:23;;575:30;551:17;;;570:2;547:26;540:66;505:10;;476:140;;;480:3;665:1;660:2;651:6;640:9;636:22;632:31;625:42;735:2;728;724:7;719:2;711:6;707:15;703:29;692:9;688:45;684:54;676:62;;;;196:548;;;;:::o;749:131::-;-1:-1:-1;;;;;824:31:1;;814:42;;804:70;;870:1;867;860:12;885:247;944:6;997:2;985:9;976:7;972:23;968:32;965:52;;;1013:1;1010;1003:12;965:52;1052:9;1039:23;1071:31;1096:5;1071:31;:::i;1329:315::-;1397:6;1405;1458:2;1446:9;1437:7;1433:23;1429:32;1426:52;;;1474:1;1471;1464:12;1426:52;1513:9;1500:23;1532:31;1557:5;1532:31;:::i;:::-;1582:5;1634:2;1619:18;;;;1606:32;;-1:-1:-1;;;1329:315:1:o;2092:180::-;2151:6;2204:2;2192:9;2183:7;2179:23;2175:32;2172:52;;;2220:1;2217;2210:12;2172:52;-1:-1:-1;2243:23:1;;2092:180;-1:-1:-1;2092:180:1:o;2277:456::-;2354:6;2362;2370;2423:2;2411:9;2402:7;2398:23;2394:32;2391:52;;;2439:1;2436;2429:12;2391:52;2478:9;2465:23;2497:31;2522:5;2497:31;:::i;:::-;2547:5;-1:-1:-1;2604:2:1;2589:18;;2576:32;2617:33;2576:32;2617:33;:::i;:::-;2277:456;;2669:7;;-1:-1:-1;;;2723:2:1;2708:18;;;;2695:32;;2277:456::o;3172:671::-;3258:6;3266;3274;3282;3335:3;3323:9;3314:7;3310:23;3306:33;3303:53;;;3352:1;3349;3342:12;3303:53;3391:9;3378:23;3410:31;3435:5;3410:31;:::i;:::-;3460:5;-1:-1:-1;3517:2:1;3502:18;;3489:32;3530:33;3489:32;3530:33;:::i;:::-;3582:7;-1:-1:-1;3641:2:1;3626:18;;3613:32;3654:33;3613:32;3654:33;:::i;:::-;3706:7;-1:-1:-1;3765:2:1;3750:18;;3737:32;3778:33;3737:32;3778:33;:::i;:::-;3172:671;;;;-1:-1:-1;3172:671:1;;-1:-1:-1;;3172:671:1:o;3848:118::-;3934:5;3927:13;3920:21;3913:5;3910:32;3900:60;;3956:1;3953;3946:12;3971:382;4036:6;4044;4097:2;4085:9;4076:7;4072:23;4068:32;4065:52;;;4113:1;4110;4103:12;4065:52;4152:9;4139:23;4171:31;4196:5;4171:31;:::i;:::-;4221:5;-1:-1:-1;4278:2:1;4263:18;;4250:32;4291:30;4250:32;4291:30;:::i;:::-;4340:7;4330:17;;;3971:382;;;;;:::o;4358:127::-;4419:10;4414:3;4410:20;4407:1;4400:31;4450:4;4447:1;4440:15;4474:4;4471:1;4464:15;4490:275;4561:2;4555:9;4626:2;4607:13;;-1:-1:-1;;4603:27:1;4591:40;;4661:18;4646:34;;4682:22;;;4643:62;4640:88;;;4708:18;;:::i;:::-;4744:2;4737:22;4490:275;;-1:-1:-1;4490:275:1:o;4770:183::-;4830:4;4863:18;4855:6;4852:30;4849:56;;;4885:18;;:::i;:::-;-1:-1:-1;4930:1:1;4926:14;4942:4;4922:25;;4770:183::o;4958:966::-;5042:6;5073:2;5116;5104:9;5095:7;5091:23;5087:32;5084:52;;;5132:1;5129;5122:12;5084:52;5172:9;5159:23;5205:18;5197:6;5194:30;5191:50;;;5237:1;5234;5227:12;5191:50;5260:22;;5313:4;5305:13;;5301:27;-1:-1:-1;5291:55:1;;5342:1;5339;5332:12;5291:55;5378:2;5365:16;5401:60;5417:43;5457:2;5417:43;:::i;:::-;5401:60;:::i;:::-;5495:15;;;5577:1;5573:10;;;;5565:19;;5561:28;;;5526:12;;;;5601:19;;;5598:39;;;5633:1;5630;5623:12;5598:39;5657:11;;;;5677:217;5693:6;5688:3;5685:15;5677:217;;;5773:3;5760:17;5790:31;5815:5;5790:31;:::i;:::-;5834:18;;5710:12;;;;5872;;;;5677:217;;;5913:5;4958:966;-1:-1:-1;;;;;;;4958:966:1:o;5929:388::-;5997:6;6005;6058:2;6046:9;6037:7;6033:23;6029:32;6026:52;;;6074:1;6071;6064:12;6026:52;6113:9;6100:23;6132:31;6157:5;6132:31;:::i;:::-;6182:5;-1:-1:-1;6239:2:1;6224:18;;6211:32;6252:33;6211:32;6252:33;:::i;6322:380::-;6401:1;6397:12;;;;6444;;;6465:61;;6519:4;6511:6;6507:17;6497:27;;6465:61;6572:2;6564:6;6561:14;6541:18;6538:38;6535:161;;6618:10;6613:3;6609:20;6606:1;6599:31;6653:4;6650:1;6643:15;6681:4;6678:1;6671:15;6535:161;;6322:380;;;:::o;6707:356::-;6909:2;6891:21;;;6928:18;;;6921:30;6987:34;6982:2;6967:18;;6960:62;7054:2;7039:18;;6707:356::o;8682:251::-;8752:6;8805:2;8793:9;8784:7;8780:23;8776:32;8773:52;;;8821:1;8818;8811:12;8773:52;8853:9;8847:16;8872:31;8897:5;8872:31;:::i;9422:245::-;9489:6;9542:2;9530:9;9521:7;9517:23;9513:32;9510:52;;;9558:1;9555;9548:12;9510:52;9590:9;9584:16;9609:28;9631:5;9609:28;:::i;10583:416::-;10785:2;10767:21;;;10824:2;10804:18;;;10797:30;10863:34;10858:2;10843:18;;10836:62;-1:-1:-1;;;10929:2:1;10914:18;;10907:50;10989:3;10974:19;;10583:416::o;11004:127::-;11065:10;11060:3;11056:20;11053:1;11046:31;11096:4;11093:1;11086:15;11120:4;11117:1;11110:15;11136:127;11197:10;11192:3;11188:20;11185:1;11178:31;11228:4;11225:1;11218:15;11252:4;11249:1;11242:15;11268:135;11307:3;11328:17;;;11325:43;;11348:18;;:::i;:::-;-1:-1:-1;11395:1:1;11384:13;;11268:135::o;11815:125::-;11880:9;;;11901:10;;;11898:36;;;11914:18;;:::i;13109:168::-;13182:9;;;13213;;13230:15;;;13224:22;;13210:37;13200:71;;13251:18;;:::i;13282:217::-;13322:1;13348;13338:132;;13392:10;13387:3;13383:20;13380:1;13373:31;13427:4;13424:1;13417:15;13455:4;13452:1;13445:15;13338:132;-1:-1:-1;13484:9:1;;13282:217::o;13504:401::-;13706:2;13688:21;;;13745:2;13725:18;;;13718:30;13784:34;13779:2;13764:18;;13757:62;-1:-1:-1;;;13850:2:1;13835:18;;13828:35;13895:3;13880:19;;13504:401::o;13910:399::-;14112:2;14094:21;;;14151:2;14131:18;;;14124:30;14190:34;14185:2;14170:18;;14163:62;-1:-1:-1;;;14256:2:1;14241:18;;14234:33;14299:3;14284:19;;13910:399::o;16137:306::-;16225:6;16233;16241;16294:2;16282:9;16273:7;16269:23;16265:32;16262:52;;;16310:1;16307;16300:12;16262:52;16339:9;16333:16;16323:26;;16389:2;16378:9;16374:18;16368:25;16358:35;;16433:2;16422:9;16418:18;16412:25;16402:35;;16137:306;;;;;:::o;16844:128::-;16911:9;;;16932:11;;;16929:37;;;16946:18;;:::i;18256:461::-;18309:3;18347:5;18341:12;18374:6;18369:3;18362:19;18400:4;18429:2;18424:3;18420:12;18413:19;;18466:2;18459:5;18455:14;18487:1;18497:195;18511:6;18508:1;18505:13;18497:195;;;18576:13;;-1:-1:-1;;;;;18572:39:1;18560:52;;18632:12;;;;18667:15;;;;18608:1;18526:9;18497:195;;;-1:-1:-1;18708:3:1;;18256:461;-1:-1:-1;;;;;18256:461:1:o;18722:582::-;19021:6;19010:9;19003:25;19064:6;19059:2;19048:9;19044:18;19037:34;19107:3;19102:2;19091:9;19087:18;19080:31;18984:4;19128:57;19180:3;19169:9;19165:19;19157:6;19128:57;:::i;:::-;-1:-1:-1;;;;;19221:32:1;;;;19216:2;19201:18;;19194:60;-1:-1:-1;19285:3:1;19270:19;19263:35;19120:65;18722:582;-1:-1:-1;;;18722:582:1:o;19309:881::-;19404:6;19435:2;19478;19466:9;19457:7;19453:23;19449:32;19446:52;;;19494:1;19491;19484:12;19446:52;19527:9;19521:16;19560:18;19552:6;19549:30;19546:50;;;19592:1;19589;19582:12;19546:50;19615:22;;19668:4;19660:13;;19656:27;-1:-1:-1;19646:55:1;;19697:1;19694;19687:12;19646:55;19726:2;19720:9;19749:60;19765:43;19805:2;19765:43;:::i;19749:60::-;19843:15;;;19925:1;19921:10;;;;19913:19;;19909:28;;;19874:12;;;;19949:19;;;19946:39;;;19981:1;19978;19971:12;19946:39;20005:11;;;;20025:135;20041:6;20036:3;20033:15;20025:135;;;20107:10;;20095:23;;20058:12;;;;20138;;;;20025:135;;20195:184;20265:6;20318:2;20306:9;20297:7;20293:23;20289:32;20286:52;;;20334:1;20331;20324:12;20286:52;-1:-1:-1;20357:16:1;;20195:184;-1:-1:-1;20195:184:1:o;21098:510::-;21369:6;21358:9;21351:25;21412:3;21407:2;21396:9;21392:18;21385:31;21332:4;21433:57;21485:3;21474:9;21470:19;21462:6;21433:57;:::i;:::-;-1:-1:-1;;;;;21526:32:1;;;;21521:2;21506:18;;21499:60;-1:-1:-1;21590:2:1;21575:18;21568:34;21425:65;21098:510;-1:-1:-1;;21098:510:1:o
Swarm Source
ipfs://2efe860eb22e6755eb1e44d95bd62d08bbc58a7ff4a2bea8aacbc4b37c0a4307
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.