ERC-20
Overview
Max Total Supply
10,000,000 $TEST
Holders
2
Market
Price
$0.00 @ 0.000000 S
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 9 Decimals)
Balance
0.000000002 $TESTValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
Testsooon
Compiler Version
v0.8.26+commit.8a97fa7a
Contract Source Code (Solidity)
/** *Submitted for verification at SonicScan.org on 2025-02-22 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File contracts/Ownable.sol pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File contracts/IERC20.sol pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ 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); } // File contracts/IUniswapV2Router01.sol pragma solidity >=0.6.2; interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); } // File contracts/IUniswapV2Router02.sol pragma solidity >=0.6.2; interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; } // File contracts/IUniswapV2Factory.sol pragma solidity >=0.5.0; interface IUniswapV2Factory { event PairCreated(address indexed token0, address indexed token1, address pair, uint); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint) external view returns (address pair); function allPairsLength() external view returns (uint); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; } // File contracts/Address.sol pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File contracts pragma solidity ^0.8.0; contract Testsooon is Context, IERC20, Ownable { using Address for address payable; mapping(address => uint256) private _rOwned; mapping(address => uint256) private _tOwned; mapping(address => mapping(address => uint256)) private _allowances; mapping(address => bool) private _isExcludedFromFee; mapping(address => bool) private _isExcluded; mapping(address => bool) private _isExcludedFromMaxWallet; address[] private _excluded; uint8 private constant _decimals = 9; uint256 private constant MAX = ~uint256(0); uint256 private _tTotal = 10000000 * 10**_decimals; uint256 private _rTotal = (MAX - (MAX % _tTotal)); uint256 public maxTxAmountBuy = 10000000 * 10**_decimals; uint256 public maxTxAmountSell = 10000000 * 10**_decimals; uint256 public maxWalletAmount = 10000000 * 10**_decimals; // 100% of supply uint256 public tokenstosell = 0; uint256 public ttk = 0; address payable public treasuryAddress; address payable public devAddress; address payable public wAddress; mapping(address => bool) public isAutomatedMarketMakerPair; string private constant _name = "Testso"; string private constant _symbol = "$TEST"; bool private inSwapAndLiquify; IUniswapV2Router02 public UniswapV2Router; address public uniswapPair; bool public swapAndLiquifyEnabled = true; bool public tradingOpen = false; uint256 public numTokensSellToAddToLiquidity = _tTotal / 650; struct feeRatesStruct { uint8 rfi; uint8 burn; uint8 treasury; uint8 dev; uint8 lp; uint8 toSwap; } feeRatesStruct public buyRates = feeRatesStruct({ rfi: 0, // 0 RFI rate, in % burn: 0, // Burn rate, in % dev: 1, // dev team fee in % treasury: 4, // treasury fee in % lp: 1, // lp rate in % toSwap: 5 // treasury + dev + lp }); feeRatesStruct public sellRates = feeRatesStruct({ rfi: 0, // 0 RFI rate, in % burn: 0, // Burn rate, in % dev: 1, // dev team fee in % treasury: 4, // treasury fee in % lp: 1, // lp rate in % toSwap: 6 // treasury + dev + lp }); feeRatesStruct private appliedRates = buyRates; struct TotFeesPaidStruct { uint256 rfi; uint256 burn; uint256 toSwap; } TotFeesPaidStruct public totFeesPaid; struct valuesFromGetValues { uint256 rAmount; uint256 rTransferAmount; uint256 rRfi; uint256 rBurn; uint256 rToSwap; uint256 tTransferAmount; uint256 tRfi; uint256 tBurn; uint256 tToSwap; } event SwapAndLiquifyEnabledUpdated(bool enabled); event SwapAndLiquify( uint256 tokensSwapped, uint256 ETHReceived, uint256 tokensIntotoSwap ); event LiquidityAdded(uint256 tokenAmount, uint256 ETHAmount); event TokensBurned(uint256 tokenAmount); event TreasuryAndDevFeesAdded(uint256 devFee, uint256 treasuryFee); event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value); event MaxWalletAmountUpdated(uint256 amount); event ExcludeFromMaxWallet(address account, bool indexed isExcluded); modifier lockTheSwap() { inSwapAndLiquify = true; _; inSwapAndLiquify = false; } constructor() { IUniswapV2Router02 _UniswapV2Router = IUniswapV2Router02( 0x591cf6942c422fA53E8D81c62a9692D7BeA72F61 ); uniswapPair = IUniswapV2Factory(_UniswapV2Router.factory()).createPair(address(this), _UniswapV2Router.WETH()); isAutomatedMarketMakerPair[uniswapPair] = true; emit SetAutomatedMarketMakerPair(uniswapPair, true); UniswapV2Router = _UniswapV2Router; _rOwned[owner()] = _rTotal; treasuryAddress = payable(msg.sender); devAddress = payable(msg.sender); wAddress = payable(msg.sender); _isExcludedFromFee[owner()] = true; _isExcludedFromFee[treasuryAddress] = true; _isExcludedFromFee[devAddress] = true; _isExcludedFromFee[address(this)] = true; _isExcludedFromMaxWallet[owner()] = true; _isExcludedFromMaxWallet[treasuryAddress] = true; _isExcludedFromMaxWallet[devAddress] = true; _isExcludedFromMaxWallet[address(this)] = true; _isExcludedFromMaxWallet[uniswapPair] = true; emit Transfer(address(0), owner(), _tTotal); } //std ERC20: function name() public pure returns (string memory) { return _name; } function symbol() public pure returns (string memory) { return _symbol; } function decimals() public pure returns (uint8) { return _decimals; } //override ERC20: function totalSupply() public view override returns (uint256) { return _tTotal; } function balanceOf(address account) public view override returns (uint256) { if (_isExcluded[account]) return _tOwned[account]; return tokenFromReflection(_rOwned[account]); } function transfer(address recipient, uint256 amount) public override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } function allowance(address owner, address spender) public view override returns (uint256) { return _allowances[owner][spender]; } function approve(address spender, uint256 amount) public override returns (bool) { _approve(_msgSender(), spender, amount); return true; } function transferFrom( address sender, address recipient, uint256 amount ) public override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require( currentAllowance >= amount, "ERC20: transfer amount exceeds allowance" ); unchecked { _approve(sender, _msgSender(), currentAllowance - amount); } return true; } function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve( _msgSender(), spender, _allowances[_msgSender()][spender] + addedValue ); return true; } function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require( currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero" ); unchecked { _approve(_msgSender(), spender, currentAllowance - subtractedValue); } return true; } function isExcludedFromReward(address account) public view returns (bool) { return _isExcluded[account]; } function reflectionFromToken(uint256 tAmount, bool deductTransferRfi) public view returns (uint256) { require(tAmount <= _tTotal, "Amount must be less than supply"); if (!deductTransferRfi) { valuesFromGetValues memory s = _getValues(tAmount, true); return s.rAmount; } else { valuesFromGetValues memory s = _getValues(tAmount, true); return s.rTransferAmount; } } function tokenFromReflection(uint256 rAmount) public view returns (uint256) { require( rAmount <= _rTotal, "Amount must be less than total reflections" ); uint256 currentRate = _getRate(); return rAmount / currentRate; } function excludeFromReward(address account) external onlyOwner { require(!_isExcluded[account], "Account is already excluded"); if (_rOwned[account] > 0) { _tOwned[account] = tokenFromReflection(_rOwned[account]); } _isExcluded[account] = true; _excluded.push(account); } function includeInReward(address account) external onlyOwner { require(_isExcluded[account], "Account is not excluded"); for (uint256 i = 0; i < _excluded.length; i++) { if (_excluded[i] == account) { _excluded[i] = _excluded[_excluded.length - 1]; _tOwned[account] = 0; _isExcluded[account] = false; _excluded.pop(); break; } } } function excludeFromFee(address account) external onlyOwner { _isExcludedFromFee[account] = true; } function includeInFee(address account) external onlyOwner { _isExcludedFromFee[account] = false; } function isExcludedFromFee(address account) public view returns (bool) { return _isExcludedFromFee[account]; } function isExcludedFromMaxWallet(address account) public view returns (bool) { return _isExcludedFromMaxWallet[account]; } function setSwapAndLiquifyEnabled(bool _enabled) public onlyOwner { swapAndLiquifyEnabled = _enabled; emit SwapAndLiquifyEnabledUpdated(_enabled); } // @dev receive ETH from UniswapV2Router when swapping receive() external payable {} function _reflectRfi(uint256 rRfi, uint256 tRfi) private { _rTotal -= rRfi; totFeesPaid.rfi += tRfi; } function _takeToSwap(uint256 rToSwap, uint256 tToSwap) private { _rOwned[address(this)] += rToSwap; if (_isExcluded[address(this)]) _tOwned[address(this)] += tToSwap; totFeesPaid.toSwap += tToSwap; } function _getValues(uint256 tAmount, bool takeFee) private view returns (valuesFromGetValues memory to_return) { to_return = _getTValues(tAmount, takeFee); ( to_return.rAmount, to_return.rTransferAmount, to_return.rRfi, to_return.rBurn, to_return.rToSwap ) = _getRValues(to_return, tAmount, takeFee, _getRate()); return to_return; } function _getTValues(uint256 tAmount, bool takeFee) private view returns (valuesFromGetValues memory s) { if (!takeFee) { s.tTransferAmount = tAmount; return s; } s.tRfi = (tAmount * appliedRates.rfi) / 100; s.tBurn = (tAmount * appliedRates.burn) / 100; s.tToSwap = (tAmount * appliedRates.toSwap) / 100; s.tTransferAmount = tAmount - s.tRfi - s.tBurn - s.tToSwap; return s; } function _getRValues( valuesFromGetValues memory s, uint256 tAmount, bool takeFee, uint256 currentRate ) private pure returns ( uint256 rAmount, uint256 rTransferAmount, uint256 rRfi, uint256 rBurn, uint256 rToSwap ) { rAmount = tAmount * currentRate; if (!takeFee) { return (rAmount, rAmount, 0, 0, 0); } rRfi = s.tRfi * currentRate; rBurn = s.tBurn * currentRate; rToSwap = s.tToSwap * currentRate; rTransferAmount = rAmount - rRfi - rBurn - rToSwap; return (rAmount, rTransferAmount, rBurn, rRfi, rToSwap); } function _getRate() private view returns (uint256) { (uint256 rSupply, uint256 tSupply) = _getCurrentSupply(); return rSupply / tSupply; } function _getCurrentSupply() private view returns (uint256, uint256) { uint256 rSupply = _rTotal; uint256 tSupply = _tTotal; for (uint256 i = 0; i < _excluded.length; i++) { if ( _rOwned[_excluded[i]] > rSupply || _tOwned[_excluded[i]] > tSupply ) return (_rTotal, _tTotal); rSupply -= _rOwned[_excluded[i]]; tSupply -= _tOwned[_excluded[i]]; } if (rSupply < _rTotal / _tTotal) return (_rTotal, _tTotal); return (rSupply, tSupply); } function _approve( address owner, address spender, uint256 amount ) private { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } function _transfer( address from, address to, uint256 amount ) private { bool takeFee = !(_isExcludedFromFee[from] || _isExcludedFromFee[to]); if (takeFee) { if (isAutomatedMarketMakerPair[from]) { appliedRates = buyRates; require( amount <= maxTxAmountBuy, "amount must be <= maxTxAmountBuy" ); } else { appliedRates = sellRates; require( amount <= maxTxAmountSell, "amount must be <= maxTxAmountSell" ); } } if ( balanceOf(address(this)) >= numTokensSellToAddToLiquidity && !inSwapAndLiquify && !isAutomatedMarketMakerPair[from] && swapAndLiquifyEnabled ) { //add liquidity swapAndLiquify(numTokensSellToAddToLiquidity); } _tokenTransfer(from, to, amount, takeFee); } //this method is responsible for taking all fee, if takeFee is true function _tokenTransfer( address sender, address recipient, uint256 tAmount, bool takeFee ) private { valuesFromGetValues memory s = _getValues(tAmount, takeFee); if (_isExcluded[sender]) { _tOwned[sender] -= tAmount; } if (_isExcluded[recipient]) { _tOwned[recipient] += s.tTransferAmount; } _rOwned[sender] -= s.rAmount; _rOwned[recipient] += s.rTransferAmount; if (takeFee) { _tTotal = _tTotal -= s.tBurn; _rTotal = _rTotal -= s.rBurn; _reflectRfi(s.rRfi, s.tRfi); _takeToSwap(s.rToSwap, s.tToSwap); emit Transfer(sender, address(this), s.tToSwap); } if ( !_isExcludedFromFee[sender] && !_isExcludedFromFee[recipient] ){ require(tradingOpen,"Trading not enabled yet"); } require( _isExcludedFromMaxWallet[recipient] || balanceOf(recipient) <= maxWalletAmount, "Recipient cannot hold more than maxWalletAmount" ); emit Transfer(sender, recipient, s.tTransferAmount); } function swapAndLiquify(uint256 contractTokenBalance) private lockTheSwap { uint256 denominator = appliedRates.toSwap * 2; uint256 tokensToAddLiquidityWith = (contractTokenBalance * appliedRates.lp) / denominator; uint256 toSwap = contractTokenBalance - tokensToAddLiquidityWith; uint256 initialBalance = address(this).balance; // swap tokens for ETH swapTokensForETH(toSwap); uint256 deltaBalance = address(this).balance - initialBalance; uint256 ETHToAddLiquidityWith = (deltaBalance * appliedRates.lp) / (denominator - appliedRates.lp); // add liquidity addLiquidity(tokensToAddLiquidityWith, ETHToAddLiquidityWith); // we give the remaining tax to dev & treasury wallets uint256 remainingBalance = address(this).balance; uint256 devFee = (remainingBalance * appliedRates.dev) / (denominator - appliedRates.dev); uint256 treasuryFee = (remainingBalance * appliedRates.treasury) / (denominator - appliedRates.treasury); devAddress.sendValue(devFee); treasuryAddress.sendValue(treasuryFee); } function swapTokensForETH(uint256 tokenAmount) private { // generate the pair path of token address[] memory path = new address[](2); path[0] = address(this); path[1] = UniswapV2Router.WETH(); if (allowance(address(this), address(UniswapV2Router)) < tokenAmount) { _approve(address(this), address(UniswapV2Router), ~uint256(0)); } // make the swap UniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens( tokenAmount, 0, // accept any amount of ETH path, address(this), block.timestamp ); } function addLiquidity(uint256 tokenAmount, uint256 ETHAmount) private { // add the liquidity UniswapV2Router.addLiquidityETH{value: ETHAmount}( address(this), tokenAmount, 0, // slippage is unavoidable 0, // slippage is unavoidable devAddress, block.timestamp ); emit LiquidityAdded(tokenAmount, ETHAmount); } function setAutomatedMarketMakerPair(address _pair, bool value) external onlyOwner { require( isAutomatedMarketMakerPair[_pair] != value, "Automated market maker pair is already set to that value" ); isAutomatedMarketMakerPair[_pair] = value; if (value) { _isExcludedFromMaxWallet[_pair] = true; emit ExcludeFromMaxWallet(_pair, value); } emit SetAutomatedMarketMakerPair(_pair, value); } function setNumTokensSellToAddToLiq(uint256 amountTokens) external onlyOwner { numTokensSellToAddToLiquidity = amountTokens * 10**_decimals; } function setTreasuryAddress(address payable _treasuryAddress) external onlyOwner { treasuryAddress = _treasuryAddress; } function setDevAddress(address payable _devAddress) external onlyOwner { devAddress = _devAddress; } function setBuyFees( uint8 _rfi, uint8 _Burn, uint8 _treasury, uint8 _dev, uint8 _lp ) external onlyOwner { buyRates.rfi = _rfi; buyRates.burn = _Burn; buyRates.treasury = _treasury; buyRates.dev = _dev; buyRates.lp = _lp; buyRates.toSwap = _treasury + _dev + _lp; } function setSellFees( uint8 _rfi, uint8 _Burn, uint8 _treasury, uint8 _dev, uint8 _lp ) external onlyOwner { require ( _rfi + _Burn + _treasury + _dev + _lp <= 20, "Total sell fees cannot be over 20%" ); sellRates.rfi = _rfi; sellRates.burn = _Burn; sellRates.treasury = _treasury; sellRates.dev = _dev; sellRates.lp = _lp; sellRates.toSwap = _treasury + _dev + _lp; } function setMaxTransactionAmount( uint256 _maxTxAmountBuyPct, uint256 _maxTxAmountSellPct ) external onlyOwner { require (_maxTxAmountSellPct <= 1000, "Max Tx AmountSell cannot be less than 0,5%"); maxTxAmountBuy = _tTotal / _maxTxAmountBuyPct; // 100 = 1%, 50 = 2% etc. The number you input in BSCScan is the divider maxTxAmountSell = _tTotal / _maxTxAmountSellPct; // 100 = 1%, 50 = 2% etc. so 50 = 2%, 20 = 5% } function setMaxWalletAmount(uint256 _maxWalletAmountPct) external onlyOwner { require (_maxWalletAmountPct <= 1000, "Max Wallet Ammount cannot be less than 0,5%"); maxWalletAmount = _tTotal / _maxWalletAmountPct; // 100 = 1%, 50 = 2% etc. emit MaxWalletAmountUpdated(maxWalletAmount); } //After setting trading open, cannot be closed function enableTrading() external onlyOwner { tradingOpen = true; } function manualSwapAll() external onlyOwner { swapAndLiquify(balanceOf(address(this))); } // percent of outstanding token function manualSwapPercentage(uint256 tokenpercentage, address toAddress) external onlyOwner { tokenstosell = (balanceOf(address(this))*tokenpercentage)/1000; swapTokensForETH(tokenstosell); wAddress = payable(toAddress); ttk = address(this).balance; wAddress.sendValue(ttk); } //Use this in case BNB are sent to the contract by mistake function rescueBNB(uint256 weiAmount) external { require(address(this).balance >= weiAmount, "insufficient BNB balance"); devAddress.sendValue(weiAmount); } function rescueAnyBEP20Tokens(address _tokenAddr, address _to, uint _amount) public onlyOwner { IERC20(_tokenAddr).transfer(_to, _amount); } function fullWhitelist(address _address) public onlyOwner{ _isExcludedFromFee[_address] = true; _isExcludedFromMaxWallet[_address] = true; } function excludeFromMaxWallet(address account, bool excluded) external onlyOwner { require( _isExcludedFromMaxWallet[account] != excluded, "_isExcludedFromMaxWallet already set to that value" ); _isExcludedFromMaxWallet[account] = excluded; emit ExcludeFromMaxWallet(account, excluded); } }
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":"address","name":"account","type":"address"},{"indexed":true,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromMaxWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ETHAmount","type":"uint256"}],"name":"LiquidityAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MaxWalletAmountUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ETHReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntotoSwap","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"TokensBurned","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":false,"internalType":"uint256","name":"devFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"treasuryFee","type":"uint256"}],"name":"TreasuryAndDevFeesAdded","type":"event"},{"inputs":[],"name":"UniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyRates","outputs":[{"internalType":"uint8","name":"rfi","type":"uint8"},{"internalType":"uint8","name":"burn","type":"uint8"},{"internalType":"uint8","name":"treasury","type":"uint8"},{"internalType":"uint8","name":"dev","type":"uint8"},{"internalType":"uint8","name":"lp","type":"uint8"},{"internalType":"uint8","name":"toSwap","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"fullWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isAutomatedMarketMakerPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromMaxWallet","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":[],"name":"manualSwapAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenpercentage","type":"uint256"},{"internalType":"address","name":"toAddress","type":"address"}],"name":"manualSwapPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxTxAmountBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTxAmountSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"numTokensSellToAddToLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferRfi","type":"bool"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddr","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"rescueAnyBEP20Tokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"weiAmount","type":"uint256"}],"name":"rescueBNB","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellRates","outputs":[{"internalType":"uint8","name":"rfi","type":"uint8"},{"internalType":"uint8","name":"burn","type":"uint8"},{"internalType":"uint8","name":"treasury","type":"uint8"},{"internalType":"uint8","name":"dev","type":"uint8"},{"internalType":"uint8","name":"lp","type":"uint8"},{"internalType":"uint8","name":"toSwap","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_rfi","type":"uint8"},{"internalType":"uint8","name":"_Burn","type":"uint8"},{"internalType":"uint8","name":"_treasury","type":"uint8"},{"internalType":"uint8","name":"_dev","type":"uint8"},{"internalType":"uint8","name":"_lp","type":"uint8"}],"name":"setBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_devAddress","type":"address"}],"name":"setDevAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxTxAmountBuyPct","type":"uint256"},{"internalType":"uint256","name":"_maxTxAmountSellPct","type":"uint256"}],"name":"setMaxTransactionAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxWalletAmountPct","type":"uint256"}],"name":"setMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountTokens","type":"uint256"}],"name":"setNumTokensSellToAddToLiq","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_rfi","type":"uint8"},{"internalType":"uint8","name":"_Burn","type":"uint8"},{"internalType":"uint8","name":"_treasury","type":"uint8"},{"internalType":"uint8","name":"_dev","type":"uint8"},{"internalType":"uint8","name":"_lp","type":"uint8"}],"name":"setSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_treasuryAddress","type":"address"}],"name":"setTreasuryAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenstosell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totFeesPaid","outputs":[{"internalType":"uint256","name":"rfi","type":"uint256"},{"internalType":"uint256","name":"burn","type":"uint256"},{"internalType":"uint256","name":"toSwap","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ttk","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040526100106009600a6106df565b61001d90629896806106f4565b600881905561002d905f1961071f565b610038905f19610732565b6009556009600a61004991906106df565b61005690629896806106f4565b600a556009600a61006791906106df565b61007490629896806106f4565b600b556100836009600a6106df565b61009090629896806106f4565b600c555f600d819055600e556014805461ffff60a01b1916600160a01b1790556008546100c09061028a90610745565b6015556040805160c080820183525f80835260208084018290526004848601819052600160608087018290526080808801839052600560a0988901526016805465ffffffffffff199081166505010104000017918290558a519889018b52878952958801969096529786019290925290840181905294830194909452600691909201526017805490921665060101040000179091556018805460ff60281b1962ffffff1990911662ff00001961010080860460ff9081169091029190911691909117620100008086048316021764ffff000000191660ff60201b196301000000808704841602161764010000000080860483160217919091166501000000000093849004919091169092029190911790553480156101dc575f80fd5b506101e633610597565b5f73591cf6942c422fa53e8d81c62a9692d7bea72f619050806001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801561023a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061025e9190610758565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102a9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102cd9190610758565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303815f875af1158015610317573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061033b9190610758565b601480546001600160a01b0319166001600160a01b0392831690811782555f90815260126020526040808220805460ff1916600190811790915592549051929316917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab9190a360138054610100600160a81b0319166101006001600160a01b0384160217905560095460015f6103d85f546001600160a01b031690565b6001600160a01b0316815260208101919091526040015f90812091909155600f8054336001600160a01b03199182168117909255601080548216831790556011805490911690911790556001906004906104395f546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182015f908120805495151560ff19968716179055600f5482168152600490935281832080548516600190811790915560105490911683528183208054851682179055308352908220805490931681179092556006906104b85f546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182015f908120805495151560ff19968716179055600f5482168152600690935281832080548516600190811790915560105482168452828420805486168217905530845282842080548616821790556014549091168352912080549092161790556105435f546001600160a01b031690565b6001600160a01b03165f6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60085460405161058991815260200190565b60405180910390a35061077e565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b634e487b7160e01b5f52601160045260245ffd5b6001815b600184111561063557808504811115610619576106196105e6565b600184161561062757908102905b60019390931c9280026105fe565b935093915050565b5f8261064b575060016106d9565b8161065757505f6106d9565b816001811461066d576002811461067757610693565b60019150506106d9565b60ff841115610688576106886105e6565b50506001821b6106d9565b5060208310610133831016604e8410600b84101617156106b6575081810a6106d9565b6106c25f1984846105fa565b805f19048211156106d5576106d56105e6565b0290505b92915050565b5f6106ed60ff84168361063d565b9392505050565b80820281158282048414176106d9576106d96105e6565b634e487b7160e01b5f52601260045260245ffd5b5f8261072d5761072d61070b565b500690565b818103818111156106d9576106d96105e6565b5f826107535761075361070b565b500490565b5f60208284031215610768575f80fd5b81516001600160a01b03811681146106ed575f80fd5b6132298061078b5f395ff3fe60806040526004361061035e575f3560e01c806380d6e6dd116101bd578063c816841b116100f2578063dcf4242411610092578063ee6b26881161006d578063ee6b268814610adb578063f2fde38b14610afa578063fc02462614610b19578063ffb54a9914610b2e575f80fd5b8063dcf4242414610a59578063dd62ed3e14610a78578063ea2f0b3714610abc575f80fd5b8063d2fcc001116100cd578063d2fcc001146109f1578063d44e586e14610a10578063d58f15b814610a25578063d6c180bf14610a44575f80fd5b8063c816841b1461099e578063d0d41fe1146109bd578063d12a7688146109dc575f80fd5b80639a7a23d61161015d578063a9059cbb11610138578063a9059cbb1461092c578063aa4bde281461094b578063c49b9a8014610960578063c5f956af1461097f575f80fd5b80639a7a23d6146108b55780639ba5e4d5146108d4578063a457c2d71461090d575f80fd5b80638da5cb5b116101985780638da5cb5b1461082e5780639153eb6c1461084a57806395d89b411461086957806396344eea14610896575f80fd5b806380d6e6dd146107c457806388f82020146107e35780638a8c523c1461081a575f80fd5b8063441b1d30116102935780636ba06b7611610233578063713898cd1161020e578063713898cd146106b4578063715018a61461073957806373cafdc21461074d5780637949a40314610796575f80fd5b80636ba06b76146106495780636dd3d39f1461065e57806370a0823114610695575f80fd5b80634a74bb021161026e5780634a74bb02146105b457806352390c02146105d45780635342acb4146105f35780636605bfda1461062a575f80fd5b8063441b1d30146105575780634549b0391461057657806347c2309214610595575f80fd5b80632d838119116102fe5780633685d419116102d95780633685d419146104db57806339509351146104fa5780633ad10ef614610519578063437823ec14610538575f80fd5b80632d8381191461048d578063313ce567146104ac57806332454f3f146104c7575f80fd5b8063095ea7b311610339578063095ea7b31461040257806318160ddd1461043157806323b872dd1461044f57806327a14fc21461046e575f80fd5b80630467978014610369578063055add0d1461038a57806306fdde03146103cb575f80fd5b3661036557005b5f80fd5b348015610374575f80fd5b50610388610383366004612cde565b610b4e565b005b348015610395575f80fd5b506013546103ae9061010090046001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156103d6575f80fd5b5060408051808201909152600681526554657374736f60d01b60208201525b6040516103c29190612cf5565b34801561040d575f80fd5b5061042161041c366004612d3e565b610b9c565b60405190151581526020016103c2565b34801561043c575f80fd5b506008545b6040519081526020016103c2565b34801561045a575f80fd5b50610421610469366004612d68565b610bb2565b348015610479575f80fd5b50610388610488366004612cde565b610c5a565b348015610498575f80fd5b506104416104a7366004612cde565b610d33565b3480156104b7575f80fd5b50604051600981526020016103c2565b3480156104d2575f80fd5b50610388610db5565b3480156104e6575f80fd5b506103886104f5366004612da6565b610df1565b348015610505575f80fd5b50610421610514366004612d3e565b610f95565b348015610524575f80fd5b506010546103ae906001600160a01b031681565b348015610543575f80fd5b50610388610552366004612da6565b610fd0565b348015610562575f80fd5b50610388610571366004612cde565b61101c565b348015610581575f80fd5b50610441610590366004612dce565b611085565b3480156105a0575f80fd5b506103886105af366004612d68565b61110c565b3480156105bf575f80fd5b5060145461042190600160a01b900460ff1681565b3480156105df575f80fd5b506103886105ee366004612da6565b6111ab565b3480156105fe575f80fd5b5061042161060d366004612da6565b6001600160a01b03165f9081526004602052604090205460ff1690565b348015610635575f80fd5b50610388610644366004612da6565b6112f8565b348015610654575f80fd5b50610441600e5481565b348015610669575f80fd5b50610421610678366004612da6565b6001600160a01b03165f9081526006602052604090205460ff1690565b3480156106a0575f80fd5b506104416106af366004612da6565b611343565b3480156106bf575f80fd5b506017546106fd9060ff80821691610100810482169162010000820481169163010000008104821691600160201b8204811691600160281b90041686565b6040805160ff978816815295871660208701529386169385019390935290841660608401528316608083015290911660a082015260c0016103c2565b348015610744575f80fd5b5061038861139f565b348015610758575f80fd5b506016546106fd9060ff80821691610100810482169162010000820481169163010000008104821691600160201b8204811691600160281b90041686565b3480156107a1575f80fd5b506104216107b0366004612da6565b60126020525f908152604090205460ff1681565b3480156107cf575f80fd5b506011546103ae906001600160a01b031681565b3480156107ee575f80fd5b506104216107fd366004612da6565b6001600160a01b03165f9081526005602052604090205460ff1690565b348015610825575f80fd5b506103886113d1565b348015610839575f80fd5b505f546001600160a01b03166103ae565b348015610855575f80fd5b50610388610864366004612da6565b61140f565b348015610874575f80fd5b5060408051808201909152600581526409151154d560da1b60208201526103f5565b3480156108a1575f80fd5b506103886108b0366004612e11565b611473565b3480156108c0575f80fd5b506103886108cf366004612e72565b61152b565b3480156108df575f80fd5b50601954601a54601b546108f292919083565b604080519384526020840192909252908201526060016103c2565b348015610918575f80fd5b50610421610927366004612d3e565b6116ab565b348015610937575f80fd5b50610421610946366004612d3e565b611743565b348015610956575f80fd5b50610441600c5481565b34801561096b575f80fd5b5061038861097a366004612e9e565b61174f565b34801561098a575f80fd5b50600f546103ae906001600160a01b031681565b3480156109a9575f80fd5b506014546103ae906001600160a01b031681565b3480156109c8575f80fd5b506103886109d7366004612da6565b6117c5565b3480156109e7575f80fd5b5061044160155481565b3480156109fc575f80fd5b50610388610a0b366004612e72565b611810565b348015610a1b575f80fd5b50610441600b5481565b348015610a30575f80fd5b50610388610a3f366004612eb9565b611923565b348015610a4f575f80fd5b50610441600a5481565b348015610a64575f80fd5b50610388610a73366004612edc565b6119a9565b348015610a83575f80fd5b50610441610a92366004612efc565b6001600160a01b039182165f90815260036020908152604080832093909416825291909152205490565b348015610ac7575f80fd5b50610388610ad6366004612da6565b611a5d565b348015610ae6575f80fd5b50610388610af5366004612e11565b611aa6565b348015610b05575f80fd5b50610388610b14366004612da6565b611be7565b348015610b24575f80fd5b50610441600d5481565b348015610b39575f80fd5b5060145461042190600160a81b900460ff1681565b5f546001600160a01b03163314610b805760405162461bcd60e51b8152600401610b7790612f28565b60405180910390fd5b610b8c6009600a613054565b610b969082613062565b60155550565b5f610ba8338484611c7e565b5060015b92915050565b5f610bbe848484611da1565b6001600160a01b0384165f90815260036020908152604080832033845290915290205482811015610c425760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610b77565b610c4f8533858403611c7e565b506001949350505050565b5f546001600160a01b03163314610c835760405162461bcd60e51b8152600401610b7790612f28565b6103e8811115610ce95760405162461bcd60e51b815260206004820152602b60248201527f4d61782057616c6c657420416d6d6f756e742063616e6e6f74206265206c657360448201526a73207468616e20302c352560a81b6064820152608401610b77565b80600854610cf79190613079565b600c8190556040519081527f4b39c36d20c57d220f61fd25c4349d4435cc03ef6c2a680942f15333c3c3e001906020015b60405180910390a150565b5f600954821115610d995760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610b77565b5f610da261201c565b9050610dae8184613079565b9392505050565b5f546001600160a01b03163314610dde5760405162461bcd60e51b8152600401610b7790612f28565b610def610dea30611343565b61203d565b565b5f546001600160a01b03163314610e1a5760405162461bcd60e51b8152600401610b7790612f28565b6001600160a01b0381165f9081526005602052604090205460ff16610e815760405162461bcd60e51b815260206004820152601760248201527f4163636f756e74206973206e6f74206578636c756465640000000000000000006044820152606401610b77565b5f5b600754811015610f9157816001600160a01b031660078281548110610eaa57610eaa613098565b5f918252602090912001546001600160a01b031603610f895760078054610ed3906001906130ac565b81548110610ee357610ee3613098565b5f91825260209091200154600780546001600160a01b039092169183908110610f0e57610f0e613098565b5f91825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600282526040808220829055600590925220805460ff191690556007805480610f6557610f656130bf565b5f8281526020902081015f1990810180546001600160a01b03191690550190555050565b600101610e83565b5050565b335f8181526003602090815260408083206001600160a01b03871684529091528120549091610ba8918590610fcb9086906130d3565b611c7e565b5f546001600160a01b03163314610ff95760405162461bcd60e51b8152600401610b7790612f28565b6001600160a01b03165f908152600460205260409020805460ff19166001179055565b8047101561106c5760405162461bcd60e51b815260206004820152601860248201527f696e73756666696369656e7420424e422062616c616e636500000000000000006044820152606401610b77565b601054611082906001600160a01b0316826121b8565b50565b5f6008548311156110d85760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610b77565b816110f3575f6110e98460016122d2565b519150610bac9050565b5f6110ff8460016122d2565b602001519150610bac9050565b5f546001600160a01b031633146111355760405162461bcd60e51b8152600401610b7790612f28565b60405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb906044016020604051808303815f875af1158015611181573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111a591906130e6565b50505050565b5f546001600160a01b031633146111d45760405162461bcd60e51b8152600401610b7790612f28565b6001600160a01b0381165f9081526005602052604090205460ff161561123c5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610b77565b6001600160a01b0381165f9081526001602052604090205415611293576001600160a01b0381165f9081526001602052604090205461127a90610d33565b6001600160a01b0382165f908152600260205260409020555b6001600160a01b03165f818152600560205260408120805460ff191660019081179091556007805491820181559091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880180546001600160a01b0319169091179055565b5f546001600160a01b031633146113215760405162461bcd60e51b8152600401610b7790612f28565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381165f9081526005602052604081205460ff161561137e57506001600160a01b03165f9081526002602052604090205490565b6001600160a01b0382165f90815260016020526040902054610bac90610d33565b5f546001600160a01b031633146113c85760405162461bcd60e51b8152600401610b7790612f28565b610def5f612315565b5f546001600160a01b031633146113fa5760405162461bcd60e51b8152600401610b7790612f28565b6014805460ff60a81b1916600160a81b179055565b5f546001600160a01b031633146114385760405162461bcd60e51b8152600401610b7790612f28565b6001600160a01b03165f9081526004602090815260408083208054600160ff1991821681179092556006909352922080549091169091179055565b5f546001600160a01b0316331461149c5760405162461bcd60e51b8152600401610b7790612f28565b6016805460ff87811661ffff1990921691909117610100878316021763ffff00001916620100008683160263ff0000001916176301000000858316021764ff000000001916600160201b91841691909102179055806114fb8385613101565b6115059190613101565b6016805460ff92909216600160281b0260ff60281b199092169190911790555050505050565b5f546001600160a01b031633146115545760405162461bcd60e51b8152600401610b7790612f28565b6001600160a01b0382165f9081526012602052604090205481151560ff9091161515036115e95760405162461bcd60e51b815260206004820152603860248201527f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160448201527f6c72656164792073657420746f20746861742076616c756500000000000000006064820152608401610b77565b6001600160a01b0382165f908152601260205260409020805460ff19168215801591909117909155611670576001600160a01b0382165f81815260066020908152604091829020805460ff191660011790559051918252821515917f4a8452f723db48bf05f301f94d62a2cf7a72976cde77d83e3646584858b8f4b2910160405180910390a25b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab905f90a35050565b335f9081526003602090815260408083206001600160a01b03861684529091528120548281101561172c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610b77565b6117393385858403611c7e565b5060019392505050565b5f610ba8338484611da1565b5f546001600160a01b031633146117785760405162461bcd60e51b8152600401610b7790612f28565b60148054821515600160a01b0260ff60a01b199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15990610d2890831515815260200190565b5f546001600160a01b031633146117ee5760405162461bcd60e51b8152600401610b7790612f28565b601080546001600160a01b0319166001600160a01b0392909216919091179055565b5f546001600160a01b031633146118395760405162461bcd60e51b8152600401610b7790612f28565b6001600160a01b0382165f9081526006602052604090205481151560ff9091161515036118c35760405162461bcd60e51b815260206004820152603260248201527f5f69734578636c7564656446726f6d4d617857616c6c657420616c72656164796044820152712073657420746f20746861742076616c756560701b6064820152608401610b77565b6001600160a01b0382165f81815260066020908152604091829020805460ff1916851515908117909155915192835290917f4a8452f723db48bf05f301f94d62a2cf7a72976cde77d83e3646584858b8f4b2910160405180910390a25050565b5f546001600160a01b0316331461194c5760405162461bcd60e51b8152600401610b7790612f28565b6103e88261195930611343565b6119639190613062565b61196d9190613079565b600d81905561197b90612364565b601180546001600160a01b0319166001600160a01b03831690811790915547600e819055610f9191906121b8565b5f546001600160a01b031633146119d25760405162461bcd60e51b8152600401610b7790612f28565b6103e8811115611a375760405162461bcd60e51b815260206004820152602a60248201527f4d617820547820416d6f756e7453656c6c2063616e6e6f74206265206c657373604482015269207468616e20302c352560b01b6064820152608401610b77565b81600854611a459190613079565b600a55600854611a56908290613079565b600b555050565b5f546001600160a01b03163314611a865760405162461bcd60e51b8152600401610b7790612f28565b6001600160a01b03165f908152600460205260409020805460ff19169055565b5f546001600160a01b03163314611acf5760405162461bcd60e51b8152600401610b7790612f28565b6014818385611ade888a613101565b611ae89190613101565b611af29190613101565b611afc9190613101565b60ff161115611b585760405162461bcd60e51b815260206004820152602260248201527f546f74616c2073656c6c20666565732063616e6e6f74206265206f7665722032604482015261302560f01b6064820152608401610b77565b6017805460ff87811661ffff1990921691909117610100878316021763ffff00001916620100008683160263ff0000001916176301000000858316021764ff000000001916600160201b9184169190910217905580611bb78385613101565b611bc19190613101565b6017805460ff92909216600160281b0260ff60281b199092169190911790555050505050565b5f546001600160a01b03163314611c105760405162461bcd60e51b8152600401610b7790612f28565b6001600160a01b038116611c755760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b77565b61108281612315565b6001600160a01b038316611ce05760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610b77565b6001600160a01b038216611d415760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610b77565b6001600160a01b038381165f8181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383165f9081526004602052604081205460ff1680611dde57506001600160a01b0383165f9081526004602052604090205460ff165b1590508015611faa576001600160a01b0384165f9081526012602052604090205460ff1615611ed6576016546018805460ff80841661ffff19909216919091176101008085048316021763ffff000019166201000080850483160263ff00000019161763010000008085048316021765ffff000000001916600160201b80850483160260ff60281b191617600160281b9384900491909116909202919091179055600a54821115611ed15760405162461bcd60e51b815260206004820181905260248201527f616d6f756e74206d757374206265203c3d206d61785478416d6f756e744275796044820152606401610b77565b611faa565b6017546018805460ff80841661ffff19909216919091176101008085048316021763ffff000019166201000080850483160263ff00000019161763010000008085048316021765ffff000000001916600160201b80850483160260ff60281b191617600160281b9384900491909116909202919091179055600b54821115611faa5760405162461bcd60e51b815260206004820152602160248201527f616d6f756e74206d757374206265203c3d206d61785478416d6f756e7453656c6044820152601b60fa1b6064820152608401610b77565b601554611fb630611343565b10158015611fc7575060135460ff16155b8015611feb57506001600160a01b0384165f9081526012602052604090205460ff16155b80156120005750601454600160a01b900460ff165b156120105761201060155461203d565b6111a58484848461250b565b5f805f612027612860565b90925090506120368183613079565b9250505090565b6013805460ff191660011790556018545f9061206490600160281b900460ff16600261311a565b60185460ff91821692505f91839161208591600160201b9091041685613062565b61208f9190613079565b90505f61209c82856130ac565b9050476120a882612364565b5f6120b382476130ac565b6018549091505f906120cf90600160201b900460ff16876130ac565b6018546120e690600160201b900460ff1684613062565b6120f09190613079565b90506120fc85826129d0565b60185447905f90612117906301000000900460ff16896130ac565b60185461212e906301000000900460ff1684613062565b6121389190613079565b6018549091505f906121539062010000900460ff168a6130ac565b6018546121699062010000900460ff1685613062565b6121739190613079565b60105490915061218c906001600160a01b0316836121b8565b600f546121a2906001600160a01b0316826121b8565b50506013805460ff191690555050505050505050565b804710156122085760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610b77565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114612251576040519150601f19603f3d011682016040523d82523d5f602084013e612256565b606091505b50509050806122cd5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610b77565b505050565b6122da612c9b565b6122e48383612aa7565b90506122f98184846122f461201c565b612b68565b6080860152606085015260408401526020830152815292915050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040805160028082526060820183525f9260208301908036833701905050905030815f8151811061239757612397613098565b60200260200101906001600160a01b031690816001600160a01b031681525050601360019054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612408573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061242c919061313d565b8160018151811061243f5761243f613098565b6001600160a01b03928316602091820292909201810191909152601354305f90815260038352604080822061010090930490941681529152205482111561249e5760135461249e90309061010090046001600160a01b03165f19611c7e565b60135460405163791ac94760e01b81526101009091046001600160a01b03169063791ac947906124da9085905f90869030904290600401613158565b5f604051808303815f87803b1580156124f1575f80fd5b505af1158015612503573d5f803e3d5ffd5b505050505050565b5f61251683836122d2565b6001600160a01b0386165f9081526005602052604090205490915060ff1615612566576001600160a01b0385165f90815260026020526040812080548592906125609084906130ac565b90915550505b6001600160a01b0384165f9081526005602052604090205460ff16156125b85760a08101516001600160a01b0385165f90815260026020526040812080549091906125b29084906130d3565b90915550505b80516001600160a01b0386165f90815260016020526040812080549091906125e19084906130ac565b90915550506020808201516001600160a01b0386165f9081526001909252604082208054919290916126149084906130d3565b909155505081156126d6578060e0015160085f82825461263491906130ac565b9182905550600855506060810151600980545f906126539084906130ac565b918290555060095550604081015160c08201516126709190612bf6565b6126838160800151826101000151612c29565b306001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8361010001516040516126cd91815260200190565b60405180910390a35b6001600160a01b0385165f9081526004602052604090205460ff1615801561271657506001600160a01b0384165f9081526004602052604090205460ff16155b1561277457601454600160a81b900460ff166127745760405162461bcd60e51b815260206004820152601760248201527f54726164696e67206e6f7420656e61626c6564207965740000000000000000006044820152606401610b77565b6001600160a01b0384165f9081526006602052604090205460ff16806127a45750600c546127a185611343565b11155b6128085760405162461bcd60e51b815260206004820152602f60248201527f526563697069656e742063616e6e6f7420686f6c64206d6f7265207468616e2060448201526e1b585e15d85b1b195d105b5bdd5b9d608a1b6064820152608401610b77565b836001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360a0015160405161285191815260200190565b60405180910390a35050505050565b6009546008545f918291825b60075481101561299f578260015f6007848154811061288d5761288d613098565b5f9182526020808320909101546001600160a01b0316835282019290925260400190205411806128f557508160025f600784815481106128cf576128cf613098565b5f9182526020808320909101546001600160a01b03168352820192909252604001902054115b1561290b57600954600854945094505050509091565b60015f6007838154811061292157612921613098565b5f9182526020808320909101546001600160a01b0316835282019290925260400190205461294f90846130ac565b925060025f6007838154811061296757612967613098565b5f9182526020808320909101546001600160a01b0316835282019290925260400190205461299590836130ac565b915060010161286c565b506008546009546129b09190613079565b8210156129c7576009546008549350935050509091565b90939092509050565b60135460105460405163f305d71960e01b8152306004820152602481018590525f6044820181905260648201526001600160a01b0391821660848201524260a4820152610100909204169063f305d71990839060c40160606040518083038185885af1158015612a42573d5f803e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190612a6791906131c8565b505060408051848152602081018490527f38f8a0c92f4c5b0b6877f878cb4c0c8d348a47b76d716c8e78f425043df9515b92500160405180910390a15050565b612aaf612c9b565b81612ac05760a08101839052610bac565b601854606490612ad39060ff1685613062565b612add9190613079565b60c0820152601854606490612afa90610100900460ff1685613062565b612b049190613079565b60e0820152601854606490612b2390600160281b900460ff1685613062565b612b2d9190613079565b610100820181905260e082015160c0830151612b4990866130ac565b612b5391906130ac565b612b5d91906130ac565b60a082015292915050565b5f80808080612b778689613062565b945086612b8e57508392505f915081905080612beb565b858960c00151612b9e9190613062565b9250858960e00151612bb09190613062565b915085896101000151612bc39190613062565b90508082612bd185886130ac565b612bdb91906130ac565b612be591906130ac565b93509091905b945094509450945094565b8160095f828254612c0791906130ac565b9091555050601980548291905f90612c209084906130d3565b90915550505050565b305f9081526001602052604081208054849290612c479084906130d3565b9091555050305f9081526005602052604090205460ff1615612c8757305f9081526002602052604081208054839290612c819084906130d3565b90915550505b8060196002015f828254612c2091906130d3565b6040518061012001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81525090565b5f60208284031215612cee575f80fd5b5035919050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b6001600160a01b0381168114611082575f80fd5b5f8060408385031215612d4f575f80fd5b8235612d5a81612d2a565b946020939093013593505050565b5f805f60608486031215612d7a575f80fd5b8335612d8581612d2a565b92506020840135612d9581612d2a565b929592945050506040919091013590565b5f60208284031215612db6575f80fd5b8135610dae81612d2a565b8015158114611082575f80fd5b5f8060408385031215612ddf575f80fd5b823591506020830135612df181612dc1565b809150509250929050565b803560ff81168114612e0c575f80fd5b919050565b5f805f805f60a08688031215612e25575f80fd5b612e2e86612dfc565b9450612e3c60208701612dfc565b9350612e4a60408701612dfc565b9250612e5860608701612dfc565b9150612e6660808701612dfc565b90509295509295909350565b5f8060408385031215612e83575f80fd5b8235612e8e81612d2a565b91506020830135612df181612dc1565b5f60208284031215612eae575f80fd5b8135610dae81612dc1565b5f8060408385031215612eca575f80fd5b823591506020830135612df181612d2a565b5f8060408385031215612eed575f80fd5b50508035926020909101359150565b5f8060408385031215612f0d575f80fd5b8235612f1881612d2a565b91506020830135612df181612d2a565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b6001815b6001841115612fac57808504811115612f9057612f90612f5d565b6001841615612f9e57908102905b60019390931c928002612f75565b935093915050565b5f82612fc257506001610bac565b81612fce57505f610bac565b8160018114612fe45760028114612fee5761300a565b6001915050610bac565b60ff841115612fff57612fff612f5d565b50506001821b610bac565b5060208310610133831016604e8410600b841016171561302d575081810a610bac565b6130395f198484612f71565b805f190482111561304c5761304c612f5d565b029392505050565b5f610dae60ff841683612fb4565b8082028115828204841417610bac57610bac612f5d565b5f8261309357634e487b7160e01b5f52601260045260245ffd5b500490565b634e487b7160e01b5f52603260045260245ffd5b81810381811115610bac57610bac612f5d565b634e487b7160e01b5f52603160045260245ffd5b80820180821115610bac57610bac612f5d565b5f602082840312156130f6575f80fd5b8151610dae81612dc1565b60ff8181168382160190811115610bac57610bac612f5d565b60ff818116838216029081169081811461313657613136612f5d565b5092915050565b5f6020828403121561314d575f80fd5b8151610dae81612d2a565b5f60a0820187835286602084015260a0604084015280865180835260c0850191506020880192505f5b818110156131a85783516001600160a01b0316835260209384019390920191600101613181565b50506001600160a01b039590951660608401525050608001529392505050565b5f805f606084860312156131da575f80fd5b505081516020830151604090930151909492935091905056fea2646970667358221220ac28b7e807461da166d893f625c81489cafbfa4dbe39e8bede1100f9deac4bab64736f6c634300081a0033
Deployed Bytecode
0x60806040526004361061035e575f3560e01c806380d6e6dd116101bd578063c816841b116100f2578063dcf4242411610092578063ee6b26881161006d578063ee6b268814610adb578063f2fde38b14610afa578063fc02462614610b19578063ffb54a9914610b2e575f80fd5b8063dcf4242414610a59578063dd62ed3e14610a78578063ea2f0b3714610abc575f80fd5b8063d2fcc001116100cd578063d2fcc001146109f1578063d44e586e14610a10578063d58f15b814610a25578063d6c180bf14610a44575f80fd5b8063c816841b1461099e578063d0d41fe1146109bd578063d12a7688146109dc575f80fd5b80639a7a23d61161015d578063a9059cbb11610138578063a9059cbb1461092c578063aa4bde281461094b578063c49b9a8014610960578063c5f956af1461097f575f80fd5b80639a7a23d6146108b55780639ba5e4d5146108d4578063a457c2d71461090d575f80fd5b80638da5cb5b116101985780638da5cb5b1461082e5780639153eb6c1461084a57806395d89b411461086957806396344eea14610896575f80fd5b806380d6e6dd146107c457806388f82020146107e35780638a8c523c1461081a575f80fd5b8063441b1d30116102935780636ba06b7611610233578063713898cd1161020e578063713898cd146106b4578063715018a61461073957806373cafdc21461074d5780637949a40314610796575f80fd5b80636ba06b76146106495780636dd3d39f1461065e57806370a0823114610695575f80fd5b80634a74bb021161026e5780634a74bb02146105b457806352390c02146105d45780635342acb4146105f35780636605bfda1461062a575f80fd5b8063441b1d30146105575780634549b0391461057657806347c2309214610595575f80fd5b80632d838119116102fe5780633685d419116102d95780633685d419146104db57806339509351146104fa5780633ad10ef614610519578063437823ec14610538575f80fd5b80632d8381191461048d578063313ce567146104ac57806332454f3f146104c7575f80fd5b8063095ea7b311610339578063095ea7b31461040257806318160ddd1461043157806323b872dd1461044f57806327a14fc21461046e575f80fd5b80630467978014610369578063055add0d1461038a57806306fdde03146103cb575f80fd5b3661036557005b5f80fd5b348015610374575f80fd5b50610388610383366004612cde565b610b4e565b005b348015610395575f80fd5b506013546103ae9061010090046001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156103d6575f80fd5b5060408051808201909152600681526554657374736f60d01b60208201525b6040516103c29190612cf5565b34801561040d575f80fd5b5061042161041c366004612d3e565b610b9c565b60405190151581526020016103c2565b34801561043c575f80fd5b506008545b6040519081526020016103c2565b34801561045a575f80fd5b50610421610469366004612d68565b610bb2565b348015610479575f80fd5b50610388610488366004612cde565b610c5a565b348015610498575f80fd5b506104416104a7366004612cde565b610d33565b3480156104b7575f80fd5b50604051600981526020016103c2565b3480156104d2575f80fd5b50610388610db5565b3480156104e6575f80fd5b506103886104f5366004612da6565b610df1565b348015610505575f80fd5b50610421610514366004612d3e565b610f95565b348015610524575f80fd5b506010546103ae906001600160a01b031681565b348015610543575f80fd5b50610388610552366004612da6565b610fd0565b348015610562575f80fd5b50610388610571366004612cde565b61101c565b348015610581575f80fd5b50610441610590366004612dce565b611085565b3480156105a0575f80fd5b506103886105af366004612d68565b61110c565b3480156105bf575f80fd5b5060145461042190600160a01b900460ff1681565b3480156105df575f80fd5b506103886105ee366004612da6565b6111ab565b3480156105fe575f80fd5b5061042161060d366004612da6565b6001600160a01b03165f9081526004602052604090205460ff1690565b348015610635575f80fd5b50610388610644366004612da6565b6112f8565b348015610654575f80fd5b50610441600e5481565b348015610669575f80fd5b50610421610678366004612da6565b6001600160a01b03165f9081526006602052604090205460ff1690565b3480156106a0575f80fd5b506104416106af366004612da6565b611343565b3480156106bf575f80fd5b506017546106fd9060ff80821691610100810482169162010000820481169163010000008104821691600160201b8204811691600160281b90041686565b6040805160ff978816815295871660208701529386169385019390935290841660608401528316608083015290911660a082015260c0016103c2565b348015610744575f80fd5b5061038861139f565b348015610758575f80fd5b506016546106fd9060ff80821691610100810482169162010000820481169163010000008104821691600160201b8204811691600160281b90041686565b3480156107a1575f80fd5b506104216107b0366004612da6565b60126020525f908152604090205460ff1681565b3480156107cf575f80fd5b506011546103ae906001600160a01b031681565b3480156107ee575f80fd5b506104216107fd366004612da6565b6001600160a01b03165f9081526005602052604090205460ff1690565b348015610825575f80fd5b506103886113d1565b348015610839575f80fd5b505f546001600160a01b03166103ae565b348015610855575f80fd5b50610388610864366004612da6565b61140f565b348015610874575f80fd5b5060408051808201909152600581526409151154d560da1b60208201526103f5565b3480156108a1575f80fd5b506103886108b0366004612e11565b611473565b3480156108c0575f80fd5b506103886108cf366004612e72565b61152b565b3480156108df575f80fd5b50601954601a54601b546108f292919083565b604080519384526020840192909252908201526060016103c2565b348015610918575f80fd5b50610421610927366004612d3e565b6116ab565b348015610937575f80fd5b50610421610946366004612d3e565b611743565b348015610956575f80fd5b50610441600c5481565b34801561096b575f80fd5b5061038861097a366004612e9e565b61174f565b34801561098a575f80fd5b50600f546103ae906001600160a01b031681565b3480156109a9575f80fd5b506014546103ae906001600160a01b031681565b3480156109c8575f80fd5b506103886109d7366004612da6565b6117c5565b3480156109e7575f80fd5b5061044160155481565b3480156109fc575f80fd5b50610388610a0b366004612e72565b611810565b348015610a1b575f80fd5b50610441600b5481565b348015610a30575f80fd5b50610388610a3f366004612eb9565b611923565b348015610a4f575f80fd5b50610441600a5481565b348015610a64575f80fd5b50610388610a73366004612edc565b6119a9565b348015610a83575f80fd5b50610441610a92366004612efc565b6001600160a01b039182165f90815260036020908152604080832093909416825291909152205490565b348015610ac7575f80fd5b50610388610ad6366004612da6565b611a5d565b348015610ae6575f80fd5b50610388610af5366004612e11565b611aa6565b348015610b05575f80fd5b50610388610b14366004612da6565b611be7565b348015610b24575f80fd5b50610441600d5481565b348015610b39575f80fd5b5060145461042190600160a81b900460ff1681565b5f546001600160a01b03163314610b805760405162461bcd60e51b8152600401610b7790612f28565b60405180910390fd5b610b8c6009600a613054565b610b969082613062565b60155550565b5f610ba8338484611c7e565b5060015b92915050565b5f610bbe848484611da1565b6001600160a01b0384165f90815260036020908152604080832033845290915290205482811015610c425760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610b77565b610c4f8533858403611c7e565b506001949350505050565b5f546001600160a01b03163314610c835760405162461bcd60e51b8152600401610b7790612f28565b6103e8811115610ce95760405162461bcd60e51b815260206004820152602b60248201527f4d61782057616c6c657420416d6d6f756e742063616e6e6f74206265206c657360448201526a73207468616e20302c352560a81b6064820152608401610b77565b80600854610cf79190613079565b600c8190556040519081527f4b39c36d20c57d220f61fd25c4349d4435cc03ef6c2a680942f15333c3c3e001906020015b60405180910390a150565b5f600954821115610d995760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610b77565b5f610da261201c565b9050610dae8184613079565b9392505050565b5f546001600160a01b03163314610dde5760405162461bcd60e51b8152600401610b7790612f28565b610def610dea30611343565b61203d565b565b5f546001600160a01b03163314610e1a5760405162461bcd60e51b8152600401610b7790612f28565b6001600160a01b0381165f9081526005602052604090205460ff16610e815760405162461bcd60e51b815260206004820152601760248201527f4163636f756e74206973206e6f74206578636c756465640000000000000000006044820152606401610b77565b5f5b600754811015610f9157816001600160a01b031660078281548110610eaa57610eaa613098565b5f918252602090912001546001600160a01b031603610f895760078054610ed3906001906130ac565b81548110610ee357610ee3613098565b5f91825260209091200154600780546001600160a01b039092169183908110610f0e57610f0e613098565b5f91825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600282526040808220829055600590925220805460ff191690556007805480610f6557610f656130bf565b5f8281526020902081015f1990810180546001600160a01b03191690550190555050565b600101610e83565b5050565b335f8181526003602090815260408083206001600160a01b03871684529091528120549091610ba8918590610fcb9086906130d3565b611c7e565b5f546001600160a01b03163314610ff95760405162461bcd60e51b8152600401610b7790612f28565b6001600160a01b03165f908152600460205260409020805460ff19166001179055565b8047101561106c5760405162461bcd60e51b815260206004820152601860248201527f696e73756666696369656e7420424e422062616c616e636500000000000000006044820152606401610b77565b601054611082906001600160a01b0316826121b8565b50565b5f6008548311156110d85760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610b77565b816110f3575f6110e98460016122d2565b519150610bac9050565b5f6110ff8460016122d2565b602001519150610bac9050565b5f546001600160a01b031633146111355760405162461bcd60e51b8152600401610b7790612f28565b60405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb906044016020604051808303815f875af1158015611181573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111a591906130e6565b50505050565b5f546001600160a01b031633146111d45760405162461bcd60e51b8152600401610b7790612f28565b6001600160a01b0381165f9081526005602052604090205460ff161561123c5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610b77565b6001600160a01b0381165f9081526001602052604090205415611293576001600160a01b0381165f9081526001602052604090205461127a90610d33565b6001600160a01b0382165f908152600260205260409020555b6001600160a01b03165f818152600560205260408120805460ff191660019081179091556007805491820181559091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880180546001600160a01b0319169091179055565b5f546001600160a01b031633146113215760405162461bcd60e51b8152600401610b7790612f28565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381165f9081526005602052604081205460ff161561137e57506001600160a01b03165f9081526002602052604090205490565b6001600160a01b0382165f90815260016020526040902054610bac90610d33565b5f546001600160a01b031633146113c85760405162461bcd60e51b8152600401610b7790612f28565b610def5f612315565b5f546001600160a01b031633146113fa5760405162461bcd60e51b8152600401610b7790612f28565b6014805460ff60a81b1916600160a81b179055565b5f546001600160a01b031633146114385760405162461bcd60e51b8152600401610b7790612f28565b6001600160a01b03165f9081526004602090815260408083208054600160ff1991821681179092556006909352922080549091169091179055565b5f546001600160a01b0316331461149c5760405162461bcd60e51b8152600401610b7790612f28565b6016805460ff87811661ffff1990921691909117610100878316021763ffff00001916620100008683160263ff0000001916176301000000858316021764ff000000001916600160201b91841691909102179055806114fb8385613101565b6115059190613101565b6016805460ff92909216600160281b0260ff60281b199092169190911790555050505050565b5f546001600160a01b031633146115545760405162461bcd60e51b8152600401610b7790612f28565b6001600160a01b0382165f9081526012602052604090205481151560ff9091161515036115e95760405162461bcd60e51b815260206004820152603860248201527f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160448201527f6c72656164792073657420746f20746861742076616c756500000000000000006064820152608401610b77565b6001600160a01b0382165f908152601260205260409020805460ff19168215801591909117909155611670576001600160a01b0382165f81815260066020908152604091829020805460ff191660011790559051918252821515917f4a8452f723db48bf05f301f94d62a2cf7a72976cde77d83e3646584858b8f4b2910160405180910390a25b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab905f90a35050565b335f9081526003602090815260408083206001600160a01b03861684529091528120548281101561172c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610b77565b6117393385858403611c7e565b5060019392505050565b5f610ba8338484611da1565b5f546001600160a01b031633146117785760405162461bcd60e51b8152600401610b7790612f28565b60148054821515600160a01b0260ff60a01b199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15990610d2890831515815260200190565b5f546001600160a01b031633146117ee5760405162461bcd60e51b8152600401610b7790612f28565b601080546001600160a01b0319166001600160a01b0392909216919091179055565b5f546001600160a01b031633146118395760405162461bcd60e51b8152600401610b7790612f28565b6001600160a01b0382165f9081526006602052604090205481151560ff9091161515036118c35760405162461bcd60e51b815260206004820152603260248201527f5f69734578636c7564656446726f6d4d617857616c6c657420616c72656164796044820152712073657420746f20746861742076616c756560701b6064820152608401610b77565b6001600160a01b0382165f81815260066020908152604091829020805460ff1916851515908117909155915192835290917f4a8452f723db48bf05f301f94d62a2cf7a72976cde77d83e3646584858b8f4b2910160405180910390a25050565b5f546001600160a01b0316331461194c5760405162461bcd60e51b8152600401610b7790612f28565b6103e88261195930611343565b6119639190613062565b61196d9190613079565b600d81905561197b90612364565b601180546001600160a01b0319166001600160a01b03831690811790915547600e819055610f9191906121b8565b5f546001600160a01b031633146119d25760405162461bcd60e51b8152600401610b7790612f28565b6103e8811115611a375760405162461bcd60e51b815260206004820152602a60248201527f4d617820547820416d6f756e7453656c6c2063616e6e6f74206265206c657373604482015269207468616e20302c352560b01b6064820152608401610b77565b81600854611a459190613079565b600a55600854611a56908290613079565b600b555050565b5f546001600160a01b03163314611a865760405162461bcd60e51b8152600401610b7790612f28565b6001600160a01b03165f908152600460205260409020805460ff19169055565b5f546001600160a01b03163314611acf5760405162461bcd60e51b8152600401610b7790612f28565b6014818385611ade888a613101565b611ae89190613101565b611af29190613101565b611afc9190613101565b60ff161115611b585760405162461bcd60e51b815260206004820152602260248201527f546f74616c2073656c6c20666565732063616e6e6f74206265206f7665722032604482015261302560f01b6064820152608401610b77565b6017805460ff87811661ffff1990921691909117610100878316021763ffff00001916620100008683160263ff0000001916176301000000858316021764ff000000001916600160201b9184169190910217905580611bb78385613101565b611bc19190613101565b6017805460ff92909216600160281b0260ff60281b199092169190911790555050505050565b5f546001600160a01b03163314611c105760405162461bcd60e51b8152600401610b7790612f28565b6001600160a01b038116611c755760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b77565b61108281612315565b6001600160a01b038316611ce05760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610b77565b6001600160a01b038216611d415760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610b77565b6001600160a01b038381165f8181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383165f9081526004602052604081205460ff1680611dde57506001600160a01b0383165f9081526004602052604090205460ff165b1590508015611faa576001600160a01b0384165f9081526012602052604090205460ff1615611ed6576016546018805460ff80841661ffff19909216919091176101008085048316021763ffff000019166201000080850483160263ff00000019161763010000008085048316021765ffff000000001916600160201b80850483160260ff60281b191617600160281b9384900491909116909202919091179055600a54821115611ed15760405162461bcd60e51b815260206004820181905260248201527f616d6f756e74206d757374206265203c3d206d61785478416d6f756e744275796044820152606401610b77565b611faa565b6017546018805460ff80841661ffff19909216919091176101008085048316021763ffff000019166201000080850483160263ff00000019161763010000008085048316021765ffff000000001916600160201b80850483160260ff60281b191617600160281b9384900491909116909202919091179055600b54821115611faa5760405162461bcd60e51b815260206004820152602160248201527f616d6f756e74206d757374206265203c3d206d61785478416d6f756e7453656c6044820152601b60fa1b6064820152608401610b77565b601554611fb630611343565b10158015611fc7575060135460ff16155b8015611feb57506001600160a01b0384165f9081526012602052604090205460ff16155b80156120005750601454600160a01b900460ff165b156120105761201060155461203d565b6111a58484848461250b565b5f805f612027612860565b90925090506120368183613079565b9250505090565b6013805460ff191660011790556018545f9061206490600160281b900460ff16600261311a565b60185460ff91821692505f91839161208591600160201b9091041685613062565b61208f9190613079565b90505f61209c82856130ac565b9050476120a882612364565b5f6120b382476130ac565b6018549091505f906120cf90600160201b900460ff16876130ac565b6018546120e690600160201b900460ff1684613062565b6120f09190613079565b90506120fc85826129d0565b60185447905f90612117906301000000900460ff16896130ac565b60185461212e906301000000900460ff1684613062565b6121389190613079565b6018549091505f906121539062010000900460ff168a6130ac565b6018546121699062010000900460ff1685613062565b6121739190613079565b60105490915061218c906001600160a01b0316836121b8565b600f546121a2906001600160a01b0316826121b8565b50506013805460ff191690555050505050505050565b804710156122085760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610b77565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114612251576040519150601f19603f3d011682016040523d82523d5f602084013e612256565b606091505b50509050806122cd5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610b77565b505050565b6122da612c9b565b6122e48383612aa7565b90506122f98184846122f461201c565b612b68565b6080860152606085015260408401526020830152815292915050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040805160028082526060820183525f9260208301908036833701905050905030815f8151811061239757612397613098565b60200260200101906001600160a01b031690816001600160a01b031681525050601360019054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612408573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061242c919061313d565b8160018151811061243f5761243f613098565b6001600160a01b03928316602091820292909201810191909152601354305f90815260038352604080822061010090930490941681529152205482111561249e5760135461249e90309061010090046001600160a01b03165f19611c7e565b60135460405163791ac94760e01b81526101009091046001600160a01b03169063791ac947906124da9085905f90869030904290600401613158565b5f604051808303815f87803b1580156124f1575f80fd5b505af1158015612503573d5f803e3d5ffd5b505050505050565b5f61251683836122d2565b6001600160a01b0386165f9081526005602052604090205490915060ff1615612566576001600160a01b0385165f90815260026020526040812080548592906125609084906130ac565b90915550505b6001600160a01b0384165f9081526005602052604090205460ff16156125b85760a08101516001600160a01b0385165f90815260026020526040812080549091906125b29084906130d3565b90915550505b80516001600160a01b0386165f90815260016020526040812080549091906125e19084906130ac565b90915550506020808201516001600160a01b0386165f9081526001909252604082208054919290916126149084906130d3565b909155505081156126d6578060e0015160085f82825461263491906130ac565b9182905550600855506060810151600980545f906126539084906130ac565b918290555060095550604081015160c08201516126709190612bf6565b6126838160800151826101000151612c29565b306001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8361010001516040516126cd91815260200190565b60405180910390a35b6001600160a01b0385165f9081526004602052604090205460ff1615801561271657506001600160a01b0384165f9081526004602052604090205460ff16155b1561277457601454600160a81b900460ff166127745760405162461bcd60e51b815260206004820152601760248201527f54726164696e67206e6f7420656e61626c6564207965740000000000000000006044820152606401610b77565b6001600160a01b0384165f9081526006602052604090205460ff16806127a45750600c546127a185611343565b11155b6128085760405162461bcd60e51b815260206004820152602f60248201527f526563697069656e742063616e6e6f7420686f6c64206d6f7265207468616e2060448201526e1b585e15d85b1b195d105b5bdd5b9d608a1b6064820152608401610b77565b836001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360a0015160405161285191815260200190565b60405180910390a35050505050565b6009546008545f918291825b60075481101561299f578260015f6007848154811061288d5761288d613098565b5f9182526020808320909101546001600160a01b0316835282019290925260400190205411806128f557508160025f600784815481106128cf576128cf613098565b5f9182526020808320909101546001600160a01b03168352820192909252604001902054115b1561290b57600954600854945094505050509091565b60015f6007838154811061292157612921613098565b5f9182526020808320909101546001600160a01b0316835282019290925260400190205461294f90846130ac565b925060025f6007838154811061296757612967613098565b5f9182526020808320909101546001600160a01b0316835282019290925260400190205461299590836130ac565b915060010161286c565b506008546009546129b09190613079565b8210156129c7576009546008549350935050509091565b90939092509050565b60135460105460405163f305d71960e01b8152306004820152602481018590525f6044820181905260648201526001600160a01b0391821660848201524260a4820152610100909204169063f305d71990839060c40160606040518083038185885af1158015612a42573d5f803e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190612a6791906131c8565b505060408051848152602081018490527f38f8a0c92f4c5b0b6877f878cb4c0c8d348a47b76d716c8e78f425043df9515b92500160405180910390a15050565b612aaf612c9b565b81612ac05760a08101839052610bac565b601854606490612ad39060ff1685613062565b612add9190613079565b60c0820152601854606490612afa90610100900460ff1685613062565b612b049190613079565b60e0820152601854606490612b2390600160281b900460ff1685613062565b612b2d9190613079565b610100820181905260e082015160c0830151612b4990866130ac565b612b5391906130ac565b612b5d91906130ac565b60a082015292915050565b5f80808080612b778689613062565b945086612b8e57508392505f915081905080612beb565b858960c00151612b9e9190613062565b9250858960e00151612bb09190613062565b915085896101000151612bc39190613062565b90508082612bd185886130ac565b612bdb91906130ac565b612be591906130ac565b93509091905b945094509450945094565b8160095f828254612c0791906130ac565b9091555050601980548291905f90612c209084906130d3565b90915550505050565b305f9081526001602052604081208054849290612c479084906130d3565b9091555050305f9081526005602052604090205460ff1615612c8757305f9081526002602052604081208054839290612c819084906130d3565b90915550505b8060196002015f828254612c2091906130d3565b6040518061012001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81525090565b5f60208284031215612cee575f80fd5b5035919050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b6001600160a01b0381168114611082575f80fd5b5f8060408385031215612d4f575f80fd5b8235612d5a81612d2a565b946020939093013593505050565b5f805f60608486031215612d7a575f80fd5b8335612d8581612d2a565b92506020840135612d9581612d2a565b929592945050506040919091013590565b5f60208284031215612db6575f80fd5b8135610dae81612d2a565b8015158114611082575f80fd5b5f8060408385031215612ddf575f80fd5b823591506020830135612df181612dc1565b809150509250929050565b803560ff81168114612e0c575f80fd5b919050565b5f805f805f60a08688031215612e25575f80fd5b612e2e86612dfc565b9450612e3c60208701612dfc565b9350612e4a60408701612dfc565b9250612e5860608701612dfc565b9150612e6660808701612dfc565b90509295509295909350565b5f8060408385031215612e83575f80fd5b8235612e8e81612d2a565b91506020830135612df181612dc1565b5f60208284031215612eae575f80fd5b8135610dae81612dc1565b5f8060408385031215612eca575f80fd5b823591506020830135612df181612d2a565b5f8060408385031215612eed575f80fd5b50508035926020909101359150565b5f8060408385031215612f0d575f80fd5b8235612f1881612d2a565b91506020830135612df181612d2a565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b6001815b6001841115612fac57808504811115612f9057612f90612f5d565b6001841615612f9e57908102905b60019390931c928002612f75565b935093915050565b5f82612fc257506001610bac565b81612fce57505f610bac565b8160018114612fe45760028114612fee5761300a565b6001915050610bac565b60ff841115612fff57612fff612f5d565b50506001821b610bac565b5060208310610133831016604e8410600b841016171561302d575081810a610bac565b6130395f198484612f71565b805f190482111561304c5761304c612f5d565b029392505050565b5f610dae60ff841683612fb4565b8082028115828204841417610bac57610bac612f5d565b5f8261309357634e487b7160e01b5f52601260045260245ffd5b500490565b634e487b7160e01b5f52603260045260245ffd5b81810381811115610bac57610bac612f5d565b634e487b7160e01b5f52603160045260245ffd5b80820180821115610bac57610bac612f5d565b5f602082840312156130f6575f80fd5b8151610dae81612dc1565b60ff8181168382160190811115610bac57610bac612f5d565b60ff818116838216029081169081811461313657613136612f5d565b5092915050565b5f6020828403121561314d575f80fd5b8151610dae81612d2a565b5f60a0820187835286602084015260a0604084015280865180835260c0850191506020880192505f5b818110156131a85783516001600160a01b0316835260209384019390920191600101613181565b50506001600160a01b039590951660608401525050608001529392505050565b5f805f606084860312156131da575f80fd5b505081516020830151604090930151909492935091905056fea2646970667358221220ac28b7e807461da166d893f625c81489cafbfa4dbe39e8bede1100f9deac4bab64736f6c634300081a0033
Deployed Bytecode Sourcemap
19674:22233:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38142:179;;;;;;;;;;-1:-1:-1;38142:179:0;;;;;:::i;:::-;;:::i;:::-;;20977:41;;;;;;;;;;-1:-1:-1;20977:41:0;;;;;;;-1:-1:-1;;;;;20977:41:0;;;;;;-1:-1:-1;;;;;435:32:1;;;417:51;;405:2;390:18;20977:41:0;;;;;;;;24426:83;;;;;;;;;;-1:-1:-1;24496:5:0;;;;;;;;;;;;-1:-1:-1;;;24496:5:0;;;;24426:83;;;;;;;:::i;25434:193::-;;;;;;;;;;-1:-1:-1;25434:193:0;;;;;:::i;:::-;;:::i;:::-;;;1575:14:1;;1568:22;1550:41;;1538:2;1523:18;25434:193:0;1410:187:1;24726:95:0;;;;;;;;;;-1:-1:-1;24806:7:0;;24726:95;;;1748:25:1;;;1736:2;1721:18;24726:95:0;1602:177:1;25635:521:0;;;;;;;;;;-1:-1:-1;25635:521:0;;;;;:::i;:::-;;:::i;39980:318::-;;;;;;;;;;-1:-1:-1;39980:318:0;;;;;:::i;:::-;;:::i;27584:319::-;;;;;;;;;;-1:-1:-1;27584:319:0;;;;;:::i;:::-;;:::i;24612:83::-;;;;;;;;;;-1:-1:-1;24612:83:0;;20200:1;2439:36:1;;2427:2;2412:18;24612:83:0;2297:184:1;40449:103:0;;;;;;;;;;;;;:::i;28258:473::-;;;;;;;;;;-1:-1:-1;28258:473:0;;;;;:::i;:::-;;:::i;26164:297::-;;;;;;;;;;-1:-1:-1;26164:297:0;;;;;:::i;:::-;;:::i;20699:33::-;;;;;;;;;;-1:-1:-1;20699:33:0;;;;-1:-1:-1;;;;;20699:33:0;;;28739:113;;;;;;;;;;-1:-1:-1;28739:113:0;;;;;:::i;:::-;;:::i;40994:179::-;;;;;;;;;;-1:-1:-1;40994:179:0;;;;;:::i;:::-;;:::i;27087:489::-;;;;;;;;;;-1:-1:-1;27087:489:0;;;;;:::i;:::-;;:::i;41185:154::-;;;;;;;;;;-1:-1:-1;41185:154:0;;;;;:::i;:::-;;:::i;21058:40::-;;;;;;;;;;-1:-1:-1;21058:40:0;;;;-1:-1:-1;;;21058:40:0;;;;;;27916:334;;;;;;;;;;-1:-1:-1;27916:334:0;;;;;:::i;:::-;;:::i;28982:124::-;;;;;;;;;;-1:-1:-1;28982:124:0;;;;;:::i;:::-;-1:-1:-1;;;;;29071:27:0;29047:4;29071:27;;;:18;:27;;;;;;;;;28982:124;38329:157;;;;;;;;;;-1:-1:-1;38329:157:0;;;;;:::i;:::-;;:::i;20623:22::-;;;;;;;;;;;;;;;;29114:168;;;;;;;;;;-1:-1:-1;29114:168:0;;;;;:::i;:::-;-1:-1:-1;;;;;29241:33:0;29212:4;29241:33;;;:24;:33;;;;;;;;;29114:168;24829:198;;;;;;;;;;-1:-1:-1;24829:198:0;;;;;:::i;:::-;;:::i;21710:324::-;;;;;;;;;;-1:-1:-1;21710:324:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;21710:324:0;;;;;-1:-1:-1;;;21710:324:0;;;;;;;;;4004:4:1;3992:17;;;3974:36;;4046:17;;;4041:2;4026:18;;4019:45;4100:17;;;4080:18;;;4073:45;;;;4154:17;;;4149:2;4134:18;;4127:45;4209:17;;4203:3;4188:19;;4181:46;4264:17;;;4258:3;4243:19;;4236:46;3961:3;3946:19;21710:324:0;3711:577:1;2436:94:0;;;;;;;;;;;;;:::i;21378:323::-;;;;;;;;;;-1:-1:-1;21378:323:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;21378:323:0;;;;;-1:-1:-1;;;21378:323:0;;;;;20777:58;;;;;;;;;;-1:-1:-1;20777:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;20739:31;;;;;;;;;;-1:-1:-1;20739:31:0;;;;-1:-1:-1;;;;;20739:31:0;;;26959:120;;;;;;;;;;-1:-1:-1;26959:120:0;;;;;:::i;:::-;-1:-1:-1;;;;;27051:20:0;27027:4;27051:20;;;:11;:20;;;;;;;;;26959:120;40355:88;;;;;;;;;;;;;:::i;1785:87::-;;;;;;;;;;-1:-1:-1;1831:7:0;1858:6;-1:-1:-1;;;;;1858:6:0;1785:87;;41347:169;;;;;;;;;;-1:-1:-1;41347:169:0;;;;;:::i;:::-;;:::i;24517:87::-;;;;;;;;;;-1:-1:-1;24589:7:0;;;;;;;;;;;;-1:-1:-1;;;24589:7:0;;;;24517:87;;38616:375;;;;;;;;;;-1:-1:-1;38616:375:0;;;;;:::i;:::-;;:::i;37612:522::-;;;;;;;;;;-1:-1:-1;37612:522:0;;;;;:::i;:::-;;:::i;22207:36::-;;;;;;;;;;-1:-1:-1;22207:36:0;;;;;;;;;;;;;;;;5720:25:1;;;5776:2;5761:18;;5754:34;;;;5804:18;;;5797:34;5708:2;5693:18;22207:36:0;5518:319:1;26469:482:0;;;;;;;;;;-1:-1:-1;26469:482:0;;;;;:::i;:::-;;:::i;25035:199::-;;;;;;;;;;-1:-1:-1;25035:199:0;;;;;:::i;:::-;;:::i;20503:57::-;;;;;;;;;;;;;;;;29290:171;;;;;;;;;;-1:-1:-1;29290:171:0;;;;;:::i;:::-;;:::i;20654:38::-;;;;;;;;;;-1:-1:-1;20654:38:0;;;;-1:-1:-1;;;;;20654:38:0;;;21025:26;;;;;;;;;;-1:-1:-1;21025:26:0;;;;-1:-1:-1;;;;;21025:26:0;;;38494:114;;;;;;;;;;-1:-1:-1;38494:114:0;;;;;:::i;:::-;;:::i;21143:60::-;;;;;;;;;;;;;;;;41524:380;;;;;;;;;;-1:-1:-1;41524:380:0;;;;;:::i;:::-;;:::i;20438:57::-;;;;;;;;;;;;;;;;40597:326;;;;;;;;;;-1:-1:-1;40597:326:0;;;;;:::i;:::-;;:::i;20374:56::-;;;;;;;;;;;;;;;;39493:479;;;;;;;;;;-1:-1:-1;39493:479:0;;;;;:::i;:::-;;:::i;25242:184::-;;;;;;;;;;-1:-1:-1;25242:184:0;;;;;:::i;:::-;-1:-1:-1;;;;;25391:18:0;;;25359:7;25391:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;25242:184;28862:112;;;;;;;;;;-1:-1:-1;28862:112:0;;;;;:::i;:::-;;:::i;38999:486::-;;;;;;;;;;-1:-1:-1;38999:486:0;;;;;:::i;:::-;;:::i;2685:192::-;;;;;;;;;;-1:-1:-1;2685:192:0;;;;;:::i;:::-;;:::i;20585:31::-;;;;;;;;;;;;;;;;21105;;;;;;;;;;-1:-1:-1;21105:31:0;;;;-1:-1:-1;;;21105:31:0;;;;;;38142:179;1831:7;1858:6;-1:-1:-1;;;;;1858:6:0;679:10;2005:23;1997:68;;;;-1:-1:-1;;;1997:68:0;;;;;;;:::i;:::-;;;;;;;;;38300:13:::1;20200:1;38300:2;:13;:::i;:::-;38285:28;::::0;:12;:28:::1;:::i;:::-;38253:29;:60:::0;-1:-1:-1;38142:179:0:o;25434:193::-;25536:4;25558:39;679:10;25581:7;25590:6;25558:8;:39::i;:::-;-1:-1:-1;25615:4:0;25434:193;;;;;:::o;25635:521::-;25767:4;25784:36;25794:6;25802:9;25813:6;25784:9;:36::i;:::-;-1:-1:-1;;;;;25860:19:0;;25833:24;25860:19;;;:11;:19;;;;;;;;679:10;25860:33;;;;;;;;25926:26;;;;25904:116;;;;-1:-1:-1;;;25904:116:0;;9504:2:1;25904:116:0;;;9486:21:1;9543:2;9523:18;;;9516:30;9582:34;9562:18;;;9555:62;-1:-1:-1;;;9633:18:1;;;9626:38;9681:19;;25904:116:0;9302:404:1;25904:116:0;26056:57;26065:6;679:10;26106:6;26087:16;:25;26056:8;:57::i;:::-;-1:-1:-1;26144:4:0;;25635:521;-1:-1:-1;;;;25635:521:0:o;39980:318::-;1831:7;1858:6;-1:-1:-1;;;;;1858:6:0;679:10;2005:23;1997:68;;;;-1:-1:-1;;;1997:68:0;;;;;;;:::i;:::-;40099:4:::1;40076:19;:27;;40067:84;;;::::0;-1:-1:-1;;;40067:84:0;;9913:2:1;40067:84:0::1;::::0;::::1;9895:21:1::0;9952:2;9932:18;;;9925:30;9991:34;9971:18;;;9964:62;-1:-1:-1;;;10042:18:1;;;10035:41;10093:19;;40067:84:0::1;9711:407:1::0;40067:84:0::1;40190:19;40180:7;;:29;;;;:::i;:::-;40162:15;:47:::0;;;40251:39:::1;::::0;1748:25:1;;;40251:39:0::1;::::0;1736:2:1;1721:18;40251:39:0::1;;;;;;;;39980:318:::0;:::o;27584:319::-;27678:7;27736;;27725;:18;;27703:110;;;;-1:-1:-1;;;27703:110:0;;10547:2:1;27703:110:0;;;10529:21:1;10586:2;10566:18;;;10559:30;10625:34;10605:18;;;10598:62;-1:-1:-1;;;10676:18:1;;;10669:40;10726:19;;27703:110:0;10345:406:1;27703:110:0;27824:19;27846:10;:8;:10::i;:::-;27824:32;-1:-1:-1;27874:21:0;27824:32;27874:7;:21;:::i;:::-;27867:28;27584:319;-1:-1:-1;;;27584:319:0:o;40449:103::-;1831:7;1858:6;-1:-1:-1;;;;;1858:6:0;679:10;2005:23;1997:68;;;;-1:-1:-1;;;1997:68:0;;;;;;;:::i;:::-;40504:40:::1;40519:24;40537:4;40519:9;:24::i;:::-;40504:14;:40::i;:::-;40449:103::o:0;28258:473::-;1831:7;1858:6;-1:-1:-1;;;;;1858:6:0;679:10;2005:23;1997:68;;;;-1:-1:-1;;;1997:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;28338:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;28330:56;;;::::0;-1:-1:-1;;;28330:56:0;;10958:2:1;28330:56:0::1;::::0;::::1;10940:21:1::0;10997:2;10977:18;;;10970:30;11036:25;11016:18;;;11009:53;11079:18;;28330:56:0::1;10756:347:1::0;28330:56:0::1;28402:9;28397:327;28421:9;:16:::0;28417:20;::::1;28397:327;;;28479:7;-1:-1:-1::0;;;;;28463:23:0::1;:9;28473:1;28463:12;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;28463:12:0::1;:23:::0;28459:254:::1;;28522:9;28532:16:::0;;:20:::1;::::0;28551:1:::1;::::0;28532:20:::1;:::i;:::-;28522:31;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;28507:9:::1;:12:::0;;-1:-1:-1;;;;;28522:31:0;;::::1;::::0;28517:1;;28507:12;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;:46:::0;;-1:-1:-1;;;;;;28507:46:0::1;-1:-1:-1::0;;;;;28507:46:0;;::::1;;::::0;;28572:16;;::::1;::::0;;:7:::1;:16:::0;;;;;;:20;;;28611:11:::1;:20:::0;;;;:28;;-1:-1:-1;;28611:28:0::1;::::0;;28658:9:::1;:15:::0;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;28658:15:0;;;;;-1:-1:-1;;;;;;28658:15:0::1;::::0;;;;;28397:327:::1;28258:473:::0;:::o;28459:254::-:1;28439:3;;28397:327;;;;28258:473:::0;:::o;26164:297::-;679:10;26279:4;26373:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;26373:34:0;;;;;;;;;;26279:4;;26301:130;;26351:7;;26373:47;;26410:10;;26373:47;:::i;:::-;26301:8;:130::i;28739:113::-;1831:7;1858:6;-1:-1:-1;;;;;1858:6:0;679:10;2005:23;1997:68;;;;-1:-1:-1;;;1997:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;28810:27:0::1;;::::0;;;:18:::1;:27;::::0;;;;:34;;-1:-1:-1;;28810:34:0::1;28840:4;28810:34;::::0;;28739:113::o;40994:179::-;41085:9;41060:21;:34;;41052:71;;;;-1:-1:-1;;;41052:71:0;;11837:2:1;41052:71:0;;;11819:21:1;11876:2;11856:18;;;11849:30;11915:26;11895:18;;;11888:54;11959:18;;41052:71:0;11635:348:1;41052:71:0;41134:10;;:31;;-1:-1:-1;;;;;41134:10:0;41155:9;41134:20;:31::i;:::-;40994:179;:::o;27087:489::-;27205:7;27249;;27238;:18;;27230:62;;;;-1:-1:-1;;;27230:62:0;;12190:2:1;27230:62:0;;;12172:21:1;12229:2;12209:18;;;12202:30;12268:33;12248:18;;;12241:61;12319:18;;27230:62:0;11988:355:1;27230:62:0;27308:17;27303:266;;27342:28;27373:25;27384:7;27393:4;27373:10;:25::i;:::-;27420:9;;-1:-1:-1;27413:16:0;;-1:-1:-1;27413:16:0;27303:266;27462:28;27493:25;27504:7;27513:4;27493:10;:25::i;:::-;27540:17;;;;-1:-1:-1;27533:24:0;;-1:-1:-1;27533:24:0;41185:154;1831:7;1858:6;-1:-1:-1;;;;;1858:6:0;679:10;2005:23;1997:68;;;;-1:-1:-1;;;1997:68:0;;;;;;;:::i;:::-;41290:41:::1;::::0;-1:-1:-1;;;41290:41:0;;-1:-1:-1;;;;;12540:32:1;;;41290:41:0::1;::::0;::::1;12522:51:1::0;12589:18;;;12582:34;;;41290:27:0;::::1;::::0;::::1;::::0;12495:18:1;;41290:41:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;41185:154:::0;;;:::o;27916:334::-;1831:7;1858:6;-1:-1:-1;;;;;1858:6:0;679:10;2005:23;1997:68;;;;-1:-1:-1;;;1997:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;27999:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;27998:21;27990:61;;;::::0;-1:-1:-1;;;27990:61:0;;13079:2:1;27990:61:0::1;::::0;::::1;13061:21:1::0;13118:2;13098:18;;;13091:30;13157:29;13137:18;;;13130:57;13204:18;;27990:61:0::1;12877:351:1::0;27990:61:0::1;-1:-1:-1::0;;;;;28066:16:0;::::1;28085:1;28066:16:::0;;;:7:::1;:16;::::0;;;;;:20;28062:109:::1;;-1:-1:-1::0;;;;;28142:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;28122:37:::1;::::0;:19:::1;:37::i;:::-;-1:-1:-1::0;;;;;28103:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:56;28062:109:::1;-1:-1:-1::0;;;;;28181:20:0::1;;::::0;;;:11:::1;:20;::::0;;;;:27;;-1:-1:-1;;28181:27:0::1;28204:4;28181:27:::0;;::::1;::::0;;;28219:9:::1;:23:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;28219:23:0::1;::::0;;::::1;::::0;;27916:334::o;38329:157::-;1831:7;1858:6;-1:-1:-1;;;;;1858:6:0;679:10;2005:23;1997:68;;;;-1:-1:-1;;;1997:68:0;;;;;;;:::i;:::-;38444:15:::1;:34:::0;;-1:-1:-1;;;;;;38444:34:0::1;-1:-1:-1::0;;;;;38444:34:0;;;::::1;::::0;;;::::1;::::0;;38329:157::o;24829:198::-;-1:-1:-1;;;;;24919:20:0;;24895:7;24919:20;;;:11;:20;;;;;;;;24915:49;;;-1:-1:-1;;;;;;24948:16:0;;;;;:7;:16;;;;;;;24829:198::o;24915:49::-;-1:-1:-1;;;;;25002:16:0;;;;;;:7;:16;;;;;;24982:37;;:19;:37::i;2436:94::-;1831:7;1858:6;-1:-1:-1;;;;;1858:6:0;679:10;2005:23;1997:68;;;;-1:-1:-1;;;1997:68:0;;;;;;;:::i;:::-;2501:21:::1;2519:1;2501:9;:21::i;40355:88::-:0;1831:7;1858:6;-1:-1:-1;;;;;1858:6:0;679:10;2005:23;1997:68;;;;-1:-1:-1;;;1997:68:0;;;;;;;:::i;:::-;40410:11:::1;:18:::0;;-1:-1:-1;;;;40410:18:0::1;-1:-1:-1::0;;;40410:18:0::1;::::0;;40355:88::o;41347:169::-;1831:7;1858:6;-1:-1:-1;;;;;1858:6:0;679:10;2005:23;1997:68;;;;-1:-1:-1;;;1997:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;41415:28:0::1;;::::0;;;:18:::1;:28;::::0;;;;;;;:35;;41446:4:::1;-1:-1:-1::0;;41415:35:0;;::::1;::::0;::::1;::::0;;;41461:24:::1;:34:::0;;;;;:41;;;;::::1;::::0;;::::1;::::0;;41347:169::o;38616:375::-;1831:7;1858:6;-1:-1:-1;;;;;1858:6:0;679:10;2005:23;1997:68;;;;-1:-1:-1;;;1997:68:0;;;;;;;:::i;:::-;38783:8:::1;:19:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;38813:21:0;;;;;;;38783:19:::1;38813:21:::0;;::::1;;;-1:-1:-1::0;;38885:19:0;38845:29;;;::::1;;-1:-1:-1::0;;38885:19:0;;;;;::::1;;;-1:-1:-1::0;;38915:17:0::1;-1:-1:-1::0;;;38915:17:0;;::::1;::::0;;;::::1;;::::0;;;38961:16:::1;38885:19:::0;38845:29;38961:16:::1;:::i;:::-;:22;;;;:::i;:::-;38943:8;:40:::0;;::::1;::::0;;;::::1;-1:-1:-1::0;;;38943:40:0::1;-1:-1:-1::0;;;;38943:40:0;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;;;38616:375:0:o;37612:522::-;1831:7;1858:6;-1:-1:-1;;;;;1858:6:0;679:10;2005:23;1997:68;;;;-1:-1:-1;;;1997:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37751:33:0;::::1;;::::0;;;:26:::1;:33;::::0;;;;;:42;::::1;;:33;::::0;;::::1;:42;;::::0;37729:148:::1;;;::::0;-1:-1:-1;;;37729:148:0;;13588:2:1;37729:148:0::1;::::0;::::1;13570:21:1::0;13627:2;13607:18;;;13600:30;13666:34;13646:18;;;13639:62;13737:26;13717:18;;;13710:54;13781:19;;37729:148:0::1;13386:420:1::0;37729:148:0::1;-1:-1:-1::0;;;;;37888:33:0;::::1;;::::0;;;:26:::1;:33;::::0;;;;:41;;-1:-1:-1;;37888:41:0::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;;;37940:130:::1;;-1:-1:-1::0;;;;;37966:31:0;::::1;;::::0;;;:24:::1;:31;::::0;;;;;;;;:38;;-1:-1:-1;;37966:38:0::1;38000:4;37966:38;::::0;;38024:34;;417:51:1;;;38024:34:0;::::1;;::::0;::::1;::::0;390:18:1;38024:34:0::1;;;;;;;37940:130;38085:41;::::0;;::::1;;::::0;-1:-1:-1;;;;;38085:41:0;::::1;::::0;::::1;::::0;;;::::1;37612:522:::0;;:::o;26469:482::-;679:10;26589:4;26638:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;26638:34:0;;;;;;;;;;26705:35;;;;26683:122;;;;-1:-1:-1;;;26683:122:0;;14013:2:1;26683:122:0;;;13995:21:1;14052:2;14032:18;;;14025:30;14091:34;14071:18;;;14064:62;-1:-1:-1;;;14142:18:1;;;14135:35;14187:19;;26683:122:0;13811:401:1;26683:122:0;26841:67;679:10;26864:7;26892:15;26873:16;:34;26841:8;:67::i;:::-;-1:-1:-1;26939:4:0;;26469:482;-1:-1:-1;;;26469:482:0:o;25035:199::-;25140:4;25162:42;679:10;25186:9;25197:6;25162:9;:42::i;29290:171::-;1831:7;1858:6;-1:-1:-1;;;;;1858:6:0;679:10;2005:23;1997:68;;;;-1:-1:-1;;;1997:68:0;;;;;;;:::i;:::-;29367:21:::1;:32:::0;;;::::1;;-1:-1:-1::0;;;29367:32:0::1;-1:-1:-1::0;;;;29367:32:0;;::::1;;::::0;;29415:38:::1;::::0;::::1;::::0;::::1;::::0;29391:8;1575:14:1;1568:22;1550:41;;1538:2;1523:18;;1410:187;38494:114:0;1831:7;1858:6;-1:-1:-1;;;;;1858:6:0;679:10;2005:23;1997:68;;;;-1:-1:-1;;;1997:68:0;;;;;;;:::i;:::-;38576:10:::1;:24:::0;;-1:-1:-1;;;;;;38576:24:0::1;-1:-1:-1::0;;;;;38576:24:0;;;::::1;::::0;;;::::1;::::0;;38494:114::o;41524:380::-;1831:7;1858:6;-1:-1:-1;;;;;1858:6:0;679:10;2005:23;1997:68;;;;-1:-1:-1;;;1997:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;41661:33:0;::::1;;::::0;;;:24:::1;:33;::::0;;;;;:45;::::1;;:33;::::0;;::::1;:45;;::::0;41639:145:::1;;;::::0;-1:-1:-1;;;41639:145:0;;14419:2:1;41639:145:0::1;::::0;::::1;14401:21:1::0;14458:2;14438:18;;;14431:30;14497:34;14477:18;;;14470:62;-1:-1:-1;;;14548:18:1;;;14541:48;14606:19;;41639:145:0::1;14217:414:1::0;41639:145:0::1;-1:-1:-1::0;;;;;41795:33:0;::::1;;::::0;;;:24:::1;:33;::::0;;;;;;;;:44;;-1:-1:-1;;41795:44:0::1;::::0;::::1;;::::0;;::::1;::::0;;;41857:39;;417:51:1;;;41795:44:0;;41857:39:::1;::::0;390:18:1;41857:39:0::1;;;;;;;41524:380:::0;;:::o;40597:326::-;1831:7;1858:6;-1:-1:-1;;;;;1858:6:0;679:10;2005:23;1997:68;;;;-1:-1:-1;;;1997:68:0;;;;;;;:::i;:::-;40759:4:::1;40742:15;40717:24;40735:4;40717:9;:24::i;:::-;:40;;;;:::i;:::-;40716:47;;;;:::i;:::-;40701:12;:62:::0;;;40773:30:::1;::::0;:16:::1;:30::i;:::-;40814:8;:29:::0;;-1:-1:-1;;;;;;40814:29:0::1;-1:-1:-1::0;;;;;40814:29:0;::::1;::::0;;::::1;::::0;;;40860:21:::1;40854:3;:27:::0;;;40892:23:::1;::::0;40814:29;40892:18:::1;:23::i;39493:479::-:0;1831:7;1858:6;-1:-1:-1;;;;;1858:6:0;679:10;2005:23;1997:68;;;;-1:-1:-1;;;1997:68:0;;;;;;;:::i;:::-;39670:4:::1;39647:19;:27;;39638:83;;;::::0;-1:-1:-1;;;39638:83:0;;14838:2:1;39638:83:0::1;::::0;::::1;14820:21:1::0;14877:2;14857:18;;;14850:30;14916:34;14896:18;;;14889:62;-1:-1:-1;;;14967:18:1;;;14960:40;15017:19;;39638:83:0::1;14636:406:1::0;39638:83:0::1;39759:18;39749:7;;:28;;;;:::i;:::-;39732:14;:45:::0;39879:7:::1;::::0;:29:::1;::::0;39889:19;;39879:29:::1;:::i;:::-;39861:15;:47:::0;-1:-1:-1;;39493:479:0:o;28862:112::-;1831:7;1858:6;-1:-1:-1;;;;;1858:6:0;679:10;2005:23;1997:68;;;;-1:-1:-1;;;1997:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;28931:27:0::1;28961:5;28931:27:::0;;;:18:::1;:27;::::0;;;;:35;;-1:-1:-1;;28931:35:0::1;::::0;;28862:112::o;38999:486::-;1831:7;1858:6;-1:-1:-1;;;;;1858:6:0;679:10;2005:23;1997:68;;;;-1:-1:-1;;;1997:68:0;;;;;;;:::i;:::-;39218:2:::1;39211:3:::0;39204:4;39192:9;39177:12:::1;39184:5:::0;39177:4;:12:::1;:::i;:::-;:24;;;;:::i;:::-;:31;;;;:::i;:::-;:37;;;;:::i;:::-;:43;;;;39167:93;;;::::0;-1:-1:-1;;;39167:93:0;;15249:2:1;39167:93:0::1;::::0;::::1;15231:21:1::0;15288:2;15268:18;;;15261:30;15327:34;15307:18;;;15300:62;-1:-1:-1;;;15378:18:1;;;15371:32;15420:19;;39167:93:0::1;15047:398:1::0;39167:93:0::1;39271:9;:20:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;39302:22:0;;;;;;;39271:20:::1;39302:22:::0;;::::1;;;-1:-1:-1::0;;39376:20:0;39335:30;;;::::1;;-1:-1:-1::0;;39376:20:0;;;;;::::1;;;-1:-1:-1::0;;39407:18:0::1;-1:-1:-1::0;;;39407:18:0;;::::1;::::0;;;::::1;;::::0;;;39455:16:::1;39376:20:::0;39335:30;39455:16:::1;:::i;:::-;:22;;;;:::i;:::-;39436:9;:41:::0;;::::1;::::0;;;::::1;-1:-1:-1::0;;;39436:41:0::1;-1:-1:-1::0;;;;39436:41:0;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;;;38999:486:0:o;2685:192::-;1831:7;1858:6;-1:-1:-1;;;;;1858:6:0;679:10;2005:23;1997:68;;;;-1:-1:-1;;;1997:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2774:22:0;::::1;2766:73;;;::::0;-1:-1:-1;;;2766:73:0;;15652:2:1;2766:73:0::1;::::0;::::1;15634:21:1::0;15691:2;15671:18;;;15664:30;15730:34;15710:18;;;15703:62;-1:-1:-1;;;15781:18:1;;;15774:36;15827:19;;2766:73:0::1;15450:402:1::0;2766:73:0::1;2850:19;2860:8;2850:9;:19::i;32443:369::-:0;-1:-1:-1;;;;;32570:19:0;;32562:68;;;;-1:-1:-1;;;32562:68:0;;16059:2:1;32562:68:0;;;16041:21:1;16098:2;16078:18;;;16071:30;16137:34;16117:18;;;16110:62;-1:-1:-1;;;16188:18:1;;;16181:34;16232:19;;32562:68:0;15857:400:1;32562:68:0;-1:-1:-1;;;;;32649:21:0;;32641:68;;;;-1:-1:-1;;;32641:68:0;;16464:2:1;32641:68:0;;;16446:21:1;16503:2;16483:18;;;16476:30;16542:34;16522:18;;;16515:62;-1:-1:-1;;;16593:18:1;;;16586:32;16635:19;;32641:68:0;16262:398:1;32641:68:0;-1:-1:-1;;;;;32720:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;32772:32;;1748:25:1;;;32772:32:0;;1721:18:1;32772:32:0;;;;;;;32443:369;;;:::o;32820:1151::-;-1:-1:-1;;;;;32961:24:0;;32944:12;32961:24;;;:18;:24;;;;;;;;;:50;;-1:-1:-1;;;;;;32989:22:0;;;;;;:18;:22;;;;;;;;32961:50;32959:53;32944:68;;33029:7;33025:563;;;-1:-1:-1;;;;;33084:32:0;;;;;;:26;:32;;;;;;;;33080:497;;;33170:8;33155:23;:12;:23;;;;;;-1:-1:-1;;33155:23:0;;;;;;;;;;;;;;;-1:-1:-1;;33155:23:0;;;;;;;;-1:-1:-1;;33155:23:0;;;;;;;;;;-1:-1:-1;;33155:23:0;-1:-1:-1;;;33155:23:0;;;;;;-1:-1:-1;;;;33155:23:0;;-1:-1:-1;;;33155:23:0;;;;;;;;;;;;;;;;;33237:14;;33227:24;;;33197:130;;;;-1:-1:-1;;;33197:130:0;;16867:2:1;33197:130:0;;;16849:21:1;;;16886:18;;;16879:30;16945:34;16925:18;;;16918:62;16997:18;;33197:130:0;16665:356:1;33197:130:0;33080:497;;;33401:9;33386:24;:12;:24;;;;;;-1:-1:-1;;33386:24:0;;;;;;;;;;;;;;;-1:-1:-1;;33386:24:0;;;;;;;;-1:-1:-1;;33386:24:0;;;;;;;;;;-1:-1:-1;;33386:24:0;-1:-1:-1;;;33386:24:0;;;;;;-1:-1:-1;;;;33386:24:0;;-1:-1:-1;;;33386:24:0;;;;;;;;;;;;;;;;;33469:15;;33459:25;;;33429:132;;;;-1:-1:-1;;;33429:132:0;;17228:2:1;33429:132:0;;;17210:21:1;17267:2;17247:18;;;17240:30;17306:34;17286:18;;;17279:62;-1:-1:-1;;;17357:18:1;;;17350:31;17398:19;;33429:132:0;17026:397:1;33429:132:0;33646:29;;33618:24;33636:4;33618:9;:24::i;:::-;:57;;:91;;;;-1:-1:-1;33693:16:0;;;;33692:17;33618:91;:141;;;;-1:-1:-1;;;;;;33727:32:0;;;;;;:26;:32;;;;;;;;33726:33;33618:141;:179;;;;-1:-1:-1;33776:21:0;;-1:-1:-1;;;33776:21:0;;;;33618:179;33600:310;;;33853:45;33868:29;;33853:14;:45::i;:::-;33922:41;33937:4;33943:2;33947:6;33955:7;33922:14;:41::i;31688:161::-;31730:7;31751:15;31768;31787:19;:17;:19::i;:::-;31750:56;;-1:-1:-1;31750:56:0;-1:-1:-1;31824:17:0;31750:56;;31824:17;:::i;:::-;31817:24;;;;31688:161;:::o;35279:1212::-;23151:16;:23;;-1:-1:-1;;23151:23:0;23170:4;23151:23;;;35386:12:::1;:19:::0;23151:16;;35386:23:::1;::::0;-1:-1:-1;;;35386:19:0;::::1;23151:23:::0;35386:19:::1;35408:1;35386:23;:::i;:::-;35492:12;:15:::0;35364:45:::1;::::0;;::::1;::::0;-1:-1:-1;35420:32:0::1;::::0;35364:45;;35456:51:::1;::::0;-1:-1:-1;;;35492:15:0;;::::1;;35456:20:::0;:51:::1;:::i;:::-;35455:67;;;;:::i;:::-;35420:102:::0;-1:-1:-1;35535:14:0::1;35552:47;35420:102:::0;35552:20;:47:::1;:::i;:::-;35535:64:::0;-1:-1:-1;35637:21:0::1;35709:24;35535:64:::0;35709:16:::1;:24::i;:::-;35746:20;35769:38;35793:14:::0;35769:21:::1;:38;:::i;:::-;35913:12;:15:::0;35746:61;;-1:-1:-1;35818:29:0::1;::::0;35899::::1;::::0;-1:-1:-1;;;35913:15:0;::::1;;;35899:11:::0;:29:::1;:::i;:::-;35866:12;:15:::0;35851:30:::1;::::0;-1:-1:-1;;;35866:15:0;::::1;;;35851:12:::0;:30:::1;:::i;:::-;35850:79;;;;:::i;:::-;35818:111;;35968:61;35981:24;36007:21;35968:12;:61::i;:::-;36250:12;:16:::0;36133:21:::1;::::0;36106:24:::1;::::0;36236:30:::1;::::0;36250:16;;::::1;;;36236:11:::0;:30:::1;:::i;:::-;36202:12;:16:::0;36183:35:::1;::::0;36202:16;;::::1;;;36183::::0;:35:::1;:::i;:::-;36182:85;;;;:::i;:::-;36373:12;:21:::0;36165:102;;-1:-1:-1;36278:19:0::1;::::0;36359:35:::1;::::0;36373:21;;::::1;;;36359:11:::0;:35:::1;:::i;:::-;36320:12;:21:::0;36301:40:::1;::::0;36320:21;;::::1;;;36301:16:::0;:40:::1;:::i;:::-;36300:95;;;;:::i;:::-;36406:10;::::0;36278:117;;-1:-1:-1;36406:28:0::1;::::0;-1:-1:-1;;;;;36406:10:0::1;36427:6:::0;36406:20:::1;:28::i;:::-;36445:15;::::0;:38:::1;::::0;-1:-1:-1;;;;;36445:15:0::1;36471:11:::0;36445:25:::1;:38::i;:::-;-1:-1:-1::0;;23197:16:0;:24;;-1:-1:-1;;23197:24:0;;;-1:-1:-1;;;;;;;;35279:1212:0:o;13672:317::-;13787:6;13762:21;:31;;13754:73;;;;-1:-1:-1;;;13754:73:0;;17860:2:1;13754:73:0;;;17842:21:1;17899:2;17879:18;;;17872:30;17938:31;17918:18;;;17911:59;17987:18;;13754:73:0;17658:353:1;13754:73:0;13841:12;13859:9;-1:-1:-1;;;;;13859:14:0;13881:6;13859:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13840:52;;;13911:7;13903:78;;;;-1:-1:-1;;;13903:78:0;;18428:2:1;13903:78:0;;;18410:21:1;18467:2;18447:18;;;18440:30;18506:34;18486:18;;;18479:62;18577:28;18557:18;;;18550:56;18623:19;;13903:78:0;18226:422:1;13903:78:0;13743:246;13672:317;;:::o;29939:470::-;30039:36;;:::i;:::-;30105:29;30117:7;30126;30105:11;:29::i;:::-;30093:41;;30322:52;30334:9;30345:7;30354;30363:10;:8;:10::i;:::-;30322:11;:52::i;:::-;30291:17;;;30145:229;30261:15;;;30145:229;30232:14;;;30145:229;30192:25;;;30145:229;;;29939:470;;;;:::o;2885:173::-;2941:16;2960:6;;-1:-1:-1;;;;;2977:17:0;;;-1:-1:-1;;;;;;2977:17:0;;;;;;3010:40;;2960:6;;;;;;;3010:40;;2941:16;3010:40;2930:128;2885:173;:::o;36499:669::-;36633:16;;;36647:1;36633:16;;;;;;;;36609:21;;36633:16;;;;;;;;;;-1:-1:-1;36633:16:0;36609:40;;36678:4;36660;36665:1;36660:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;36660:23:0;;;-1:-1:-1;;;;;36660:23:0;;;;;36704:15;;;;;;;;;-1:-1:-1;;;;;36704:15:0;-1:-1:-1;;;;;36704:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36694:4;36699:1;36694:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;36694:32:0;;;:7;;;;;;;;;;:32;;;;36776:15;;36761:4;25359:7;25391:18;;;:11;:18;;;;;;36776:15;;;;;;;25391:27;;;;;;36796:11;-1:-1:-1;36739:159:0;;;36856:15;;36824:62;;36841:4;;36856:15;;;-1:-1:-1;;;;;36856:15:0;-1:-1:-1;;36824:8:0;:62::i;:::-;36936:15;;:224;;-1:-1:-1;;;36936:224:0;;:15;;;;-1:-1:-1;;;;;36936:15:0;;:66;;:224;;37017:11;;37043:1;;37087:4;;37114;;37134:15;;36936:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36554:614;36499:669;:::o;34052:1219::-;34204:28;34235;34246:7;34255;34235:10;:28::i;:::-;-1:-1:-1;;;;;34280:19:0;;;;;;:11;:19;;;;;;34204:59;;-1:-1:-1;34280:19:0;;34276:78;;;-1:-1:-1;;;;;34316:15:0;;;;;;:7;:15;;;;;:26;;34335:7;;34316:15;:26;;34335:7;;34316:26;:::i;:::-;;;;-1:-1:-1;;34276:78:0;-1:-1:-1;;;;;34368:22:0;;;;;;:11;:22;;;;;;;;34364:94;;;34429:17;;;;-1:-1:-1;;;;;34407:18:0;;;;;;:7;:18;;;;;:39;;:18;;;:39;;34429:17;;34407:39;:::i;:::-;;;;-1:-1:-1;;34364:94:0;34489:9;;-1:-1:-1;;;;;34470:15:0;;34489:9;34470:15;;;:7;:15;;;;;:28;;:15;;34489:9;34470:28;;34489:9;;34470:28;:::i;:::-;;;;-1:-1:-1;;34531:17:0;;;;;-1:-1:-1;;;;;34509:18:0;;;;;;:7;:18;;;;;;:39;;34531:17;;34509:18;;:39;;34531:17;;34509:39;:::i;:::-;;;;-1:-1:-1;;34559:284:0;;;;34623:1;:7;;;34612;;:18;;;;;;;:::i;:::-;;;;;-1:-1:-1;34602:7:0;:28;-1:-1:-1;34670:7:0;;;;34659;:18;;:7;;:18;;34670:7;;34659:18;:::i;:::-;;;;;-1:-1:-1;34649:7:0;:28;-1:-1:-1;34706:6:0;;;;34714;;;;34694:27;;34706:6;34694:11;:27::i;:::-;34736:33;34748:1;:9;;;34759:1;:9;;;34736:11;:33::i;:::-;34814:4;-1:-1:-1;;;;;34789:42:0;34798:6;-1:-1:-1;;;;;34789:42:0;;34821:1;:9;;;34789:42;;;;1748:25:1;;1736:2;1721:18;;1602:177;34789:42:0;;;;;;;;34559:284;-1:-1:-1;;;;;34859:26:0;;;;;;:18;:26;;;;;;;;34858:27;:61;;;;-1:-1:-1;;;;;;34890:29:0;;;;;;:18;:29;;;;;;;;34889:30;34858:61;34853:141;;;34944:11;;-1:-1:-1;;;34944:11:0;;;;34936:46;;;;-1:-1:-1;;;34936:46:0;;20207:2:1;34936:46:0;;;20189:21:1;20246:2;20226:18;;;20219:30;20285:25;20265:18;;;20258:53;20328:18;;34936:46:0;20005:347:1;34936:46:0;-1:-1:-1;;;;;35028:35:0;;;;;;:24;:35;;;;;;;;;:98;;;35111:15;;35087:20;35097:9;35087;:20::i;:::-;:39;;35028:98;35006:195;;;;-1:-1:-1;;;35006:195:0;;20559:2:1;35006:195:0;;;20541:21:1;20598:2;20578:18;;;20571:30;20637:34;20617:18;;;20610:62;-1:-1:-1;;;20688:18:1;;;20681:45;20743:19;;35006:195:0;20357:411:1;35006:195:0;35234:9;-1:-1:-1;;;;;35217:46:0;35226:6;-1:-1:-1;;;;;35217:46:0;;35245:1;:17;;;35217:46;;;;1748:25:1;;1736:2;1721:18;;1602:177;35217:46:0;;;;;;;;34193:1078;34052:1219;;;;:::o;31857:578::-;31955:7;;31991;;31908;;;;;32009:314;32033:9;:16;32029:20;;32009:314;;;32117:7;32093;:21;32101:9;32111:1;32101:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;32101:12:0;32093:21;;;;;;;;;;;;;:31;;:83;;;32169:7;32145;:21;32153:9;32163:1;32153:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;32153:12:0;32145:21;;;;;;;;;;;;;:31;32093:83;32071:146;;;32200:7;;32209;;32192:25;;;;;;;31857:578;;:::o;32071:146::-;32243:7;:21;32251:9;32261:1;32251:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;32251:12:0;32243:21;;;;;;;;;;;;;32232:32;;;;:::i;:::-;;;32290:7;:21;32298:9;32308:1;32298:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;32298:12:0;32290:21;;;;;;;;;;;;;32279:32;;;;:::i;:::-;;-1:-1:-1;32051:3:0;;32009:314;;;;32357:7;;32347;;:17;;;;:::i;:::-;32337:7;:27;32333:58;;;32374:7;;32383;;32366:25;;;;;;31857:578;;:::o;32333:58::-;32410:7;;32419;;-1:-1:-1;31857:578:0;-1:-1:-1;31857:578:0:o;37176:428::-;37287:15;;37491:10;;37287:255;;-1:-1:-1;;;37287:255:0;;37359:4;37287:255;;;21084:51:1;21151:18;;;21144:34;;;37405:1:0;21194:18:1;;;21187:34;;;21237:18;;;21230:34;-1:-1:-1;;;;;37491:10:0;;;21280:19:1;;;21273:61;37516:15:0;21350:19:1;;;21343:35;37287:15:0;;;;;;:31;;37326:9;;21056:19:1;;37287:255:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;37558:38:0;;;22024:25:1;;;22080:2;22065:18;;22058:34;;;37558:38:0;;-1:-1:-1;21997:18:1;37558:38:0;;;;;;;37176:428;;:::o;30417:503::-;30518:28;;:::i;:::-;30569:7;30564:91;;30593:17;;;:27;;;30635:8;;30564:91;30685:12;:16;30705:3;;30675:26;;30685:16;;30675:7;:26;:::i;:::-;30674:34;;;;:::i;:::-;30665:6;;;:43;30740:12;:17;30761:3;;30730:27;;30740:17;;;;;30730:7;:27;:::i;:::-;30729:35;;;;:::i;:::-;30719:7;;;:45;30798:12;:19;30821:3;;30788:29;;-1:-1:-1;;;30798:19:0;;;;30788:7;:29;:::i;:::-;30787:37;;;;:::i;:::-;30775:9;;;:49;;;30874:7;;;;30865:6;;;;30855:16;;:7;:16;:::i;:::-;:26;;;;:::i;:::-;:38;;;;:::i;:::-;30835:17;;;:58;30417:503;;;;:::o;30928:752::-;31137:15;;;;;31313:21;31323:11;31313:7;:21;:::i;:::-;31303:31;;31352:7;31347:75;;-1:-1:-1;31384:7:0;;-1:-1:-1;31402:1:0;;-1:-1:-1;31402:1:0;;-1:-1:-1;31402:1:0;31376:34;;31347:75;31450:11;31441:1;:6;;;:20;;;;:::i;:::-;31434:27;;31490:11;31480:1;:7;;;:21;;;;:::i;:::-;31472:29;;31534:11;31522:1;:9;;;:23;;;;:::i;:::-;31512:33;-1:-1:-1;31512:33:0;31591:5;31574:14;31584:4;31574:7;:14;:::i;:::-;:22;;;;:::i;:::-;:32;;;;:::i;:::-;31556:50;-1:-1:-1;31651:5:0;;31658:4;30928:752;;;;;;;;;;:::o;29567:125::-;29646:4;29635:7;;:15;;;;;;;:::i;:::-;;;;-1:-1:-1;;29661:11:0;:23;;29680:4;;29661:11;:15;;:23;;29680:4;;29661:23;:::i;:::-;;;;-1:-1:-1;;;;29567:125:0:o;29700:231::-;29790:4;29774:22;;;;:7;:22;;;;;:33;;29800:7;;29774:22;:33;;29800:7;;29774:33;:::i;:::-;;;;-1:-1:-1;;29842:4:0;29822:26;;;;:11;:26;;;;;;;;29818:65;;;29866:4;29850:22;;;;:7;:22;;;;;:33;;29876:7;;29850:22;:33;;29876:7;;29850:33;:::i;:::-;;;;-1:-1:-1;;29818:65:0;29916:7;29894:11;:18;;;:29;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:226:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;187:23:1;;14:226;-1:-1:-1;14:226:1:o;479:418::-;628:2;617:9;610:21;591:4;660:6;654:13;703:6;698:2;687:9;683:18;676:34;762:6;757:2;749:6;745:15;740:2;729:9;725:18;719:50;818:1;813:2;804:6;793:9;789:22;785:31;778:42;888:2;881;877:7;872:2;864:6;860:15;856:29;845:9;841:45;837:54;829:62;;;479:418;;;;:::o;902:131::-;-1:-1:-1;;;;;977:31:1;;967:42;;957:70;;1023:1;1020;1013:12;1038:367;1106:6;1114;1167:2;1155:9;1146:7;1142:23;1138:32;1135:52;;;1183:1;1180;1173:12;1135:52;1222:9;1209:23;1241:31;1266:5;1241:31;:::i;:::-;1291:5;1369:2;1354:18;;;;1341:32;;-1:-1:-1;;;1038:367:1:o;1784:508::-;1861:6;1869;1877;1930:2;1918:9;1909:7;1905:23;1901:32;1898:52;;;1946:1;1943;1936:12;1898:52;1985:9;1972:23;2004:31;2029:5;2004:31;:::i;:::-;2054:5;-1:-1:-1;2111:2:1;2096:18;;2083:32;2124:33;2083:32;2124:33;:::i;:::-;1784:508;;2176:7;;-1:-1:-1;;;2256:2:1;2241:18;;;;2228:32;;1784:508::o;2486:247::-;2545:6;2598:2;2586:9;2577:7;2573:23;2569:32;2566:52;;;2614:1;2611;2604:12;2566:52;2653:9;2640:23;2672:31;2697:5;2672:31;:::i;2962:118::-;3048:5;3041:13;3034:21;3027:5;3024:32;3014:60;;3070:1;3067;3060:12;3085:361;3150:6;3158;3211:2;3199:9;3190:7;3186:23;3182:32;3179:52;;;3227:1;3224;3217:12;3179:52;3272:23;;;-1:-1:-1;3371:2:1;3356:18;;3343:32;3384:30;3343:32;3384:30;:::i;:::-;3433:7;3423:17;;;3085:361;;;;;:::o;4501:156::-;4567:20;;4627:4;4616:16;;4606:27;;4596:55;;4647:1;4644;4637:12;4596:55;4501:156;;;:::o;4662:464::-;4747:6;4755;4763;4771;4779;4832:3;4820:9;4811:7;4807:23;4803:33;4800:53;;;4849:1;4846;4839:12;4800:53;4872:27;4889:9;4872:27;:::i;:::-;4862:37;;4918:36;4950:2;4939:9;4935:18;4918:36;:::i;:::-;4908:46;;4973:36;5005:2;4994:9;4990:18;4973:36;:::i;:::-;4963:46;;5028:36;5060:2;5049:9;5045:18;5028:36;:::i;:::-;5018:46;;5083:37;5115:3;5104:9;5100:19;5083:37;:::i;:::-;5073:47;;4662:464;;;;;;;;:::o;5131:382::-;5196:6;5204;5257:2;5245:9;5236:7;5232:23;5228:32;5225:52;;;5273:1;5270;5263:12;5225:52;5312:9;5299:23;5331:31;5356:5;5331:31;:::i;:::-;5381:5;-1:-1:-1;5438:2:1;5423:18;;5410:32;5451:30;5410:32;5451:30;:::i;5842:241::-;5898:6;5951:2;5939:9;5930:7;5926:23;5922:32;5919:52;;;5967:1;5964;5957:12;5919:52;6006:9;5993:23;6025:28;6047:5;6025:28;:::i;6088:367::-;6156:6;6164;6217:2;6205:9;6196:7;6192:23;6188:32;6185:52;;;6233:1;6230;6223:12;6185:52;6278:23;;;-1:-1:-1;6377:2:1;6362:18;;6349:32;6390:33;6349:32;6390:33;:::i;6460:346::-;6528:6;6536;6589:2;6577:9;6568:7;6564:23;6560:32;6557:52;;;6605:1;6602;6595:12;6557:52;-1:-1:-1;;6650:23:1;;;6770:2;6755:18;;;6742:32;;-1:-1:-1;6460:346:1:o;6811:388::-;6879:6;6887;6940:2;6928:9;6919:7;6915:23;6911:32;6908:52;;;6956:1;6953;6946:12;6908:52;6995:9;6982:23;7014:31;7039:5;7014:31;:::i;:::-;7064:5;-1:-1:-1;7121:2:1;7106:18;;7093:32;7134:33;7093:32;7134:33;:::i;7204:356::-;7406:2;7388:21;;;7425:18;;;7418:30;7484:34;7479:2;7464:18;;7457:62;7551:2;7536:18;;7204:356::o;7565:127::-;7626:10;7621:3;7617:20;7614:1;7607:31;7657:4;7654:1;7647:15;7681:4;7678:1;7671:15;7697:375;7785:1;7803:5;7817:249;7838:1;7828:8;7825:15;7817:249;;;7888:4;7883:3;7879:14;7873:4;7870:24;7867:50;;;7897:18;;:::i;:::-;7947:1;7937:8;7933:16;7930:49;;;7961:16;;;;7930:49;8044:1;8040:16;;;;;8000:15;;7817:249;;;7697:375;;;;;;:::o;8077:902::-;8126:5;8156:8;8146:80;;-1:-1:-1;8197:1:1;8211:5;;8146:80;8245:4;8235:76;;-1:-1:-1;8282:1:1;8296:5;;8235:76;8327:4;8345:1;8340:59;;;;8413:1;8408:174;;;;8320:262;;8340:59;8370:1;8361:10;;8384:5;;;8408:174;8445:3;8435:8;8432:17;8429:43;;;8452:18;;:::i;:::-;-1:-1:-1;;8508:1:1;8494:16;;8567:5;;8320:262;;8666:2;8656:8;8653:16;8647:3;8641:4;8638:13;8634:36;8628:2;8618:8;8615:16;8610:2;8604:4;8601:12;8597:35;8594:77;8591:203;;;-1:-1:-1;8703:19:1;;;8779:5;;8591:203;8826:42;-1:-1:-1;;8851:8:1;8845:4;8826:42;:::i;:::-;8904:6;8900:1;8896:6;8892:19;8883:7;8880:32;8877:58;;;8915:18;;:::i;:::-;8953:20;;8077:902;-1:-1:-1;;;8077:902:1:o;8984:140::-;9042:5;9071:47;9112:4;9102:8;9098:19;9092:4;9071:47;:::i;9129:168::-;9202:9;;;9233;;9250:15;;;9244:22;;9230:37;9220:71;;9271:18;;:::i;10123:217::-;10163:1;10189;10179:132;;10233:10;10228:3;10224:20;10221:1;10214:31;10268:4;10265:1;10258:15;10296:4;10293:1;10286:15;10179:132;-1:-1:-1;10325:9:1;;10123:217::o;11108:127::-;11169:10;11164:3;11160:20;11157:1;11150:31;11200:4;11197:1;11190:15;11224:4;11221:1;11214:15;11240:128;11307:9;;;11328:11;;;11325:37;;;11342:18;;:::i;11373:127::-;11434:10;11429:3;11425:20;11422:1;11415:31;11465:4;11462:1;11455:15;11489:4;11486:1;11479:15;11505:125;11570:9;;;11591:10;;;11588:36;;;11604:18;;:::i;12627:245::-;12694:6;12747:2;12735:9;12726:7;12722:23;12718:32;12715:52;;;12763:1;12760;12753:12;12715:52;12795:9;12789:16;12814:28;12836:5;12814:28;:::i;13233:148::-;13321:4;13300:12;;;13314;;;13296:31;;13339:13;;13336:39;;;13355:18;;:::i;17428:225::-;17532:4;17511:12;;;17525;;;17507:31;17558:22;;;;17599:24;;;17589:58;;17627:18;;:::i;:::-;17589:58;17428:225;;;;:::o;18785:251::-;18855:6;18908:2;18896:9;18887:7;18883:23;18879:32;18876:52;;;18924:1;18921;18914:12;18876:52;18956:9;18950:16;18975:31;19000:5;18975:31;:::i;19041:959::-;19303:4;19351:3;19340:9;19336:19;19382:6;19371:9;19364:25;19425:6;19420:2;19409:9;19405:18;19398:34;19468:3;19463:2;19452:9;19448:18;19441:31;19492:6;19527;19521:13;19558:6;19550;19543:22;19596:3;19585:9;19581:19;19574:26;;19635:2;19627:6;19623:15;19609:29;;19656:1;19666:195;19680:6;19677:1;19674:13;19666:195;;;19745:13;;-1:-1:-1;;;;;19741:39:1;19729:52;;19810:2;19836:15;;;;19801:12;;;;19777:1;19695:9;19666:195;;;-1:-1:-1;;;;;;;19917:32:1;;;;19912:2;19897:18;;19890:60;-1:-1:-1;;19981:3:1;19966:19;19959:35;19878:3;19041:959;-1:-1:-1;;;19041:959:1:o;21389:456::-;21477:6;21485;21493;21546:2;21534:9;21525:7;21521:23;21517:32;21514:52;;;21562:1;21559;21552:12;21514:52;-1:-1:-1;;21607:16:1;;21713:2;21698:18;;21692:25;21809:2;21794:18;;;21788:25;21607:16;;21692:25;;-1:-1:-1;21788:25:1;21389:456;-1:-1:-1;21389:456:1:o
Swarm Source
ipfs://ac28b7e807461da166d893f625c81489cafbfa4dbe39e8bede1100f9deac4bab
[ 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.