Feature Tip: Add private address tag to any address under My Name Tag !
ERC-20
Overview
Max Total Supply
1,000,000,000,000,000 Bayblade
Holders
27
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Balance
760,000,000,000 BaybladeValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
This contract contains unverified libraries: IterableMapping
Contract Name:
BayBlade
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-08-01 */ // SPDX-License-Identifier: MIT pragma solidity ^0.6.2; abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } 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); } interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } /// @title Dividend-Paying Token Optional Interface /// @author Roger Wu (https://github.com/roger-wu) /// @dev OPTIONAL functions for a dividend-paying token contract. interface DividendPayingTokenOptionalInterface { /// @notice View the amount of dividend in wei that an address can withdraw. /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` can withdraw. function withdrawableDividendOf(address _owner) external view returns(uint256); /// @notice View the amount of dividend in wei that an address has withdrawn. /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` has withdrawn. function withdrawnDividendOf(address _owner) external view returns(uint256); /// @notice View the amount of dividend in wei that an address has earned in total. /// @dev accumulativeDividendOf(_owner) = withdrawableDividendOf(_owner) + withdrawnDividendOf(_owner) /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` has earned in total. function accumulativeDividendOf(address _owner) external view returns(uint256); } /// @title Dividend-Paying Token Interface /// @author Roger Wu (https://github.com/roger-wu) /// @dev An interface for a dividend-paying token contract. interface DividendPayingTokenInterface { /// @notice View the amount of dividend in wei that an address can withdraw. /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` can withdraw. function dividendOf(address _owner) external view returns(uint256); /// @notice Distributes ether to token holders as dividends. /// @dev SHOULD distribute the paid ether to token holders as dividends. /// SHOULD NOT directly transfer ether to token holders in this function. /// MUST emit a `DividendsDistributed` event when the amount of distributed ether is greater than 0. function distributeDividends() external payable; /// @notice Withdraws the ether distributed to the sender. /// @dev SHOULD transfer `dividendOf(msg.sender)` wei to `msg.sender`, and `dividendOf(msg.sender)` SHOULD be 0 after the transfer. /// MUST emit a `DividendWithdrawn` event if the amount of ether transferred is greater than 0. function withdrawDividend() external; /// @dev This event MUST emit when ether is distributed to token holders. /// @param from The address which sends ether to this contract. /// @param weiAmount The amount of distributed ether in wei. event DividendsDistributed( address indexed from, uint256 weiAmount ); /// @dev This event MUST emit when an address withdraws their dividend. /// @param to The address which withdraws ether from this contract. /// @param weiAmount The amount of withdrawn ether in wei. event DividendWithdrawn( address indexed to, uint256 weiAmount ); } /** * @title SafeMathInt * @dev Math operations for int256 with overflow safety checks. */ library SafeMathInt { int256 private constant MIN_INT256 = int256(1) << 255; int256 private constant MAX_INT256 = ~(int256(1) << 255); /** * @dev Multiplies two int256 variables and fails on overflow. */ function mul(int256 a, int256 b) internal pure returns (int256) { int256 c = a * b; // Detect overflow when multiplying MIN_INT256 with -1 require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256)); require((b == 0) || (c / b == a)); return c; } /** * @dev Division of two int256 variables and fails on overflow. */ function div(int256 a, int256 b) internal pure returns (int256) { // Prevent overflow when dividing MIN_INT256 by -1 require(b != -1 || a != MIN_INT256); // Solidity already throws when dividing by 0. return a / b; } /** * @dev Subtracts two int256 variables and fails on overflow. */ function sub(int256 a, int256 b) internal pure returns (int256) { int256 c = a - b; require((b >= 0 && c <= a) || (b < 0 && c > a)); return c; } /** * @dev Adds two int256 variables and fails on overflow. */ function add(int256 a, int256 b) internal pure returns (int256) { int256 c = a + b; require((b >= 0 && c >= a) || (b < 0 && c < a)); return c; } /** * @dev Converts to absolute value, and fails on overflow. */ function abs(int256 a) internal pure returns (int256) { require(a != MIN_INT256); return a < 0 ? -a : a; } function toUint256Safe(int256 a) internal pure returns (uint256) { require(a >= 0); return uint256(a); } } library SafeMathUint { function toInt256Safe(uint256 a) internal pure returns (int256) { int256 b = int256(a); require(b >= 0); return b; } } library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { using SafeMath for uint256; mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) public { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be to transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); } // pragma solidity >=0.6.2; interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; } 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; } interface IUniswapV2Pair { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; event Mint(address indexed sender, uint amount0, uint amount1); event Burn(address indexed sender, uint amount0, uint amount1, address indexed to); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint); function price1CumulativeLast() external view returns (uint); function kLast() external view returns (uint); function mint(address to) external returns (uint liquidity); function burn(address to) external returns (uint amount0, uint amount1); function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } 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 () public { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } library IterableMapping { // Iterable mapping from address to uint; struct Map { address[] keys; mapping(address => uint) values; mapping(address => uint) indexOf; mapping(address => bool) inserted; } function get(Map storage map, address key) public view returns (uint) { return map.values[key]; } function getIndexOfKey(Map storage map, address key) public view returns (int) { if(!map.inserted[key]) { return -1; } return int(map.indexOf[key]); } function getKeyAtIndex(Map storage map, uint index) public view returns (address) { return map.keys[index]; } function size(Map storage map) public view returns (uint) { return map.keys.length; } function set(Map storage map, address key, uint val) public { if (map.inserted[key]) { map.values[key] = val; } else { map.inserted[key] = true; map.values[key] = val; map.indexOf[key] = map.keys.length; map.keys.push(key); } } function remove(Map storage map, address key) public { if (!map.inserted[key]) { return; } delete map.inserted[key]; delete map.values[key]; uint index = map.indexOf[key]; uint lastIndex = map.keys.length - 1; address lastKey = map.keys[lastIndex]; map.indexOf[lastKey] = index; delete map.indexOf[key]; map.keys[index] = lastKey; map.keys.pop(); } } /// @title Dividend-Paying Token /// @author Roger Wu (https://github.com/roger-wu) /// @dev A mintable ERC20 token that allows anyone to pay and distribute ether /// to token holders as dividends and allows token holders to withdraw their dividends. /// Reference: the source code of PoWH3D: https://etherscan.io/address/0xB3775fB83F7D12A36E0475aBdD1FCA35c091efBe#code contract DividendPayingToken is ERC20, DividendPayingTokenInterface, DividendPayingTokenOptionalInterface { using SafeMath for uint256; using SafeMathUint for uint256; using SafeMathInt for int256; // With `magnitude`, we can properly distribute dividends even if the amount of received ether is small. // For more discussion about choosing the value of `magnitude`, // see https://github.com/ethereum/EIPs/issues/1726#issuecomment-472352728 uint256 constant internal magnitude = 2**128; uint256 internal magnifiedDividendPerShare; // About dividendCorrection: // If the token balance of a `_user` is never changed, the dividend of `_user` can be computed with: // `dividendOf(_user) = dividendPerShare * balanceOf(_user)`. // When `balanceOf(_user)` is changed (via minting/burning/transferring tokens), // `dividendOf(_user)` should not be changed, // but the computed value of `dividendPerShare * balanceOf(_user)` is changed. // To keep the `dividendOf(_user)` unchanged, we add a correction term: // `dividendOf(_user) = dividendPerShare * balanceOf(_user) + dividendCorrectionOf(_user)`, // where `dividendCorrectionOf(_user)` is updated whenever `balanceOf(_user)` is changed: // `dividendCorrectionOf(_user) = dividendPerShare * (old balanceOf(_user)) - (new balanceOf(_user))`. // So now `dividendOf(_user)` returns the same value before and after `balanceOf(_user)` is changed. mapping(address => int256) internal magnifiedDividendCorrections; mapping(address => uint256) internal withdrawnDividends; uint256 public totalDividendsDistributed; constructor(string memory _name, string memory _symbol) public ERC20(_name, _symbol) { } /// @dev Distributes dividends whenever ether is paid to this contract. receive() external payable { distributeDividends(); } /// @notice Distributes ether to token holders as dividends. /// @dev It reverts if the total supply of tokens is 0. /// It emits the `DividendsDistributed` event if the amount of received ether is greater than 0. /// About undistributed ether: /// In each distribution, there is a small amount of ether not distributed, /// the magnified amount of which is /// `(msg.value * magnitude) % totalSupply()`. /// With a well-chosen `magnitude`, the amount of undistributed ether /// (de-magnified) in a distribution can be less than 1 wei. /// We can actually keep track of the undistributed ether in a distribution /// and try to distribute it in the next distribution, /// but keeping track of such data on-chain costs much more than /// the saved ether, so we don't do that. function distributeDividends() public override payable { require(totalSupply() > 0); if (msg.value > 0) { magnifiedDividendPerShare = magnifiedDividendPerShare.add( (msg.value).mul(magnitude) / totalSupply() ); emit DividendsDistributed(msg.sender, msg.value); totalDividendsDistributed = totalDividendsDistributed.add(msg.value); } } /// @notice Withdraws the ether distributed to the sender. /// @dev It emits a `DividendWithdrawn` event if the amount of withdrawn ether is greater than 0. function withdrawDividend() public virtual override { _withdrawDividendOfUser(msg.sender); } /// @notice Withdraws the ether distributed to the sender. /// @dev It emits a `DividendWithdrawn` event if the amount of withdrawn ether is greater than 0. function _withdrawDividendOfUser(address payable user) internal returns (uint256) { uint256 _withdrawableDividend = withdrawableDividendOf(user); if (_withdrawableDividend > 0) { withdrawnDividends[user] = withdrawnDividends[user].add(_withdrawableDividend); emit DividendWithdrawn(user, _withdrawableDividend); (bool success,) = user.call{value: _withdrawableDividend, gas: 3000}(""); if(!success) { withdrawnDividends[user] = withdrawnDividends[user].sub(_withdrawableDividend); return 0; } return _withdrawableDividend; } return 0; } /// @notice View the amount of dividend in wei that an address can withdraw. /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` can withdraw. function dividendOf(address _owner) public view override returns(uint256) { return withdrawableDividendOf(_owner); } /// @notice View the amount of dividend in wei that an address can withdraw. /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` can withdraw. function withdrawableDividendOf(address _owner) public view override returns(uint256) { return accumulativeDividendOf(_owner).sub(withdrawnDividends[_owner]); } /// @notice View the amount of dividend in wei that an address has withdrawn. /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` has withdrawn. function withdrawnDividendOf(address _owner) public view override returns(uint256) { return withdrawnDividends[_owner]; } /// @notice View the amount of dividend in wei that an address has earned in total. /// @dev accumulativeDividendOf(_owner) = withdrawableDividendOf(_owner) + withdrawnDividendOf(_owner) /// = (magnifiedDividendPerShare * balanceOf(_owner) + magnifiedDividendCorrections[_owner]) / magnitude /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` has earned in total. function accumulativeDividendOf(address _owner) public view override returns(uint256) { return magnifiedDividendPerShare.mul(balanceOf(_owner)).toInt256Safe() .add(magnifiedDividendCorrections[_owner]).toUint256Safe() / magnitude; } /// @dev Internal function that transfer tokens from one address to another. /// Update magnifiedDividendCorrections to keep dividends unchanged. /// @param from The address to transfer from. /// @param to The address to transfer to. /// @param value The amount to be transferred. function _transfer(address from, address to, uint256 value) internal virtual override { require(false); int256 _magCorrection = magnifiedDividendPerShare.mul(value).toInt256Safe(); magnifiedDividendCorrections[from] = magnifiedDividendCorrections[from].add(_magCorrection); magnifiedDividendCorrections[to] = magnifiedDividendCorrections[to].sub(_magCorrection); } /// @dev Internal function that mints tokens to an account. /// Update magnifiedDividendCorrections to keep dividends unchanged. /// @param account The account that will receive the created tokens. /// @param value The amount that will be created. function _mint(address account, uint256 value) internal override { super._mint(account, value); magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account] .sub( (magnifiedDividendPerShare.mul(value)).toInt256Safe() ); } /// @dev Internal function that burns an amount of the token of a given account. /// Update magnifiedDividendCorrections to keep dividends unchanged. /// @param account The account whose tokens will be burnt. /// @param value The amount that will be burnt. function _burn(address account, uint256 value) internal override { super._burn(account, value); magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account] .add( (magnifiedDividendPerShare.mul(value)).toInt256Safe() ); } function _setBalance(address account, uint256 newBalance) internal { uint256 currentBalance = balanceOf(account); if(newBalance > currentBalance) { uint256 mintAmount = newBalance.sub(currentBalance); _mint(account, mintAmount); } else if(newBalance < currentBalance) { uint256 burnAmount = currentBalance.sub(newBalance); _burn(account, burnAmount); } } } contract BayBlade is ERC20, Ownable { using SafeMath for uint256; IUniswapV2Router02 public uniswapV2Router; address public immutable uniswapV2Pair; bool private swapping; BaybladeDividendTracker public dividendTracker; address public liquidityWallet; uint256 public maxSellTransactionAmount = 5000000000000 * (10**18); uint256 public swapTokensAtAmount = 2000000000000 * (10**18); uint256 public immutable ETHRewardsFee; uint256 public immutable liquidityFee; uint256 public immutable totalFees; address payable public devWallet = 0x43AFe97160ce3043fF69e1B728e26F1F8eb391CA; // sells have fees of 12 and 6 (10 * 1.2 and 5 * 1.2) uint256 public immutable sellFeeIncreaseFactor = 120; // use by default 300,000 gas to process auto-claiming dividends uint256 public gasForProcessing = 300000; // exlcude from fees and max transaction amount mapping (address => bool) private _isExcludedFromFees; // addresses that can make transfers before presale is over mapping (address => bool) private canTransferBeforeTradingIsEnabled; // store addresses that a automatic market maker pairs. Any transfer *to* these addresses // could be subject to a maximum transfer amount mapping (address => bool) public automatedMarketMakerPairs; event UpdateDividendTracker(address indexed newAddress, address indexed oldAddress); event UpdateUniswapV2Router(address indexed newAddress, address indexed oldAddress); event ExcludeFromFees(address indexed account, bool isExcluded); event ExcludeMultipleAccountsFromFees(address[] accounts, bool isExcluded); event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value); event LiquidityWalletUpdated(address indexed newLiquidityWallet, address indexed oldLiquidityWallet); event GasForProcessingUpdated(uint256 indexed newValue, uint256 indexed oldValue); event SwapAndLiquify( uint256 tokensSwapped, uint256 ethReceived ); event SendDividends( uint256 tokensSwapped, uint256 amount ); event ProcessedDividendTracker( uint256 iterations, uint256 claims, uint256 lastProcessedIndex, bool indexed automatic, uint256 gas, address indexed processor ); constructor() public ERC20("BayBlade", "Bayblade") { uint256 _ETHRewardsFee = 4; uint256 _liquidityFee = 20; ETHRewardsFee = _ETHRewardsFee; liquidityFee = _liquidityFee; totalFees = _ETHRewardsFee.add(_liquidityFee); dividendTracker = new BaybladeDividendTracker(); liquidityWallet = owner(); IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); // Create a uniswap pair for this new token address _uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()) .createPair(address(this), _uniswapV2Router.WETH()); uniswapV2Router = _uniswapV2Router; uniswapV2Pair = _uniswapV2Pair; _setAutomatedMarketMakerPair(_uniswapV2Pair, true); // exclude from receiving dividends dividendTracker.excludeFromDividends(address(dividendTracker)); dividendTracker.excludeFromDividends(address(this)); dividendTracker.excludeFromDividends(owner()); dividendTracker.excludeFromDividends(address(_uniswapV2Router)); // exclude from paying fees or having max transaction amount excludeFromFees(liquidityWallet, true); excludeFromFees(address(this), true); // enable owner and fixed-sale wallet to send tokens before presales are over canTransferBeforeTradingIsEnabled[owner()] = true; /* _mint is an internal function in ERC20.sol that is only called here, and CANNOT be called ever again */ _mint(owner(), 1000000000000000 * (10**18)); } receive() external payable { } function updateDividendTracker(address newAddress) public onlyOwner { require(newAddress != address(dividendTracker), "The dividend tracker already has that address"); BaybladeDividendTracker newDividendTracker = BaybladeDividendTracker(payable(newAddress)); require(newDividendTracker.owner() == address(this), "The new dividend tracker must be owned by the BAYBLADE token contract"); newDividendTracker.excludeFromDividends(address(newDividendTracker)); newDividendTracker.excludeFromDividends(address(this)); newDividendTracker.excludeFromDividends(owner()); newDividendTracker.excludeFromDividends(address(uniswapV2Router)); emit UpdateDividendTracker(newAddress, address(dividendTracker)); dividendTracker = newDividendTracker; } function updateUniswapV2Router(address newAddress) public onlyOwner { require(newAddress != address(uniswapV2Router), "The router already has that address"); emit UpdateUniswapV2Router(newAddress, address(uniswapV2Router)); uniswapV2Router = IUniswapV2Router02(newAddress); } function sendETHToDevWallet(uint256 amount) private { swapTokensForEth(amount); devWallet.transfer(address(this).balance); } function setDevWallet(address payable newAddress) external onlyOwner { devWallet = newAddress; } function changeMaxSellLimit(uint256 newSellLimit) external onlyOwner { maxSellTransactionAmount = newSellLimit * (10**18); } function excludeFromFees(address account, bool excluded) public onlyOwner { require(_isExcludedFromFees[account] != excluded, "Bayblade: Account is already the value of 'excluded'"); _isExcludedFromFees[account] = excluded; emit ExcludeFromFees(account, excluded); } function excludeFromDividends(address account) external onlyOwner { dividendTracker.excludeFromDividends(account); } function excludeMultipleAccountsFromFees(address[] calldata accounts, bool excluded) public onlyOwner { for(uint256 i = 0; i < accounts.length; i++) { _isExcludedFromFees[accounts[i]] = excluded; } emit ExcludeMultipleAccountsFromFees(accounts, excluded); } function setAutomatedMarketMakerPair(address pair, bool value) public onlyOwner { require(pair != uniswapV2Pair, "The Uniswap pair cannot be removed from automatedMarketMakerPairs"); _setAutomatedMarketMakerPair(pair, value); } function _setAutomatedMarketMakerPair(address pair, bool value) private { require(automatedMarketMakerPairs[pair] != value, "Automated market maker pair is already set to that value"); automatedMarketMakerPairs[pair] = value; if(value) { dividendTracker.excludeFromDividends(pair); } emit SetAutomatedMarketMakerPair(pair, value); } function updateLiquidityWallet(address newLiquidityWallet) public onlyOwner { require(newLiquidityWallet != liquidityWallet, "Bayblade: The liquidity wallet is already this address"); excludeFromFees(newLiquidityWallet, true); emit LiquidityWalletUpdated(newLiquidityWallet, liquidityWallet); liquidityWallet = newLiquidityWallet; } function updateGasForProcessing(uint256 newValue) public onlyOwner { require(newValue >= 200000 && newValue <= 500000, "Bayblade: gasForProcessing must be between 200,000 and 500,000"); require(newValue != gasForProcessing, "Bayblade: Cannot update gasForProcessing to same value"); emit GasForProcessingUpdated(newValue, gasForProcessing); gasForProcessing = newValue; } function updateClaimWait(uint256 claimWait) external onlyOwner { dividendTracker.updateClaimWait(claimWait); } function getClaimWait() external view returns(uint256) { return dividendTracker.claimWait(); } function getTotalDividendsDistributed() external view returns (uint256) { return dividendTracker.totalDividendsDistributed(); } function isExcludedFromFees(address account) public view returns(bool) { return _isExcludedFromFees[account]; } function isExcludedFromDividends(address account) public view returns(bool) { return dividendTracker.excludedFromDividends(account); } function withdrawableDividendOf(address account) public view returns(uint256) { return dividendTracker.withdrawableDividendOf(account); } function dividendTokenBalanceOf(address account) public view returns (uint256) { return dividendTracker.balanceOf(account); } function getAccountDividendsInfo(address account) external view returns ( address, int256, int256, uint256, uint256, uint256, uint256, uint256) { return dividendTracker.getAccount(account); } function getAccountDividendsInfoAtIndex(uint256 index) external view returns ( address, int256, int256, uint256, uint256, uint256, uint256, uint256) { return dividendTracker.getAccountAtIndex(index); } function processDividendTracker(uint256 gas) external { (uint256 iterations, uint256 claims, uint256 lastProcessedIndex) = dividendTracker.process(gas); emit ProcessedDividendTracker(iterations, claims, lastProcessedIndex, false, gas, tx.origin); } function claim() external { dividendTracker.processAccount(msg.sender, false); } function getLastProcessedIndex() external view returns(uint256) { return dividendTracker.getLastProcessedIndex(); } function getNumberOfDividendTokenHolders() external view returns(uint256) { return dividendTracker.getNumberOfTokenHolders(); } function _transfer( address from, address to, uint256 amount ) internal override { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); if(amount == 0) { super._transfer(from, to, 0); return; } if( !swapping && automatedMarketMakerPairs[to] && // sells only by detecting transfer to automated market maker pair from != address(uniswapV2Router) && //router -> pair is removing liquidity which shouldn't have max !_isExcludedFromFees[to] && //no max for those excluded from fees !_isExcludedFromFees[liquidityWallet] ) { require(amount <= maxSellTransactionAmount, "Sell transfer amount exceeds the maxSellTransactionAmount."); } uint256 contractTokenBalance = balanceOf(address(this)); bool canSwap = contractTokenBalance >= swapTokensAtAmount; if( canSwap && !swapping && !automatedMarketMakerPairs[from] && from != liquidityWallet && to != liquidityWallet ) { swapping = true; uint256 swapTokens = contractTokenBalance.mul(liquidityFee).div(totalFees); swapAndLiquify(swapTokens); uint256 sellTokens = balanceOf(address(this)); swapAndSendDividends(sellTokens); swapping = false; } bool takeFee = !swapping; // if any account belongs to _isExcludedFromFee account then remove the fee if(_isExcludedFromFees[from] || _isExcludedFromFees[to]) { takeFee = false; } if(takeFee) { uint256 fees = amount.mul(totalFees).div(100); // if sell, multiply by 1.2 if(automatedMarketMakerPairs[to]) { fees = fees.mul(sellFeeIncreaseFactor).div(100); } amount = amount.sub(fees); super._transfer(from, address(this), fees); } super._transfer(from, to, amount); try dividendTracker.setBalance(payable(from), balanceOf(from)) {} catch {} try dividendTracker.setBalance(payable(to), balanceOf(to)) {} catch {} if(!swapping) { uint256 gas = gasForProcessing; try dividendTracker.process(gas) returns (uint256 iterations, uint256 claims, uint256 lastProcessedIndex) { emit ProcessedDividendTracker(iterations, claims, lastProcessedIndex, true, gas, tx.origin); } catch { } } } function swapAndLiquify(uint256 tokens) private { // capture the contract's current ETH balance. // this is so that we can capture exactly the amount of ETH that the // swap creates, and not make the liquidity event include any ETH that // has been manually sent to the contract uint256 initialBalance = address(this).balance; // how much ETH did we just swap into? uint256 newBalance = address(this).balance.sub(initialBalance); sendETHToDevWallet(tokens); emit SwapAndLiquify(tokens, newBalance); } function swapTokensForEth(uint256 tokenAmount) private { // generate the uniswap pair path of token -> weth address[] memory path = new address[](2); path[0] = address(this); path[1] = uniswapV2Router.WETH(); _approve(address(this), address(uniswapV2Router), tokenAmount); // make the swap uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens( tokenAmount, 0, // accept any amount of ETH path, address(this), block.timestamp ); } function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private { // approve token transfer to cover all possible scenarios _approve(address(this), address(uniswapV2Router), tokenAmount); // add the liquidity uniswapV2Router.addLiquidityETH{value: ethAmount}( address(this), tokenAmount, 0, // slippage is unavoidable 0, // slippage is unavoidable liquidityWallet, block.timestamp ); } function swapAndSendDividends(uint256 tokens) private { swapTokensForEth(tokens); uint256 dividends = address(this).balance; (bool success,) = address(dividendTracker).call{value: dividends}(""); if(success) { emit SendDividends(tokens, dividends); } } } contract BaybladeDividendTracker is DividendPayingToken, Ownable { using SafeMath for uint256; using SafeMathInt for int256; using IterableMapping for IterableMapping.Map; IterableMapping.Map private tokenHoldersMap; uint256 public lastProcessedIndex; mapping (address => bool) public excludedFromDividends; mapping (address => uint256) public lastClaimTimes; uint256 public claimWait; uint256 public minimumTokenBalanceForDividends; event ExcludeFromDividends(address indexed account); event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue); event Claim(address indexed account, uint256 amount, bool indexed automatic); constructor() public DividendPayingToken("Bayblade_Dividend_Tracker", "Bayblade_Dividend_Tracker") { claimWait = 3600; minimumTokenBalanceForDividends = 1000000000000 * (10**18); } function _transfer(address, address, uint256) internal override { require(false, "Bayblade_Dividend_Tracker: No transfers allowed"); } function withdrawDividend() public override { require(false, "Bayblade_Dividend_Tracker: withdrawDividend disabled. Use the 'claim' function on the main Bayblade contract."); } function excludeFromDividends(address account) external onlyOwner { require(!excludedFromDividends[account]); excludedFromDividends[account] = true; _setBalance(account, 0); tokenHoldersMap.remove(account); emit ExcludeFromDividends(account); } function updateClaimWait(uint256 newClaimWait) external onlyOwner { require(newClaimWait >= 3600 && newClaimWait <= 86400, "Bayblade_Dividend_Tracker: claimWait must be updated to between 1 and 24 hours"); require(newClaimWait != claimWait, "TIKI_Dividend_Tracker: Cannot update claimWait to same value"); emit ClaimWaitUpdated(newClaimWait, claimWait); claimWait = newClaimWait; } function getLastProcessedIndex() external view returns(uint256) { return lastProcessedIndex; } function getNumberOfTokenHolders() external view returns(uint256) { return tokenHoldersMap.keys.length; } function getAccount(address _account) public view returns ( address account, int256 index, int256 iterationsUntilProcessed, uint256 withdrawableDividends, uint256 totalDividends, uint256 lastClaimTime, uint256 nextClaimTime, uint256 secondsUntilAutoClaimAvailable) { account = _account; index = tokenHoldersMap.getIndexOfKey(account); iterationsUntilProcessed = -1; if(index >= 0) { if(uint256(index) > lastProcessedIndex) { iterationsUntilProcessed = index.sub(int256(lastProcessedIndex)); } else { uint256 processesUntilEndOfArray = tokenHoldersMap.keys.length > lastProcessedIndex ? tokenHoldersMap.keys.length.sub(lastProcessedIndex) : 0; iterationsUntilProcessed = index.add(int256(processesUntilEndOfArray)); } } withdrawableDividends = withdrawableDividendOf(account); totalDividends = accumulativeDividendOf(account); lastClaimTime = lastClaimTimes[account]; nextClaimTime = lastClaimTime > 0 ? lastClaimTime.add(claimWait) : 0; secondsUntilAutoClaimAvailable = nextClaimTime > block.timestamp ? nextClaimTime.sub(block.timestamp) : 0; } function getAccountAtIndex(uint256 index) public view returns ( address, int256, int256, uint256, uint256, uint256, uint256, uint256) { if(index >= tokenHoldersMap.size()) { return (0x0000000000000000000000000000000000000000, -1, -1, 0, 0, 0, 0, 0); } address account = tokenHoldersMap.getKeyAtIndex(index); return getAccount(account); } function canAutoClaim(uint256 lastClaimTime) private view returns (bool) { if(lastClaimTime > block.timestamp) { return false; } return block.timestamp.sub(lastClaimTime) >= claimWait; } function setBalance(address payable account, uint256 newBalance) external onlyOwner { if(excludedFromDividends[account]) { return; } if(newBalance >= minimumTokenBalanceForDividends) { _setBalance(account, newBalance); tokenHoldersMap.set(account, newBalance); } else { _setBalance(account, 0); tokenHoldersMap.remove(account); } processAccount(account, true); } function process(uint256 gas) public returns (uint256, uint256, uint256) { uint256 numberOfTokenHolders = tokenHoldersMap.keys.length; if(numberOfTokenHolders == 0) { return (0, 0, lastProcessedIndex); } uint256 _lastProcessedIndex = lastProcessedIndex; uint256 gasUsed = 0; uint256 gasLeft = gasleft(); uint256 iterations = 0; uint256 claims = 0; while(gasUsed < gas && iterations < numberOfTokenHolders) { _lastProcessedIndex++; if(_lastProcessedIndex >= tokenHoldersMap.keys.length) { _lastProcessedIndex = 0; } address account = tokenHoldersMap.keys[_lastProcessedIndex]; if(canAutoClaim(lastClaimTimes[account])) { if(processAccount(payable(account), true)) { claims++; } } iterations++; uint256 newGasLeft = gasleft(); if(gasLeft > newGasLeft) { gasUsed = gasUsed.add(gasLeft.sub(newGasLeft)); } gasLeft = newGasLeft; } lastProcessedIndex = _lastProcessedIndex; return (iterations, claims, lastProcessedIndex); } function processAccount(address payable account, bool automatic) public onlyOwner returns (bool) { uint256 amount = _withdrawDividendOfUser(account); if(amount > 0) { lastClaimTimes[account] = block.timestamp; emit Claim(account, amount, automatic); return true; } return false; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"accounts","type":"address[]"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeMultipleAccountsFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"GasForProcessingUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newLiquidityWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldLiquidityWallet","type":"address"}],"name":"LiquidityWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"iterations","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"claims","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastProcessedIndex","type":"uint256"},{"indexed":true,"internalType":"bool","name":"automatic","type":"bool"},{"indexed":false,"internalType":"uint256","name":"gas","type":"uint256"},{"indexed":true,"internalType":"address","name":"processor","type":"address"}],"name":"ProcessedDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SendDividends","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"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"inputs":[],"name":"ETHRewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newSellLimit","type":"uint256"}],"name":"changeMaxSellLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"dividendTokenBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendTracker","outputs":[{"internalType":"contract BaybladeDividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeMultipleAccountsFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gasForProcessing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAccountDividendsInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getAccountDividendsInfoAtIndex","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getClaimWait","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastProcessedIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfDividendTokenHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalDividendsDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromDividends","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSellTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"processDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellFeeIncreaseFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"address payable","name":"newAddress","type":"address"}],"name":"setDevWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"claimWait","type":"uint256"}],"name":"updateClaimWait","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"updateGasForProcessing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newLiquidityWallet","type":"address"}],"name":"updateLiquidityWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateUniswapV2Router","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawableDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6101206040526c3f1bdf10116048a593400000006009556c193e5939a08ce9dbd480000000600a557343afe97160ce3043ff69e1b728e26f1f8eb391ca600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550607861010090815250620493e0600c553480156200009957600080fd5b506040518060400160405280600881526020017f426179426c6164650000000000000000000000000000000000000000000000008152506040518060400160405280600881526020017f426179626c61646500000000000000000000000000000000000000000000000081525081600390805190602001906200011e92919062000fc4565b5080600490805190602001906200013792919062000fc4565b50505060006200014c6200090460201b60201c565b905080600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3506000600490506000601490508160a081815250508060c081815250506200022181836200090c60201b62003c0d1790919060201c565b60e0818152505060405162000236906200104b565b604051809103906000f08015801562000253573d6000803e3d6000fd5b50600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620002a46200099560201b60201c565b600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000737a250d5630b4cf539739df2c5dacb4c659f2488d905060008173ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156200034657600080fd5b505afa1580156200035b573d6000803e3d6000fd5b505050506040513d60208110156200037257600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1663c9c65396308473ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015620003e657600080fd5b505afa158015620003fb573d6000803e3d6000fd5b505050506040513d60208110156200041257600080fd5b81019080805190602001909291905050506040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b1580156200048d57600080fd5b505af1158015620004a2573d6000803e3d6000fd5b505050506040513d6020811015620004b957600080fd5b8101908080519060200190929190505050905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b8152505062000557816001620009bf60201b60201c565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b1580156200060557600080fd5b505af11580156200061a573d6000803e3d6000fd5b50505050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b158015620006aa57600080fd5b505af1158015620006bf573d6000803e3d6000fd5b50505050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0620007116200099560201b60201c565b6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b1580156200075e57600080fd5b505af115801562000773573d6000803e3d6000fd5b50505050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0836040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b1580156200080357600080fd5b505af115801562000818573d6000803e3d6000fd5b5050505062000851600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600162000bb860201b60201c565b6200086430600162000bb860201b60201c565b6001600e60006200087a6200099560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620008fa620008df6200099560201b60201c565b6d314dc6448d9338c15b0a0000000062000de160201b60201c565b5050505062001078565b600033905090565b6000808284019050838110156200098b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b801515600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515141562000a6a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001806200a12d6038913960400191505060405180910390fd5b80600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550801562000b6e57600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0836040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b15801562000b5457600080fd5b505af115801562000b69573d6000803e3d6000fd5b505050505b8015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b62000bc86200090460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161462000c8b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b801515600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515141562000d36576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260348152602001806200a0f96034913960400191505060405180910390fd5b80600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df78260405180821515815260200191505060405180910390a25050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000e85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b62000e996000838362000fbf60201b60201c565b62000eb5816002546200090c60201b62003c0d1790919060201c565b60028190555062000f13816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546200090c60201b62003c0d1790919060201c565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200100757805160ff191683800117855562001038565b8280016001018555821562001038579182015b82811115620010375782518255916020019190600101906200101a565b5b50905062001047919062001059565b5090565b613869806200689083390190565b5b80821115620010745760008160009055506001016200105a565b5090565b60805160601c60a05160c05160e051610100516157bc620010d4600039806115855280614516525080611423528061430b528061447c5250806129ce528061432f5250806128b852508061197e5280612abc52506157bc6000f3fe6080604052600436106102cd5760003560e01c806388bdd9be11610175578063ad56c13c116100dc578063dd62ed3e11610095578063e7841ec01161006f578063e7841ec014611130578063e98030c71461115b578063f27fd25414611196578063f2fde38b1461122c576102d4565b8063dd62ed3e1461102f578063e2f45605146110b4578063e37ba8f9146110df576102d4565b8063ad56c13c14610d85578063b62496f514610e31578063c024666814610e98578063c492f04614610ef5578063c705c56914610f87578063d469801614610fee576102d4565b80639a7a23d61161012e5780639a7a23d614610b8b5780639c1b8af514610be8578063a26579ad14610c13578063a457c2d714610c3e578063a8b9d24014610caf578063a9059cbb14610d14576102d4565b806388bdd9be146109d25780638c0344db14610a235780638da5cb5b14610a4e5780638ea5220f14610a8f57806395d89b4114610ad057806398118cb414610b60576102d4565b8063313ce5671161023457806364b0f653116101ed578063700bb191116101c7578063700bb191146108e057806370a082311461091b578063715018a614610980578063871c128d14610997576102d4565b806364b0f653146107ff57806365b8dbc01461082a5780636843cd841461087b576102d4565b8063313ce5671461065057806331e79db01461067e57806339509351146106cf57806349bd5a5e146107405780634e71d92d146107815780634fbee19314610798576102d4565b806318160ddd1161028657806318160ddd146104ac5780631f53ac02146104d757806322bd3f7f1461052857806323b872dd146105535780632c1f5216146105e457806330bb4cff14610625576102d4565b806302259e9e146102d9578063065af77a1461030457806306fdde031461033f578063095ea7b3146103cf57806313114a9d146104405780631694505e1461046b576102d4565b366102d457005b600080fd5b3480156102e557600080fd5b506102ee61127d565b6040518082815260200191505060405180910390f35b34801561031057600080fd5b5061033d6004803603602081101561032757600080fd5b8101908080359060200190929190505050611283565b005b34801561034b57600080fd5b50610354611361565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610394578082015181840152602081019050610379565b50505050905090810190601f1680156103c15780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103db57600080fd5b50610428600480360360408110156103f257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611403565b60405180821515815260200191505060405180910390f35b34801561044c57600080fd5b50610455611421565b6040518082815260200191505060405180910390f35b34801561047757600080fd5b50610480611445565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156104b857600080fd5b506104c161146b565b6040518082815260200191505060405180910390f35b3480156104e357600080fd5b50610526600480360360208110156104fa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611475565b005b34801561053457600080fd5b5061053d611583565b6040518082815260200191505060405180910390f35b34801561055f57600080fd5b506105cc6004803603606081101561057657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506115a7565b60405180821515815260200191505060405180910390f35b3480156105f057600080fd5b506105f9611680565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561063157600080fd5b5061063a6116a6565b6040518082815260200191505060405180910390f35b34801561065c57600080fd5b50610665611750565b604051808260ff16815260200191505060405180910390f35b34801561068a57600080fd5b506106cd600480360360208110156106a157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611759565b005b3480156106db57600080fd5b50610728600480360360408110156106f257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506118c9565b60405180821515815260200191505060405180910390f35b34801561074c57600080fd5b5061075561197c565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561078d57600080fd5b506107966119a0565b005b3480156107a457600080fd5b506107e7600480360360208110156107bb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611a74565b60405180821515815260200191505060405180910390f35b34801561080b57600080fd5b50610814611aca565b6040518082815260200191505060405180910390f35b34801561083657600080fd5b506108796004803603602081101561084d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b74565b005b34801561088757600080fd5b506108ca6004803603602081101561089e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611da5565b6040518082815260200191505060405180910390f35b3480156108ec57600080fd5b506109196004803603602081101561090357600080fd5b8101908080359060200190929190505050611e72565b005b34801561092757600080fd5b5061096a6004803603602081101561093e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611fb1565b6040518082815260200191505060405180910390f35b34801561098c57600080fd5b50610995611ff9565b005b3480156109a357600080fd5b506109d0600480360360208110156109ba57600080fd5b8101908080359060200190929190505050612184565b005b3480156109de57600080fd5b50610a21600480360360208110156109f557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061234e565b005b348015610a2f57600080fd5b50610a386128b6565b6040518082815260200191505060405180910390f35b348015610a5a57600080fd5b50610a636128da565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610a9b57600080fd5b50610aa4612904565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610adc57600080fd5b50610ae561292a565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610b25578082015181840152602081019050610b0a565b50505050905090810190601f168015610b525780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610b6c57600080fd5b50610b756129cc565b6040518082815260200191505060405180910390f35b348015610b9757600080fd5b50610be660048036036040811015610bae57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035151590602001909291905050506129f0565b005b348015610bf457600080fd5b50610bfd612b6d565b6040518082815260200191505060405180910390f35b348015610c1f57600080fd5b50610c28612b73565b6040518082815260200191505060405180910390f35b348015610c4a57600080fd5b50610c9760048036036040811015610c6157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612c1d565b60405180821515815260200191505060405180910390f35b348015610cbb57600080fd5b50610cfe60048036036020811015610cd257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612cea565b6040518082815260200191505060405180910390f35b348015610d2057600080fd5b50610d6d60048036036040811015610d3757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612db7565b60405180821515815260200191505060405180910390f35b348015610d9157600080fd5b50610dd460048036036020811015610da857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612dd5565b604051808973ffffffffffffffffffffffffffffffffffffffff1681526020018881526020018781526020018681526020018581526020018481526020018381526020018281526020019850505050505050505060405180910390f35b348015610e3d57600080fd5b50610e8060048036036020811015610e5457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612f08565b60405180821515815260200191505060405180910390f35b348015610ea457600080fd5b50610ef360048036036040811015610ebb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050612f28565b005b348015610f0157600080fd5b50610f8560048036036040811015610f1857600080fd5b8101908080359060200190640100000000811115610f3557600080fd5b820183602082011115610f4757600080fd5b80359060200191846020830284011164010000000083111715610f6957600080fd5b9091929391929390803515159060200190929190505050613146565b005b348015610f9357600080fd5b50610fd660048036036020811015610faa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613320565b60405180821515815260200191505060405180910390f35b348015610ffa57600080fd5b506110036133ed565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561103b57600080fd5b5061109e6004803603604081101561105257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613413565b6040518082815260200191505060405180910390f35b3480156110c057600080fd5b506110c961349a565b6040518082815260200191505060405180910390f35b3480156110eb57600080fd5b5061112e6004803603602081101561110257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506134a0565b005b34801561113c57600080fd5b506111456136dc565b6040518082815260200191505060405180910390f35b34801561116757600080fd5b506111946004803603602081101561117e57600080fd5b8101908080359060200190929190505050613786565b005b3480156111a257600080fd5b506111cf600480360360208110156111b957600080fd5b81019080803590602001909291905050506138e0565b604051808973ffffffffffffffffffffffffffffffffffffffff1681526020018881526020018781526020018681526020018581526020018481526020018381526020018281526020019850505050505050505060405180910390f35b34801561123857600080fd5b5061127b6004803603602081101561124f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506139fd565b005b60095481565b61128b613c95565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461134d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b670de0b6b3a7640000810260098190555050565b606060038054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156113f95780601f106113ce576101008083540402835291602001916113f9565b820191906000526020600020905b8154815290600101906020018083116113dc57829003601f168201915b5050505050905090565b6000611417611410613c95565b8484613c9d565b6001905092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600254905090565b61147d613c95565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461153f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60006115b4848484613e94565b611675846115c0613c95565b6116708560405180606001604052806028815260200161560f60289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000611626613c95565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546148489092919063ffffffff16565b613c9d565b600190509392505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166385a6b3ae6040518163ffffffff1660e01b815260040160206040518083038186803b15801561171057600080fd5b505afa158015611724573d6000803e3d6000fd5b505050506040513d602081101561173a57600080fd5b8101908080519060200190929190505050905090565b60006012905090565b611761613c95565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611823576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0826040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b1580156118ae57600080fd5b505af11580156118c2573d6000803e3d6000fd5b5050505050565b60006119726118d6613c95565b8461196d85600160006118e7613c95565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c0d90919063ffffffff16565b613c9d565b6001905092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bc4c4b373360006040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff168152602001821515815260200192505050602060405180830381600087803b158015611a3657600080fd5b505af1158015611a4a573d6000803e3d6000fd5b505050506040513d6020811015611a6057600080fd5b810190808051906020019092919050505050565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166309bbedde6040518163ffffffff1660e01b815260040160206040518083038186803b158015611b3457600080fd5b505afa158015611b48573d6000803e3d6000fd5b505050506040513d6020811015611b5e57600080fd5b8101908080519060200190929190505050905090565b611b7c613c95565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611c3e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611ce5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061554c6023913960400191505060405180910390fd5b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e60405160405180910390a380600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611e3057600080fd5b505afa158015611e44573d6000803e3d6000fd5b505050506040513d6020811015611e5a57600080fd5b81019080805190602001909291905050509050919050565b6000806000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ffb2c479856040518263ffffffff1660e01b815260040180828152602001915050606060405180830381600087803b158015611eec57600080fd5b505af1158015611f00573d6000803e3d6000fd5b505050506040513d6060811015611f1657600080fd5b810190808051906020019092919080519060200190929190805190602001909291905050509250925092503273ffffffffffffffffffffffffffffffffffffffff16600015157fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a98858585896040518085815260200184815260200183815260200182815260200194505050505060405180910390a350505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b612001613c95565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146120c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b61218c613c95565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461224e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b62030d40811015801561226457506207a1208111155b6122b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603e81526020018061556f603e913960400191505060405180910390fd5b600c54811415612314576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806156ff6036913960400191505060405180910390fd5b600c54817f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db760405160405180910390a380600c8190555050565b612356613c95565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612418576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156124bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d81526020018061575a602d913960400191505060405180910390fd5b60008190503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561252157600080fd5b505afa158015612535573d6000803e3d6000fd5b505050506040513d602081101561254b57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16146125c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260458152602001806156ba6045913960600191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166331e79db0826040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b15801561263157600080fd5b505af1158015612645573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff166331e79db0306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b1580156126b257600080fd5b505af11580156126c6573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff166331e79db06126ee6128da565b6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b15801561273a57600080fd5b505af115801561274e573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff166331e79db0600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b1580156127dd57600080fd5b505af11580156127f1573d6000803e3d6000fd5b50505050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f90c7d74461c613da5efa97d90740869367d74ab3aa5837aa4ae9a975f954b7a860405160405180910390a380600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156129c25780601f10612997576101008083540402835291602001916129c2565b820191906000526020600020905b8154815290600101906020018083116129a557829003601f168201915b5050505050905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6129f8613c95565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612aba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b5f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260418152602001806155ad6041913960600191505060405180910390fd5b612b698282614908565b5050565b600c5481565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636f2789ec6040518163ffffffff1660e01b815260040160206040518083038186803b158015612bdd57600080fd5b505afa158015612bf1573d6000803e3d6000fd5b505050506040513d6020811015612c0757600080fd5b8101908080519060200190929190505050905090565b6000612ce0612c2a613c95565b84612cdb856040518060600160405280602581526020016157356025913960016000612c54613c95565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546148489092919063ffffffff16565b613c9d565b6001905092915050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a8b9d240836040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612d7557600080fd5b505afa158015612d89573d6000803e3d6000fd5b505050506040513d6020811015612d9f57600080fd5b81019080805190602001909291905050509050919050565b6000612dcb612dc4613c95565b8484613e94565b6001905092915050565b600080600080600080600080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fbcbc0f18a6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1681526020019150506101006040518083038186803b158015612e6b57600080fd5b505afa158015612e7f573d6000803e3d6000fd5b505050506040513d610100811015612e9657600080fd5b81019080805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919050505097509750975097509750975097509750919395975091939597565b600f6020528060005260406000206000915054906101000a900460ff1681565b612f30613c95565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612ff2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b801515600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515141561309b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603481526020018061543c6034913960400191505060405180910390fd5b80600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df78260405180821515815260200191505060405180910390a25050565b61314e613c95565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613210576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60005b838390508110156132aa5781600d600086868581811061322f57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080600101915050613213565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b35838383604051808060200183151581526020018281038252858582818152602001925060200280828437600081840152601f19601f82011690508083019250505094505050505060405180910390a1505050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634e7b827f836040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156133ab57600080fd5b505afa1580156133bf573d6000803e3d6000fd5b505050506040513d60208110156133d557600080fd5b81019080805190602001909291905050509050919050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600a5481565b6134a8613c95565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461356a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613611576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806154706036913960400191505060405180910390fd5b61361c816001612f28565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f6080503d1da552ae8eb4b7b8a20245d9fabed014180510e7d1a05ea08fdb0f3e60405160405180910390a380600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e7841ec06040518163ffffffff1660e01b815260040160206040518083038186803b15801561374657600080fd5b505afa15801561375a573d6000803e3d6000fd5b505050506040513d602081101561377057600080fd5b8101908080519060200190929190505050905090565b61378e613c95565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613850576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e98030c7826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156138c557600080fd5b505af11580156138d9573d6000803e3d6000fd5b5050505050565b600080600080600080600080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635183d6fd8a6040518263ffffffff1660e01b8152600401808281526020019150506101006040518083038186803b15801561396057600080fd5b505afa158015613974573d6000803e3d6000fd5b505050506040513d61010081101561398b57600080fd5b81019080805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919050505097509750975097509750975097509750919395975091939597565b613a05613c95565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613ac7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613b4d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806154a66026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080828401905083811015613c8b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613d23576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806156966024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613da9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806154cc6022913960400191505060405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613f1a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806156376025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613fa0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806154196023913960400191505060405180910390fd5b6000811415613fba57613fb583836000614afc565b614843565b600660149054906101000a900460ff161580156140205750600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b801561407a5750600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b80156140d05750600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156141485750600d6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156141a9576009548111156141a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a81526020018061565c603a913960400191505060405180910390fd5b5b60006141b430611fb1565b90506000600a5482101590508080156141da5750600660149054906101000a900460ff16155b80156142305750600f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b801561428a5750600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b80156142e45750600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b156143aa576001600660146101000a81548160ff021916908315150217905550600061436b7f000000000000000000000000000000000000000000000000000000000000000061435d7f000000000000000000000000000000000000000000000000000000000000000086614dbd90919063ffffffff16565b614e4390919063ffffffff16565b905061437681614e8d565b600061438130611fb1565b905061438c81614ef6565b6000600660146101000a81548160ff02191690831515021790555050505b6000600660149054906101000a900460ff16159050600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806144605750600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1561446a57600090505b80156145775760006144b860646144aa7f000000000000000000000000000000000000000000000000000000000000000088614dbd90919063ffffffff16565b614e4390919063ffffffff16565b9050600f60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156145555761455260646145447f000000000000000000000000000000000000000000000000000000000000000084614dbd90919063ffffffff16565b614e4390919063ffffffff16565b90505b6145688186614fda90919063ffffffff16565b9450614575873083614afc565b505b614582868686614afc565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e30443bc876145ca89611fb1565b6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561461d57600080fd5b505af192505050801561462e575060015b61463757614638565b5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e30443bc8661468088611fb1565b6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1580156146d357600080fd5b505af19250505080156146e4575060015b6146ed576146ee565b5b600660149054906101000a900460ff1661483f576000600c549050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ffb2c479826040518263ffffffff1660e01b815260040180828152602001915050606060405180830381600087803b15801561477e57600080fd5b505af19250505080156147c657506040513d606081101561479e57600080fd5b8101908080519060200190929190805190602001909291908051906020019092919050505060015b6147cf5761483d565b3273ffffffffffffffffffffffffffffffffffffffff16600115157fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a98858585896040518085815260200184815260200183815260200182815260200194505050505060405180910390a35050505b505b5050505b505050565b60008383111582906148f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156148ba57808201518184015260208101905061489f565b50505050905090810190601f1680156148e75780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b801515600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514156149b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001806154ee6038913960400191505060405180910390fd5b80600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015614ab257600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0836040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b158015614a9957600080fd5b505af1158015614aad573d6000803e3d6000fd5b505050505b8015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415614b82576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806156376025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415614c08576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806154196023913960400191505060405180910390fd5b614c13838383615024565b614c7e81604051806060016040528060268152602001615526602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546148489092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614d11816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c0d90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b600080831415614dd05760009050614e3d565b6000828402905082848281614de157fe5b0414614e38576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806155ee6021913960400191505060405180910390fd5b809150505b92915050565b6000614e8583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250615029565b905092915050565b60004790506000614ea78247614fda90919063ffffffff16565b9050614eb2836150ef565b7f28fc98272ce761178794ad6768050fea1648e07f1e2ffe15afd3a290f83814868382604051808381526020018281526020019250505060405180910390a1505050565b614eff81615164565b60004790506000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168260405180600001905060006040518083038185875af1925050503d8060008114614f86576040519150601f19603f3d011682016040523d82523d6000602084013e614f8b565b606091505b505090508015614fd5577f80195cc573b02cc48460cbca6e6e4cc85ddb91959d946e1c3025ea3d87942dc38383604051808381526020018281526020019250505060405180910390a15b505050565b600061501c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614848565b905092915050565b505050565b600080831182906150d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561509a57808201518184015260208101905061507f565b50505050905090810190601f1680156150c75780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816150e157fe5b049050809150509392505050565b6150f881615164565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015615160573d6000803e3d6000fd5b5050565b6060600267ffffffffffffffff8111801561517e57600080fd5b506040519080825280602002602001820160405280156151ad5781602001602082028036833780820191505090505b50905030816000815181106151be57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561526057600080fd5b505afa158015615274573d6000803e3d6000fd5b505050506040513d602081101561528a57600080fd5b8101908080519060200190929190505050816001815181106152a857fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061530f30600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684613c9d565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b815260040180868152602001858152602001806020018473ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b838110156153d35780820151818401526020810190506153b8565b505050509050019650505050505050600060405180830381600087803b1580156153fc57600080fd5b505af1158015615410573d6000803e3d6000fd5b50505050505056fe45524332303a207472616e7366657220746f20746865207a65726f2061646472657373426179626c6164653a204163636f756e7420697320616c7265616479207468652076616c7565206f6620276578636c7564656427426179626c6164653a20546865206c69717569646974792077616c6c657420697320616c7265616479207468697320616464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f20616464726573734175746f6d61746564206d61726b6574206d616b6572207061697220697320616c72656164792073657420746f20746861742076616c756545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636554686520726f7574657220616c72656164792068617320746861742061646472657373426179626c6164653a20676173466f7250726f63657373696e67206d757374206265206265747765656e203230302c30303020616e64203530302c30303054686520556e697377617020706169722063616e6e6f742062652072656d6f7665642066726f6d206175746f6d617465644d61726b65744d616b65725061697273536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a207472616e736665722066726f6d20746865207a65726f206164647265737353656c6c207472616e7366657220616d6f756e74206578636565647320746865206d617853656c6c5472616e73616374696f6e416d6f756e742e45524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373546865206e6577206469766964656e6420747261636b6572206d757374206265206f776e65642062792074686520424159424c41444520746f6b656e20636f6e7472616374426179626c6164653a2043616e6e6f742075706461746520676173466f7250726f63657373696e6720746f2073616d652076616c756545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f546865206469766964656e6420747261636b657220616c72656164792068617320746861742061646472657373a2646970667358221220215b8ef7afa6b6af2f51c9eb5e7d516a5a469a83ce01ed6af15146162d1eaf7a64736f6c634300060c003360806040523480156200001157600080fd5b506040518060400160405280601981526020017f426179626c6164655f4469766964656e645f547261636b6572000000000000008152506040518060400160405280601981526020017f426179626c6164655f4469766964656e645f547261636b657200000000000000815250818181600390805190602001906200009892919062000192565b508060049080519060200190620000b192919062000192565b50505050506000620000c86200018a60201b60201c565b905080600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350610e106011819055506c0c9f2c9cd04674edea4000000060128190555062000238565b600033905090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620001d557805160ff191683800117855562000206565b8280016001018555821562000206579182015b8281111562000205578251825591602001919060010190620001e8565b5b50905062000215919062000219565b5090565b5b80821115620002345760008160009055506001016200021a565b5090565b61362180620002486000396000f3fe6080604052600436106102085760003560e01c8063715018a611610118578063bc4c4b37116100a0578063e7841ec01161006f578063e7841ec014610c39578063e98030c714610c64578063f2fde38b14610c9f578063fbcbc0f114610cf0578063ffb2c47914610d9c57610217565b8063bc4c4b3714610abb578063be10b61414610b2e578063dd62ed3e14610b59578063e30443bc14610bde57610217565b806395d89b41116100e757806395d89b411461087f578063a457c2d71461090f578063a8b9d24014610980578063a9059cbb146109e5578063aafd847a14610a5657610217565b8063715018a61461079757806385a6b3ae146107ae5780638da5cb5b146107d957806391b89fba1461081a57610217565b80633009a6091161019b5780634e7b827f1161016a5780634e7b827f146105f35780635183d6fd1461065a5780636a474002146106f05780636f2789ec1461070757806370a082311461073257610217565b80633009a609146104d8578063313ce5671461050357806331e79db014610531578063395093511461058257610217565b806318160ddd116101d757806318160ddd14610352578063226cfa3d1461037d57806323b872dd146103e257806327ce01471461047357610217565b806303c833021461021c57806306fdde0314610226578063095ea7b3146102b657806309bbedde1461032757610217565b3661021757610215610df9565b005b600080fd5b610224610df9565b005b34801561023257600080fd5b5061023b610ed0565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561027b578082015181840152602081019050610260565b50505050905090810190601f1680156102a85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102c257600080fd5b5061030f600480360360408110156102d957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610f72565b60405180821515815260200191505060405180910390f35b34801561033357600080fd5b5061033c610f90565b6040518082815260200191505060405180910390f35b34801561035e57600080fd5b50610367610fa0565b6040518082815260200191505060405180910390f35b34801561038957600080fd5b506103cc600480360360208110156103a057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610faa565b6040518082815260200191505060405180910390f35b3480156103ee57600080fd5b5061045b6004803603606081101561040557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610fc2565b60405180821515815260200191505060405180910390f35b34801561047f57600080fd5b506104c26004803603602081101561049657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061109b565b6040518082815260200191505060405180910390f35b3480156104e457600080fd5b506104ed61113c565b6040518082815260200191505060405180910390f35b34801561050f57600080fd5b50610518611142565b604051808260ff16815260200191505060405180910390f35b34801561053d57600080fd5b506105806004803603602081101561055457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061114b565b005b34801561058e57600080fd5b506105db600480360360408110156105a557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061139d565b60405180821515815260200191505060405180910390f35b3480156105ff57600080fd5b506106426004803603602081101561061657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611450565b60405180821515815260200191505060405180910390f35b34801561066657600080fd5b506106936004803603602081101561067d57600080fd5b8101908080359060200190929190505050611470565b604051808973ffffffffffffffffffffffffffffffffffffffff1681526020018881526020018781526020018681526020018581526020018481526020018381526020018281526020019850505050505050505060405180910390f35b3480156106fc57600080fd5b5061070561160f565b005b34801561071357600080fd5b5061071c611668565b6040518082815260200191505060405180910390f35b34801561073e57600080fd5b506107816004803603602081101561075557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061166e565b6040518082815260200191505060405180910390f35b3480156107a357600080fd5b506107ac6116b6565b005b3480156107ba57600080fd5b506107c3611841565b6040518082815260200191505060405180910390f35b3480156107e557600080fd5b506107ee611847565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561082657600080fd5b506108696004803603602081101561083d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611871565b6040518082815260200191505060405180910390f35b34801561088b57600080fd5b50610894611883565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156108d45780820151818401526020810190506108b9565b50505050905090810190601f1680156109015780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561091b57600080fd5b506109686004803603604081101561093257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611925565b60405180821515815260200191505060405180910390f35b34801561098c57600080fd5b506109cf600480360360208110156109a357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506119f2565b6040518082815260200191505060405180910390f35b3480156109f157600080fd5b50610a3e60048036036040811015610a0857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611a55565b60405180821515815260200191505060405180910390f35b348015610a6257600080fd5b50610aa560048036036020811015610a7957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611a73565b6040518082815260200191505060405180910390f35b348015610ac757600080fd5b50610b1660048036036040811015610ade57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050611abc565b60405180821515815260200191505060405180910390f35b348015610b3a57600080fd5b50610b43611c49565b6040518082815260200191505060405180910390f35b348015610b6557600080fd5b50610bc860048036036040811015610b7c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611c4f565b6040518082815260200191505060405180910390f35b348015610bea57600080fd5b50610c3760048036036040811015610c0157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611cd6565b005b348015610c4557600080fd5b50610c4e611f44565b6040518082815260200191505060405180910390f35b348015610c7057600080fd5b50610c9d60048036036020811015610c8757600080fd5b8101908080359060200190929190505050611f4e565b005b348015610cab57600080fd5b50610cee60048036036020811015610cc257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612117565b005b348015610cfc57600080fd5b50610d3f60048036036020811015610d1357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612327565b604051808973ffffffffffffffffffffffffffffffffffffffff1681526020018881526020018781526020018681526020018581526020018481526020018381526020018281526020019850505050505050505060405180910390f35b348015610da857600080fd5b50610dd560048036036020811015610dbf57600080fd5b8101908080359060200190929190505050612534565b60405180848152602001838152602001828152602001935050505060405180910390f35b6000610e03610fa0565b11610e0d57600080fd5b6000341115610ece57610e5e610e21610fa0565b610e45700100000000000000000000000000000000346126ad90919063ffffffff16565b81610e4c57fe5b0460055461273390919063ffffffff16565b6005819055503373ffffffffffffffffffffffffffffffffffffffff167fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d78454116511346040518082815260200191505060405180910390a2610ec73460085461273390919063ffffffff16565b6008819055505b565b606060038054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610f685780601f10610f3d57610100808354040283529160200191610f68565b820191906000526020600020905b815481529060010190602001808311610f4b57829003601f168201915b5050505050905090565b6000610f86610f7f6127bb565b84846127c3565b6001905092915050565b6000600a60000180549050905090565b6000600254905090565b60106020528060005260406000206000915090505481565b6000610fcf8484846129ba565b61109084610fdb6127bb565b61108b8560405180606001604052806028815260200161346360289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006110416127bb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612a169092919063ffffffff16565b6127c3565b600190509392505050565b600070010000000000000000000000000000000061112d611128600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461111a6111156111048861166e565b6005546126ad90919063ffffffff16565b612ad6565b612af390919063ffffffff16565b612b35565b8161113457fe5b049050919050565b600e5481565b60006012905090565b6111536127bb565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611215576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600f60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561126c57600080fd5b6001600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506112cf816000612b4c565b600a731408dd20d80b68693e02059b8f3fc5d4b28b2dce634c60db9c9091836040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060006040518083038186803b15801561133f57600080fd5b505af4158015611353573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff167fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b2560405160405180910390a250565b60006114466113aa6127bb565b8461144185600160006113bb6127bb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461273390919063ffffffff16565b6127c3565b6001905092915050565b600f6020528060005260406000206000915054906101000a900460ff1681565b600080600080600080600080600a731408dd20d80b68693e02059b8f3fc5d4b28b2dce63deb3d89690916040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156114ce57600080fd5b505af41580156114e2573d6000803e3d6000fd5b505050506040513d60208110156114f857600080fd5b810190808051906020019092919050505089106115505760007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80600080600080600097509750975097509750975097509750611604565b6000600a731408dd20d80b68693e02059b8f3fc5d4b28b2dce63d1aa9e7e90918c6040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b1580156115ac57600080fd5b505af41580156115c0573d6000803e3d6000fd5b505050506040513d60208110156115d657600080fd5b810190808051906020019092919050505090506115f281612327565b98509850985098509850985098509850505b919395975091939597565b6000611666576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252606d81526020018061350c606d913960800191505060405180910390fd5b565b60115481565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6116be6127bb565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611780576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60085481565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600061187c826119f2565b9050919050565b606060048054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561191b5780601f106118f05761010080835404028352916020019161191b565b820191906000526020600020905b8154815290600101906020018083116118fe57829003601f168201915b5050505050905090565b60006119e86119326127bb565b846119e385604051806060016040528060258152602001613579602591396001600061195c6127bb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612a169092919063ffffffff16565b6127c3565b6001905092915050565b6000611a4e600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611a408461109b565b612bb990919063ffffffff16565b9050919050565b6000611a69611a626127bb565b84846129ba565b6001905092915050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000611ac66127bb565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611b88576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000611b9384612c03565b90506000811115611c3d5742601060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508215158473ffffffffffffffffffffffffffffffffffffffff167fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf092836040518082815260200191505060405180910390a36001915050611c43565b60009150505b92915050565b60125481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611cde6127bb565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611da0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611df757611f40565b6012548110611e9f57611e0a8282612b4c565b600a731408dd20d80b68693e02059b8f3fc5d4b28b2dce63bc2b405c909184846040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060006040518083038186803b158015611e8257600080fd5b505af4158015611e96573d6000803e3d6000fd5b50505050611f33565b611eaa826000612b4c565b600a731408dd20d80b68693e02059b8f3fc5d4b28b2dce634c60db9c9091846040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060006040518083038186803b158015611f1a57600080fd5b505af4158015611f2e573d6000803e3d6000fd5b505050505b611f3e826001611abc565b505b5050565b6000600e54905090565b611f566127bb565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612018576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b610e10811015801561202d5750620151808111155b612082576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604e81526020018061359e604e913960600191505060405180910390fd5b6011548114156120dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c8152602001806134ac603c913960400191505060405180910390fd5b601154817f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f60405160405180910390a38060118190555050565b61211f6127bb565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146121e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612267576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806133cb6026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080600080600080600080889750600a731408dd20d80b68693e02059b8f3fc5d4b28b2dce6317e142d190918a6040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b1580156123a657600080fd5b505af41580156123ba573d6000803e3d6000fd5b505050506040513d60208110156123d057600080fd5b810190808051906020019092919050505096507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff95506000871261248657600e548711156124345761242d600e5488612e2590919063ffffffff16565b9550612485565b6000600e54600a600001805490501161244e57600061246c565b61246b600e54600a60000180549050612bb990919063ffffffff16565b5b90506124818189612af390919063ffffffff16565b9650505b5b61248f886119f2565b945061249a8861109b565b9350601060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549250600083116124ed576000612503565b6125026011548461273390919063ffffffff16565b5b9150428211612513576000612527565b6125264283612bb990919063ffffffff16565b5b9050919395975091939597565b600080600080600a600001805490509050600081141561256057600080600e54935093509350506126a6565b6000600e5490506000805a90506000805b898410801561257f57508582105b1561268d578480600101955050600a6000018054905085106125a057600094505b6000600a60000186815481106125b257fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050612627601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612e67565b1561264657612637816001611abc565b156126455781806001019250505b5b828060010193505060005a905080851115612683576126806126718287612bb990919063ffffffff16565b8761273390919063ffffffff16565b95505b8094505050612571565b84600e819055508181600e549850985098505050505050505b9193909250565b6000808314156126c0576000905061272d565b60008284029050828482816126d157fe5b0414612728576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806134426021913960400191505060405180910390fd5b809150505b92915050565b6000808284019050838110156127b1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612849576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806134e86024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806133f16022913960400191505060405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b6000612a11576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180613413602f913960400191505060405180910390fd5b505050565b6000838311158290612ac3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612a88578082015181840152602081019050612a6d565b50505050905090810190601f168015612ab55780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6000808290506000811215612aea57600080fd5b80915050919050565b600080828401905060008312158015612b0c5750838112155b80612b225750600083128015612b2157508381125b5b612b2b57600080fd5b8091505092915050565b600080821215612b4457600080fd5b819050919050565b6000612b578361166e565b905080821115612b88576000612b768284612bb990919063ffffffff16565b9050612b828482612e9a565b50612bb4565b80821015612bb3576000612ba58383612bb990919063ffffffff16565b9050612bb18482612f59565b505b5b505050565b6000612bfb83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612a16565b905092915050565b600080612c0f836119f2565b90506000811115612e1a57612c6c81600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461273390919063ffffffff16565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff167fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d826040518082815260200191505060405180910390a260008373ffffffffffffffffffffffffffffffffffffffff1682610bb890604051806000019050600060405180830381858888f193505050503d8060008114612d62576040519150601f19603f3d011682016040523d82523d6000602084013e612d67565b606091505b5050905080612e1057612dc282600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612bb990919063ffffffff16565b600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600092505050612e20565b8192505050612e20565b60009150505b919050565b600080828403905060008312158015612e3e5750838113155b80612e545750600083128015612e5357508381135b5b612e5d57600080fd5b8091505092915050565b600042821115612e7a5760009050612e95565b601154612e908342612bb990919063ffffffff16565b101590505b919050565b612ea48282613018565b612f12612ec4612ebf836005546126ad90919063ffffffff16565b612ad6565b600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612e2590919063ffffffff16565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b612f6382826131df565b612fd1612f83612f7e836005546126ad90919063ffffffff16565b612ad6565b600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612af390919063ffffffff16565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b6130c7600083836133a3565b6130dc8160025461273390919063ffffffff16565b600281905550613133816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461273390919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613265576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061348b6021913960400191505060405180910390fd5b613271826000836133a3565b6132dc816040518060600160405280602281526020016133a9602291396000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612a169092919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061333381600254612bb990919063ffffffff16565b600281905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b50505056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f2061646472657373426179626c6164655f4469766964656e645f547261636b65723a204e6f207472616e736665727320616c6c6f776564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737354494b495f4469766964656e645f547261636b65723a2043616e6e6f742075706461746520636c61696d5761697420746f2073616d652076616c756545524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373426179626c6164655f4469766964656e645f547261636b65723a2077697468647261774469766964656e642064697361626c65642e20557365207468652027636c61696d272066756e6374696f6e206f6e20746865206d61696e20426179626c61646520636f6e74726163742e45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f426179626c6164655f4469766964656e645f547261636b65723a20636c61696d57616974206d757374206265207570646174656420746f206265747765656e203120616e6420323420686f757273a264697066735822122030b24135a0bc4b83f0a35765fc44ed0e5be4110338035c24b90aeefa22e21bde64736f6c634300060c0033426179626c6164653a204163636f756e7420697320616c7265616479207468652076616c7565206f6620276578636c75646564274175746f6d61746564206d61726b6574206d616b6572207061697220697320616c72656164792073657420746f20746861742076616c7565
Deployed Bytecode
0x6080604052600436106102cd5760003560e01c806388bdd9be11610175578063ad56c13c116100dc578063dd62ed3e11610095578063e7841ec01161006f578063e7841ec014611130578063e98030c71461115b578063f27fd25414611196578063f2fde38b1461122c576102d4565b8063dd62ed3e1461102f578063e2f45605146110b4578063e37ba8f9146110df576102d4565b8063ad56c13c14610d85578063b62496f514610e31578063c024666814610e98578063c492f04614610ef5578063c705c56914610f87578063d469801614610fee576102d4565b80639a7a23d61161012e5780639a7a23d614610b8b5780639c1b8af514610be8578063a26579ad14610c13578063a457c2d714610c3e578063a8b9d24014610caf578063a9059cbb14610d14576102d4565b806388bdd9be146109d25780638c0344db14610a235780638da5cb5b14610a4e5780638ea5220f14610a8f57806395d89b4114610ad057806398118cb414610b60576102d4565b8063313ce5671161023457806364b0f653116101ed578063700bb191116101c7578063700bb191146108e057806370a082311461091b578063715018a614610980578063871c128d14610997576102d4565b806364b0f653146107ff57806365b8dbc01461082a5780636843cd841461087b576102d4565b8063313ce5671461065057806331e79db01461067e57806339509351146106cf57806349bd5a5e146107405780634e71d92d146107815780634fbee19314610798576102d4565b806318160ddd1161028657806318160ddd146104ac5780631f53ac02146104d757806322bd3f7f1461052857806323b872dd146105535780632c1f5216146105e457806330bb4cff14610625576102d4565b806302259e9e146102d9578063065af77a1461030457806306fdde031461033f578063095ea7b3146103cf57806313114a9d146104405780631694505e1461046b576102d4565b366102d457005b600080fd5b3480156102e557600080fd5b506102ee61127d565b6040518082815260200191505060405180910390f35b34801561031057600080fd5b5061033d6004803603602081101561032757600080fd5b8101908080359060200190929190505050611283565b005b34801561034b57600080fd5b50610354611361565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610394578082015181840152602081019050610379565b50505050905090810190601f1680156103c15780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103db57600080fd5b50610428600480360360408110156103f257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611403565b60405180821515815260200191505060405180910390f35b34801561044c57600080fd5b50610455611421565b6040518082815260200191505060405180910390f35b34801561047757600080fd5b50610480611445565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156104b857600080fd5b506104c161146b565b6040518082815260200191505060405180910390f35b3480156104e357600080fd5b50610526600480360360208110156104fa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611475565b005b34801561053457600080fd5b5061053d611583565b6040518082815260200191505060405180910390f35b34801561055f57600080fd5b506105cc6004803603606081101561057657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506115a7565b60405180821515815260200191505060405180910390f35b3480156105f057600080fd5b506105f9611680565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561063157600080fd5b5061063a6116a6565b6040518082815260200191505060405180910390f35b34801561065c57600080fd5b50610665611750565b604051808260ff16815260200191505060405180910390f35b34801561068a57600080fd5b506106cd600480360360208110156106a157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611759565b005b3480156106db57600080fd5b50610728600480360360408110156106f257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506118c9565b60405180821515815260200191505060405180910390f35b34801561074c57600080fd5b5061075561197c565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561078d57600080fd5b506107966119a0565b005b3480156107a457600080fd5b506107e7600480360360208110156107bb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611a74565b60405180821515815260200191505060405180910390f35b34801561080b57600080fd5b50610814611aca565b6040518082815260200191505060405180910390f35b34801561083657600080fd5b506108796004803603602081101561084d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b74565b005b34801561088757600080fd5b506108ca6004803603602081101561089e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611da5565b6040518082815260200191505060405180910390f35b3480156108ec57600080fd5b506109196004803603602081101561090357600080fd5b8101908080359060200190929190505050611e72565b005b34801561092757600080fd5b5061096a6004803603602081101561093e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611fb1565b6040518082815260200191505060405180910390f35b34801561098c57600080fd5b50610995611ff9565b005b3480156109a357600080fd5b506109d0600480360360208110156109ba57600080fd5b8101908080359060200190929190505050612184565b005b3480156109de57600080fd5b50610a21600480360360208110156109f557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061234e565b005b348015610a2f57600080fd5b50610a386128b6565b6040518082815260200191505060405180910390f35b348015610a5a57600080fd5b50610a636128da565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610a9b57600080fd5b50610aa4612904565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610adc57600080fd5b50610ae561292a565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610b25578082015181840152602081019050610b0a565b50505050905090810190601f168015610b525780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610b6c57600080fd5b50610b756129cc565b6040518082815260200191505060405180910390f35b348015610b9757600080fd5b50610be660048036036040811015610bae57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035151590602001909291905050506129f0565b005b348015610bf457600080fd5b50610bfd612b6d565b6040518082815260200191505060405180910390f35b348015610c1f57600080fd5b50610c28612b73565b6040518082815260200191505060405180910390f35b348015610c4a57600080fd5b50610c9760048036036040811015610c6157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612c1d565b60405180821515815260200191505060405180910390f35b348015610cbb57600080fd5b50610cfe60048036036020811015610cd257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612cea565b6040518082815260200191505060405180910390f35b348015610d2057600080fd5b50610d6d60048036036040811015610d3757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612db7565b60405180821515815260200191505060405180910390f35b348015610d9157600080fd5b50610dd460048036036020811015610da857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612dd5565b604051808973ffffffffffffffffffffffffffffffffffffffff1681526020018881526020018781526020018681526020018581526020018481526020018381526020018281526020019850505050505050505060405180910390f35b348015610e3d57600080fd5b50610e8060048036036020811015610e5457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612f08565b60405180821515815260200191505060405180910390f35b348015610ea457600080fd5b50610ef360048036036040811015610ebb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050612f28565b005b348015610f0157600080fd5b50610f8560048036036040811015610f1857600080fd5b8101908080359060200190640100000000811115610f3557600080fd5b820183602082011115610f4757600080fd5b80359060200191846020830284011164010000000083111715610f6957600080fd5b9091929391929390803515159060200190929190505050613146565b005b348015610f9357600080fd5b50610fd660048036036020811015610faa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613320565b60405180821515815260200191505060405180910390f35b348015610ffa57600080fd5b506110036133ed565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561103b57600080fd5b5061109e6004803603604081101561105257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613413565b6040518082815260200191505060405180910390f35b3480156110c057600080fd5b506110c961349a565b6040518082815260200191505060405180910390f35b3480156110eb57600080fd5b5061112e6004803603602081101561110257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506134a0565b005b34801561113c57600080fd5b506111456136dc565b6040518082815260200191505060405180910390f35b34801561116757600080fd5b506111946004803603602081101561117e57600080fd5b8101908080359060200190929190505050613786565b005b3480156111a257600080fd5b506111cf600480360360208110156111b957600080fd5b81019080803590602001909291905050506138e0565b604051808973ffffffffffffffffffffffffffffffffffffffff1681526020018881526020018781526020018681526020018581526020018481526020018381526020018281526020019850505050505050505060405180910390f35b34801561123857600080fd5b5061127b6004803603602081101561124f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506139fd565b005b60095481565b61128b613c95565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461134d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b670de0b6b3a7640000810260098190555050565b606060038054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156113f95780601f106113ce576101008083540402835291602001916113f9565b820191906000526020600020905b8154815290600101906020018083116113dc57829003601f168201915b5050505050905090565b6000611417611410613c95565b8484613c9d565b6001905092915050565b7f000000000000000000000000000000000000000000000000000000000000001881565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600254905090565b61147d613c95565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461153f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b7f000000000000000000000000000000000000000000000000000000000000007881565b60006115b4848484613e94565b611675846115c0613c95565b6116708560405180606001604052806028815260200161560f60289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000611626613c95565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546148489092919063ffffffff16565b613c9d565b600190509392505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166385a6b3ae6040518163ffffffff1660e01b815260040160206040518083038186803b15801561171057600080fd5b505afa158015611724573d6000803e3d6000fd5b505050506040513d602081101561173a57600080fd5b8101908080519060200190929190505050905090565b60006012905090565b611761613c95565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611823576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0826040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b1580156118ae57600080fd5b505af11580156118c2573d6000803e3d6000fd5b5050505050565b60006119726118d6613c95565b8461196d85600160006118e7613c95565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c0d90919063ffffffff16565b613c9d565b6001905092915050565b7f0000000000000000000000000ffd3bfaf8897d24fc357e5d2faa08f47f82470c81565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bc4c4b373360006040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff168152602001821515815260200192505050602060405180830381600087803b158015611a3657600080fd5b505af1158015611a4a573d6000803e3d6000fd5b505050506040513d6020811015611a6057600080fd5b810190808051906020019092919050505050565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166309bbedde6040518163ffffffff1660e01b815260040160206040518083038186803b158015611b3457600080fd5b505afa158015611b48573d6000803e3d6000fd5b505050506040513d6020811015611b5e57600080fd5b8101908080519060200190929190505050905090565b611b7c613c95565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611c3e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611ce5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061554c6023913960400191505060405180910390fd5b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e60405160405180910390a380600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611e3057600080fd5b505afa158015611e44573d6000803e3d6000fd5b505050506040513d6020811015611e5a57600080fd5b81019080805190602001909291905050509050919050565b6000806000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ffb2c479856040518263ffffffff1660e01b815260040180828152602001915050606060405180830381600087803b158015611eec57600080fd5b505af1158015611f00573d6000803e3d6000fd5b505050506040513d6060811015611f1657600080fd5b810190808051906020019092919080519060200190929190805190602001909291905050509250925092503273ffffffffffffffffffffffffffffffffffffffff16600015157fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a98858585896040518085815260200184815260200183815260200182815260200194505050505060405180910390a350505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b612001613c95565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146120c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b61218c613c95565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461224e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b62030d40811015801561226457506207a1208111155b6122b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603e81526020018061556f603e913960400191505060405180910390fd5b600c54811415612314576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806156ff6036913960400191505060405180910390fd5b600c54817f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db760405160405180910390a380600c8190555050565b612356613c95565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612418576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156124bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d81526020018061575a602d913960400191505060405180910390fd5b60008190503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561252157600080fd5b505afa158015612535573d6000803e3d6000fd5b505050506040513d602081101561254b57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16146125c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260458152602001806156ba6045913960600191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166331e79db0826040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b15801561263157600080fd5b505af1158015612645573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff166331e79db0306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b1580156126b257600080fd5b505af11580156126c6573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff166331e79db06126ee6128da565b6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b15801561273a57600080fd5b505af115801561274e573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff166331e79db0600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b1580156127dd57600080fd5b505af11580156127f1573d6000803e3d6000fd5b50505050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f90c7d74461c613da5efa97d90740869367d74ab3aa5837aa4ae9a975f954b7a860405160405180910390a380600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b7f000000000000000000000000000000000000000000000000000000000000000481565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156129c25780601f10612997576101008083540402835291602001916129c2565b820191906000526020600020905b8154815290600101906020018083116129a557829003601f168201915b5050505050905090565b7f000000000000000000000000000000000000000000000000000000000000001481565b6129f8613c95565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612aba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b7f0000000000000000000000000ffd3bfaf8897d24fc357e5d2faa08f47f82470c73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b5f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260418152602001806155ad6041913960600191505060405180910390fd5b612b698282614908565b5050565b600c5481565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636f2789ec6040518163ffffffff1660e01b815260040160206040518083038186803b158015612bdd57600080fd5b505afa158015612bf1573d6000803e3d6000fd5b505050506040513d6020811015612c0757600080fd5b8101908080519060200190929190505050905090565b6000612ce0612c2a613c95565b84612cdb856040518060600160405280602581526020016157356025913960016000612c54613c95565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546148489092919063ffffffff16565b613c9d565b6001905092915050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a8b9d240836040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612d7557600080fd5b505afa158015612d89573d6000803e3d6000fd5b505050506040513d6020811015612d9f57600080fd5b81019080805190602001909291905050509050919050565b6000612dcb612dc4613c95565b8484613e94565b6001905092915050565b600080600080600080600080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fbcbc0f18a6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1681526020019150506101006040518083038186803b158015612e6b57600080fd5b505afa158015612e7f573d6000803e3d6000fd5b505050506040513d610100811015612e9657600080fd5b81019080805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919050505097509750975097509750975097509750919395975091939597565b600f6020528060005260406000206000915054906101000a900460ff1681565b612f30613c95565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612ff2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b801515600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515141561309b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603481526020018061543c6034913960400191505060405180910390fd5b80600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df78260405180821515815260200191505060405180910390a25050565b61314e613c95565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613210576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60005b838390508110156132aa5781600d600086868581811061322f57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080600101915050613213565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b35838383604051808060200183151581526020018281038252858582818152602001925060200280828437600081840152601f19601f82011690508083019250505094505050505060405180910390a1505050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634e7b827f836040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156133ab57600080fd5b505afa1580156133bf573d6000803e3d6000fd5b505050506040513d60208110156133d557600080fd5b81019080805190602001909291905050509050919050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600a5481565b6134a8613c95565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461356a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613611576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806154706036913960400191505060405180910390fd5b61361c816001612f28565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f6080503d1da552ae8eb4b7b8a20245d9fabed014180510e7d1a05ea08fdb0f3e60405160405180910390a380600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e7841ec06040518163ffffffff1660e01b815260040160206040518083038186803b15801561374657600080fd5b505afa15801561375a573d6000803e3d6000fd5b505050506040513d602081101561377057600080fd5b8101908080519060200190929190505050905090565b61378e613c95565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613850576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e98030c7826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156138c557600080fd5b505af11580156138d9573d6000803e3d6000fd5b5050505050565b600080600080600080600080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635183d6fd8a6040518263ffffffff1660e01b8152600401808281526020019150506101006040518083038186803b15801561396057600080fd5b505afa158015613974573d6000803e3d6000fd5b505050506040513d61010081101561398b57600080fd5b81019080805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919050505097509750975097509750975097509750919395975091939597565b613a05613c95565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613ac7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613b4d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806154a66026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080828401905083811015613c8b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613d23576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806156966024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613da9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806154cc6022913960400191505060405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613f1a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806156376025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613fa0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806154196023913960400191505060405180910390fd5b6000811415613fba57613fb583836000614afc565b614843565b600660149054906101000a900460ff161580156140205750600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b801561407a5750600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b80156140d05750600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156141485750600d6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156141a9576009548111156141a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a81526020018061565c603a913960400191505060405180910390fd5b5b60006141b430611fb1565b90506000600a5482101590508080156141da5750600660149054906101000a900460ff16155b80156142305750600f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b801561428a5750600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b80156142e45750600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b156143aa576001600660146101000a81548160ff021916908315150217905550600061436b7f000000000000000000000000000000000000000000000000000000000000001861435d7f000000000000000000000000000000000000000000000000000000000000001486614dbd90919063ffffffff16565b614e4390919063ffffffff16565b905061437681614e8d565b600061438130611fb1565b905061438c81614ef6565b6000600660146101000a81548160ff02191690831515021790555050505b6000600660149054906101000a900460ff16159050600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806144605750600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1561446a57600090505b80156145775760006144b860646144aa7f000000000000000000000000000000000000000000000000000000000000001888614dbd90919063ffffffff16565b614e4390919063ffffffff16565b9050600f60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156145555761455260646145447f000000000000000000000000000000000000000000000000000000000000007884614dbd90919063ffffffff16565b614e4390919063ffffffff16565b90505b6145688186614fda90919063ffffffff16565b9450614575873083614afc565b505b614582868686614afc565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e30443bc876145ca89611fb1565b6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561461d57600080fd5b505af192505050801561462e575060015b61463757614638565b5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e30443bc8661468088611fb1565b6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1580156146d357600080fd5b505af19250505080156146e4575060015b6146ed576146ee565b5b600660149054906101000a900460ff1661483f576000600c549050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ffb2c479826040518263ffffffff1660e01b815260040180828152602001915050606060405180830381600087803b15801561477e57600080fd5b505af19250505080156147c657506040513d606081101561479e57600080fd5b8101908080519060200190929190805190602001909291908051906020019092919050505060015b6147cf5761483d565b3273ffffffffffffffffffffffffffffffffffffffff16600115157fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a98858585896040518085815260200184815260200183815260200182815260200194505050505060405180910390a35050505b505b5050505b505050565b60008383111582906148f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156148ba57808201518184015260208101905061489f565b50505050905090810190601f1680156148e75780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b801515600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514156149b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001806154ee6038913960400191505060405180910390fd5b80600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015614ab257600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0836040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b158015614a9957600080fd5b505af1158015614aad573d6000803e3d6000fd5b505050505b8015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415614b82576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806156376025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415614c08576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806154196023913960400191505060405180910390fd5b614c13838383615024565b614c7e81604051806060016040528060268152602001615526602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546148489092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614d11816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c0d90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b600080831415614dd05760009050614e3d565b6000828402905082848281614de157fe5b0414614e38576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806155ee6021913960400191505060405180910390fd5b809150505b92915050565b6000614e8583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250615029565b905092915050565b60004790506000614ea78247614fda90919063ffffffff16565b9050614eb2836150ef565b7f28fc98272ce761178794ad6768050fea1648e07f1e2ffe15afd3a290f83814868382604051808381526020018281526020019250505060405180910390a1505050565b614eff81615164565b60004790506000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168260405180600001905060006040518083038185875af1925050503d8060008114614f86576040519150601f19603f3d011682016040523d82523d6000602084013e614f8b565b606091505b505090508015614fd5577f80195cc573b02cc48460cbca6e6e4cc85ddb91959d946e1c3025ea3d87942dc38383604051808381526020018281526020019250505060405180910390a15b505050565b600061501c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614848565b905092915050565b505050565b600080831182906150d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561509a57808201518184015260208101905061507f565b50505050905090810190601f1680156150c75780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816150e157fe5b049050809150509392505050565b6150f881615164565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015615160573d6000803e3d6000fd5b5050565b6060600267ffffffffffffffff8111801561517e57600080fd5b506040519080825280602002602001820160405280156151ad5781602001602082028036833780820191505090505b50905030816000815181106151be57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561526057600080fd5b505afa158015615274573d6000803e3d6000fd5b505050506040513d602081101561528a57600080fd5b8101908080519060200190929190505050816001815181106152a857fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061530f30600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684613c9d565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b815260040180868152602001858152602001806020018473ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b838110156153d35780820151818401526020810190506153b8565b505050509050019650505050505050600060405180830381600087803b1580156153fc57600080fd5b505af1158015615410573d6000803e3d6000fd5b50505050505056fe45524332303a207472616e7366657220746f20746865207a65726f2061646472657373426179626c6164653a204163636f756e7420697320616c7265616479207468652076616c7565206f6620276578636c7564656427426179626c6164653a20546865206c69717569646974792077616c6c657420697320616c7265616479207468697320616464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f20616464726573734175746f6d61746564206d61726b6574206d616b6572207061697220697320616c72656164792073657420746f20746861742076616c756545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636554686520726f7574657220616c72656164792068617320746861742061646472657373426179626c6164653a20676173466f7250726f63657373696e67206d757374206265206265747765656e203230302c30303020616e64203530302c30303054686520556e697377617020706169722063616e6e6f742062652072656d6f7665642066726f6d206175746f6d617465644d61726b65744d616b65725061697273536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a207472616e736665722066726f6d20746865207a65726f206164647265737353656c6c207472616e7366657220616d6f756e74206578636565647320746865206d617853656c6c5472616e73616374696f6e416d6f756e742e45524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373546865206e6577206469766964656e6420747261636b6572206d757374206265206f776e65642062792074686520424159424c41444520746f6b656e20636f6e7472616374426179626c6164653a2043616e6e6f742075706461746520676173466f7250726f63657373696e6720746f2073616d652076616c756545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f546865206469766964656e6420747261636b657220616c72656164792068617320746861742061646472657373a2646970667358221220215b8ef7afa6b6af2f51c9eb5e7d516a5a469a83ce01ed6af15146162d1eaf7a64736f6c634300060c0033
Deployed Bytecode Sourcemap
43748:15091:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44045:66;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;49304:138;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;15330:100;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17497:169;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;44276:34;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;43826:41;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;16450:108;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;49182:110;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;44462:52;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;18148:355;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;43951:46;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;51950:141;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;16292:93;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;49762:130;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;18912:218;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;43874:38;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;53602:88;;;;;;;;;;;;;:::i;:::-;;52099:125;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;53832:141;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;48701:307;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;52544:130;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;53335:259;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;16621:127;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;33073:148;;;;;;;;;;;;;:::i;:::-;;51282:412;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;47863:830;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;44187:38;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;32431:79;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;44317:77;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;15549:104;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44232:37;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;50232:252;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;44594:40;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;51834:108;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;19633:269;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;52392:147;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;16961:175;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;52682:318;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45052:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;49450:300;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;49912:304;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;52236:148;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;44006:30;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;17199:151;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;44118:60;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;50901:373;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;53698:126;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;51702:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;53005:325;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33376:244;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;44045:66;;;;:::o;49304:138::-;32653:12;:10;:12::i;:::-;32643:22;;:6;;;;;;;;;;;:22;;;32635:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49427:6:::1;49411:12;:23;49384:24;:50;;;;49304:138:::0;:::o;15330:100::-;15384:13;15417:5;15410:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15330:100;:::o;17497:169::-;17580:4;17597:39;17606:12;:10;:12::i;:::-;17620:7;17629:6;17597:8;:39::i;:::-;17654:4;17647:11;;17497:169;;;;:::o;44276:34::-;;;:::o;43826:41::-;;;;;;;;;;;;;:::o;16450:108::-;16511:7;16538:12;;16531:19;;16450:108;:::o;49182:110::-;32653:12;:10;:12::i;:::-;32643:22;;:6;;;;;;;;;;;:22;;;32635:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49274:10:::1;49262:9;;:22;;;;;;;;;;;;;;;;;;49182:110:::0;:::o;44462:52::-;;;:::o;18148:355::-;18288:4;18305:36;18315:6;18323:9;18334:6;18305:9;:36::i;:::-;18352:121;18361:6;18369:12;:10;:12::i;:::-;18383:89;18421:6;18383:89;;;;;;;;;;;;;;;;;:11;:19;18395:6;18383:19;;;;;;;;;;;;;;;:33;18403:12;:10;:12::i;:::-;18383:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;18352:8;:121::i;:::-;18491:4;18484:11;;18148:355;;;;;:::o;43951:46::-;;;;;;;;;;;;;:::o;51950:141::-;52013:7;52040:15;;;;;;;;;;;:41;;;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52033:50;;51950:141;:::o;16292:93::-;16350:5;16375:2;16368:9;;16292:93;:::o;49762:130::-;32653:12;:10;:12::i;:::-;32643:22;;:6;;;;;;;;;;;:22;;;32635:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49839:15:::1;;;;;;;;;;;:36;;;49876:7;49839:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;49762:130:::0;:::o;18912:218::-;19000:4;19017:83;19026:12;:10;:12::i;:::-;19040:7;19049:50;19088:10;19049:11;:25;19061:12;:10;:12::i;:::-;19049:25;;;;;;;;;;;;;;;:34;19075:7;19049:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;19017:8;:83::i;:::-;19118:4;19111:11;;18912:218;;;;:::o;43874:38::-;;;:::o;53602:88::-;53633:15;;;;;;;;;;;:30;;;53664:10;53676:5;53633:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53602:88::o;52099:125::-;52164:4;52188:19;:28;52208:7;52188:28;;;;;;;;;;;;;;;;;;;;;;;;;52181:35;;52099:125;;;:::o;53832:141::-;53897:7;53924:15;;;;;;;;;;;:39;;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53917:48;;53832:141;:::o;48701:307::-;32653:12;:10;:12::i;:::-;32643:22;;:6;;;;;;;;;;;:22;;;32635:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48810:15:::1;;;;;;;;;;;48788:38;;:10;:38;;;;48780:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48924:15;;;;;;;;;;;48882:59;;48904:10;48882:59;;;;;;;;;;;;48989:10;48952:15;;:48;;;;;;;;;;;;;;;;;;48701:307:::0;:::o;52544:130::-;52614:7;52635:15;;;;;;;;;;;:25;;;52661:7;52635:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52628:41;;52544:130;;;:::o;53335:259::-;53395:18;53415:14;53431:26;53461:15;;;;;;;;;;;:23;;;53485:3;53461:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53394:95;;;;;;53576:9;53499:87;;53564:5;53499:87;;;53524:10;53536:6;53544:18;53571:3;53499:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53335:259;;;;:::o;16621:127::-;16695:7;16722:9;:18;16732:7;16722:18;;;;;;;;;;;;;;;;16715:25;;16621:127;;;:::o;33073:148::-;32653:12;:10;:12::i;:::-;32643:22;;:6;;;;;;;;;;;:22;;;32635:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33180:1:::1;33143:40;;33164:6;;;;;;;;;;;33143:40;;;;;;;;;;;;33211:1;33194:6;;:19;;;;;;;;;;;;;;;;;;33073:148::o:0;51282:412::-;32653:12;:10;:12::i;:::-;32643:22;;:6;;;;;;;;;;;:22;;;32635:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51380:6:::1;51368:8;:18;;:40;;;;;51402:6;51390:8;:18;;51368:40;51360:115;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51506:16;;51494:8;:28;;51486:95;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51631:16;;51621:8;51597:51;;;;;;;;;;51678:8;51659:16;:27;;;;51282:412:::0;:::o;47863:830::-;32653:12;:10;:12::i;:::-;32643:22;;:6;;;;;;;;;;;:22;;;32635:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47972:15:::1;;;;;;;;;;;47950:38;;:10;:38;;;;47942:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48051:42;48128:10;48051:89;;48199:4;48161:43;;:18;:24;;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;:43;;;48153:125;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48291:18;:39;;;48339:18;48291:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;48370:18;:39;;;48418:4;48370:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;48435:18;:39;;;48475:7;:5;:7::i;:::-;48435:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;48494:18;:39;;;48542:15;;;;;;;;;;;48494:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;48619:15;;;;;;;;;;;48577:59;;48599:10;48577:59;;;;;;;;;;;;48667:18;48649:15;;:36;;;;;;;;;;;;;;;;;;32713:1;47863:830:::0;:::o;44187:38::-;;;:::o;32431:79::-;32469:7;32496:6;;;;;;;;;;;32489:13;;32431:79;:::o;44317:77::-;;;;;;;;;;;;;:::o;15549:104::-;15605:13;15638:7;15631:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15549:104;:::o;44232:37::-;;;:::o;50232:252::-;32653:12;:10;:12::i;:::-;32643:22;;:6;;;;;;;;;;;:22;;;32635:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50339:13:::1;50331:21;;:4;:21;;;;50323:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50435:41;50464:4;50470:5;50435:28;:41::i;:::-;50232:252:::0;;:::o;44594:40::-;;;;:::o;51834:108::-;51880:7;51907:15;;;;;;;;;;;:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51900:34;;51834:108;:::o;19633:269::-;19726:4;19743:129;19752:12;:10;:12::i;:::-;19766:7;19775:96;19814:15;19775:96;;;;;;;;;;;;;;;;;:11;:25;19787:12;:10;:12::i;:::-;19775:25;;;;;;;;;;;;;;;:34;19801:7;19775:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;19743:8;:129::i;:::-;19890:4;19883:11;;19633:269;;;;:::o;52392:147::-;52461:7;52485:15;;;;;;;;;;;:38;;;52524:7;52485:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52478:54;;52392:147;;;:::o;16961:175::-;17047:4;17064:42;17074:12;:10;:12::i;:::-;17088:9;17099:6;17064:9;:42::i;:::-;17124:4;17117:11;;16961:175;;;;:::o;52682:318::-;52778:7;52800:6;52821;52842:7;52864;52886;52908;52930;52957:15;;;;;;;;;;;:26;;;52984:7;52957:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52950:42;;;;;;;;;;;;;;;;52682:318;;;;;;;;;:::o;45052:58::-;;;;;;;;;;;;;;;;;;;;;;:::o;49450:300::-;32653:12;:10;:12::i;:::-;32643:22;;:6;;;;;;;;;;;:22;;;32635:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49575:8:::1;49543:40;;:19;:28;49563:7;49543:28;;;;;;;;;;;;;;;;;;;;;;;;;:40;;;;49535:105;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49682:8;49651:19;:28;49671:7;49651:28;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;49724:7;49708:34;;;49733:8;49708:34;;;;;;;;;;;;;;;;;;;;49450:300:::0;;:::o;49912:304::-;32653:12;:10;:12::i;:::-;32643:22;;:6;;;;;;;;;;;:22;;;32635:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50029:9:::1;50025:115;50048:8;;:15;;50044:1;:19;50025:115;;;50120:8;50085:19;:32;50105:8;;50114:1;50105:11;;;;;;;;;;;;;;;50085:32;;;;;;;;;;;;;;;;:43;;;;;;;;;;;;;;;;;;50065:3;;;;;;;50025:115;;;;50157:51;50189:8;;50199;50157:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49912:304:::0;;;:::o;52236:148::-;52306:4;52330:15;;;;;;;;;;;:37;;;52368:7;52330:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52323:53;;52236:148;;;:::o;44006:30::-;;;;;;;;;;;;;:::o;17199:151::-;17288:7;17315:11;:18;17327:5;17315:18;;;;;;;;;;;;;;;:27;17334:7;17315:27;;;;;;;;;;;;;;;;17308:34;;17199:151;;;;:::o;44118:60::-;;;;:::o;50901:373::-;32653:12;:10;:12::i;:::-;32643:22;;:6;;;;;;;;;;;:22;;;32635:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51018:15:::1;;;;;;;;;;;50996:37;;:18;:37;;;;50988:104;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51103:41;51119:18;51139:4;51103:15;:41::i;:::-;51203:15;;;;;;;;;;;51160:59;;51183:18;51160:59;;;;;;;;;;;;51248:18;51230:15;;:36;;;;;;;;;;;;;;;;;;50901:373:::0;:::o;53698:126::-;53753:7;53777:15;;;;;;;;;;;:37;;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53770:46;;53698:126;:::o;51702:124::-;32653:12;:10;:12::i;:::-;32643:22;;:6;;;;;;;;;;;:22;;;32635:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51776:15:::1;;;;;;;;;;;:31;;;51808:9;51776:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;51702:124:::0;:::o;53005:325::-;53106:7;53128:6;53149;53170:7;53192;53214;53236;53258;53282:15;;;;;;;;;;;:33;;;53316:5;53282:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53275:47;;;;;;;;;;;;;;;;53005:325;;;;;;;;;:::o;33376:244::-;32653:12;:10;:12::i;:::-;32643:22;;:6;;;;;;;;;;;:22;;;32635:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33485:1:::1;33465:22;;:8;:22;;;;33457:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33575:8;33546:38;;33567:6;;;;;;;;;;;33546:38;;;;;;;;;;;;33604:8;33595:6;;:17;;;;;;;;;;;;;;;;;;33376:244:::0;:::o;8861:181::-;8919:7;8939:9;8955:1;8951;:5;8939:17;;8980:1;8975;:6;;8967:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9033:1;9026:8;;;8861:181;;;;:::o;97:98::-;150:7;177:10;170:17;;97:98;:::o;22819:380::-;22972:1;22955:19;;:5;:19;;;;22947:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23053:1;23034:21;;:7;:21;;;;23026:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23137:6;23107:11;:18;23119:5;23107:18;;;;;;;;;;;;;;;:27;23126:7;23107:27;;;;;;;;;;;;;;;:36;;;;23175:7;23159:32;;23168:5;23159:32;;;23184:6;23159:32;;;;;;;;;;;;;;;;;;22819:380;;;:::o;53989:2739::-;54137:1;54121:18;;:4;:18;;;;54113:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54214:1;54200:16;;:2;:16;;;;54192:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54294:1;54284:6;:11;54281:92;;;54312:28;54328:4;54334:2;54338:1;54312:15;:28::i;:::-;54355:7;;54281:92;54413:8;;;;;;;;;;;54412:9;:55;;;;;54438:25;:29;54464:2;54438:29;;;;;;;;;;;;;;;;;;;;;;;;;54412:55;:168;;;;;54564:15;;;;;;;;;;;54548:32;;:4;:32;;;;54412:168;:273;;;;;54662:19;:23;54682:2;54662:23;;;;;;;;;;;;;;;;;;;;;;;;;54661:24;54412:273;:365;;;;;54741:19;:36;54761:15;;;;;;;;;;;54741:36;;;;;;;;;;;;;;;;;;;;;;;;;54740:37;54412:365;54397:524;;;54822:24;;54812:6;:34;;54804:105;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54397:524;54927:28;54958:24;54976:4;54958:9;:24::i;:::-;54927:55;;55003:12;55042:18;;55018:20;:42;;55003:57;;55090:7;:33;;;;;55115:8;;;;;;;;;;;55114:9;55090:33;:82;;;;;55141:25;:31;55167:4;55141:31;;;;;;;;;;;;;;;;;;;;;;;;;55140:32;55090:82;:122;;;;;55197:15;;;;;;;;;;;55189:23;;:4;:23;;;;55090:122;:160;;;;;55235:15;;;;;;;;;;;55229:21;;:2;:21;;;;55090:160;55073:505;;;55288:4;55277:8;;:15;;;;;;;;;;;;;;;;;;55309:18;55330:53;55373:9;55330:38;55355:12;55330:20;:24;;:38;;;;:::i;:::-;:42;;:53;;;;:::i;:::-;55309:74;;55398:26;55413:10;55398:14;:26::i;:::-;55441:18;55462:24;55480:4;55462:9;:24::i;:::-;55441:45;;55501:32;55522:10;55501:20;:32::i;:::-;55561:5;55550:8;;:16;;;;;;;;;;;;;;;;;;55073:505;;;55592:12;55608:8;;;;;;;;;;;55607:9;55592:24;;55718:19;:25;55738:4;55718:25;;;;;;;;;;;;;;;;;;;;;;;;;:52;;;;55747:19;:23;55767:2;55747:23;;;;;;;;;;;;;;;;;;;;;;;;;55718:52;55715:99;;;55797:5;55787:15;;55715:99;55829:7;55826:352;;;55850:12;55865:30;55891:3;55865:21;55876:9;55865:6;:10;;:21;;;;:::i;:::-;:25;;:30;;;;:::i;:::-;55850:45;;55956:25;:29;55982:2;55956:29;;;;;;;;;;;;;;;;;;;;;;;;;55953:116;;;56013:40;56049:3;56013:31;56022:21;56013:4;:8;;:31;;;;:::i;:::-;:35;;:40;;;;:::i;:::-;56006:47;;55953:116;56091:16;56102:4;56091:6;:10;;:16;;;;:::i;:::-;56082:25;;56124:42;56140:4;56154;56161;56124:15;:42::i;:::-;55826:352;;56190:33;56206:4;56212:2;56216:6;56190:15;:33::i;:::-;56240:15;;;;;;;;;;;:26;;;56275:4;56282:15;56292:4;56282:9;:15::i;:::-;56240:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56236:74;;;;;;56324:15;;;;;;;;;;;:26;;;56359:2;56364:13;56374:2;56364:9;:13::i;:::-;56324:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56320:70;;;;;;56406:8;;;;;;;;;;;56402:319;;56425:11;56439:16;;56425:30;;56470:15;;;;;;;;;;;:23;;;56494:3;56470:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56466:244;;;;;56663:9;56587:86;;56652:4;56587:86;;;56612:10;56624:6;56632:18;56658:3;56587:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56499:184;;;56466:244;56402:319;;53989:2739;;;;;;;:::o;9764:192::-;9850:7;9883:1;9878;:6;;9886:12;9870:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9910:9;9926:1;9922;:5;9910:17;;9947:1;9940:8;;;9764:192;;;;;:::o;50492:399::-;50618:5;50583:40;;:25;:31;50609:4;50583:31;;;;;;;;;;;;;;;;;;;;;;;;;:40;;;;50575:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50729:5;50695:25;:31;50721:4;50695:31;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;50750:5;50747:79;;;50772:15;;;;;;;;;;;:36;;;50809:4;50772:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50747:79;50877:5;50843:40;;50871:4;50843:40;;;;;;;;;;;;50492:399;;:::o;20392:573::-;20550:1;20532:20;;:6;:20;;;;20524:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20634:1;20613:23;;:9;:23;;;;20605:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20689:47;20710:6;20718:9;20729:6;20689:20;:47::i;:::-;20769:71;20791:6;20769:71;;;;;;;;;;;;;;;;;:9;:17;20779:6;20769:17;;;;;;;;;;;;;;;;:21;;:71;;;;;:::i;:::-;20749:9;:17;20759:6;20749:17;;;;;;;;;;;;;;;:91;;;;20874:32;20899:6;20874:9;:20;20884:9;20874:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;20851:9;:20;20861:9;20851:20;;;;;;;;;;;;;;;:55;;;;20939:9;20922:35;;20931:6;20922:35;;;20950:6;20922:35;;;;;;;;;;;;;;;;;;20392:573;;;:::o;10215:471::-;10273:7;10523:1;10518;:6;10514:47;;;10548:1;10541:8;;;;10514:47;10573:9;10589:1;10585;:5;10573:17;;10618:1;10613;10609;:5;;;;;;:10;10601:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10677:1;10670:8;;;10215:471;;;;;:::o;11162:132::-;11220:7;11247:39;11251:1;11254;11247:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;11240:46;;11162:132;;;;:::o;56736:612::-;57060:22;57085:21;57060:46;;57167:18;57188:41;57214:14;57188:21;:25;;:41;;;;:::i;:::-;57167:62;;57253:26;57272:6;57253:18;:26::i;:::-;57305:34;57320:6;57328:10;57305:34;;;;;;;;;;;;;;;;;;;;;;;;56736:612;;;:::o;58524:312::-;58589:24;58606:6;58589:16;:24::i;:::-;58624:17;58644:21;58624:41;;58677:12;58702:15;;;;;;;;;;;58694:29;;58731:9;58694:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58676:69;;;58761:7;58758:71;;;58785:32;58799:6;58807:9;58785:32;;;;;;;;;;;;;;;;;;;;;;;;58758:71;58524:312;;;:::o;9325:136::-;9383:7;9410:43;9414:1;9417;9410:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;9403:50;;9325:136;;;;:::o;23802:125::-;;;;:::o;11790:278::-;11876:7;11908:1;11904;:5;11911:12;11896:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11935:9;11951:1;11947;:5;;;;;;11935:17;;12059:1;12052:8;;;11790:278;;;;;:::o;49020:150::-;49084:24;49101:6;49084:16;:24::i;:::-;49120:9;;;;;;;;;;;:18;;:41;49139:21;49120:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49020:150;:::o;57356:611::-;57494:21;57532:1;57518:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57494:40;;57563:4;57545;57550:1;57545:7;;;;;;;;;;;;;:23;;;;;;;;;;;57589:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57579:4;57584:1;57579:7;;;;;;;;;;;;;:32;;;;;;;;;;;57624:62;57641:4;57656:15;;;;;;;;;;;57674:11;57624:8;:62::i;:::-;57725:15;;;;;;;;;;;:66;;;57806:11;57832:1;57876:4;57903;57923:15;57725:224;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57356:611;;:::o
Swarm Source
ipfs://30b24135a0bc4b83f0a35765fc44ed0e5be4110338035c24b90aeefa22e21bde
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.