ERC-20
Overview
Max Total Supply
1,000,000,000,000 NFA
Holders
67
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Balance
6,869,029,663.144046436698777521 NFAValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
NFA
Compiler Version
v0.8.21+commit.d9974bed
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-11-05 */ /// SPDX-License-Identifier: MIT pragma solidity 0.8.21; 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; } 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); } 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; } /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev 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 `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, 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 `from` to `to` 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 from, address to, uint256 amount) external returns (bool); } /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ 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); } /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } /** * @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.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * The default value of {decimals} is 18. To change this, you should override * this function so it returns a different value. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead 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 { 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}. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _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 default value returned by this function, unless * it's 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: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, 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}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, 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}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); 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) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + 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) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `from` to `to`. * * This 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: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer(address from, address to, uint256 amount) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by // decrementing then incrementing. _balances[to] += amount; } emit Transfer(from, to, amount); _afterTokenTransfer(from, to, 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 += amount; unchecked { // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above. _balances[account] += amount; } emit Transfer(address(0), account, amount); _afterTokenTransfer(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); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; // Overflow not possible: amount <= accountBalance <= totalSupply. _totalSupply -= amount; } emit Transfer(account, address(0), amount); _afterTokenTransfer(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 Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance(address owner, address spender, uint256 amount) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - 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 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 {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been 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 _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {} } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(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"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @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 a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * 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) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } 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) internal view returns (uint) { return map.values[key]; } function getIndexOfKey(Map storage map, address key) internal view returns (int) { if(!map.inserted[key]) { return -1; } return int(map.indexOf[key]); } function getKeyAtIndex(Map storage map, uint index) internal view returns (address) { return map.keys[index]; } function size(Map storage map) internal view returns (uint) { return map.keys.length; } function set(Map storage map, address key, uint val) internal { 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) internal { 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 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); } // File: contracts/interface/DividendPayingTokenInterface.sol /// @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); } } /** * @title SafeMathUint * @dev Math operations with safety checks that revert on error */ library SafeMathUint { function toInt256Safe(uint256 a) internal pure returns (int256) { int256 b = int256(a); require(b >= 0); return b; } } /// @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 abstract contract DividendPayingToken is 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; mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; // 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; /// @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(payable(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(_balances[_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 { 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 amount The amount that will be created. function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _totalSupply += amount; _balances[account] += amount; magnifiedDividendCorrections[account] = magnifiedDividendCorrections[ account ].sub((magnifiedDividendPerShare.mul(amount)).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 amount The amount that will be burnt. function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; magnifiedDividendCorrections[account] = magnifiedDividendCorrections[ account ].add((magnifiedDividendPerShare.mul(amount)).toInt256Safe()); } /// @dev update the user share as per there balance function _setBalance(address account, uint256 newBalance) internal { uint256 currentBalance = _balances[account]; if(newBalance > currentBalance) { uint256 mintAmount = newBalance.sub(currentBalance); _mint(account, mintAmount); } else if(newBalance < currentBalance) { uint256 burnAmount = currentBalance.sub(newBalance); _burn(account, burnAmount); } } } /// @title NFA ERC20 with buy and sell fees /// having eth relfection for holders contract NFA is ERC20, Ownable { /// custom errors error CannotRemoveMainPair(); error ZeroAddressNotAllowed(); error BuyFeesLimitExceeds(); error SellFeesLimitExceeds(); error CannotBlacklistLPPair(); error UpdateBoolValue(); error CannotClaimNativeToken(); error MaxAmountMustBeGreaterThanOnePercent(); error AmountTooHigh(); error LpBurnFrequencyIsTooHigh(); error MustBeWithinRange(); error TradingIsAlreadyLive(); error TradingIsNotEnabledYet(); /// @notice global burn address address private constant deadWallet = address(0xdead); /// @notice Max limit on Buy / Sell fees uint256 public constant MAX_FEE_LIMIT = 50; /// @notice max total supply 1 trillion tokens (18 decimals) uint256 private maxSupply = 1_000_000_000_000 * 1e18; /// @notice swap threshold at which collected fees tokens are swapped for ether, autoLP uint256 public swapTokensAtAmount = (maxSupply * 2) / 10000; // 0.02% of the supply /// @notice gas for reward processing uint256 public gasForProcessing = 300000; /// @notice check if it's a swap tx bool private inSwap = false; /// @notice reward automation status bool public isAutomationEnabled = true; /// @notice lp burn enabled status bool public lpBurnEnabled = true; /// @notice trading enable status bool public isTradingEnabled; /// @notice burn percentage uint256 public burnPercentage = 25; /// @notice burn frequency uint256 public lpBurnFrequency = 6 hours; /// @notice last lp burn time uint256 public lastLpBurnTime; /// @notice buyFees refelction uint256 public buyFeeReflection; /// @notice buyFees marketing uint256 public buyFeeMarketing; /// @notice sellFees reflection uint256 public sellFeeReflection; /// @notice sell fees marketing uint256 public sellFeeMarketing; /// @notice dividend tracker for ETH rewards DividendTracker public ethDividendTracker; /// @notice marketingWallet address public marketingWallet; /// @notice uniswap V2 router address IUniswapV2Router02 public immutable uniswapV2Router; /// @notice uniswap V2 Pair address address public uniswapV2Pair; /// @notice mapping to manager liquidity pairs mapping(address => bool) public isAutomatedMarketMaker; /// @notice mapping to manage excluded address from/to fees mapping(address => bool) public isExcludedFromFees; //// EVENTS //// event BuyFeesUpdated(uint256 indexed rFee, uint256 indexed mFee); event SellFeesUpdated(uint256 indexed rFee, uint256 indexed mFee); event FeesSwapped(uint256 indexed tokens, uint256 indexed eth); event swapTokensAtAmountUpdated(uint256 indexed amount); event RewardsInjected (uint256 ethAmount); event AutoNukeLP(); /// @dev create an erc20 token using openzeppeling ERC20, Ownable /// uses uniswap router and factory interface /// set uniswap router, create pair, initialize buy, sell fees, marketingWallet values /// excludes the token, marketingWallet and owner address from fees /// and mint the supply to owner wallet. constructor () ERC20("Not Financial Advice", "NFA"){ ethDividendTracker = new DividendTracker(); uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(address(this), uniswapV2Router.WETH()); isAutomatedMarketMaker[uniswapV2Pair] = true; buyFeeReflection = 10; buyFeeMarketing = 10; sellFeeReflection = 10; sellFeeMarketing = 10; marketingWallet = 0x00d9783d385a499F330434596FDd1b39559DaCB9; // fee wallet // exclude from receiving dividends ethDividendTracker.excludeFromDividends(address(ethDividendTracker)); ethDividendTracker.excludeFromDividends(address(this)); ethDividendTracker.excludeFromDividends(owner()); ethDividendTracker.excludeFromDividends(uniswapV2Pair); ethDividendTracker.excludeFromDividends(deadWallet); isExcludedFromFees[address(this)] = true; isExcludedFromFees[marketingWallet] = true; isExcludedFromFees[owner()] = true; _mint(msg.sender, maxSupply); } /// modifier /// modifier lockTheSwap { inSwap = true; _; inSwap = false; } /// receive external ether receive () external payable {} /// @dev owner can claim other erc20 tokens, if accidently sent by someone /// @param _token: token address to be rescued /// @param _amount: amount to rescued /// Requirements -- /// Cannot claim native token function claimOtherERC20 (address _token, uint256 _amount) external onlyOwner { if(_token == address(this)) { revert CannotClaimNativeToken(); } IERC20 tkn = IERC20(_token); tkn.transfer(owner(), _amount); } /// @dev enable trading globally, once enabled it can never be turned off function enableTrading() external onlyOwner { if(isTradingEnabled){ revert TradingIsAlreadyLive(); } isTradingEnabled = true; } /// @dev exclude or include a user from/to fees /// @param user: user address /// @param value: boolean value. true means excluded. false means included /// Requirements -- /// zero address not allowed /// if a user is excluded already, can't exlude him again function excludeFromFees (address user, bool value) external onlyOwner { if(user == address(0)){ revert ZeroAddressNotAllowed(); } if(isExcludedFromFees[user] == value){ revert UpdateBoolValue(); } isExcludedFromFees[user] = value; } /// @dev add or remove new pairs /// @param _newPair: address to be added or removed as pair /// @param value: boolean value, true means blacklisted, false means unblacklisted /// Requirements -- /// address should not be zero /// Can not remove main pair /// can not add already added pairs and vice versa function manageLiquidityPairs (address _newPair, bool value) external onlyOwner { if(_newPair == address(0)){ revert ZeroAddressNotAllowed(); } if(_newPair == uniswapV2Pair){ revert CannotRemoveMainPair(); } if(isAutomatedMarketMaker[_newPair] == value){ revert UpdateBoolValue(); } ethDividendTracker.excludeFromDividends(_newPair); isAutomatedMarketMaker[_newPair] = value; } /// @notice user can claim his pending reward by calling this function function claimEthReward() external { ethDividendTracker.processAccount(payable(msg.sender), false); } /// @dev owner can exclude any address from dividends /// @param account: user address or contract to exclude function excludeFromDividends(address account) external onlyOwner { ethDividendTracker.excludeFromDividends(account); } /// @dev update buy fees /// @param reflection - update reflection fees /// @param marketing - update marketing fees function setBuyFees (uint256 reflection, uint256 marketing) external onlyOwner { if(reflection + marketing > MAX_FEE_LIMIT){ revert BuyFeesLimitExceeds(); } buyFeeReflection = reflection; buyFeeMarketing = marketing; emit BuyFeesUpdated(reflection, marketing); } /// @dev update sell fees /// @param reflection - update reflection fees /// @param marketing - update marketing fees function setSellFees (uint256 reflection, uint256 marketing) external onlyOwner { if(reflection + marketing > MAX_FEE_LIMIT){ revert SellFeesLimitExceeds(); } sellFeeReflection = reflection; sellFeeMarketing = marketing; emit SellFeesUpdated(reflection, marketing); } /// @dev update gas for auto distribution /// @param gas: new gas limit function setGasForProcessing (uint256 gas) external onlyOwner { if(gas < 200000 && gas > 500000) { ///Gas fees limit for auto distribution must be within 200000 to 500000 revert MustBeWithinRange(); } gasForProcessing = gas; } /// @dev update automatic distribution status for rewards /// @param value: if it's true, eth will distributed automatically else /// user have to claim it manually (by default automation is enabled with manual claim /// option as well); function setAutomaticDistribution(bool value) external onlyOwner { if(isAutomationEnabled == value){ revert UpdateBoolValue(); } isAutomationEnabled = value; } /// @dev update swap tokens at amount /// @param amount: new min swap swap threshold function setSwapTokensAtAmount (uint256 amount) external onlyOwner { if(amount > maxSupply / 100) { revert AmountTooHigh(); } swapTokensAtAmount = amount; } /// @dev update marketing wallet /// @param wallet; new marketing wallet address function setMarketingWallet (address wallet) external onlyOwner { if(wallet == address(0)){ revert ZeroAddressNotAllowed(); } marketingWallet = wallet; } /// @dev adjust autoLPBurn settings /// @param frequencyInSeconds: how frequent lp should burn /// @param percent: percent in basis point /// @param enabled: burn status, enable or disable function setAutoLPBurnSettings(uint256 frequencyInSeconds, uint256 percent, bool enabled) external onlyOwner { if(frequencyInSeconds <= 600){ /// must be greator than 10 minutes revert LpBurnFrequencyIsTooHigh(); } if(percent >= 1000 && percent <= 0){ /// must be within 0.01% to 9.99% revert MustBeWithinRange(); } lpBurnFrequency = frequencyInSeconds; burnPercentage = percent; lpBurnEnabled = enabled; } /// @notice manage transfers, fees /// see {ERC20 - _transfer} /// requirements -- /// from or to should not be zero /// from or to should not be blacklisted function _transfer (address from, address to, uint256 amount) internal override { if(from == address(0)){ revert ZeroAddressNotAllowed(); } if(to == address(0)){ revert ZeroAddressNotAllowed(); } if(!isTradingEnabled){ if(!isExcludedFromFees[from] && !isExcludedFromFees[to]) { revert TradingIsNotEnabledYet(); } } if(amount == 0){ super._transfer(from, to, 0); return; } uint256 contractBalance = balanceOf(address(this)); bool canSwapped = contractBalance >= swapTokensAtAmount; if(canSwapped && !isAutomatedMarketMaker[from] && !inSwap && !isExcludedFromFees[from] && !isExcludedFromFees[to]){ if(contractBalance > swapTokensAtAmount * 20){ contractBalance = swapTokensAtAmount * 20; } swapTokensForEth(contractBalance); sendToMarketingAndDividends(); } if( isAutomatedMarketMaker[to] && lpBurnEnabled && block.timestamp >= lastLpBurnTime + lpBurnFrequency && !isExcludedFromFees[from]){ autoBurnLiquidityPairTokens(); } bool takeFee = true; if(isExcludedFromFees[from] || isExcludedFromFees[to]){ takeFee = false; } uint256 fees = 0; if(takeFee){ uint256 buyFee = buyFeeReflection + buyFeeMarketing; if(isAutomatedMarketMaker[from] && buyFee > 0){ fees = (amount * buyFee) / 100; } uint256 sellFee = sellFeeReflection + sellFeeMarketing; if(isAutomatedMarketMaker[to] && sellFee > 0){ fees = (amount * sellFee) / 100; } if(fees > 0){ super._transfer(from, address(this), fees); } amount = amount - fees; } super._transfer(from, to, amount); /// set shares as per user balance try ethDividendTracker.setBalance(payable(from), balanceOf(from)) {} catch {} try ethDividendTracker.setBalance(payable(to), balanceOf(to)) {} catch {} /// check if dividend tracker has rewards uint256 rewardsAvailable = address(ethDividendTracker).balance; /// if automation is enabeld and rewards are available /// proceeds to distribute rewards automatically if(isAutomationEnabled && rewardsAvailable > 0) { ethDividendTracker.process(gasForProcessing); } } /// @notice burn tokens from pair as per given settings and sync the pair function autoBurnLiquidityPairTokens() internal returns (bool){ lastLpBurnTime = block.timestamp; uint256 liquidityPairBalance = balanceOf(uniswapV2Pair); uint256 amountToBurn = (liquidityPairBalance * burnPercentage) / 10000; if (amountToBurn > 0){ super._transfer(uniswapV2Pair, address(0xdead), amountToBurn); } IUniswapV2Pair pair = IUniswapV2Pair(uniswapV2Pair); pair.sync(); emit AutoNukeLP(); return true; } /// @notice manages tokens conversion to eth /// @param tokenAmount: tokens to be converted to eth function swapTokensForEth(uint256 tokenAmount) private lockTheSwap { // generate the uniswap pair path of token -> weth address[] memory path = new address[](2); path[0] = address(this); path[1] = uniswapV2Router.WETH(); if(allowance(address(this), address(uniswapV2Router)) < tokenAmount){ _approve(address(this), address(uniswapV2Router), type(uint256).max); } // make the swap uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens( tokenAmount, 0, // accept any amount of ETH path, address(this), block.timestamp ); } ///@notice send the received ether to marketing and eth dividend tracker function sendToMarketingAndDividends() private { uint256 buyFees = buyFeeMarketing + buyFeeReflection; uint256 sellFees = sellFeeMarketing + sellFeeReflection; uint256 marketingFees = buyFeeMarketing + sellFeeMarketing; uint256 ethBalance = address(this).balance; if(buyFees + sellFees > 0){ uint256 marketingPart = (ethBalance * marketingFees) / (buyFees + sellFees); bool success; if( marketingPart > 0){ (success,) = payable(marketingWallet).call{value: marketingPart}(""); } if(address(this).balance > 0){ ethDividendTracker.distributeDividends{value: address(this).balance}(); } } } /// @notice Returns total eth distributed to users till date function getTotalDividendsDistributed() external view returns (uint256) { return ethDividendTracker.totalDividendsDistributed(); } /// @notice returns the pending reward for user function withdrawableDividendOf(address account) public view returns (uint256) { return ethDividendTracker.withdrawableDividendOf(account); } /// @notice return user information, how much reward he claimed, availableToClaim, lastClaimTime. /// @param user: user address function getUserInfo(address user) external view returns (uint256 totalClaimed, uint256 availableToClaim, uint256 lastClaimTime){ (,,,availableToClaim, totalClaimed, lastClaimTime, ,) = ethDividendTracker.getAccount(user); } } //// @dev see {DividendPayingToken} contract DividendTracker is Ownable, DividendPayingToken { 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 immutable 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() { claimWait = 3600; minimumTokenBalanceForDividends = 1000000 * 1e18; //must hold 1000000+ tokens } function _transfer( address, address, uint256 ) internal pure override { require(false); } function withdrawDividend() public pure override { require(false); } 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, "eth_Dividend_Tracker: claimWait must be updated to between 1 and 24 hours" ); 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"},{"inputs":[],"name":"AmountTooHigh","type":"error"},{"inputs":[],"name":"BuyFeesLimitExceeds","type":"error"},{"inputs":[],"name":"CannotBlacklistLPPair","type":"error"},{"inputs":[],"name":"CannotClaimNativeToken","type":"error"},{"inputs":[],"name":"CannotRemoveMainPair","type":"error"},{"inputs":[],"name":"LpBurnFrequencyIsTooHigh","type":"error"},{"inputs":[],"name":"MaxAmountMustBeGreaterThanOnePercent","type":"error"},{"inputs":[],"name":"MustBeWithinRange","type":"error"},{"inputs":[],"name":"SellFeesLimitExceeds","type":"error"},{"inputs":[],"name":"TradingIsAlreadyLive","type":"error"},{"inputs":[],"name":"TradingIsNotEnabledYet","type":"error"},{"inputs":[],"name":"UpdateBoolValue","type":"error"},{"inputs":[],"name":"ZeroAddressNotAllowed","type":"error"},{"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":[],"name":"AutoNukeLP","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"rFee","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"mFee","type":"uint256"}],"name":"BuyFeesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokens","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"eth","type":"uint256"}],"name":"FeesSwapped","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":"ethAmount","type":"uint256"}],"name":"RewardsInjected","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"rFee","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"mFee","type":"uint256"}],"name":"SellFeesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"swapTokensAtAmountUpdated","type":"event"},{"inputs":[],"name":"MAX_FEE_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyFeeMarketing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyFeeReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimEthReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"claimOtherERC20","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":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ethDividendTracker","outputs":[{"internalType":"contract DividendTracker","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":"user","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gasForProcessing","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":"user","type":"address"}],"name":"getUserInfo","outputs":[{"internalType":"uint256","name":"totalClaimed","type":"uint256"},{"internalType":"uint256","name":"availableToClaim","type":"uint256"},{"internalType":"uint256","name":"lastClaimTime","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":"","type":"address"}],"name":"isAutomatedMarketMaker","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isAutomationEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isTradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastLpBurnTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpBurnEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpBurnFrequency","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newPair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"manageLiquidityPairs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellFeeMarketing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellFeeReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"frequencyInSeconds","type":"uint256"},{"internalType":"uint256","name":"percent","type":"uint256"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setAutoLPBurnSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomaticDistribution","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"reflection","type":"uint256"},{"internalType":"uint256","name":"marketing","type":"uint256"}],"name":"setBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"setGasForProcessing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"setMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"reflection","type":"uint256"},{"internalType":"uint256","name":"marketing","type":"uint256"}],"name":"setSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setSwapTokensAtAmount","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":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","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":"address","name":"account","type":"address"}],"name":"withdrawableDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60a06040526c0c9f2c9cd04674edea40000000600655612710600260065462000029919062000b8a565b62000035919062000c01565b600755620493e06008555f60095f6101000a81548160ff0219169083151502179055506001600960016101000a81548160ff0219169083151502179055506001600960026101000a81548160ff0219169083151502179055506019600a55615460600b55348015620000a5575f80fd5b506040518060400160405280601481526020017f4e6f742046696e616e6369616c204164766963650000000000000000000000008152506040518060400160405280600381526020017f4e46410000000000000000000000000000000000000000000000000000000000815250816003908162000123919062000e93565b50806004908162000135919062000e93565b505050620001586200014c620008e560201b60201c565b620008ec60201b60201c565b604051620001669062000b46565b604051809103905ff08015801562000180573d5f803e3d5ffd5b5060115f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505060805173ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000254573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200027a919062000fdc565b73ffffffffffffffffffffffffffffffffffffffff1663c9c653963060805173ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620002e2573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000308919062000fdc565b6040518363ffffffff1660e01b8152600401620003279291906200101d565b6020604051808303815f875af115801562000344573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200036a919062000fdc565b60135f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160145f60135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600a600d81905550600a600e81905550600a600f81905550600a60108190555072d9783d385a499f330434596fdd1b39559dacb960125f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db060115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016200050f919062001048565b5f604051808303815f87803b15801562000527575f80fd5b505af11580156200053a573d5f803e3d5ffd5b5050505060115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0306040518263ffffffff1660e01b81526004016200059a919062001048565b5f604051808303815f87803b158015620005b2575f80fd5b505af1158015620005c5573d5f803e3d5ffd5b5050505060115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db062000616620009af60201b60201c565b6040518263ffffffff1660e01b815260040162000634919062001048565b5f604051808303815f87803b1580156200064c575f80fd5b505af11580156200065f573d5f803e3d5ffd5b5050505060115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db060135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401620006e0919062001048565b5f604051808303815f87803b158015620006f8575f80fd5b505af11580156200070b573d5f803e3d5ffd5b5050505060115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db061dead6040518263ffffffff1660e01b81526004016200076d919062001048565b5f604051808303815f87803b15801562000785575f80fd5b505af115801562000798573d5f803e3d5ffd5b50505050600160155f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160155f60125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160155f6200087c620009af60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550620008df33600654620009d760201b60201c565b62001147565b5f33905090565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000a48576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000a3f90620010c1565b60405180910390fd5b62000a5b5f838362000b3c60201b60201c565b8060025f82825462000a6e9190620010e1565b92505081905550805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000b1d91906200112c565b60405180910390a362000b385f838362000b4160201b60201c565b5050565b505050565b505050565b6128c9806200517083390190565b5f819050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f62000b968262000b54565b915062000ba38362000b54565b925082820262000bb38162000b54565b9150828204841483151762000bcd5762000bcc62000b5d565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f62000c0d8262000b54565b915062000c1a8362000b54565b92508262000c2d5762000c2c62000bd4565b5b828204905092915050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168062000cb457607f821691505b60208210810362000cca5762000cc962000c6f565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830262000d2e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000cf1565b62000d3a868362000cf1565b95508019841693508086168417925050509392505050565b5f819050919050565b5f62000d7b62000d7562000d6f8462000b54565b62000d52565b62000b54565b9050919050565b5f819050919050565b62000d968362000d5b565b62000dae62000da58262000d82565b84845462000cfd565b825550505050565b5f90565b62000dc462000db6565b62000dd181848462000d8b565b505050565b5b8181101562000df85762000dec5f8262000dba565b60018101905062000dd7565b5050565b601f82111562000e475762000e118162000cd0565b62000e1c8462000ce2565b8101602085101562000e2c578190505b62000e4462000e3b8562000ce2565b83018262000dd6565b50505b505050565b5f82821c905092915050565b5f62000e695f198460080262000e4c565b1980831691505092915050565b5f62000e83838362000e58565b9150826002028217905092915050565b62000e9e8262000c38565b67ffffffffffffffff81111562000eba5762000eb962000c42565b5b62000ec6825462000c9c565b62000ed382828562000dfc565b5f60209050601f83116001811462000f09575f841562000ef4578287015190505b62000f00858262000e76565b86555062000f6f565b601f19841662000f198662000cd0565b5f5b8281101562000f425784890151825560018201915060208501945060208101905062000f1b565b8683101562000f62578489015162000f5e601f89168262000e58565b8355505b6001600288020188555050505b505050505050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f62000fa68262000f7b565b9050919050565b62000fb88162000f9a565b811462000fc3575f80fd5b50565b5f8151905062000fd68162000fad565b92915050565b5f6020828403121562000ff45762000ff362000f77565b5b5f620010038482850162000fc6565b91505092915050565b620010178162000f9a565b82525050565b5f604082019050620010325f8301856200100c565b6200104160208301846200100c565b9392505050565b5f6020820190506200105d5f8301846200100c565b92915050565b5f82825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f2061646472657373005f82015250565b5f620010a9601f8362001063565b9150620010b68262001073565b602082019050919050565b5f6020820190508181035f830152620010da816200109b565b9050919050565b5f620010ed8262000b54565b9150620010fa8362000b54565b925082820190508082111562001115576200111462000b5d565b5b92915050565b620011268162000b54565b82525050565b5f602082019050620011415f8301846200111b565b92915050565b608051613ff46200117c5f395f8181610c2501528181612b0901528181612be901528181612c190152612c610152613ff45ff3fe6080604052600436106102b0575f3560e01c8063715018a611610174578063a4c82a00116100db578063c024666811610094578063e2f456051161006e578063e2f4560514610a93578063e48e0e9814610abd578063f01f20df14610ae7578063f2fde38b14610b11576102b7565b8063c024666814610a07578063c476549514610a2f578063dd62ed3e14610a57576102b7565b8063a4c82a00146108ed578063a8b9d24014610917578063a9059cbb14610953578063afa4f3b21461098f578063b2d8f208146109b7578063b384f764146109df576102b7565b806395d89b411161012d57806395d89b41146107f55780639c1b8af51461081f5780639edc5f0f146108495780639fd8234e14610873578063a0a0c4651461089b578063a457c2d7146108b1576102b7565b8063715018a614610711578063730c18881461072757806375f0a8741461074f57806384288417146107795780638a8c523c146107b55780638da5cb5b146107cb576102b7565b806331e79db0116102185780634fbee193116101d15780634fbee193146105e15780635594fed01461061d5780635960e46d146106475780635d098b381461066f5780636386c1c71461069757806370a08231146106d5576102b7565b806331e79db0146104d757806339509351146104ff578063457e328c1461053b57806349bd5a5e146105655780634aa49f201461058f5780634eed4bd5146105b9576102b7565b806323b872dd1161026a57806323b872dd146103c95780632c3e486c146104055780632e82f1a01461042f57806330bb4cff1461045957806330c93ffa14610483578063313ce567146104ad576102b7565b80626b4a4d146102bb578063064a59d0146102e557806306fdde031461030f578063095ea7b3146103395780631694505e1461037557806318160ddd1461039f576102b7565b366102b757005b5f80fd5b3480156102c6575f80fd5b506102cf610b39565b6040516102dc9190613067565b60405180910390f35b3480156102f0575f80fd5b506102f9610b5e565b604051610306919061309a565b60405180910390f35b34801561031a575f80fd5b50610323610b71565b604051610330919061313d565b60405180910390f35b348015610344575f80fd5b5061035f600480360381019061035a91906131cf565b610c01565b60405161036c919061309a565b60405180910390f35b348015610380575f80fd5b50610389610c23565b604051610396919061323e565b60405180910390f35b3480156103aa575f80fd5b506103b3610c47565b6040516103c09190613266565b60405180910390f35b3480156103d4575f80fd5b506103ef60048036038101906103ea919061327f565b610c50565b6040516103fc919061309a565b60405180910390f35b348015610410575f80fd5b50610419610c7e565b6040516104269190613266565b60405180910390f35b34801561043a575f80fd5b50610443610c84565b604051610450919061309a565b60405180910390f35b348015610464575f80fd5b5061046d610c97565b60405161047a9190613266565b60405180910390f35b34801561048e575f80fd5b50610497610d2b565b6040516104a49190613266565b60405180910390f35b3480156104b8575f80fd5b506104c1610d31565b6040516104ce91906132ea565b60405180910390f35b3480156104e2575f80fd5b506104fd60048036038101906104f89190613303565b610d39565b005b34801561050a575f80fd5b50610525600480360381019061052091906131cf565b610dcb565b604051610532919061309a565b60405180910390f35b348015610546575f80fd5b5061054f610e01565b60405161055c9190613266565b60405180910390f35b348015610570575f80fd5b50610579610e07565b604051610586919061333d565b60405180910390f35b34801561059a575f80fd5b506105a3610e2c565b6040516105b09190613266565b60405180910390f35b3480156105c4575f80fd5b506105df60048036038101906105da91906131cf565b610e32565b005b3480156105ec575f80fd5b5061060760048036038101906106029190613303565b610f2b565b604051610614919061309a565b60405180910390f35b348015610628575f80fd5b50610631610f48565b60405161063e9190613266565b60405180910390f35b348015610652575f80fd5b5061066d60048036038101906106689190613356565b610f4e565b005b34801561067a575f80fd5b5061069560048036038101906106909190613303565b610fab565b005b3480156106a2575f80fd5b506106bd60048036038101906106b89190613303565b61105b565b6040516106cc93929190613381565b60405180910390f35b3480156106e0575f80fd5b506106fb60048036038101906106f69190613303565b611123565b6040516107089190613266565b60405180910390f35b34801561071c575f80fd5b50610725611168565b005b348015610732575f80fd5b5061074d600480360381019061074891906133e0565b61117b565b005b34801561075a575f80fd5b50610763611234565b604051610770919061333d565b60405180910390f35b348015610784575f80fd5b5061079f600480360381019061079a9190613303565b611259565b6040516107ac919061309a565b60405180910390f35b3480156107c0575f80fd5b506107c9611276565b005b3480156107d6575f80fd5b506107df6112e2565b6040516107ec919061333d565b60405180910390f35b348015610800575f80fd5b5061080961130a565b604051610816919061313d565b60405180910390f35b34801561082a575f80fd5b5061083361139a565b6040516108409190613266565b60405180910390f35b348015610854575f80fd5b5061085d6113a0565b60405161086a9190613266565b60405180910390f35b34801561087e575f80fd5b5061089960048036038101906108949190613430565b6113a5565b005b3480156108a6575f80fd5b506108af611433565b005b3480156108bc575f80fd5b506108d760048036038101906108d291906131cf565b6114d2565b6040516108e4919061309a565b60405180910390f35b3480156108f8575f80fd5b50610901611547565b60405161090e9190613266565b60405180910390f35b348015610922575f80fd5b5061093d60048036038101906109389190613303565b61154d565b60405161094a9190613266565b60405180910390f35b34801561095e575f80fd5b50610979600480360381019061097491906131cf565b6115ee565b604051610986919061309a565b60405180910390f35b34801561099a575f80fd5b506109b560048036038101906109b09190613356565b611610565b005b3480156109c2575f80fd5b506109dd60048036038101906109d89190613430565b61166a565b005b3480156109ea575f80fd5b50610a056004803603810190610a00919061346e565b6116f8565b005b348015610a12575f80fd5b50610a2d6004803603810190610a28919061346e565b611950565b005b348015610a3a575f80fd5b50610a556004803603810190610a5091906134ac565b611a9b565b005b348015610a62575f80fd5b50610a7d6004803603810190610a7891906134d7565b611b0c565b604051610a8a9190613266565b60405180910390f35b348015610a9e575f80fd5b50610aa7611b8e565b604051610ab49190613266565b60405180910390f35b348015610ac8575f80fd5b50610ad1611b94565b604051610ade919061309a565b60405180910390f35b348015610af2575f80fd5b50610afb611ba7565b604051610b089190613266565b60405180910390f35b348015610b1c575f80fd5b50610b376004803603810190610b329190613303565b611bad565b005b60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600960039054906101000a900460ff1681565b606060038054610b8090613542565b80601f0160208091040260200160405190810160405280929190818152602001828054610bac90613542565b8015610bf75780601f10610bce57610100808354040283529160200191610bf7565b820191905f5260205f20905b815481529060010190602001808311610bda57829003601f168201915b5050505050905090565b5f80610c0b611c2f565b9050610c18818585611c36565b600191505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f600254905090565b5f80610c5a611c2f565b9050610c67858285611df9565b610c72858585611e84565b60019150509392505050565b600b5481565b600960029054906101000a900460ff1681565b5f60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166385a6b3ae6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d02573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d269190613586565b905090565b600f5481565b5f6012905090565b610d416126a5565b60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0826040518263ffffffff1660e01b8152600401610d9b919061333d565b5f604051808303815f87803b158015610db2575f80fd5b505af1158015610dc4573d5f803e3d5ffd5b5050505050565b5f80610dd5611c2f565b9050610df6818585610de78589611b0c565b610df191906135de565b611c36565b600191505092915050565b600d5481565b60135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e5481565b610e3a6126a5565b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e9f576040517fe9cceb3600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8290508073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb610ec76112e2565b846040518363ffffffff1660e01b8152600401610ee5929190613611565b6020604051808303815f875af1158015610f01573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f25919061364c565b50505050565b6015602052805f5260405f205f915054906101000a900460ff1681565b60105481565b610f566126a5565b62030d4081108015610f6a57506207a12081115b15610fa1576040517f25e7e29300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060088190555050565b610fb36126a5565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611018576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060125f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f805f60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fbcbc0f1856040518263ffffffff1660e01b81526004016110b8919061333d565b61010060405180830381865afa1580156110d4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110f891906136be565b9091929394959650909192939495509091929394509050508093508195508294505050509193909250565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6111706126a5565b6111795f612723565b565b6111836126a5565b61025883116111be576040517f360c89ac00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e882101580156111d057505f8211155b15611207576040517f25e7e29300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82600b8190555081600a8190555080600960026101000a81548160ff021916908315150217905550505050565b60125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6014602052805f5260405f205f915054906101000a900460ff1681565b61127e6126a5565b600960039054906101000a900460ff16156112c5576040517fbd34ea0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600960036101000a81548160ff021916908315150217905550565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461131990613542565b80601f016020809104026020016040519081016040528092919081815260200182805461134590613542565b80156113905780601f1061136757610100808354040283529160200191611390565b820191905f5260205f20905b81548152906001019060200180831161137357829003601f168201915b5050505050905090565b60085481565b603281565b6113ad6126a5565b603281836113bb91906135de565b11156113f3576040517f53a712e300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600f819055508060108190555080827f2c7448b63380296b372453c5287509524b5b645dc6a93ffe09e0af53e6b8935b60405160405180910390a35050565b60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bc4c4b37335f6040518363ffffffff1660e01b815260040161148f92919061378f565b6020604051808303815f875af11580156114ab573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114cf919061364c565b50565b5f806114dc611c2f565b90505f6114e98286611b0c565b90508381101561152e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152590613826565b60405180910390fd5b61153b8286868403611c36565b60019250505092915050565b600c5481565b5f60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a8b9d240836040518263ffffffff1660e01b81526004016115a8919061333d565b602060405180830381865afa1580156115c3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115e79190613586565b9050919050565b5f806115f8611c2f565b9050611605818585611e84565b600191505092915050565b6116186126a5565b60646006546116279190613871565b811115611660576040517ffd7850ad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060078190555050565b6116726126a5565b6032818361168091906135de565b11156116b8576040517f83fcbf2a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600d8190555080600e8190555080827f480af1f773972b1df72af32ec463e0fdeb1b49f1ca37d07982f677919d5fdd0c60405160405180910390a35050565b6117006126a5565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611765576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036117eb576040517f02e4f4c400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80151560145f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16151503611871576040517fc7f2b1ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0836040518263ffffffff1660e01b81526004016118cb919061333d565b5f604051808303815f87803b1580156118e2575f80fd5b505af11580156118f4573d5f803e3d5ffd5b505050508060145f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b6119586126a5565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036119bd576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80151560155f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16151503611a43576040517fc7f2b1ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060155f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b611aa36126a5565b801515600960019054906101000a900460ff16151503611aef576040517fc7f2b1ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600960016101000a81548160ff02191690831515021790555050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b60075481565b600960019054906101000a900460ff1681565b600a5481565b611bb56126a5565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611c23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1a90613911565b60405180910390fd5b611c2c81612723565b50565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611ca4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9b9061399f565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0990613a2d565b60405180910390fd5b8060015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611dec9190613266565b60405180910390a3505050565b5f611e048484611b0c565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611e7e5781811015611e70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6790613a95565b60405180910390fd5b611e7d8484848403611c36565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611ee9576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f4e576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600960039054906101000a900460ff166120385760155f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16158015612000575060155f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15612037576040517fe80d52de00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5f810361204f5761204a83835f6127e6565b6126a0565b5f61205930611123565b90505f60075482101590508080156120b8575060145f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b80156120d0575060095f9054906101000a900460ff16155b8015612123575060155f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b8015612176575060155f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b156121b557601460075461218a9190613ab3565b8211156121a35760146007546121a09190613ab3565b91505b6121ac82612a52565b6121b4612d0a565b5b60145f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680156122175750600960029054906101000a900460ff165b80156122325750600b54600c5461222e91906135de565b4210155b8015612285575060155f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b1561229457612292612ea3565b505b5f6001905060155f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680612334575060155f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b1561233d575f90505b5f8115612479575f600e54600d5461235591906135de565b905060145f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680156123ac57505f81115b156123cc57606481876123bf9190613ab3565b6123c99190613871565b91505b5f601054600f546123dd91906135de565b905060145f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16801561243457505f81115b1561245457606481886124479190613ab3565b6124519190613871565b92505b5f831115612468576124678930856127e6565b5b82876124749190613af4565b965050505b6124848787876127e6565b60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e30443bc886124cb8a611123565b6040518363ffffffff1660e01b81526004016124e8929190613b27565b5f604051808303815f87803b1580156124ff575f80fd5b505af1925050508015612510575060015b5060115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e30443bc8761255889611123565b6040518363ffffffff1660e01b8152600401612575929190613b27565b5f604051808303815f87803b15801561258c575f80fd5b505af192505050801561259d575060015b505f60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16319050600960019054906101000a900460ff1680156125f557505f81115b1561269a5760115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ffb2c4796008546040518263ffffffff1660e01b81526004016126569190613266565b6060604051808303815f875af1158015612672573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126969190613b4e565b5050505b50505050505b505050565b6126ad611c2f565b73ffffffffffffffffffffffffffffffffffffffff166126cb6112e2565b73ffffffffffffffffffffffffffffffffffffffff1614612721576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271890613be8565b60405180910390fd5b565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612854576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284b90613c76565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036128c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b990613d04565b60405180910390fd5b6128cd838383612fe3565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015612950576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294790613d92565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550815f808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612a399190613266565b60405180910390a3612a4c848484612fe8565b50505050565b600160095f6101000a81548160ff0219169083151502179055505f600267ffffffffffffffff811115612a8857612a87613db0565b5b604051908082528060200260200182016040528015612ab65781602001602082028036833780820191505090505b50905030815f81518110612acd57612acc613ddd565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b70573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b949190613e0a565b81600181518110612ba857612ba7613ddd565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505081612c0d307f0000000000000000000000000000000000000000000000000000000000000000611b0c565b1015612c5f57612c5e307f00000000000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff611c36565b5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663791ac947835f8430426040518663ffffffff1660e01b8152600401612cc0959493929190613f25565b5f604051808303815f87803b158015612cd7575f80fd5b505af1158015612ce9573d5f803e3d5ffd5b50505050505f60095f6101000a81548160ff02191690831515021790555050565b5f600d54600e54612d1b91906135de565b90505f600f54601054612d2e91906135de565b90505f601054600e54612d4191906135de565b90505f4790505f8385612d5491906135de565b1115612e9d575f8385612d6791906135de565b8383612d739190613ab3565b612d7d9190613871565b90505f80821115612e135760125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051612dcd90613faa565b5f6040518083038185875af1925050503d805f8114612e07576040519150601f19603f3d011682016040523d82523d5f602084013e612e0c565b606091505b5050809150505b5f471115612e9a5760115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166303c83302476040518263ffffffff1660e01b81526004015f604051808303818588803b158015612e82575f80fd5b505af1158015612e94573d5f803e3d5ffd5b50505050505b50505b50505050565b5f42600c819055505f612ed660135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611123565b90505f612710600a5483612eea9190613ab3565b612ef49190613871565b90505f811115612f2d57612f2c60135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661dead836127e6565b5b5f60135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663fff6cae96040518163ffffffff1660e01b81526004015f604051808303815f87803b158015612f97575f80fd5b505af1158015612fa9573d5f803e3d5ffd5b505050507f454c91ae84fcc766ddda0dcb289f26b3d0176efeacf4061fc219fa6ca8c3048d60405160405180910390a16001935050505090565b505050565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f61302f61302a61302584612fed565b61300c565b612fed565b9050919050565b5f61304082613015565b9050919050565b5f61305182613036565b9050919050565b61306181613047565b82525050565b5f60208201905061307a5f830184613058565b92915050565b5f8115159050919050565b61309481613080565b82525050565b5f6020820190506130ad5f83018461308b565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156130ea5780820151818401526020810190506130cf565b5f8484015250505050565b5f601f19601f8301169050919050565b5f61310f826130b3565b61311981856130bd565b93506131298185602086016130cd565b613132816130f5565b840191505092915050565b5f6020820190508181035f8301526131558184613105565b905092915050565b5f80fd5b5f61316b82612fed565b9050919050565b61317b81613161565b8114613185575f80fd5b50565b5f8135905061319681613172565b92915050565b5f819050919050565b6131ae8161319c565b81146131b8575f80fd5b50565b5f813590506131c9816131a5565b92915050565b5f80604083850312156131e5576131e461315d565b5b5f6131f285828601613188565b9250506020613203858286016131bb565b9150509250929050565b5f61321782613015565b9050919050565b5f6132288261320d565b9050919050565b6132388161321e565b82525050565b5f6020820190506132515f83018461322f565b92915050565b6132608161319c565b82525050565b5f6020820190506132795f830184613257565b92915050565b5f805f606084860312156132965761329561315d565b5b5f6132a386828701613188565b93505060206132b486828701613188565b92505060406132c5868287016131bb565b9150509250925092565b5f60ff82169050919050565b6132e4816132cf565b82525050565b5f6020820190506132fd5f8301846132db565b92915050565b5f602082840312156133185761331761315d565b5b5f61332584828501613188565b91505092915050565b61333781613161565b82525050565b5f6020820190506133505f83018461332e565b92915050565b5f6020828403121561336b5761336a61315d565b5b5f613378848285016131bb565b91505092915050565b5f6060820190506133945f830186613257565b6133a16020830185613257565b6133ae6040830184613257565b949350505050565b6133bf81613080565b81146133c9575f80fd5b50565b5f813590506133da816133b6565b92915050565b5f805f606084860312156133f7576133f661315d565b5b5f613404868287016131bb565b9350506020613415868287016131bb565b9250506040613426868287016133cc565b9150509250925092565b5f80604083850312156134465761344561315d565b5b5f613453858286016131bb565b9250506020613464858286016131bb565b9150509250929050565b5f80604083850312156134845761348361315d565b5b5f61349185828601613188565b92505060206134a2858286016133cc565b9150509250929050565b5f602082840312156134c1576134c061315d565b5b5f6134ce848285016133cc565b91505092915050565b5f80604083850312156134ed576134ec61315d565b5b5f6134fa85828601613188565b925050602061350b85828601613188565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061355957607f821691505b60208210810361356c5761356b613515565b5b50919050565b5f81519050613580816131a5565b92915050565b5f6020828403121561359b5761359a61315d565b5b5f6135a884828501613572565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6135e88261319c565b91506135f38361319c565b925082820190508082111561360b5761360a6135b1565b5b92915050565b5f6040820190506136245f83018561332e565b6136316020830184613257565b9392505050565b5f81519050613646816133b6565b92915050565b5f602082840312156136615761366061315d565b5b5f61366e84828501613638565b91505092915050565b5f8151905061368581613172565b92915050565b5f819050919050565b61369d8161368b565b81146136a7575f80fd5b50565b5f815190506136b881613694565b92915050565b5f805f805f805f80610100898b0312156136db576136da61315d565b5b5f6136e88b828c01613677565b98505060206136f98b828c016136aa565b975050604061370a8b828c016136aa565b965050606061371b8b828c01613572565b955050608061372c8b828c01613572565b94505060a061373d8b828c01613572565b93505060c061374e8b828c01613572565b92505060e061375f8b828c01613572565b9150509295985092959890939650565b5f61377982612fed565b9050919050565b6137898161376f565b82525050565b5f6040820190506137a25f830185613780565b6137af602083018461308b565b9392505050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f775f8201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b5f6138106025836130bd565b915061381b826137b6565b604082019050919050565b5f6020820190508181035f83015261383d81613804565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61387b8261319c565b91506138868361319c565b92508261389657613895613844565b5b828204905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f6138fb6026836130bd565b9150613906826138a1565b604082019050919050565b5f6020820190508181035f830152613928816138ef565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f6139896024836130bd565b91506139948261392f565b604082019050919050565b5f6020820190508181035f8301526139b68161397d565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f613a176022836130bd565b9150613a22826139bd565b604082019050919050565b5f6020820190508181035f830152613a4481613a0b565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000005f82015250565b5f613a7f601d836130bd565b9150613a8a82613a4b565b602082019050919050565b5f6020820190508181035f830152613aac81613a73565b9050919050565b5f613abd8261319c565b9150613ac88361319c565b9250828202613ad68161319c565b91508282048414831517613aed57613aec6135b1565b5b5092915050565b5f613afe8261319c565b9150613b098361319c565b9250828203905081811115613b2157613b206135b1565b5b92915050565b5f604082019050613b3a5f830185613780565b613b476020830184613257565b9392505050565b5f805f60608486031215613b6557613b6461315d565b5b5f613b7286828701613572565b9350506020613b8386828701613572565b9250506040613b9486828701613572565b9150509250925092565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f613bd26020836130bd565b9150613bdd82613b9e565b602082019050919050565b5f6020820190508181035f830152613bff81613bc6565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f613c606025836130bd565b9150613c6b82613c06565b604082019050919050565b5f6020820190508181035f830152613c8d81613c54565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f613cee6023836130bd565b9150613cf982613c94565b604082019050919050565b5f6020820190508181035f830152613d1b81613ce2565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f613d7c6026836130bd565b9150613d8782613d22565b604082019050919050565b5f6020820190508181035f830152613da981613d70565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f60208284031215613e1f57613e1e61315d565b5b5f613e2c84828501613677565b91505092915050565b5f819050919050565b5f613e58613e53613e4e84613e35565b61300c565b61319c565b9050919050565b613e6881613e3e565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b613ea081613161565b82525050565b5f613eb18383613e97565b60208301905092915050565b5f602082019050919050565b5f613ed382613e6e565b613edd8185613e78565b9350613ee883613e88565b805f5b83811015613f18578151613eff8882613ea6565b9750613f0a83613ebd565b925050600181019050613eeb565b5085935050505092915050565b5f60a082019050613f385f830188613257565b613f456020830187613e5f565b8181036040830152613f578186613ec9565b9050613f66606083018561332e565b613f736080830184613257565b9695505050505050565b5f81905092915050565b50565b5f613f955f83613f7d565b9150613fa082613f87565b5f82019050919050565b5f613fb482613f8a565b915081905091905056fea2646970667358221220ef37b4ac76de266a77319253bb287877d0f4dfe73b2b6d0d13419263bec7dcb064736f6c6343000815003360a060405234801562000010575f80fd5b5062000031620000256200005260201b60201c565b6200005960201b60201c565b610e10600f8190555069d3c21bcecceda1000000608081815250506200011a565b5f33905090565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60805161278f6200013a5f395f8181610b210152610b9b015261278f5ff3fe60806040526004361061014e575f3560e01c80638da5cb5b116100b5578063e30443bc1161006e578063e30443bc146104a2578063e7841ec0146104ca578063e98030c7146104f4578063f2fde38b1461051c578063fbcbc0f114610544578063ffb2c479146105875761015d565b80638da5cb5b1461035e57806391b89fba14610388578063a8b9d240146103c4578063aafd847a14610400578063bc4c4b371461043c578063be10b614146104785761015d565b80634e7b827f116101075780634e7b827f1461025f5780635183d6fd1461029b5780636a474002146102de5780636f2789ec146102f4578063715018a61461031e57806385a6b3ae146103345761015d565b806303c833021461016157806309bbedde1461016b578063226cfa3d1461019557806327ce0147146101d15780633009a6091461020d57806331e79db0146102375761015d565b3661015d5761015b6105c5565b005b5f80fd5b6101696105c5565b005b348015610176575f80fd5b5061017f610691565b60405161018c9190611e8b565b60405180910390f35b3480156101a0575f80fd5b506101bb60048036038101906101b69190611f02565b61069f565b6040516101c89190611e8b565b60405180910390f35b3480156101dc575f80fd5b506101f760048036038101906101f29190611f02565b6106b4565b6040516102049190611e8b565b60405180910390f35b348015610218575f80fd5b50610221610789565b60405161022e9190611e8b565b60405180910390f35b348015610242575f80fd5b5061025d60048036038101906102589190611f02565b61078f565b005b34801561026a575f80fd5b5061028560048036038101906102809190611f02565b6108a3565b6040516102929190611f47565b60405180910390f35b3480156102a6575f80fd5b506102c160048036038101906102bc9190611f8a565b6108c0565b6040516102d5989796959493929190611fdc565b60405180910390f35b3480156102e9575f80fd5b506102f2610952565b005b3480156102ff575f80fd5b5061030861095d565b6040516103159190611e8b565b60405180910390f35b348015610329575f80fd5b50610332610963565b005b34801561033f575f80fd5b50610348610976565b6040516103559190611e8b565b60405180910390f35b348015610369575f80fd5b5061037261097c565b60405161037f9190612058565b60405180910390f35b348015610393575f80fd5b506103ae60048036038101906103a99190611f02565b6109a3565b6040516103bb9190611e8b565b60405180910390f35b3480156103cf575f80fd5b506103ea60048036038101906103e59190611f02565b6109b4565b6040516103f79190611e8b565b60405180910390f35b34801561040b575f80fd5b5061042660048036038101906104219190611f02565b610a14565b6040516104339190611e8b565b60405180910390f35b348015610447575f80fd5b50610462600480360381019061045d91906120d6565b610a5a565b60405161046f9190611f47565b60405180910390f35b348015610483575f80fd5b5061048c610b1f565b6040516104999190611e8b565b60405180910390f35b3480156104ad575f80fd5b506104c860048036038101906104c39190612114565b610b43565b005b3480156104d5575f80fd5b506104de610c15565b6040516104eb9190611e8b565b60405180910390f35b3480156104ff575f80fd5b5061051a60048036038101906105159190611f8a565b610c1e565b005b348015610527575f80fd5b50610542600480360381019061053d9190611f02565b610cb4565b005b34801561054f575f80fd5b5061056a60048036038101906105659190611f02565b610d36565b60405161057e989796959493929190611fdc565b60405180910390f35b348015610592575f80fd5b506105ad60048036038101906105a89190611f8a565b610e9e565b6040516105bc93929190612152565b60405180910390f35b5f600454116105d2575f80fd5b5f34111561068f5761061f6004546106047001000000000000000000000000000000003461101d90919063ffffffff16565b61060e91906121e1565b60015461103290919063ffffffff16565b6001819055503373ffffffffffffffffffffffffffffffffffffffff167fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165113460405161066b9190611e8b565b60405180910390a26106883460075461103290919063ffffffff16565b6007819055505b565b5f60085f0180549050905090565b600e602052805f5260405f205f915090505481565b5f70010000000000000000000000000000000061077861077360055f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461076561076060025f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205460015461101d90919063ffffffff16565b611047565b61106190919063ffffffff16565b6110a8565b61078291906121e1565b9050919050565b600c5481565b6107976110bd565b600d5f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16156107ea575f80fd5b6001600d5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550610849815f61113b565b61085d8160086111da90919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b2560405160405180910390a250565b600d602052805f5260405f205f915054906101000a900460ff1681565b5f805f805f805f806108d26008611482565b8910610915575f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff805f805f805f97509750975097509750975097509750610947565b5f61092a8a600861149190919063ffffffff16565b905061093581610d36565b98509850985098509850985098509850505b919395975091939597565b5f61095b575f80fd5b565b600f5481565b61096b6110bd565b6109745f6114d7565b565b60075481565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f6109ad826109b4565b9050919050565b5f610a0d60065f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546109ff846106b4565b61159890919063ffffffff16565b9050919050565b5f60065f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b5f610a636110bd565b5f610a6d846115ad565b90505f811115610b145742600e5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508215158473ffffffffffffffffffffffffffffffffffffffff167fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf09283604051610b029190611e8b565b60405180910390a36001915050610b19565b5f9150505b92915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b610b4b6110bd565b600d5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16610c11577f00000000000000000000000000000000000000000000000000000000000000008110610be557610bca828261113b565b610be0828260086117c29092919063ffffffff16565b610c04565b610bef825f61113b565b610c038260086111da90919063ffffffff16565b5b610c0f826001610a5a565b505b5050565b5f600c54905090565b610c266110bd565b610e108110158015610c3b5750620151808111155b610c7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c71906122b7565b60405180910390fd5b600f54817f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f60405160405180910390a380600f8190555050565b610cbc6110bd565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610d2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2190612345565b60405180910390fd5b610d33816114d7565b50565b5f805f805f805f80889750610d558860086119a890919063ffffffff16565b96507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff95505f8712610df557600c54871115610da757610da0600c5488611a6a90919063ffffffff16565b9550610df4565b5f600c5460085f018054905011610dbe575f610ddb565b610dda600c5460085f018054905061159890919063ffffffff16565b5b9050610df0818961106190919063ffffffff16565b9650505b5b610dfe886109b4565b9450610e09886106b4565b9350600e5f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205492505f8311610e58575f610e6e565b610e6d600f548461103290919063ffffffff16565b5b9150428211610e7d575f610e91565b610e90428361159890919063ffffffff16565b5b9050919395975091939597565b5f805f8060085f018054905090505f8103610ec4575f80600c5493509350935050611016565b5f600c5490505f805a90505f805b8984108015610ee057508582105b15610ffd578480610ef090612363565b95505060085f01805490508510610f05575f94505b5f60085f018681548110610f1c57610f1b6123aa565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050610f8c600e5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054611ab1565b15610fb157610f9c816001610a5a565b15610fb0578180610fac90612363565b9250505b5b8280610fbc90612363565b9350505f5a905080851115610ff357610ff0610fe1828761159890919063ffffffff16565b8761103290919063ffffffff16565b95505b8094505050610ed2565b84600c819055508181600c549850985098505050505050505b9193909250565b5f818361102a91906123d7565b905092915050565b5f818361103f9190612418565b905092915050565b5f808290505f811215611058575f80fd5b80915050919050565b5f80828461106f919061244b565b90505f83121580156110815750838112155b8061109657505f8312801561109557508381125b5b61109e575f80fd5b8091505092915050565b5f808212156110b5575f80fd5b819050919050565b6110c5611ae2565b73ffffffffffffffffffffffffffffffffffffffff166110e361097c565b73ffffffffffffffffffffffffffffffffffffffff1614611139576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611130906124d6565b60405180910390fd5b565b5f60025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050808211156111aa575f611198828461159890919063ffffffff16565b90506111a48482611ae9565b506111d5565b808210156111d4575f6111c6838361159890919063ffffffff16565b90506111d28482611c73565b505b5b505050565b816003015f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161561147e57816003015f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81549060ff0219169055816001015f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f90555f826002015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f6001845f018054905061131291906124f4565b90505f845f01828154811061132a576113296123aa565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905082856002015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550846002015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f905580855f0184815481106113f0576113ef6123aa565b5b905f5260205f20015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550845f0180548061144857611447612527565b5b600190038181905f5260205f20015f6101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590555050505b5050565b5f815f01805490509050919050565b5f825f0182815481106114a7576114a66123aa565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905092915050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f81836115a591906124f4565b905092915050565b5f806115b8836109b4565b90505f8111156117b8576116128160065f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461103290919063ffffffff16565b60065f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff167fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d826040516116999190611e8b565b60405180910390a25f8373ffffffffffffffffffffffffffffffffffffffff1682610bb8906040516116ca90612581565b5f60405180830381858888f193505050503d805f8114611705576040519150601f19603f3d011682016040523d82523d5f602084013e61170a565b606091505b50509050806117ae576117638260065f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461159890919063ffffffff16565b60065f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505f925050506117bd565b81925050506117bd565b5f9150505b919050565b826003015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161561185c5780836001015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506119a3565b6001836003015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555080836001015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550825f0180549050836002015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550825f0182908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b505050565b5f826003015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16611a21577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9050611a64565b826002015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505b92915050565b5f808284611a789190612595565b90505f8312158015611a8a5750838113155b80611a9f57505f83128015611a9e57508381135b5b611aa7575f80fd5b8091505092915050565b5f42821115611ac2575f9050611add565b600f54611ad8834261159890919063ffffffff16565b101590505b919050565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611b57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4e9061261f565b60405180910390fd5b8060045f828254611b689190612418565b925050819055508060025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611bbb9190612418565b92505081905550611c2e611be2611bdd8360015461101d90919063ffffffff16565b611047565b60055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054611a6a90919063ffffffff16565b60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ce1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd8906126ad565b60405180910390fd5b5f60025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015611d65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5c9061273b565b60405180910390fd5b81810360025f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508160045f828254611dba91906124f4565b92505081905550611e2d611de1611ddc8460015461101d90919063ffffffff16565b611047565b60055f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461106190919063ffffffff16565b60055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505050565b5f819050919050565b611e8581611e73565b82525050565b5f602082019050611e9e5f830184611e7c565b92915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611ed182611ea8565b9050919050565b611ee181611ec7565b8114611eeb575f80fd5b50565b5f81359050611efc81611ed8565b92915050565b5f60208284031215611f1757611f16611ea4565b5b5f611f2484828501611eee565b91505092915050565b5f8115159050919050565b611f4181611f2d565b82525050565b5f602082019050611f5a5f830184611f38565b92915050565b611f6981611e73565b8114611f73575f80fd5b50565b5f81359050611f8481611f60565b92915050565b5f60208284031215611f9f57611f9e611ea4565b5b5f611fac84828501611f76565b91505092915050565b611fbe81611ec7565b82525050565b5f819050919050565b611fd681611fc4565b82525050565b5f61010082019050611ff05f83018b611fb5565b611ffd602083018a611fcd565b61200a6040830189611fcd565b6120176060830188611e7c565b6120246080830187611e7c565b61203160a0830186611e7c565b61203e60c0830185611e7c565b61204b60e0830184611e7c565b9998505050505050505050565b5f60208201905061206b5f830184611fb5565b92915050565b5f61207b82611ea8565b9050919050565b61208b81612071565b8114612095575f80fd5b50565b5f813590506120a681612082565b92915050565b6120b581611f2d565b81146120bf575f80fd5b50565b5f813590506120d0816120ac565b92915050565b5f80604083850312156120ec576120eb611ea4565b5b5f6120f985828601612098565b925050602061210a858286016120c2565b9150509250929050565b5f806040838503121561212a57612129611ea4565b5b5f61213785828601612098565b925050602061214885828601611f76565b9150509250929050565b5f6060820190506121655f830186611e7c565b6121726020830185611e7c565b61217f6040830184611e7c565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6121eb82611e73565b91506121f683611e73565b92508261220657612205612187565b5b828204905092915050565b5f82825260208201905092915050565b7f6574685f4469766964656e645f547261636b65723a20636c61696d57616974205f8201527f6d757374206265207570646174656420746f206265747765656e203120616e6460208201527f20323420686f7572730000000000000000000000000000000000000000000000604082015250565b5f6122a1604983612211565b91506122ac82612221565b606082019050919050565b5f6020820190508181035f8301526122ce81612295565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f61232f602683612211565b915061233a826122d5565b604082019050919050565b5f6020820190508181035f83015261235c81612323565b9050919050565b5f61236d82611e73565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361239f5761239e6121b4565b5b600182019050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6123e182611e73565b91506123ec83611e73565b92508282026123fa81611e73565b91508282048414831517612411576124106121b4565b5b5092915050565b5f61242282611e73565b915061242d83611e73565b9250828201905080821115612445576124446121b4565b5b92915050565b5f61245582611fc4565b915061246083611fc4565b92508282019050828112155f8312168382125f841215161715612486576124856121b4565b5b92915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f6124c0602083612211565b91506124cb8261248c565b602082019050919050565b5f6020820190508181035f8301526124ed816124b4565b9050919050565b5f6124fe82611e73565b915061250983611e73565b9250828203905081811115612521576125206121b4565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b5f81905092915050565b50565b5f61256c5f83612554565b91506125778261255e565b5f82019050919050565b5f61258b82612561565b9150819050919050565b5f61259f82611fc4565b91506125aa83611fc4565b925082820390508181125f8412168282135f8512151617156125cf576125ce6121b4565b5b92915050565b7f45524332303a206d696e7420746f20746865207a65726f2061646472657373005f82015250565b5f612609601f83612211565b9150612614826125d5565b602082019050919050565b5f6020820190508181035f830152612636816125fd565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f206164647265735f8201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b5f612697602183612211565b91506126a28261263d565b604082019050919050565b5f6020820190508181035f8301526126c48161268b565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e5f8201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b5f612725602283612211565b9150612730826126cb565b604082019050919050565b5f6020820190508181035f83015261275281612719565b905091905056fea26469706673582212203cffecb4ee1a8d12ce55a0fcdf08b1855451869756b191a57682e6e7241d235764736f6c63430008150033
Deployed Bytecode
0x6080604052600436106102b0575f3560e01c8063715018a611610174578063a4c82a00116100db578063c024666811610094578063e2f456051161006e578063e2f4560514610a93578063e48e0e9814610abd578063f01f20df14610ae7578063f2fde38b14610b11576102b7565b8063c024666814610a07578063c476549514610a2f578063dd62ed3e14610a57576102b7565b8063a4c82a00146108ed578063a8b9d24014610917578063a9059cbb14610953578063afa4f3b21461098f578063b2d8f208146109b7578063b384f764146109df576102b7565b806395d89b411161012d57806395d89b41146107f55780639c1b8af51461081f5780639edc5f0f146108495780639fd8234e14610873578063a0a0c4651461089b578063a457c2d7146108b1576102b7565b8063715018a614610711578063730c18881461072757806375f0a8741461074f57806384288417146107795780638a8c523c146107b55780638da5cb5b146107cb576102b7565b806331e79db0116102185780634fbee193116101d15780634fbee193146105e15780635594fed01461061d5780635960e46d146106475780635d098b381461066f5780636386c1c71461069757806370a08231146106d5576102b7565b806331e79db0146104d757806339509351146104ff578063457e328c1461053b57806349bd5a5e146105655780634aa49f201461058f5780634eed4bd5146105b9576102b7565b806323b872dd1161026a57806323b872dd146103c95780632c3e486c146104055780632e82f1a01461042f57806330bb4cff1461045957806330c93ffa14610483578063313ce567146104ad576102b7565b80626b4a4d146102bb578063064a59d0146102e557806306fdde031461030f578063095ea7b3146103395780631694505e1461037557806318160ddd1461039f576102b7565b366102b757005b5f80fd5b3480156102c6575f80fd5b506102cf610b39565b6040516102dc9190613067565b60405180910390f35b3480156102f0575f80fd5b506102f9610b5e565b604051610306919061309a565b60405180910390f35b34801561031a575f80fd5b50610323610b71565b604051610330919061313d565b60405180910390f35b348015610344575f80fd5b5061035f600480360381019061035a91906131cf565b610c01565b60405161036c919061309a565b60405180910390f35b348015610380575f80fd5b50610389610c23565b604051610396919061323e565b60405180910390f35b3480156103aa575f80fd5b506103b3610c47565b6040516103c09190613266565b60405180910390f35b3480156103d4575f80fd5b506103ef60048036038101906103ea919061327f565b610c50565b6040516103fc919061309a565b60405180910390f35b348015610410575f80fd5b50610419610c7e565b6040516104269190613266565b60405180910390f35b34801561043a575f80fd5b50610443610c84565b604051610450919061309a565b60405180910390f35b348015610464575f80fd5b5061046d610c97565b60405161047a9190613266565b60405180910390f35b34801561048e575f80fd5b50610497610d2b565b6040516104a49190613266565b60405180910390f35b3480156104b8575f80fd5b506104c1610d31565b6040516104ce91906132ea565b60405180910390f35b3480156104e2575f80fd5b506104fd60048036038101906104f89190613303565b610d39565b005b34801561050a575f80fd5b50610525600480360381019061052091906131cf565b610dcb565b604051610532919061309a565b60405180910390f35b348015610546575f80fd5b5061054f610e01565b60405161055c9190613266565b60405180910390f35b348015610570575f80fd5b50610579610e07565b604051610586919061333d565b60405180910390f35b34801561059a575f80fd5b506105a3610e2c565b6040516105b09190613266565b60405180910390f35b3480156105c4575f80fd5b506105df60048036038101906105da91906131cf565b610e32565b005b3480156105ec575f80fd5b5061060760048036038101906106029190613303565b610f2b565b604051610614919061309a565b60405180910390f35b348015610628575f80fd5b50610631610f48565b60405161063e9190613266565b60405180910390f35b348015610652575f80fd5b5061066d60048036038101906106689190613356565b610f4e565b005b34801561067a575f80fd5b5061069560048036038101906106909190613303565b610fab565b005b3480156106a2575f80fd5b506106bd60048036038101906106b89190613303565b61105b565b6040516106cc93929190613381565b60405180910390f35b3480156106e0575f80fd5b506106fb60048036038101906106f69190613303565b611123565b6040516107089190613266565b60405180910390f35b34801561071c575f80fd5b50610725611168565b005b348015610732575f80fd5b5061074d600480360381019061074891906133e0565b61117b565b005b34801561075a575f80fd5b50610763611234565b604051610770919061333d565b60405180910390f35b348015610784575f80fd5b5061079f600480360381019061079a9190613303565b611259565b6040516107ac919061309a565b60405180910390f35b3480156107c0575f80fd5b506107c9611276565b005b3480156107d6575f80fd5b506107df6112e2565b6040516107ec919061333d565b60405180910390f35b348015610800575f80fd5b5061080961130a565b604051610816919061313d565b60405180910390f35b34801561082a575f80fd5b5061083361139a565b6040516108409190613266565b60405180910390f35b348015610854575f80fd5b5061085d6113a0565b60405161086a9190613266565b60405180910390f35b34801561087e575f80fd5b5061089960048036038101906108949190613430565b6113a5565b005b3480156108a6575f80fd5b506108af611433565b005b3480156108bc575f80fd5b506108d760048036038101906108d291906131cf565b6114d2565b6040516108e4919061309a565b60405180910390f35b3480156108f8575f80fd5b50610901611547565b60405161090e9190613266565b60405180910390f35b348015610922575f80fd5b5061093d60048036038101906109389190613303565b61154d565b60405161094a9190613266565b60405180910390f35b34801561095e575f80fd5b50610979600480360381019061097491906131cf565b6115ee565b604051610986919061309a565b60405180910390f35b34801561099a575f80fd5b506109b560048036038101906109b09190613356565b611610565b005b3480156109c2575f80fd5b506109dd60048036038101906109d89190613430565b61166a565b005b3480156109ea575f80fd5b50610a056004803603810190610a00919061346e565b6116f8565b005b348015610a12575f80fd5b50610a2d6004803603810190610a28919061346e565b611950565b005b348015610a3a575f80fd5b50610a556004803603810190610a5091906134ac565b611a9b565b005b348015610a62575f80fd5b50610a7d6004803603810190610a7891906134d7565b611b0c565b604051610a8a9190613266565b60405180910390f35b348015610a9e575f80fd5b50610aa7611b8e565b604051610ab49190613266565b60405180910390f35b348015610ac8575f80fd5b50610ad1611b94565b604051610ade919061309a565b60405180910390f35b348015610af2575f80fd5b50610afb611ba7565b604051610b089190613266565b60405180910390f35b348015610b1c575f80fd5b50610b376004803603810190610b329190613303565b611bad565b005b60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600960039054906101000a900460ff1681565b606060038054610b8090613542565b80601f0160208091040260200160405190810160405280929190818152602001828054610bac90613542565b8015610bf75780601f10610bce57610100808354040283529160200191610bf7565b820191905f5260205f20905b815481529060010190602001808311610bda57829003601f168201915b5050505050905090565b5f80610c0b611c2f565b9050610c18818585611c36565b600191505092915050565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b5f600254905090565b5f80610c5a611c2f565b9050610c67858285611df9565b610c72858585611e84565b60019150509392505050565b600b5481565b600960029054906101000a900460ff1681565b5f60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166385a6b3ae6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d02573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d269190613586565b905090565b600f5481565b5f6012905090565b610d416126a5565b60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0826040518263ffffffff1660e01b8152600401610d9b919061333d565b5f604051808303815f87803b158015610db2575f80fd5b505af1158015610dc4573d5f803e3d5ffd5b5050505050565b5f80610dd5611c2f565b9050610df6818585610de78589611b0c565b610df191906135de565b611c36565b600191505092915050565b600d5481565b60135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e5481565b610e3a6126a5565b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e9f576040517fe9cceb3600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8290508073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb610ec76112e2565b846040518363ffffffff1660e01b8152600401610ee5929190613611565b6020604051808303815f875af1158015610f01573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f25919061364c565b50505050565b6015602052805f5260405f205f915054906101000a900460ff1681565b60105481565b610f566126a5565b62030d4081108015610f6a57506207a12081115b15610fa1576040517f25e7e29300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060088190555050565b610fb36126a5565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611018576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060125f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f805f60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fbcbc0f1856040518263ffffffff1660e01b81526004016110b8919061333d565b61010060405180830381865afa1580156110d4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110f891906136be565b9091929394959650909192939495509091929394509050508093508195508294505050509193909250565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6111706126a5565b6111795f612723565b565b6111836126a5565b61025883116111be576040517f360c89ac00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e882101580156111d057505f8211155b15611207576040517f25e7e29300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82600b8190555081600a8190555080600960026101000a81548160ff021916908315150217905550505050565b60125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6014602052805f5260405f205f915054906101000a900460ff1681565b61127e6126a5565b600960039054906101000a900460ff16156112c5576040517fbd34ea0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600960036101000a81548160ff021916908315150217905550565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461131990613542565b80601f016020809104026020016040519081016040528092919081815260200182805461134590613542565b80156113905780601f1061136757610100808354040283529160200191611390565b820191905f5260205f20905b81548152906001019060200180831161137357829003601f168201915b5050505050905090565b60085481565b603281565b6113ad6126a5565b603281836113bb91906135de565b11156113f3576040517f53a712e300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600f819055508060108190555080827f2c7448b63380296b372453c5287509524b5b645dc6a93ffe09e0af53e6b8935b60405160405180910390a35050565b60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bc4c4b37335f6040518363ffffffff1660e01b815260040161148f92919061378f565b6020604051808303815f875af11580156114ab573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114cf919061364c565b50565b5f806114dc611c2f565b90505f6114e98286611b0c565b90508381101561152e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152590613826565b60405180910390fd5b61153b8286868403611c36565b60019250505092915050565b600c5481565b5f60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a8b9d240836040518263ffffffff1660e01b81526004016115a8919061333d565b602060405180830381865afa1580156115c3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115e79190613586565b9050919050565b5f806115f8611c2f565b9050611605818585611e84565b600191505092915050565b6116186126a5565b60646006546116279190613871565b811115611660576040517ffd7850ad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060078190555050565b6116726126a5565b6032818361168091906135de565b11156116b8576040517f83fcbf2a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600d8190555080600e8190555080827f480af1f773972b1df72af32ec463e0fdeb1b49f1ca37d07982f677919d5fdd0c60405160405180910390a35050565b6117006126a5565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611765576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036117eb576040517f02e4f4c400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80151560145f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16151503611871576040517fc7f2b1ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0836040518263ffffffff1660e01b81526004016118cb919061333d565b5f604051808303815f87803b1580156118e2575f80fd5b505af11580156118f4573d5f803e3d5ffd5b505050508060145f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b6119586126a5565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036119bd576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80151560155f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16151503611a43576040517fc7f2b1ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060155f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b611aa36126a5565b801515600960019054906101000a900460ff16151503611aef576040517fc7f2b1ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600960016101000a81548160ff02191690831515021790555050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b60075481565b600960019054906101000a900460ff1681565b600a5481565b611bb56126a5565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611c23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1a90613911565b60405180910390fd5b611c2c81612723565b50565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611ca4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9b9061399f565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0990613a2d565b60405180910390fd5b8060015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611dec9190613266565b60405180910390a3505050565b5f611e048484611b0c565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611e7e5781811015611e70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6790613a95565b60405180910390fd5b611e7d8484848403611c36565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611ee9576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f4e576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600960039054906101000a900460ff166120385760155f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16158015612000575060155f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15612037576040517fe80d52de00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5f810361204f5761204a83835f6127e6565b6126a0565b5f61205930611123565b90505f60075482101590508080156120b8575060145f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b80156120d0575060095f9054906101000a900460ff16155b8015612123575060155f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b8015612176575060155f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b156121b557601460075461218a9190613ab3565b8211156121a35760146007546121a09190613ab3565b91505b6121ac82612a52565b6121b4612d0a565b5b60145f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680156122175750600960029054906101000a900460ff165b80156122325750600b54600c5461222e91906135de565b4210155b8015612285575060155f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b1561229457612292612ea3565b505b5f6001905060155f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680612334575060155f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b1561233d575f90505b5f8115612479575f600e54600d5461235591906135de565b905060145f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680156123ac57505f81115b156123cc57606481876123bf9190613ab3565b6123c99190613871565b91505b5f601054600f546123dd91906135de565b905060145f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16801561243457505f81115b1561245457606481886124479190613ab3565b6124519190613871565b92505b5f831115612468576124678930856127e6565b5b82876124749190613af4565b965050505b6124848787876127e6565b60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e30443bc886124cb8a611123565b6040518363ffffffff1660e01b81526004016124e8929190613b27565b5f604051808303815f87803b1580156124ff575f80fd5b505af1925050508015612510575060015b5060115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e30443bc8761255889611123565b6040518363ffffffff1660e01b8152600401612575929190613b27565b5f604051808303815f87803b15801561258c575f80fd5b505af192505050801561259d575060015b505f60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16319050600960019054906101000a900460ff1680156125f557505f81115b1561269a5760115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ffb2c4796008546040518263ffffffff1660e01b81526004016126569190613266565b6060604051808303815f875af1158015612672573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126969190613b4e565b5050505b50505050505b505050565b6126ad611c2f565b73ffffffffffffffffffffffffffffffffffffffff166126cb6112e2565b73ffffffffffffffffffffffffffffffffffffffff1614612721576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271890613be8565b60405180910390fd5b565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612854576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284b90613c76565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036128c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b990613d04565b60405180910390fd5b6128cd838383612fe3565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015612950576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294790613d92565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550815f808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612a399190613266565b60405180910390a3612a4c848484612fe8565b50505050565b600160095f6101000a81548160ff0219169083151502179055505f600267ffffffffffffffff811115612a8857612a87613db0565b5b604051908082528060200260200182016040528015612ab65781602001602082028036833780820191505090505b50905030815f81518110612acd57612acc613ddd565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b70573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b949190613e0a565b81600181518110612ba857612ba7613ddd565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505081612c0d307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d611b0c565b1015612c5f57612c5e307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff611c36565b5b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac947835f8430426040518663ffffffff1660e01b8152600401612cc0959493929190613f25565b5f604051808303815f87803b158015612cd7575f80fd5b505af1158015612ce9573d5f803e3d5ffd5b50505050505f60095f6101000a81548160ff02191690831515021790555050565b5f600d54600e54612d1b91906135de565b90505f600f54601054612d2e91906135de565b90505f601054600e54612d4191906135de565b90505f4790505f8385612d5491906135de565b1115612e9d575f8385612d6791906135de565b8383612d739190613ab3565b612d7d9190613871565b90505f80821115612e135760125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051612dcd90613faa565b5f6040518083038185875af1925050503d805f8114612e07576040519150601f19603f3d011682016040523d82523d5f602084013e612e0c565b606091505b5050809150505b5f471115612e9a5760115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166303c83302476040518263ffffffff1660e01b81526004015f604051808303818588803b158015612e82575f80fd5b505af1158015612e94573d5f803e3d5ffd5b50505050505b50505b50505050565b5f42600c819055505f612ed660135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611123565b90505f612710600a5483612eea9190613ab3565b612ef49190613871565b90505f811115612f2d57612f2c60135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661dead836127e6565b5b5f60135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663fff6cae96040518163ffffffff1660e01b81526004015f604051808303815f87803b158015612f97575f80fd5b505af1158015612fa9573d5f803e3d5ffd5b505050507f454c91ae84fcc766ddda0dcb289f26b3d0176efeacf4061fc219fa6ca8c3048d60405160405180910390a16001935050505090565b505050565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f61302f61302a61302584612fed565b61300c565b612fed565b9050919050565b5f61304082613015565b9050919050565b5f61305182613036565b9050919050565b61306181613047565b82525050565b5f60208201905061307a5f830184613058565b92915050565b5f8115159050919050565b61309481613080565b82525050565b5f6020820190506130ad5f83018461308b565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156130ea5780820151818401526020810190506130cf565b5f8484015250505050565b5f601f19601f8301169050919050565b5f61310f826130b3565b61311981856130bd565b93506131298185602086016130cd565b613132816130f5565b840191505092915050565b5f6020820190508181035f8301526131558184613105565b905092915050565b5f80fd5b5f61316b82612fed565b9050919050565b61317b81613161565b8114613185575f80fd5b50565b5f8135905061319681613172565b92915050565b5f819050919050565b6131ae8161319c565b81146131b8575f80fd5b50565b5f813590506131c9816131a5565b92915050565b5f80604083850312156131e5576131e461315d565b5b5f6131f285828601613188565b9250506020613203858286016131bb565b9150509250929050565b5f61321782613015565b9050919050565b5f6132288261320d565b9050919050565b6132388161321e565b82525050565b5f6020820190506132515f83018461322f565b92915050565b6132608161319c565b82525050565b5f6020820190506132795f830184613257565b92915050565b5f805f606084860312156132965761329561315d565b5b5f6132a386828701613188565b93505060206132b486828701613188565b92505060406132c5868287016131bb565b9150509250925092565b5f60ff82169050919050565b6132e4816132cf565b82525050565b5f6020820190506132fd5f8301846132db565b92915050565b5f602082840312156133185761331761315d565b5b5f61332584828501613188565b91505092915050565b61333781613161565b82525050565b5f6020820190506133505f83018461332e565b92915050565b5f6020828403121561336b5761336a61315d565b5b5f613378848285016131bb565b91505092915050565b5f6060820190506133945f830186613257565b6133a16020830185613257565b6133ae6040830184613257565b949350505050565b6133bf81613080565b81146133c9575f80fd5b50565b5f813590506133da816133b6565b92915050565b5f805f606084860312156133f7576133f661315d565b5b5f613404868287016131bb565b9350506020613415868287016131bb565b9250506040613426868287016133cc565b9150509250925092565b5f80604083850312156134465761344561315d565b5b5f613453858286016131bb565b9250506020613464858286016131bb565b9150509250929050565b5f80604083850312156134845761348361315d565b5b5f61349185828601613188565b92505060206134a2858286016133cc565b9150509250929050565b5f602082840312156134c1576134c061315d565b5b5f6134ce848285016133cc565b91505092915050565b5f80604083850312156134ed576134ec61315d565b5b5f6134fa85828601613188565b925050602061350b85828601613188565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061355957607f821691505b60208210810361356c5761356b613515565b5b50919050565b5f81519050613580816131a5565b92915050565b5f6020828403121561359b5761359a61315d565b5b5f6135a884828501613572565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6135e88261319c565b91506135f38361319c565b925082820190508082111561360b5761360a6135b1565b5b92915050565b5f6040820190506136245f83018561332e565b6136316020830184613257565b9392505050565b5f81519050613646816133b6565b92915050565b5f602082840312156136615761366061315d565b5b5f61366e84828501613638565b91505092915050565b5f8151905061368581613172565b92915050565b5f819050919050565b61369d8161368b565b81146136a7575f80fd5b50565b5f815190506136b881613694565b92915050565b5f805f805f805f80610100898b0312156136db576136da61315d565b5b5f6136e88b828c01613677565b98505060206136f98b828c016136aa565b975050604061370a8b828c016136aa565b965050606061371b8b828c01613572565b955050608061372c8b828c01613572565b94505060a061373d8b828c01613572565b93505060c061374e8b828c01613572565b92505060e061375f8b828c01613572565b9150509295985092959890939650565b5f61377982612fed565b9050919050565b6137898161376f565b82525050565b5f6040820190506137a25f830185613780565b6137af602083018461308b565b9392505050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f775f8201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b5f6138106025836130bd565b915061381b826137b6565b604082019050919050565b5f6020820190508181035f83015261383d81613804565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61387b8261319c565b91506138868361319c565b92508261389657613895613844565b5b828204905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f6138fb6026836130bd565b9150613906826138a1565b604082019050919050565b5f6020820190508181035f830152613928816138ef565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f6139896024836130bd565b91506139948261392f565b604082019050919050565b5f6020820190508181035f8301526139b68161397d565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f613a176022836130bd565b9150613a22826139bd565b604082019050919050565b5f6020820190508181035f830152613a4481613a0b565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000005f82015250565b5f613a7f601d836130bd565b9150613a8a82613a4b565b602082019050919050565b5f6020820190508181035f830152613aac81613a73565b9050919050565b5f613abd8261319c565b9150613ac88361319c565b9250828202613ad68161319c565b91508282048414831517613aed57613aec6135b1565b5b5092915050565b5f613afe8261319c565b9150613b098361319c565b9250828203905081811115613b2157613b206135b1565b5b92915050565b5f604082019050613b3a5f830185613780565b613b476020830184613257565b9392505050565b5f805f60608486031215613b6557613b6461315d565b5b5f613b7286828701613572565b9350506020613b8386828701613572565b9250506040613b9486828701613572565b9150509250925092565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f613bd26020836130bd565b9150613bdd82613b9e565b602082019050919050565b5f6020820190508181035f830152613bff81613bc6565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f613c606025836130bd565b9150613c6b82613c06565b604082019050919050565b5f6020820190508181035f830152613c8d81613c54565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f613cee6023836130bd565b9150613cf982613c94565b604082019050919050565b5f6020820190508181035f830152613d1b81613ce2565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f613d7c6026836130bd565b9150613d8782613d22565b604082019050919050565b5f6020820190508181035f830152613da981613d70565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f60208284031215613e1f57613e1e61315d565b5b5f613e2c84828501613677565b91505092915050565b5f819050919050565b5f613e58613e53613e4e84613e35565b61300c565b61319c565b9050919050565b613e6881613e3e565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b613ea081613161565b82525050565b5f613eb18383613e97565b60208301905092915050565b5f602082019050919050565b5f613ed382613e6e565b613edd8185613e78565b9350613ee883613e88565b805f5b83811015613f18578151613eff8882613ea6565b9750613f0a83613ebd565b925050600181019050613eeb565b5085935050505092915050565b5f60a082019050613f385f830188613257565b613f456020830187613e5f565b8181036040830152613f578186613ec9565b9050613f66606083018561332e565b613f736080830184613257565b9695505050505050565b5f81905092915050565b50565b5f613f955f83613f7d565b9150613fa082613f87565b5f82019050919050565b5f613fb482613f8a565b915081905091905056fea2646970667358221220ef37b4ac76de266a77319253bb287877d0f4dfe73b2b6d0d13419263bec7dcb064736f6c63430008150033
Deployed Bytecode Sourcemap
50310:16361:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52335:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51719:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13993:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16353:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52496:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15122:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17134:261;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51860:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51641:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65880:144;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52171:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14964:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57478:133;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17804:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52024:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52595:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52097:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55151:261;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52814:51;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52247:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58655:284;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59830:198;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66428:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;15293:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26706:103;;;;;;;;;;;;;:::i;:::-;;60251:526;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52416:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52688:54;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55499:172;;;;;;;;;;;;;:::i;:::-;;26065:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14212:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51391:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50990:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58227:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57229:115;;;;;;;;;;;;;:::i;:::-;;18545:436;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51942:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66089:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15626:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59520:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57757:329;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56638:503;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55973:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59209:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15882:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51259:59;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51555:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51787:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26964:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52335:41;;;;;;;;;;;;;:::o;51719:28::-;;;;;;;;;;;;;:::o;13993:100::-;14047:13;14080:5;14073:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13993:100;:::o;16353:201::-;16436:4;16453:13;16469:12;:10;:12::i;:::-;16453:28;;16492:32;16501:5;16508:7;16517:6;16492:8;:32::i;:::-;16542:4;16535:11;;;16353:201;;;;:::o;52496:51::-;;;:::o;15122:108::-;15183:7;15210:12;;15203:19;;15122:108;:::o;17134:261::-;17231:4;17248:15;17266:12;:10;:12::i;:::-;17248:30;;17289:38;17305:4;17311:7;17320:6;17289:15;:38::i;:::-;17338:27;17348:4;17354:2;17358:6;17338:9;:27::i;:::-;17383:4;17376:11;;;17134:261;;;;;:::o;51860:40::-;;;;:::o;51641:32::-;;;;;;;;;;;;;:::o;65880:144::-;65943:7;65970:18;;;;;;;;;;;:44;;;:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65963:53;;65880:144;:::o;52171:32::-;;;;:::o;14964:93::-;15022:5;15047:2;15040:9;;14964:93;:::o;57478:133::-;25951:13;:11;:13::i;:::-;57555:18:::1;;;;;;;;;;;:39;;;57595:7;57555:48;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;57478:133:::0;:::o;17804:238::-;17892:4;17909:13;17925:12;:10;:12::i;:::-;17909:28;;17948:64;17957:5;17964:7;18001:10;17973:25;17983:5;17990:7;17973:9;:25::i;:::-;:38;;;;:::i;:::-;17948:8;:64::i;:::-;18030:4;18023:11;;;17804:238;;;;:::o;52024:31::-;;;;:::o;52595:28::-;;;;;;;;;;;;;:::o;52097:30::-;;;;:::o;55151:261::-;25951:13;:11;:13::i;:::-;55261:4:::1;55243:23;;:6;:23;;::::0;55240:86:::1;;55290:24;;;;;;;;;;;;;;55240:86;55336:10;55356:6;55336:27;;55374:3;:12;;;55387:7;:5;:7::i;:::-;55396;55374:30;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;55229:183;55151:261:::0;;:::o;52814:51::-;;;;;;;;;;;;;;;;;;;;;;:::o;52247:31::-;;;;:::o;58655:284::-;25951:13;:11;:13::i;:::-;58737:6:::1;58731:3;:12;:28;;;;;58753:6;58747:3;:12;58731:28;58728:171;;;58868:19;;;;;;;;;;;;;;58728:171;58928:3;58909:16;:22;;;;58655:284:::0;:::o;59830:198::-;25951:13;:11;:13::i;:::-;59926:1:::1;59908:20;;:6;:20;;::::0;59905:81:::1;;59951:23;;;;;;;;;;;;;;59905:81;60014:6;59996:15;;:24;;;;;;;;;;;;;;;;;;59830:198:::0;:::o;66428:238::-;66486:20;66508:24;66534:21;66623:18;;;;;;;;;;;:29;;;66653:4;66623:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66567:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66428:238;;;;;:::o;15293:127::-;15367:7;15394:9;:18;15404:7;15394:18;;;;;;;;;;;;;;;;15387:25;;15293:127;;;:::o;26706:103::-;25951:13;:11;:13::i;:::-;26771:30:::1;26798:1;26771:18;:30::i;:::-;26706:103::o:0;60251:526::-;25951:13;:11;:13::i;:::-;60396:3:::1;60374:18;:25;60371:138;;60471:26;;;;;;;;;;;;;;60371:138;60533:4;60522:7;:15;;:31;;;;;60552:1;60541:7;:12;;60522:31;60519:135;;;60623:19;;;;;;;;;;;;;;60519:135;60682:18;60664:15;:36;;;;60728:7;60711:14;:24;;;;60762:7;60746:13;;:23;;;;;;;;;;;;;;;;;;60251:526:::0;;;:::o;52416:30::-;;;;;;;;;;;;;:::o;52688:54::-;;;;;;;;;;;;;;;;;;;;;;:::o;55499:172::-;25951:13;:11;:13::i;:::-;55557:16:::1;;;;;;;;;;;55554:76;;;55596:22;;;;;;;;;;;;;;55554:76;55659:4;55640:16;;:23;;;;;;;;;;;;;;;;;;55499:172::o:0;26065:87::-;26111:7;26138:6;;;;;;;;;;;26131:13;;26065:87;:::o;14212:104::-;14268:13;14301:7;14294:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14212:104;:::o;51391:40::-;;;;:::o;50990:42::-;51030:2;50990:42;:::o;58227:334::-;25951:13;:11;:13::i;:::-;51030:2:::1;58334:9;58321:10;:22;;;;:::i;:::-;:38;58318:98;;;58382:22;;;;;;;;;;;;;;58318:98;58448:10;58428:17;:30;;;;58488:9;58469:16;:28;;;;58541:9;58529:10;58513:38;;;;;;;;;;58227:334:::0;;:::o;57229:115::-;57275:18;;;;;;;;;;;:33;;;57317:10;57330:5;57275:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;57229:115::o;18545:436::-;18638:4;18655:13;18671:12;:10;:12::i;:::-;18655:28;;18694:24;18721:25;18731:5;18738:7;18721:9;:25::i;:::-;18694:52;;18785:15;18765:16;:35;;18757:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;18878:60;18887:5;18894:7;18922:15;18903:16;:34;18878:8;:60::i;:::-;18969:4;18962:11;;;;18545:436;;;;:::o;51942:29::-;;;;:::o;66089:187::-;66186:7;66218:18;;;;;;;;;;;:41;;;66260:7;66218:50;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66211:57;;66089:187;;;:::o;15626:193::-;15705:4;15722:13;15738:12;:10;:12::i;:::-;15722:28;;15761;15771:5;15778:2;15782:6;15761:9;:28::i;:::-;15807:4;15800:11;;;15626:193;;;;:::o;59520:201::-;25951:13;:11;:13::i;:::-;59622:3:::1;59610:9;;:15;;;;:::i;:::-;59601:6;:24;59598:78;;;59649:15;;;;;;;;;;;;;;59598:78;59707:6;59686:18;:27;;;;59520:201:::0;:::o;57757:329::-;25951:13;:11;:13::i;:::-;51030:2:::1;57863:9;57850:10;:22;;;;:::i;:::-;:38;57847:97;;;57911:21;;;;;;;;;;;;;;57847:97;57975:10;57956:16;:29;;;;58014:9;57996:15;:27;;;;58066:9;58054:10;58039:37;;;;;;;;;;57757:329:::0;;:::o;56638:503::-;25951:13;:11;:13::i;:::-;56752:1:::1;56732:22;;:8;:22;;::::0;56729:83:::1;;56777:23;;;;;;;;;;;;;;56729:83;56837:13;;;;;;;;;;;56825:25;;:8;:25;;::::0;56822:85:::1;;56873:22;;;;;;;;;;;;;;56822:85;56956:5;56920:41;;:22;:32;56943:8;56920:32;;;;;;;;;;;;;;;;;;;;;;;;;:41;;::::0;56917:96:::1;;56984:17;;;;;;;;;;;;;;56917:96;57023:18;;;;;;;;;;;:39;;;57063:8;57023:49;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;57118:5;57083:22;:32;57106:8;57083:32;;;;;;;;;;;;;;;;:40;;;;;;;;;;;;;;;;;;56638:503:::0;;:::o;55973:308::-;25951:13;:11;:13::i;:::-;56074:1:::1;56058:18;;:4;:18;;::::0;56055:79:::1;;56099:23;;;;;;;;;;;;;;56055:79;56175:5;56147:33;;:18;:24;56166:4;56147:24;;;;;;;;;;;;;;;;;;;;;;;;;:33;;::::0;56144:87:::1;;56202:17;;;;;;;;;;;;;;56144:87;56268:5;56241:18;:24;56260:4;56241:24;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;55973:308:::0;;:::o;59209:204::-;25951:13;:11;:13::i;:::-;59311:5:::1;59288:28;;:19;;;;;;;;;;;:28;;::::0;59285:83:::1;;59339:17;;;;;;;;;;;;;;59285:83;59400:5;59378:19;;:27;;;;;;;;;;;;;;;;;;59209:204:::0;:::o;15882:151::-;15971:7;15998:11;:18;16010:5;15998:18;;;;;;;;;;;;;;;:27;16017:7;15998:27;;;;;;;;;;;;;;;;15991:34;;15882:151;;;;:::o;51259:59::-;;;;:::o;51555:38::-;;;;;;;;;;;;;:::o;51787:34::-;;;;:::o;26964:201::-;25951:13;:11;:13::i;:::-;27073:1:::1;27053:22;;:8;:22;;::::0;27045:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;27129:28;27148:8;27129:18;:28::i;:::-;26964:201:::0;:::o;11797:98::-;11850:7;11877:10;11870:17;;11797:98;:::o;22538:346::-;22657:1;22640:19;;:5;:19;;;22632:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22738:1;22719:21;;:7;:21;;;22711:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22822:6;22792:11;:18;22804:5;22792:18;;;;;;;;;;;;;;;:27;22811:7;22792:27;;;;;;;;;;;;;;;:36;;;;22860:7;22844:32;;22853:5;22844:32;;;22869:6;22844:32;;;;;;:::i;:::-;;;;;;;;22538:346;;;:::o;23175:419::-;23276:24;23303:25;23313:5;23320:7;23303:9;:25::i;:::-;23276:52;;23363:17;23343:16;:37;23339:248;;23425:6;23405:16;:26;;23397:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;23509:51;23518:5;23525:7;23553:6;23534:16;:25;23509:8;:51::i;:::-;23339:248;23265:329;23175:419;;;:::o;60969:2555::-;61078:1;61062:18;;:4;:18;;;61059:74;;61099:23;;;;;;;;;;;;;;61059:74;61160:1;61146:16;;:2;:16;;;61143:72;;61181:23;;;;;;;;;;;;;;61143:72;61229:16;;;;;;;;;;;61225:168;;61263:18;:24;61282:4;61263:24;;;;;;;;;;;;;;;;;;;;;;;;;61262:25;:52;;;;;61292:18;:22;61311:2;61292:22;;;;;;;;;;;;;;;;;;;;;;;;;61291:23;61262:52;61259:124;;;61347:24;;;;;;;;;;;;;;61259:124;61225:168;61417:1;61407:6;:11;61404:82;;61430:28;61446:4;61452:2;61456:1;61430:15;:28::i;:::-;61469:7;;61404:82;61495:23;61521:24;61539:4;61521:9;:24::i;:::-;61495:50;;61556:15;61593:18;;61574:15;:37;;61556:55;;61624:10;:54;;;;;61650:22;:28;61673:4;61650:28;;;;;;;;;;;;;;;;;;;;;;;;;61649:29;61624:54;:76;;;;;61694:6;;;;;;;;;;;61693:7;61624:76;:105;;;;;61705:18;:24;61724:4;61705:24;;;;;;;;;;;;;;;;;;;;;;;;;61704:25;61624:105;:143;;;;;61745:18;:22;61764:2;61745:22;;;;;;;;;;;;;;;;;;;;;;;;;61744:23;61624:143;61621:377;;;61825:2;61804:18;;:23;;;;:::i;:::-;61786:15;:41;61783:119;;;61884:2;61863:18;;:23;;;;:::i;:::-;61845:41;;61783:119;61913:33;61930:15;61913:16;:33::i;:::-;61958:29;:27;:29::i;:::-;61621:377;62013:22;:26;62036:2;62013:26;;;;;;;;;;;;;;;;;;;;;;;;;:43;;;;;62043:13;;;;;;;;;;;62013:43;:98;;;;;62096:15;;62079:14;;:32;;;;:::i;:::-;62060:15;:51;;62013:98;:127;;;;;62116:18;:24;62135:4;62116:24;;;;;;;;;;;;;;;;;;;;;;;;;62115:25;62013:127;62009:188;;;62156:29;:27;:29::i;:::-;;62009:188;62215:12;62230:4;62215:19;;62247:18;:24;62266:4;62247:24;;;;;;;;;;;;;;;;;;;;;;;;;:50;;;;62275:18;:22;62294:2;62275:22;;;;;;;;;;;;;;;;;;;;;;;;;62247:50;62244:91;;;62319:5;62309:15;;62244:91;62346:12;62375:7;62372:509;;;62404:14;62440:15;;62421:16;;:34;;;;:::i;:::-;62404:51;;62472:22;:28;62495:4;62472:28;;;;;;;;;;;;;;;;;;;;;;;;;:42;;;;;62513:1;62504:6;:10;62472:42;62469:103;;;62557:3;62547:6;62538;:15;;;;:::i;:::-;62537:23;;;;:::i;:::-;62530:30;;62469:103;62582:15;62620:16;;62600:17;;:36;;;;:::i;:::-;62582:54;;62650:22;:26;62673:2;62650:26;;;;;;;;;;;;;;;;;;;;;;;;;:41;;;;;62690:1;62680:7;:11;62650:41;62647:103;;;62735:3;62724:7;62715:6;:16;;;;:::i;:::-;62714:24;;;;:::i;:::-;62707:31;;62647:103;62770:1;62763:4;:8;62760:78;;;62784:42;62800:4;62814;62821;62784:15;:42::i;:::-;62760:78;62866:4;62857:6;:13;;;;:::i;:::-;62848:22;;62383:498;;62372:509;62890:33;62906:4;62912:2;62916:6;62890:15;:33::i;:::-;62984:18;;;;;;;;;;;:29;;;63022:4;63029:15;63039:4;63029:9;:15::i;:::-;62984:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62980:77;63071:18;;;;;;;;;;;:29;;;63109:2;63114:13;63124:2;63114:9;:13::i;:::-;63071:57;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63067:73;63203:24;63238:18;;;;;;;;;;;63230:35;;;63203:62;;63401:19;;;;;;;;;;;:43;;;;;63443:1;63424:16;:20;63401:43;63398:119;;;63461:18;;;;;;;;;;;:26;;;63488:16;;63461:44;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;63398:119;61049:2475;;;;;60969:2555;;;;:::o;26230:132::-;26305:12;:10;:12::i;:::-;26294:23;;:7;:5;:7::i;:::-;:23;;;26286:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;26230:132::o;27325:191::-;27399:16;27418:6;;;;;;;;;;;27399:25;;27444:8;27435:6;;:17;;;;;;;;;;;;;;;;;;27499:8;27468:40;;27489:8;27468:40;;;;;;;;;;;;27388:128;27325:191;:::o;19451:806::-;19564:1;19548:18;;:4;:18;;;19540:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19641:1;19627:16;;:2;:16;;;19619:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;19696:38;19717:4;19723:2;19727:6;19696:20;:38::i;:::-;19747:19;19769:9;:15;19779:4;19769:15;;;;;;;;;;;;;;;;19747:37;;19818:6;19803:11;:21;;19795:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;19935:6;19921:11;:20;19903:9;:15;19913:4;19903:15;;;;;;;;;;;;;;;:38;;;;20138:6;20121:9;:13;20131:2;20121:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;20188:2;20173:26;;20182:4;20173:26;;;20192:6;20173:26;;;;;;:::i;:::-;;;;;;;;20212:37;20232:4;20238:2;20242:6;20212:19;:37::i;:::-;19529:728;19451:806;;;:::o;64262:705::-;54785:4;54776:6;;:13;;;;;;;;;;;;;;;;;;64400:21:::1;64438:1;64424:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64400:40;;64469:4;64451;64456:1;64451:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;::::0;::::1;64495:15;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64485:4;64490:1;64485:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;::::0;::::1;64594:11;64541:50;64559:4;64574:15;64541:9;:50::i;:::-;:64;64538:159;;;64617:68;64634:4;64649:15;64667:17;64617:8;:68::i;:::-;64538:159;64735:15;:66;;;64816:11;64842:1;64886:4;64913;64933:15;64735:224;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;64329:638;54821:5:::0;54812:6;;:14;;;;;;;;;;;;;;;;;;64262:705;:::o;65057:745::-;65115:15;65151:16;;65133:15;;:34;;;;:::i;:::-;65115:52;;65178:16;65216:17;;65197:16;;:36;;;;:::i;:::-;65178:55;;65244:21;65286:16;;65268:15;;:34;;;;:::i;:::-;65244:58;;65313:18;65334:21;65313:42;;65390:1;65379:8;65369:7;:18;;;;:::i;:::-;:22;65366:429;;;65403:21;65469:8;65459:7;:18;;;;:::i;:::-;65441:13;65428:10;:26;;;;:::i;:::-;65427:51;;;;:::i;:::-;65403:75;;65489:12;65536:1;65520:13;:17;65516:123;;;65576:15;;;;;;;;;;;65568:29;;65605:13;65568:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65555:68;;;;;65516:123;65680:1;65656:21;:25;65653:131;;;65698:18;;;;;;;;;;;:38;;;65744:21;65698:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65653:131;65392:403;;65366:429;65104:698;;;;65057:745::o;63611:528::-;63668:4;63704:15;63687:14;:32;;;;63733:28;63764:24;63774:13;;;;;;;;;;;63764:9;:24::i;:::-;63733:55;;63802:20;63867:5;63849:14;;63826:20;:37;;;;:::i;:::-;63825:47;;;;:::i;:::-;63802:70;;63905:1;63890:12;:16;63886:109;;;63922:61;63938:13;;;;;;;;;;;63961:6;63970:12;63922:15;:61::i;:::-;63886:109;64008:19;64045:13;;;;;;;;;;;64008:51;;64070:4;:9;;;:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64097:12;;;;;;;;;;64127:4;64120:11;;;;;63611:528;:::o;24194:91::-;;;;:::o;24889:90::-;;;;:::o;7:126:1:-;44:7;84:42;77:5;73:54;62:65;;7:126;;;:::o;139:60::-;167:3;188:5;181:12;;139:60;;;:::o;205:142::-;255:9;288:53;306:34;315:24;333:5;315:24;:::i;:::-;306:34;:::i;:::-;288:53;:::i;:::-;275:66;;205:142;;;:::o;353:134::-;411:9;444:37;475:5;444:37;:::i;:::-;431:50;;353:134;;;:::o;493:166::-;575:9;608:45;647:5;608:45;:::i;:::-;595:58;;493:166;;;:::o;665:195::-;784:69;847:5;784:69;:::i;:::-;779:3;772:82;665:195;;:::o;866:286::-;991:4;1029:2;1018:9;1014:18;1006:26;;1042:103;1142:1;1131:9;1127:17;1118:6;1042:103;:::i;:::-;866:286;;;;:::o;1158:90::-;1192:7;1235:5;1228:13;1221:21;1210:32;;1158:90;;;:::o;1254:109::-;1335:21;1350:5;1335:21;:::i;:::-;1330:3;1323:34;1254:109;;:::o;1369:210::-;1456:4;1494:2;1483:9;1479:18;1471:26;;1507:65;1569:1;1558:9;1554:17;1545:6;1507:65;:::i;:::-;1369:210;;;;:::o;1585:99::-;1637:6;1671:5;1665:12;1655:22;;1585:99;;;:::o;1690:169::-;1774:11;1808:6;1803:3;1796:19;1848:4;1843:3;1839:14;1824:29;;1690:169;;;;:::o;1865:246::-;1946:1;1956:113;1970:6;1967:1;1964:13;1956:113;;;2055:1;2050:3;2046:11;2040:18;2036:1;2031:3;2027:11;2020:39;1992:2;1989:1;1985:10;1980:15;;1956:113;;;2103:1;2094:6;2089:3;2085:16;2078:27;1927:184;1865:246;;;:::o;2117:102::-;2158:6;2209:2;2205:7;2200:2;2193:5;2189:14;2185:28;2175:38;;2117:102;;;:::o;2225:377::-;2313:3;2341:39;2374:5;2341:39;:::i;:::-;2396:71;2460:6;2455:3;2396:71;:::i;:::-;2389:78;;2476:65;2534:6;2529:3;2522:4;2515:5;2511:16;2476:65;:::i;:::-;2566:29;2588:6;2566:29;:::i;:::-;2561:3;2557:39;2550:46;;2317:285;2225:377;;;;:::o;2608:313::-;2721:4;2759:2;2748:9;2744:18;2736:26;;2808:9;2802:4;2798:20;2794:1;2783:9;2779:17;2772:47;2836:78;2909:4;2900:6;2836:78;:::i;:::-;2828:86;;2608:313;;;;:::o;3008:117::-;3117:1;3114;3107:12;3254:96;3291:7;3320:24;3338:5;3320:24;:::i;:::-;3309:35;;3254:96;;;:::o;3356:122::-;3429:24;3447:5;3429:24;:::i;:::-;3422:5;3419:35;3409:63;;3468:1;3465;3458:12;3409:63;3356:122;:::o;3484:139::-;3530:5;3568:6;3555:20;3546:29;;3584:33;3611:5;3584:33;:::i;:::-;3484:139;;;;:::o;3629:77::-;3666:7;3695:5;3684:16;;3629:77;;;:::o;3712:122::-;3785:24;3803:5;3785:24;:::i;:::-;3778:5;3775:35;3765:63;;3824:1;3821;3814:12;3765:63;3712:122;:::o;3840:139::-;3886:5;3924:6;3911:20;3902:29;;3940:33;3967:5;3940:33;:::i;:::-;3840:139;;;;:::o;3985:474::-;4053:6;4061;4110:2;4098:9;4089:7;4085:23;4081:32;4078:119;;;4116:79;;:::i;:::-;4078:119;4236:1;4261:53;4306:7;4297:6;4286:9;4282:22;4261:53;:::i;:::-;4251:63;;4207:117;4363:2;4389:53;4434:7;4425:6;4414:9;4410:22;4389:53;:::i;:::-;4379:63;;4334:118;3985:474;;;;;:::o;4465:126::-;4515:9;4548:37;4579:5;4548:37;:::i;:::-;4535:50;;4465:126;;;:::o;4597:152::-;4673:9;4706:37;4737:5;4706:37;:::i;:::-;4693:50;;4597:152;;;:::o;4755:183::-;4868:63;4925:5;4868:63;:::i;:::-;4863:3;4856:76;4755:183;;:::o;4944:274::-;5063:4;5101:2;5090:9;5086:18;5078:26;;5114:97;5208:1;5197:9;5193:17;5184:6;5114:97;:::i;:::-;4944:274;;;;:::o;5224:118::-;5311:24;5329:5;5311:24;:::i;:::-;5306:3;5299:37;5224:118;;:::o;5348:222::-;5441:4;5479:2;5468:9;5464:18;5456:26;;5492:71;5560:1;5549:9;5545:17;5536:6;5492:71;:::i;:::-;5348:222;;;;:::o;5576:619::-;5653:6;5661;5669;5718:2;5706:9;5697:7;5693:23;5689:32;5686:119;;;5724:79;;:::i;:::-;5686:119;5844:1;5869:53;5914:7;5905:6;5894:9;5890:22;5869:53;:::i;:::-;5859:63;;5815:117;5971:2;5997:53;6042:7;6033:6;6022:9;6018:22;5997:53;:::i;:::-;5987:63;;5942:118;6099:2;6125:53;6170:7;6161:6;6150:9;6146:22;6125:53;:::i;:::-;6115:63;;6070:118;5576:619;;;;;:::o;6201:86::-;6236:7;6276:4;6269:5;6265:16;6254:27;;6201:86;;;:::o;6293:112::-;6376:22;6392:5;6376:22;:::i;:::-;6371:3;6364:35;6293:112;;:::o;6411:214::-;6500:4;6538:2;6527:9;6523:18;6515:26;;6551:67;6615:1;6604:9;6600:17;6591:6;6551:67;:::i;:::-;6411:214;;;;:::o;6631:329::-;6690:6;6739:2;6727:9;6718:7;6714:23;6710:32;6707:119;;;6745:79;;:::i;:::-;6707:119;6865:1;6890:53;6935:7;6926:6;6915:9;6911:22;6890:53;:::i;:::-;6880:63;;6836:117;6631:329;;;;:::o;6966:118::-;7053:24;7071:5;7053:24;:::i;:::-;7048:3;7041:37;6966:118;;:::o;7090:222::-;7183:4;7221:2;7210:9;7206:18;7198:26;;7234:71;7302:1;7291:9;7287:17;7278:6;7234:71;:::i;:::-;7090:222;;;;:::o;7318:329::-;7377:6;7426:2;7414:9;7405:7;7401:23;7397:32;7394:119;;;7432:79;;:::i;:::-;7394:119;7552:1;7577:53;7622:7;7613:6;7602:9;7598:22;7577:53;:::i;:::-;7567:63;;7523:117;7318:329;;;;:::o;7653:442::-;7802:4;7840:2;7829:9;7825:18;7817:26;;7853:71;7921:1;7910:9;7906:17;7897:6;7853:71;:::i;:::-;7934:72;8002:2;7991:9;7987:18;7978:6;7934:72;:::i;:::-;8016;8084:2;8073:9;8069:18;8060:6;8016:72;:::i;:::-;7653:442;;;;;;:::o;8101:116::-;8171:21;8186:5;8171:21;:::i;:::-;8164:5;8161:32;8151:60;;8207:1;8204;8197:12;8151:60;8101:116;:::o;8223:133::-;8266:5;8304:6;8291:20;8282:29;;8320:30;8344:5;8320:30;:::i;:::-;8223:133;;;;:::o;8362:613::-;8436:6;8444;8452;8501:2;8489:9;8480:7;8476:23;8472:32;8469:119;;;8507:79;;:::i;:::-;8469:119;8627:1;8652:53;8697:7;8688:6;8677:9;8673:22;8652:53;:::i;:::-;8642:63;;8598:117;8754:2;8780:53;8825:7;8816:6;8805:9;8801:22;8780:53;:::i;:::-;8770:63;;8725:118;8882:2;8908:50;8950:7;8941:6;8930:9;8926:22;8908:50;:::i;:::-;8898:60;;8853:115;8362:613;;;;;:::o;8981:474::-;9049:6;9057;9106:2;9094:9;9085:7;9081:23;9077:32;9074:119;;;9112:79;;:::i;:::-;9074:119;9232:1;9257:53;9302:7;9293:6;9282:9;9278:22;9257:53;:::i;:::-;9247:63;;9203:117;9359:2;9385:53;9430:7;9421:6;9410:9;9406:22;9385:53;:::i;:::-;9375:63;;9330:118;8981:474;;;;;:::o;9461:468::-;9526:6;9534;9583:2;9571:9;9562:7;9558:23;9554:32;9551:119;;;9589:79;;:::i;:::-;9551:119;9709:1;9734:53;9779:7;9770:6;9759:9;9755:22;9734:53;:::i;:::-;9724:63;;9680:117;9836:2;9862:50;9904:7;9895:6;9884:9;9880:22;9862:50;:::i;:::-;9852:60;;9807:115;9461:468;;;;;:::o;9935:323::-;9991:6;10040:2;10028:9;10019:7;10015:23;10011:32;10008:119;;;10046:79;;:::i;:::-;10008:119;10166:1;10191:50;10233:7;10224:6;10213:9;10209:22;10191:50;:::i;:::-;10181:60;;10137:114;9935:323;;;;:::o;10264:474::-;10332:6;10340;10389:2;10377:9;10368:7;10364:23;10360:32;10357:119;;;10395:79;;:::i;:::-;10357:119;10515:1;10540:53;10585:7;10576:6;10565:9;10561:22;10540:53;:::i;:::-;10530:63;;10486:117;10642:2;10668:53;10713:7;10704:6;10693:9;10689:22;10668:53;:::i;:::-;10658:63;;10613:118;10264:474;;;;;:::o;10744:180::-;10792:77;10789:1;10782:88;10889:4;10886:1;10879:15;10913:4;10910:1;10903:15;10930:320;10974:6;11011:1;11005:4;11001:12;10991:22;;11058:1;11052:4;11048:12;11079:18;11069:81;;11135:4;11127:6;11123:17;11113:27;;11069:81;11197:2;11189:6;11186:14;11166:18;11163:38;11160:84;;11216:18;;:::i;:::-;11160:84;10981:269;10930:320;;;:::o;11256:143::-;11313:5;11344:6;11338:13;11329:22;;11360:33;11387:5;11360:33;:::i;:::-;11256:143;;;;:::o;11405:351::-;11475:6;11524:2;11512:9;11503:7;11499:23;11495:32;11492:119;;;11530:79;;:::i;:::-;11492:119;11650:1;11675:64;11731:7;11722:6;11711:9;11707:22;11675:64;:::i;:::-;11665:74;;11621:128;11405:351;;;;:::o;11762:180::-;11810:77;11807:1;11800:88;11907:4;11904:1;11897:15;11931:4;11928:1;11921:15;11948:191;11988:3;12007:20;12025:1;12007:20;:::i;:::-;12002:25;;12041:20;12059:1;12041:20;:::i;:::-;12036:25;;12084:1;12081;12077:9;12070:16;;12105:3;12102:1;12099:10;12096:36;;;12112:18;;:::i;:::-;12096:36;11948:191;;;;:::o;12145:332::-;12266:4;12304:2;12293:9;12289:18;12281:26;;12317:71;12385:1;12374:9;12370:17;12361:6;12317:71;:::i;:::-;12398:72;12466:2;12455:9;12451:18;12442:6;12398:72;:::i;:::-;12145:332;;;;;:::o;12483:137::-;12537:5;12568:6;12562:13;12553:22;;12584:30;12608:5;12584:30;:::i;:::-;12483:137;;;;:::o;12626:345::-;12693:6;12742:2;12730:9;12721:7;12717:23;12713:32;12710:119;;;12748:79;;:::i;:::-;12710:119;12868:1;12893:61;12946:7;12937:6;12926:9;12922:22;12893:61;:::i;:::-;12883:71;;12839:125;12626:345;;;;:::o;12977:143::-;13034:5;13065:6;13059:13;13050:22;;13081:33;13108:5;13081:33;:::i;:::-;12977:143;;;;:::o;13126:76::-;13162:7;13191:5;13180:16;;13126:76;;;:::o;13208:120::-;13280:23;13297:5;13280:23;:::i;:::-;13273:5;13270:34;13260:62;;13318:1;13315;13308:12;13260:62;13208:120;:::o;13334:141::-;13390:5;13421:6;13415:13;13406:22;;13437:32;13463:5;13437:32;:::i;:::-;13334:141;;;;:::o;13481:1444::-;13612:6;13620;13628;13636;13644;13652;13660;13668;13717:3;13705:9;13696:7;13692:23;13688:33;13685:120;;;13724:79;;:::i;:::-;13685:120;13844:1;13869:64;13925:7;13916:6;13905:9;13901:22;13869:64;:::i;:::-;13859:74;;13815:128;13982:2;14008:63;14063:7;14054:6;14043:9;14039:22;14008:63;:::i;:::-;13998:73;;13953:128;14120:2;14146:63;14201:7;14192:6;14181:9;14177:22;14146:63;:::i;:::-;14136:73;;14091:128;14258:2;14284:64;14340:7;14331:6;14320:9;14316:22;14284:64;:::i;:::-;14274:74;;14229:129;14397:3;14424:64;14480:7;14471:6;14460:9;14456:22;14424:64;:::i;:::-;14414:74;;14368:130;14537:3;14564:64;14620:7;14611:6;14600:9;14596:22;14564:64;:::i;:::-;14554:74;;14508:130;14677:3;14704:64;14760:7;14751:6;14740:9;14736:22;14704:64;:::i;:::-;14694:74;;14648:130;14817:3;14844:64;14900:7;14891:6;14880:9;14876:22;14844:64;:::i;:::-;14834:74;;14788:130;13481:1444;;;;;;;;;;;:::o;14931:104::-;14976:7;15005:24;15023:5;15005:24;:::i;:::-;14994:35;;14931:104;;;:::o;15041:142::-;15144:32;15170:5;15144:32;:::i;:::-;15139:3;15132:45;15041:142;;:::o;15189:352::-;15320:4;15358:2;15347:9;15343:18;15335:26;;15371:87;15455:1;15444:9;15440:17;15431:6;15371:87;:::i;:::-;15468:66;15530:2;15519:9;15515:18;15506:6;15468:66;:::i;:::-;15189:352;;;;;:::o;15547:224::-;15687:34;15683:1;15675:6;15671:14;15664:58;15756:7;15751:2;15743:6;15739:15;15732:32;15547:224;:::o;15777:366::-;15919:3;15940:67;16004:2;15999:3;15940:67;:::i;:::-;15933:74;;16016:93;16105:3;16016:93;:::i;:::-;16134:2;16129:3;16125:12;16118:19;;15777:366;;;:::o;16149:419::-;16315:4;16353:2;16342:9;16338:18;16330:26;;16402:9;16396:4;16392:20;16388:1;16377:9;16373:17;16366:47;16430:131;16556:4;16430:131;:::i;:::-;16422:139;;16149:419;;;:::o;16574:180::-;16622:77;16619:1;16612:88;16719:4;16716:1;16709:15;16743:4;16740:1;16733:15;16760:185;16800:1;16817:20;16835:1;16817:20;:::i;:::-;16812:25;;16851:20;16869:1;16851:20;:::i;:::-;16846:25;;16890:1;16880:35;;16895:18;;:::i;:::-;16880:35;16937:1;16934;16930:9;16925:14;;16760:185;;;;:::o;16951:225::-;17091:34;17087:1;17079:6;17075:14;17068:58;17160:8;17155:2;17147:6;17143:15;17136:33;16951:225;:::o;17182:366::-;17324:3;17345:67;17409:2;17404:3;17345:67;:::i;:::-;17338:74;;17421:93;17510:3;17421:93;:::i;:::-;17539:2;17534:3;17530:12;17523:19;;17182:366;;;:::o;17554:419::-;17720:4;17758:2;17747:9;17743:18;17735:26;;17807:9;17801:4;17797:20;17793:1;17782:9;17778:17;17771:47;17835:131;17961:4;17835:131;:::i;:::-;17827:139;;17554:419;;;:::o;17979:223::-;18119:34;18115:1;18107:6;18103:14;18096:58;18188:6;18183:2;18175:6;18171:15;18164:31;17979:223;:::o;18208:366::-;18350:3;18371:67;18435:2;18430:3;18371:67;:::i;:::-;18364:74;;18447:93;18536:3;18447:93;:::i;:::-;18565:2;18560:3;18556:12;18549:19;;18208:366;;;:::o;18580:419::-;18746:4;18784:2;18773:9;18769:18;18761:26;;18833:9;18827:4;18823:20;18819:1;18808:9;18804:17;18797:47;18861:131;18987:4;18861:131;:::i;:::-;18853:139;;18580:419;;;:::o;19005:221::-;19145:34;19141:1;19133:6;19129:14;19122:58;19214:4;19209:2;19201:6;19197:15;19190:29;19005:221;:::o;19232:366::-;19374:3;19395:67;19459:2;19454:3;19395:67;:::i;:::-;19388:74;;19471:93;19560:3;19471:93;:::i;:::-;19589:2;19584:3;19580:12;19573:19;;19232:366;;;:::o;19604:419::-;19770:4;19808:2;19797:9;19793:18;19785:26;;19857:9;19851:4;19847:20;19843:1;19832:9;19828:17;19821:47;19885:131;20011:4;19885:131;:::i;:::-;19877:139;;19604:419;;;:::o;20029:179::-;20169:31;20165:1;20157:6;20153:14;20146:55;20029:179;:::o;20214:366::-;20356:3;20377:67;20441:2;20436:3;20377:67;:::i;:::-;20370:74;;20453:93;20542:3;20453:93;:::i;:::-;20571:2;20566:3;20562:12;20555:19;;20214:366;;;:::o;20586:419::-;20752:4;20790:2;20779:9;20775:18;20767:26;;20839:9;20833:4;20829:20;20825:1;20814:9;20810:17;20803:47;20867:131;20993:4;20867:131;:::i;:::-;20859:139;;20586:419;;;:::o;21011:410::-;21051:7;21074:20;21092:1;21074:20;:::i;:::-;21069:25;;21108:20;21126:1;21108:20;:::i;:::-;21103:25;;21163:1;21160;21156:9;21185:30;21203:11;21185:30;:::i;:::-;21174:41;;21364:1;21355:7;21351:15;21348:1;21345:22;21325:1;21318:9;21298:83;21275:139;;21394:18;;:::i;:::-;21275:139;21059:362;21011:410;;;;:::o;21427:194::-;21467:4;21487:20;21505:1;21487:20;:::i;:::-;21482:25;;21521:20;21539:1;21521:20;:::i;:::-;21516:25;;21565:1;21562;21558:9;21550:17;;21589:1;21583:4;21580:11;21577:37;;;21594:18;;:::i;:::-;21577:37;21427:194;;;;:::o;21627:364::-;21764:4;21802:2;21791:9;21787:18;21779:26;;21815:87;21899:1;21888:9;21884:17;21875:6;21815:87;:::i;:::-;21912:72;21980:2;21969:9;21965:18;21956:6;21912:72;:::i;:::-;21627:364;;;;;:::o;21997:663::-;22085:6;22093;22101;22150:2;22138:9;22129:7;22125:23;22121:32;22118:119;;;22156:79;;:::i;:::-;22118:119;22276:1;22301:64;22357:7;22348:6;22337:9;22333:22;22301:64;:::i;:::-;22291:74;;22247:128;22414:2;22440:64;22496:7;22487:6;22476:9;22472:22;22440:64;:::i;:::-;22430:74;;22385:129;22553:2;22579:64;22635:7;22626:6;22615:9;22611:22;22579:64;:::i;:::-;22569:74;;22524:129;21997:663;;;;;:::o;22666:182::-;22806:34;22802:1;22794:6;22790:14;22783:58;22666:182;:::o;22854:366::-;22996:3;23017:67;23081:2;23076:3;23017:67;:::i;:::-;23010:74;;23093:93;23182:3;23093:93;:::i;:::-;23211:2;23206:3;23202:12;23195:19;;22854:366;;;:::o;23226:419::-;23392:4;23430:2;23419:9;23415:18;23407:26;;23479:9;23473:4;23469:20;23465:1;23454:9;23450:17;23443:47;23507:131;23633:4;23507:131;:::i;:::-;23499:139;;23226:419;;;:::o;23651:224::-;23791:34;23787:1;23779:6;23775:14;23768:58;23860:7;23855:2;23847:6;23843:15;23836:32;23651:224;:::o;23881:366::-;24023:3;24044:67;24108:2;24103:3;24044:67;:::i;:::-;24037:74;;24120:93;24209:3;24120:93;:::i;:::-;24238:2;24233:3;24229:12;24222:19;;23881:366;;;:::o;24253:419::-;24419:4;24457:2;24446:9;24442:18;24434:26;;24506:9;24500:4;24496:20;24492:1;24481:9;24477:17;24470:47;24534:131;24660:4;24534:131;:::i;:::-;24526:139;;24253:419;;;:::o;24678:222::-;24818:34;24814:1;24806:6;24802:14;24795:58;24887:5;24882:2;24874:6;24870:15;24863:30;24678:222;:::o;24906:366::-;25048:3;25069:67;25133:2;25128:3;25069:67;:::i;:::-;25062:74;;25145:93;25234:3;25145:93;:::i;:::-;25263:2;25258:3;25254:12;25247:19;;24906:366;;;:::o;25278:419::-;25444:4;25482:2;25471:9;25467:18;25459:26;;25531:9;25525:4;25521:20;25517:1;25506:9;25502:17;25495:47;25559:131;25685:4;25559:131;:::i;:::-;25551:139;;25278:419;;;:::o;25703:225::-;25843:34;25839:1;25831:6;25827:14;25820:58;25912:8;25907:2;25899:6;25895:15;25888:33;25703:225;:::o;25934:366::-;26076:3;26097:67;26161:2;26156:3;26097:67;:::i;:::-;26090:74;;26173:93;26262:3;26173:93;:::i;:::-;26291:2;26286:3;26282:12;26275:19;;25934:366;;;:::o;26306:419::-;26472:4;26510:2;26499:9;26495:18;26487:26;;26559:9;26553:4;26549:20;26545:1;26534:9;26530:17;26523:47;26587:131;26713:4;26587:131;:::i;:::-;26579:139;;26306:419;;;:::o;26731:180::-;26779:77;26776:1;26769:88;26876:4;26873:1;26866:15;26900:4;26897:1;26890:15;26917:180;26965:77;26962:1;26955:88;27062:4;27059:1;27052:15;27086:4;27083:1;27076:15;27103:351;27173:6;27222:2;27210:9;27201:7;27197:23;27193:32;27190:119;;;27228:79;;:::i;:::-;27190:119;27348:1;27373:64;27429:7;27420:6;27409:9;27405:22;27373:64;:::i;:::-;27363:74;;27319:128;27103:351;;;;:::o;27460:85::-;27505:7;27534:5;27523:16;;27460:85;;;:::o;27551:158::-;27609:9;27642:61;27660:42;27669:32;27695:5;27669:32;:::i;:::-;27660:42;:::i;:::-;27642:61;:::i;:::-;27629:74;;27551:158;;;:::o;27715:147::-;27810:45;27849:5;27810:45;:::i;:::-;27805:3;27798:58;27715:147;;:::o;27868:114::-;27935:6;27969:5;27963:12;27953:22;;27868:114;;;:::o;27988:184::-;28087:11;28121:6;28116:3;28109:19;28161:4;28156:3;28152:14;28137:29;;27988:184;;;;:::o;28178:132::-;28245:4;28268:3;28260:11;;28298:4;28293:3;28289:14;28281:22;;28178:132;;;:::o;28316:108::-;28393:24;28411:5;28393:24;:::i;:::-;28388:3;28381:37;28316:108;;:::o;28430:179::-;28499:10;28520:46;28562:3;28554:6;28520:46;:::i;:::-;28598:4;28593:3;28589:14;28575:28;;28430:179;;;;:::o;28615:113::-;28685:4;28717;28712:3;28708:14;28700:22;;28615:113;;;:::o;28764:732::-;28883:3;28912:54;28960:5;28912:54;:::i;:::-;28982:86;29061:6;29056:3;28982:86;:::i;:::-;28975:93;;29092:56;29142:5;29092:56;:::i;:::-;29171:7;29202:1;29187:284;29212:6;29209:1;29206:13;29187:284;;;29288:6;29282:13;29315:63;29374:3;29359:13;29315:63;:::i;:::-;29308:70;;29401:60;29454:6;29401:60;:::i;:::-;29391:70;;29247:224;29234:1;29231;29227:9;29222:14;;29187:284;;;29191:14;29487:3;29480:10;;28888:608;;;28764:732;;;;:::o;29502:831::-;29765:4;29803:3;29792:9;29788:19;29780:27;;29817:71;29885:1;29874:9;29870:17;29861:6;29817:71;:::i;:::-;29898:80;29974:2;29963:9;29959:18;29950:6;29898:80;:::i;:::-;30025:9;30019:4;30015:20;30010:2;29999:9;29995:18;29988:48;30053:108;30156:4;30147:6;30053:108;:::i;:::-;30045:116;;30171:72;30239:2;30228:9;30224:18;30215:6;30171:72;:::i;:::-;30253:73;30321:3;30310:9;30306:19;30297:6;30253:73;:::i;:::-;29502:831;;;;;;;;:::o;30339:147::-;30440:11;30477:3;30462:18;;30339:147;;;;:::o;30492:114::-;;:::o;30612:398::-;30771:3;30792:83;30873:1;30868:3;30792:83;:::i;:::-;30785:90;;30884:93;30973:3;30884:93;:::i;:::-;31002:1;30997:3;30993:11;30986:18;;30612:398;;;:::o;31016:379::-;31200:3;31222:147;31365:3;31222:147;:::i;:::-;31215:154;;31386:3;31379:10;;31016:379;;;:::o
Swarm Source
ipfs://3cffecb4ee1a8d12ce55a0fcdf08b1855451869756b191a57682e6e7241d2357
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.