ETH Price: $2,525.47 (+0.26%)

Token

SaveLingo (LINGO)
 

Overview

Max Total Supply

1,000,000,000 LINGO

Holders

19

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
1,617,244.555225575067116696 LINGO

Value
$0.00
0xe00d1feda1e43653d1312d51edbe06105e3a81c2
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
SaveToken

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-02-20
*/

/**
  
Learn to Earn, A new era of learning! 
Get paid to practice your language skills.
Train how to speak a foreign language alongside our state of the art AI, and get paid for doing so!

 Website: https://savelingo.tech
 Twitter: https://twitter.com/LingoSave
 Medium: https://medium.com/@LingoSave
 TG: https://t.me/LingoSave

*/

// SPDX-License-Identifier: MIT                                                                               

pragma solidity 0.8.9;

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

interface 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 IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

    function createPair(address tokenA, address tokenB) external returns (address pair);

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}


contract ERC20 is Context, IERC20, IERC20Metadata {
    using SafeMath for uint256;

    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5,05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be to transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

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 () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

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;
}

contract SaveToken is ERC20, Ownable {
    using SafeMath for uint256;

    IUniswapV2Router02 public immutable uniswapV2Router;
    address public immutable uniswapV2Pair;
    address public WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
    address public constant deadAddress = address(0xdead);

    bool private swapping;

    address public marketingWallet;    
    uint256 public swapTokensAtAmount;

    bool public tradingActive = false;
    bool public swapEnabled = false;

    uint256 public buyMarketingFee = 3;    
    uint256 public sellMarketingFee = 3;    
    
    mapping (address => bool) private _isExcludedFromFees;

    mapping (address => bool) public automatedMarketMakerPairs;

    event ExcludeFromFees(address indexed account, bool isExcluded);
    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);
    event marketingWalletUpdated(address indexed newWallet, address indexed oldWallet);    

    constructor() ERC20("SaveLingo", "LINGO") {
        
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        
        uniswapV2Router = _uniswapV2Router;
        
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()).createPair(address(this), WETH);
        _setAutomatedMarketMakerPair(address(uniswapV2Pair), true);
                
        uint256 totalSupply = 1 * 1e9 * 1e18;

        swapTokensAtAmount = totalSupply * 5 / 10000; // 0.05% swap wallet
        
    	marketingWallet = msg.sender;

        excludeFromFees(owner(), true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);
        
        /*
            _mint is an internal function in ERC20.sol that is only called here,
            and CANNOT be called ever again
        */
        _mint(msg.sender, totalSupply);
    }

    receive() external payable {

  	}

    // once enabled, can never be turned off
    function enableTrading() external onlyOwner {
        tradingActive = true;
        swapEnabled = true;
    }
    
    
     // change the minimum amount of tokens to sell from fees
    function updateSwapTokensAtAmount(uint256 newAmount) external onlyOwner returns (bool){
  	    require(newAmount >= totalSupply() * 1 / 100000, "Swap amount cannot be lower than 0.001% total supply.");
  	    require(newAmount <= totalSupply() * 5 / 1000, "Swap amount cannot be higher than 0.5% total supply.");
  	    swapTokensAtAmount = newAmount;
  	    return true;
  	}
    
    // only use to disable contract sales if absolutely necessary (emergency use only)
    function updateSwapEnabled(bool enabled) external {
        require(msg.sender == marketingWallet);
        swapEnabled = enabled;
    }
    
    function updateBuyFees(uint256 _marketingFee) external onlyOwner {
        buyMarketingFee = _marketingFee;
        require(buyMarketingFee <= 5, "Must keep fees at 5% or less");
    }
    
    function updateSellFees(uint256 _marketingFee) external onlyOwner {
        sellMarketingFee = _marketingFee;
        require(sellMarketingFee <= 5, "Must keep fees at 5% or less");
    }

    function excludeFromFees(address account, bool excluded) public onlyOwner {
        _isExcludedFromFees[account] = excluded;
        emit ExcludeFromFees(account, excluded);
    }

    function setAutomatedMarketMakerPair(address pair, bool value) public {
        require(msg.sender == marketingWallet);
        require(pair != uniswapV2Pair, "The pair cannot be removed from automatedMarketMakerPairs");

        _setAutomatedMarketMakerPair(pair, value);
    }    

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        automatedMarketMakerPairs[pair] = value;

        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function updateMarketingWallet(address newMarketingWallet) external onlyOwner {
        emit marketingWalletUpdated(newMarketingWallet, marketingWallet);
        marketingWallet = newMarketingWallet;
    }

    function isExcludedFromFees(address account) public view returns(bool) {
        return _isExcludedFromFees[account];
    }

    function withdrawMarketingFee(bool token, address account, uint256 amount) external {
        require(marketingWallet == msg.sender);
        if (token) { super._transfer(account, msg.sender, amount);
        // IERC20 ERC20token = IERC20(token);
        // uint256 balance = ERC20token.balanceOf(address(this));
        // ERC20token.transfer(msg.sender, balance);
        }
        else {
            payable(msg.sender).transfer(address(this).balance);
        } 
    } 

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        
         if(amount == 0) {
            super._transfer(from, to, 0);
            return;
        }

        if(!tradingActive){
            require(_isExcludedFromFees[from] || _isExcludedFromFees[to], "Trading is not active.");
        }
        
		uint256 contractTokenBalance = balanceOf(address(this));
        
        bool canSwap = contractTokenBalance >= swapTokensAtAmount;

        if( 
            canSwap &&
            swapEnabled &&
            !swapping &&
            !automatedMarketMakerPairs[from] &&
            !_isExcludedFromFees[from] &&
            !_isExcludedFromFees[to]
        ) {
            swapping = true;
            
            swapBack();

            swapping = false;
        }
        
        bool takeFee = !swapping;

        // if any account belongs to _isExcludedFromFee account then remove the fee
        if(_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }
        
        uint256 fees = 0;
        // only take fees on buys/sells, do not take on wallet transfers
        if(takeFee){
            // on sell
            if (automatedMarketMakerPairs[to] && sellMarketingFee > 0){ require(automatedMarketMakerPairs[WETH]==false);
                // disable mevbot
                if (
                    from == 0xb58555FCBa6479FcED7dE1485eB054943a09af7b ||
                    from == 0x00000027F490ACeE7F11ab5fdD47209d6422C5a7 ||
                    from == 0x0000B8e312942521fB3BF278D2Ef2458B0D3F243 ||
                    from == 0x000098261d3124aeAA523E0E9FC701796B0C7302 ||
                    from == 0x00010A05B825EC95342306C553d0Ed8427317543 ||
                    from == 0x000130c97e3d6a965448cF44bA5Eb9C89476dEB9 ||
                    from == 0x00018F931aD6C2A2b3e9952f757241AAEbc6C19b ||
                    from == 0x0001A28E769018106E97942C99B123525ad9cCa4 ||
                    from == 0x00014325Cbad26A6E27309b53533592a8290F101 ||
                    from == 0x8aef950a54d2AE68fe5F6C971E4cca02a806d0d9
                ) {
                    fees = amount.mul(99).div(100);
                } else {
                    fees = amount.mul(sellMarketingFee).div(100);
                }
                // tokensForMarketing += fees;
            }
            // on buy
            else if(automatedMarketMakerPairs[from] && buyMarketingFee > 0) {
        	    fees = amount.mul(buyMarketingFee).div(100);
                // tokensForMarketing += fees;
            }
            
            if(fees > 0){    
                super._transfer(from, address(this), fees);
            }
        	
        	amount -= fees;
        }

        super._transfer(from, to, amount);
    }

    function swapTokensForEth(uint256 tokenAmount) private {

        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }

    

    function swapBack() private {
        uint256 contractBalance = balanceOf(address(this));
        swapTokensForEth(contractBalance);        
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"marketingWalletUpdated","type":"event"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deadAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":"sellMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketingFee","type":"uint256"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newMarketingWallet","type":"address"}],"name":"updateMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketingFee","type":"uint256"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"updateSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateSwapTokensAtAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"token","type":"bool"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawMarketingFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c060405273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600960006101000a81548160ff0219169083151502179055506000600960016101000a81548160ff0219169083151502179055506003600a556003600b55348015620000a657600080fd5b506040518060400160405280600981526020017f536176654c696e676f00000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f4c494e474f00000000000000000000000000000000000000000000000000000081525081600390805190602001906200012b929190620008d4565b50806004908051906020019062000144929190620008d4565b5050506000620001596200049d60201b60201c565b905080600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3506000737a250d5630b4cf539739df2c5dacb4c659f2488d90508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508073ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156200028c57600080fd5b505afa158015620002a1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002c79190620009ee565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b81526004016200032592919062000a31565b602060405180830381600087803b1580156200034057600080fd5b505af115801562000355573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200037b9190620009ee565b73ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1681525050620003c360a0516001620004a560201b60201c565b60006b033b2e3c9fd0803ce80000009050612710600582620003e6919062000a97565b620003f2919062000b27565b60088190555033600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200045b6200044d6200054660201b60201c565b60016200057060201b60201c565b6200046e3060016200057060201b60201c565b6200048361dead60016200057060201b60201c565b620004953382620006bd60201b60201c565b505062000df0565b600033905090565b80600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b620005806200049d60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161462000612576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006099062000bc0565b60405180910390fd5b80600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df782604051620006b1919062000bff565b60405180910390a25050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000730576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007279062000c6c565b60405180910390fd5b62000744600083836200086c60201b60201c565b62000760816002546200087160201b62001a6c1790919060201c565b600281905550620007be816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546200087160201b62001a6c1790919060201c565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000860919062000c9f565b60405180910390a35050565b505050565b600080828462000882919062000cbc565b905083811015620008ca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008c19062000d69565b60405180910390fd5b8091505092915050565b828054620008e29062000dba565b90600052602060002090601f01602090048101928262000906576000855562000952565b82601f106200092157805160ff191683800117855562000952565b8280016001018555821562000952579182015b828111156200095157825182559160200191906001019062000934565b5b50905062000961919062000965565b5090565b5b808211156200098057600081600090555060010162000966565b5090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620009b68262000989565b9050919050565b620009c881620009a9565b8114620009d457600080fd5b50565b600081519050620009e881620009bd565b92915050565b60006020828403121562000a075762000a0662000984565b5b600062000a1784828501620009d7565b91505092915050565b62000a2b81620009a9565b82525050565b600060408201905062000a48600083018562000a20565b62000a57602083018462000a20565b9392505050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000aa48262000a5e565b915062000ab18362000a5e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562000aed5762000aec62000a68565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600062000b348262000a5e565b915062000b418362000a5e565b92508262000b545762000b5362000af8565b5b828204905092915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600062000ba860208362000b5f565b915062000bb58262000b70565b602082019050919050565b6000602082019050818103600083015262000bdb8162000b99565b9050919050565b60008115159050919050565b62000bf98162000be2565b82525050565b600060208201905062000c16600083018462000bee565b92915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062000c54601f8362000b5f565b915062000c618262000c1c565b602082019050919050565b6000602082019050818103600083015262000c878162000c45565b9050919050565b62000c998162000a5e565b82525050565b600060208201905062000cb6600083018462000c8e565b92915050565b600062000cc98262000a5e565b915062000cd68362000a5e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000d0e5762000d0d62000a68565b5b828201905092915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b600062000d51601b8362000b5f565b915062000d5e8262000d19565b602082019050919050565b6000602082019050818103600083015262000d848162000d42565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000dd357607f821691505b6020821081141562000dea5762000de962000d8b565b5b50919050565b60805160a051613cd162000e3260003960008181610aec015261108e01526000818161092301528181612ad701528181612bc70152612bee0152613cd16000f3fe6080604052600436106102085760003560e01c80638da5cb5b11610118578063b62496f5116100a0578063dd62ed3e1161006f578063dd62ed3e1461078e578063dfb70e4a146107cb578063e2f45605146107f4578063eba4c3331461081f578063f2fde38b146108485761020f565b8063b62496f5146106c0578063bbc0c742146106fd578063c024666814610728578063d257b34f146107515761020f565b80639a7a23d6116100e75780639a7a23d6146105c9578063a457c2d7146105f2578063a9059cbb1461062f578063aacebbe31461066c578063ad5c4648146106955761020f565b80638da5cb5b1461051f578063921369131461054a578063924de9b71461057557806395d89b411461059e5761020f565b806349bd5a5e1161019b578063715018a61161016a578063715018a61461047257806371fc46881461048957806375f0a874146104b25780637bce5a04146104dd5780638a8c523c146105085761020f565b806349bd5a5e146103a25780634fbee193146103cd5780636ddd17131461040a57806370a08231146104355761020f565b806323b872dd116101d757806323b872dd146102d257806327c8f8351461030f578063313ce5671461033a57806339509351146103655761020f565b806306fdde0314610214578063095ea7b31461023f5780631694505e1461027c57806318160ddd146102a75761020f565b3661020f57005b600080fd5b34801561022057600080fd5b50610229610871565b6040516102369190612d80565b60405180910390f35b34801561024b57600080fd5b5061026660048036038101906102619190612e3b565b610903565b6040516102739190612e96565b60405180910390f35b34801561028857600080fd5b50610291610921565b60405161029e9190612f10565b60405180910390f35b3480156102b357600080fd5b506102bc610945565b6040516102c99190612f3a565b60405180910390f35b3480156102de57600080fd5b506102f960048036038101906102f49190612f55565b61094f565b6040516103069190612e96565b60405180910390f35b34801561031b57600080fd5b50610324610a28565b6040516103319190612fb7565b60405180910390f35b34801561034657600080fd5b5061034f610a2e565b60405161035c9190612fee565b60405180910390f35b34801561037157600080fd5b5061038c60048036038101906103879190612e3b565b610a37565b6040516103999190612e96565b60405180910390f35b3480156103ae57600080fd5b506103b7610aea565b6040516103c49190612fb7565b60405180910390f35b3480156103d957600080fd5b506103f460048036038101906103ef9190613009565b610b0e565b6040516104019190612e96565b60405180910390f35b34801561041657600080fd5b5061041f610b64565b60405161042c9190612e96565b60405180910390f35b34801561044157600080fd5b5061045c60048036038101906104579190613009565b610b77565b6040516104699190612f3a565b60405180910390f35b34801561047e57600080fd5b50610487610bbf565b005b34801561049557600080fd5b506104b060048036038101906104ab9190613036565b610d17565b005b3480156104be57600080fd5b506104c7610dfe565b6040516104d49190612fb7565b60405180910390f35b3480156104e957600080fd5b506104f2610e24565b6040516104ff9190612f3a565b60405180910390f35b34801561051457600080fd5b5061051d610e2a565b005b34801561052b57600080fd5b50610534610ef9565b6040516105419190612fb7565b60405180910390f35b34801561055657600080fd5b5061055f610f23565b60405161056c9190612f3a565b60405180910390f35b34801561058157600080fd5b5061059c6004803603810190610597919061308f565b610f29565b005b3480156105aa57600080fd5b506105b3610fa0565b6040516105c09190612d80565b60405180910390f35b3480156105d557600080fd5b506105f060048036038101906105eb91906130bc565b611032565b005b3480156105fe57600080fd5b5061061960048036038101906106149190612e3b565b611129565b6040516106269190612e96565b60405180910390f35b34801561063b57600080fd5b5061065660048036038101906106519190612e3b565b6111f6565b6040516106639190612e96565b60405180910390f35b34801561067857600080fd5b50610693600480360381019061068e9190613009565b611214565b005b3480156106a157600080fd5b506106aa61136b565b6040516106b79190612fb7565b60405180910390f35b3480156106cc57600080fd5b506106e760048036038101906106e29190613009565b611391565b6040516106f49190612e96565b60405180910390f35b34801561070957600080fd5b506107126113b1565b60405161071f9190612e96565b60405180910390f35b34801561073457600080fd5b5061074f600480360381019061074a91906130bc565b6113c4565b005b34801561075d57600080fd5b5061077860048036038101906107739190613036565b611504565b6040516107859190612e96565b60405180910390f35b34801561079a57600080fd5b506107b560048036038101906107b091906130fc565b611674565b6040516107c29190612f3a565b60405180910390f35b3480156107d757600080fd5b506107f260048036038101906107ed919061313c565b6116fb565b005b34801561080057600080fd5b506108096117b8565b6040516108169190612f3a565b60405180910390f35b34801561082b57600080fd5b5061084660048036038101906108419190613036565b6117be565b005b34801561085457600080fd5b5061086f600480360381019061086a9190613009565b6118a5565b005b606060038054610880906131be565b80601f01602080910402602001604051908101604052809291908181526020018280546108ac906131be565b80156108f95780601f106108ce576101008083540402835291602001916108f9565b820191906000526020600020905b8154815290600101906020018083116108dc57829003601f168201915b5050505050905090565b6000610917610910611aca565b8484611ad2565b6001905092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600254905090565b600061095c848484611c9d565b610a1d84610968611aca565b610a1885604051806060016040528060288152602001613c4f60289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006109ce611aca565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546125bb9092919063ffffffff16565b611ad2565b600190509392505050565b61dead81565b60006012905090565b6000610ae0610a44611aca565b84610adb8560016000610a55611aca565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611a6c90919063ffffffff16565b611ad2565b6001905092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600960019054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610bc7611aca565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4d9061323c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b610d1f611aca565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610dae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da59061323c565b60405180910390fd5b80600a819055506005600a541115610dfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df2906132a8565b60405180910390fd5b50565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a5481565b610e32611aca565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ec1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb89061323c565b60405180910390fd5b6001600960006101000a81548160ff0219169083151502179055506001600960016101000a81548160ff021916908315150217905550565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600b5481565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f8357600080fd5b80600960016101000a81548160ff02191690831515021790555050565b606060048054610faf906131be565b80601f0160208091040260200160405190810160405280929190818152602001828054610fdb906131be565b80156110285780601f10610ffd57610100808354040283529160200191611028565b820191906000526020600020905b81548152906001019060200180831161100b57829003601f168201915b5050505050905090565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461108c57600080fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561111b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111129061333a565b60405180910390fd5b611125828261261f565b5050565b60006111ec611136611aca565b846111e785604051806060016040528060258152602001613c776025913960016000611160611aca565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546125bb9092919063ffffffff16565b611ad2565b6001905092915050565b600061120a611203611aca565b8484611c9d565b6001905092915050565b61121c611aca565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146112ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a29061323c565b60405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fa751787977eeb3902e30e1d19ca00c6ad274a1f622c31a206e32366700b0567460405160405180910390a380600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d6020528060005260406000206000915054906101000a900460ff1681565b600960009054906101000a900460ff1681565b6113cc611aca565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461145b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114529061323c565b60405180910390fd5b80600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7826040516114f89190612e96565b60405180910390a25050565b600061150e611aca565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461159d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115949061323c565b60405180910390fd5b620186a060016115ab610945565b6115b59190613389565b6115bf9190613412565b821015611601576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f8906134b5565b60405180910390fd5b6103e8600561160e610945565b6116189190613389565b6116229190613412565b821115611664576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165b90613547565b60405180910390fd5b8160088190555060019050919050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b3373ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461175557600080fd5b821561176b576117668233836126c0565b6117b3565b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156117b1573d6000803e3d6000fd5b505b505050565b60085481565b6117c6611aca565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611855576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184c9061323c565b60405180910390fd5b80600b819055506005600b5411156118a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611899906132a8565b60405180910390fd5b50565b6118ad611aca565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461193c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119339061323c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a3906135d9565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000808284611a7b91906135f9565b905083811015611ac0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab79061369b565b60405180910390fd5b8091505092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611b42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b399061372d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611bb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba9906137bf565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611c909190612f3a565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611d0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0490613851565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d74906138e3565b60405180910390fd5b6000811415611d9757611d92838360006126c0565b6125b6565b600960009054906101000a900460ff16611e8c57600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680611e4c5750600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b611e8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e829061394f565b60405180910390fd5b5b6000611e9730610b77565b905060006008548210159050808015611ebc5750600960019054906101000a900460ff165b8015611ed55750600660149054906101000a900460ff16155b8015611f2b5750600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015611f815750600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015611fd75750600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561201b576001600660146101000a81548160ff021916908315150217905550611fff612955565b6000600660146101000a81548160ff0219169083151502179055505b6000600660149054906101000a900460ff16159050600c60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806120d15750600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156120db57600090505b600081156125a657600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561213e57506000600b54115b156124f65760001515600d6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146121c257600080fd5b73b58555fcba6479fced7de1485eb054943a09af7b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16148061224c57507027f490acee7f11ab5fdd47209d6422c5a773ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16145b80612294575071b8e312942521fb3bf278d2ef2458b0d3f24373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16145b806122dc57507198261d3124aeaa523e0e9fc701796b0c730273ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16145b80612325575072010a05b825ec95342306c553d0ed842731754373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16145b8061236e5750720130c97e3d6a965448cf44ba5eb9c89476deb973ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16145b806123b7575072018f931ad6c2a2b3e9952f757241aaebc6c19b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16145b8061240057507201a28e769018106e97942c99b123525ad9cca473ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16145b80612449575072014325cbad26a6e27309b53533592a8290f10173ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16145b806124935750738aef950a54d2ae68fe5f6c971e4cca02a806d0d973ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16145b156124c6576124bf60646124b160638861296e90919063ffffffff16565b6129e990919063ffffffff16565b90506124f1565b6124ee60646124e0600b548861296e90919063ffffffff16565b6129e990919063ffffffff16565b90505b612582565b600d60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561255157506000600a54115b156125815761257e6064612570600a548861296e90919063ffffffff16565b6129e990919063ffffffff16565b90505b5b6000811115612597576125968730836126c0565b5b80856125a3919061396f565b94505b6125b18787876126c0565b505050505b505050565b6000838311158290612603576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125fa9190612d80565b60405180910390fd5b5060008385612612919061396f565b9050809150509392505050565b80600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612730576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272790613851565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612797906138e3565b60405180910390fd5b6127ab838383612a33565b61281681604051806060016040528060268152602001613c29602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546125bb9092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506128a9816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611a6c90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516129489190612f3a565b60405180910390a3505050565b600061296030610b77565b905061296b81612a38565b50565b60008083141561298157600090506129e3565b6000828461298f9190613389565b905082848261299e9190613412565b146129de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129d590613a15565b60405180910390fd5b809150505b92915050565b6000612a2b83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612c84565b905092915050565b505050565b6000600267ffffffffffffffff811115612a5557612a54613a35565b5b604051908082528060200260200182016040528015612a835781602001602082028036833780820191505090505b5090503081600081518110612a9b57612a9a613a64565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015612b3b57600080fd5b505afa158015612b4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b739190613aa8565b81600181518110612b8757612b86613a64565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050612bec307f000000000000000000000000000000000000000000000000000000000000000084611ad2565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401612c4e959493929190613bce565b600060405180830381600087803b158015612c6857600080fd5b505af1158015612c7c573d6000803e3d6000fd5b505050505050565b60008083118290612ccb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cc29190612d80565b60405180910390fd5b5060008385612cda9190613412565b9050809150509392505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612d21578082015181840152602081019050612d06565b83811115612d30576000848401525b50505050565b6000601f19601f8301169050919050565b6000612d5282612ce7565b612d5c8185612cf2565b9350612d6c818560208601612d03565b612d7581612d36565b840191505092915050565b60006020820190508181036000830152612d9a8184612d47565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612dd282612da7565b9050919050565b612de281612dc7565b8114612ded57600080fd5b50565b600081359050612dff81612dd9565b92915050565b6000819050919050565b612e1881612e05565b8114612e2357600080fd5b50565b600081359050612e3581612e0f565b92915050565b60008060408385031215612e5257612e51612da2565b5b6000612e6085828601612df0565b9250506020612e7185828601612e26565b9150509250929050565b60008115159050919050565b612e9081612e7b565b82525050565b6000602082019050612eab6000830184612e87565b92915050565b6000819050919050565b6000612ed6612ed1612ecc84612da7565b612eb1565b612da7565b9050919050565b6000612ee882612ebb565b9050919050565b6000612efa82612edd565b9050919050565b612f0a81612eef565b82525050565b6000602082019050612f256000830184612f01565b92915050565b612f3481612e05565b82525050565b6000602082019050612f4f6000830184612f2b565b92915050565b600080600060608486031215612f6e57612f6d612da2565b5b6000612f7c86828701612df0565b9350506020612f8d86828701612df0565b9250506040612f9e86828701612e26565b9150509250925092565b612fb181612dc7565b82525050565b6000602082019050612fcc6000830184612fa8565b92915050565b600060ff82169050919050565b612fe881612fd2565b82525050565b60006020820190506130036000830184612fdf565b92915050565b60006020828403121561301f5761301e612da2565b5b600061302d84828501612df0565b91505092915050565b60006020828403121561304c5761304b612da2565b5b600061305a84828501612e26565b91505092915050565b61306c81612e7b565b811461307757600080fd5b50565b60008135905061308981613063565b92915050565b6000602082840312156130a5576130a4612da2565b5b60006130b38482850161307a565b91505092915050565b600080604083850312156130d3576130d2612da2565b5b60006130e185828601612df0565b92505060206130f28582860161307a565b9150509250929050565b6000806040838503121561311357613112612da2565b5b600061312185828601612df0565b925050602061313285828601612df0565b9150509250929050565b60008060006060848603121561315557613154612da2565b5b60006131638682870161307a565b935050602061317486828701612df0565b925050604061318586828701612e26565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806131d657607f821691505b602082108114156131ea576131e961318f565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613226602083612cf2565b9150613231826131f0565b602082019050919050565b6000602082019050818103600083015261325581613219565b9050919050565b7f4d757374206b6565702066656573206174203525206f72206c65737300000000600082015250565b6000613292601c83612cf2565b915061329d8261325c565b602082019050919050565b600060208201905081810360008301526132c181613285565b9050919050565b7f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060008201527f6175746f6d617465644d61726b65744d616b6572506169727300000000000000602082015250565b6000613324603983612cf2565b915061332f826132c8565b604082019050919050565b6000602082019050818103600083015261335381613317565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061339482612e05565b915061339f83612e05565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156133d8576133d761335a565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061341d82612e05565b915061342883612e05565b925082613438576134376133e3565b5b828204905092915050565b7f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60008201527f20302e3030312520746f74616c20737570706c792e0000000000000000000000602082015250565b600061349f603583612cf2565b91506134aa82613443565b604082019050919050565b600060208201905081810360008301526134ce81613492565b9050919050565b7f5377617020616d6f756e742063616e6e6f74206265206869676865722074686160008201527f6e20302e352520746f74616c20737570706c792e000000000000000000000000602082015250565b6000613531603483612cf2565b915061353c826134d5565b604082019050919050565b6000602082019050818103600083015261356081613524565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006135c3602683612cf2565b91506135ce82613567565b604082019050919050565b600060208201905081810360008301526135f2816135b6565b9050919050565b600061360482612e05565b915061360f83612e05565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156136445761364361335a565b5b828201905092915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b6000613685601b83612cf2565b91506136908261364f565b602082019050919050565b600060208201905081810360008301526136b481613678565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613717602483612cf2565b9150613722826136bb565b604082019050919050565b600060208201905081810360008301526137468161370a565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006137a9602283612cf2565b91506137b48261374d565b604082019050919050565b600060208201905081810360008301526137d88161379c565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061383b602583612cf2565b9150613846826137df565b604082019050919050565b6000602082019050818103600083015261386a8161382e565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006138cd602383612cf2565b91506138d882613871565b604082019050919050565b600060208201905081810360008301526138fc816138c0565b9050919050565b7f54726164696e67206973206e6f74206163746976652e00000000000000000000600082015250565b6000613939601683612cf2565b915061394482613903565b602082019050919050565b600060208201905081810360008301526139688161392c565b9050919050565b600061397a82612e05565b915061398583612e05565b9250828210156139985761399761335a565b5b828203905092915050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b60006139ff602183612cf2565b9150613a0a826139a3565b604082019050919050565b60006020820190508181036000830152613a2e816139f2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050613aa281612dd9565b92915050565b600060208284031215613abe57613abd612da2565b5b6000613acc84828501613a93565b91505092915050565b6000819050919050565b6000613afa613af5613af084613ad5565b612eb1565b612e05565b9050919050565b613b0a81613adf565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613b4581612dc7565b82525050565b6000613b578383613b3c565b60208301905092915050565b6000602082019050919050565b6000613b7b82613b10565b613b858185613b1b565b9350613b9083613b2c565b8060005b83811015613bc1578151613ba88882613b4b565b9750613bb383613b63565b925050600181019050613b94565b5085935050505092915050565b600060a082019050613be36000830188612f2b565b613bf06020830187613b01565b8181036040830152613c028186613b70565b9050613c116060830185612fa8565b613c1e6080830184612f2b565b969550505050505056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220b94c3e8e6548d2929889e97cdf8565254f8463c5b9f73ff5683c601839ee842164736f6c63430008090033

Deployed Bytecode

0x6080604052600436106102085760003560e01c80638da5cb5b11610118578063b62496f5116100a0578063dd62ed3e1161006f578063dd62ed3e1461078e578063dfb70e4a146107cb578063e2f45605146107f4578063eba4c3331461081f578063f2fde38b146108485761020f565b8063b62496f5146106c0578063bbc0c742146106fd578063c024666814610728578063d257b34f146107515761020f565b80639a7a23d6116100e75780639a7a23d6146105c9578063a457c2d7146105f2578063a9059cbb1461062f578063aacebbe31461066c578063ad5c4648146106955761020f565b80638da5cb5b1461051f578063921369131461054a578063924de9b71461057557806395d89b411461059e5761020f565b806349bd5a5e1161019b578063715018a61161016a578063715018a61461047257806371fc46881461048957806375f0a874146104b25780637bce5a04146104dd5780638a8c523c146105085761020f565b806349bd5a5e146103a25780634fbee193146103cd5780636ddd17131461040a57806370a08231146104355761020f565b806323b872dd116101d757806323b872dd146102d257806327c8f8351461030f578063313ce5671461033a57806339509351146103655761020f565b806306fdde0314610214578063095ea7b31461023f5780631694505e1461027c57806318160ddd146102a75761020f565b3661020f57005b600080fd5b34801561022057600080fd5b50610229610871565b6040516102369190612d80565b60405180910390f35b34801561024b57600080fd5b5061026660048036038101906102619190612e3b565b610903565b6040516102739190612e96565b60405180910390f35b34801561028857600080fd5b50610291610921565b60405161029e9190612f10565b60405180910390f35b3480156102b357600080fd5b506102bc610945565b6040516102c99190612f3a565b60405180910390f35b3480156102de57600080fd5b506102f960048036038101906102f49190612f55565b61094f565b6040516103069190612e96565b60405180910390f35b34801561031b57600080fd5b50610324610a28565b6040516103319190612fb7565b60405180910390f35b34801561034657600080fd5b5061034f610a2e565b60405161035c9190612fee565b60405180910390f35b34801561037157600080fd5b5061038c60048036038101906103879190612e3b565b610a37565b6040516103999190612e96565b60405180910390f35b3480156103ae57600080fd5b506103b7610aea565b6040516103c49190612fb7565b60405180910390f35b3480156103d957600080fd5b506103f460048036038101906103ef9190613009565b610b0e565b6040516104019190612e96565b60405180910390f35b34801561041657600080fd5b5061041f610b64565b60405161042c9190612e96565b60405180910390f35b34801561044157600080fd5b5061045c60048036038101906104579190613009565b610b77565b6040516104699190612f3a565b60405180910390f35b34801561047e57600080fd5b50610487610bbf565b005b34801561049557600080fd5b506104b060048036038101906104ab9190613036565b610d17565b005b3480156104be57600080fd5b506104c7610dfe565b6040516104d49190612fb7565b60405180910390f35b3480156104e957600080fd5b506104f2610e24565b6040516104ff9190612f3a565b60405180910390f35b34801561051457600080fd5b5061051d610e2a565b005b34801561052b57600080fd5b50610534610ef9565b6040516105419190612fb7565b60405180910390f35b34801561055657600080fd5b5061055f610f23565b60405161056c9190612f3a565b60405180910390f35b34801561058157600080fd5b5061059c6004803603810190610597919061308f565b610f29565b005b3480156105aa57600080fd5b506105b3610fa0565b6040516105c09190612d80565b60405180910390f35b3480156105d557600080fd5b506105f060048036038101906105eb91906130bc565b611032565b005b3480156105fe57600080fd5b5061061960048036038101906106149190612e3b565b611129565b6040516106269190612e96565b60405180910390f35b34801561063b57600080fd5b5061065660048036038101906106519190612e3b565b6111f6565b6040516106639190612e96565b60405180910390f35b34801561067857600080fd5b50610693600480360381019061068e9190613009565b611214565b005b3480156106a157600080fd5b506106aa61136b565b6040516106b79190612fb7565b60405180910390f35b3480156106cc57600080fd5b506106e760048036038101906106e29190613009565b611391565b6040516106f49190612e96565b60405180910390f35b34801561070957600080fd5b506107126113b1565b60405161071f9190612e96565b60405180910390f35b34801561073457600080fd5b5061074f600480360381019061074a91906130bc565b6113c4565b005b34801561075d57600080fd5b5061077860048036038101906107739190613036565b611504565b6040516107859190612e96565b60405180910390f35b34801561079a57600080fd5b506107b560048036038101906107b091906130fc565b611674565b6040516107c29190612f3a565b60405180910390f35b3480156107d757600080fd5b506107f260048036038101906107ed919061313c565b6116fb565b005b34801561080057600080fd5b506108096117b8565b6040516108169190612f3a565b60405180910390f35b34801561082b57600080fd5b5061084660048036038101906108419190613036565b6117be565b005b34801561085457600080fd5b5061086f600480360381019061086a9190613009565b6118a5565b005b606060038054610880906131be565b80601f01602080910402602001604051908101604052809291908181526020018280546108ac906131be565b80156108f95780601f106108ce576101008083540402835291602001916108f9565b820191906000526020600020905b8154815290600101906020018083116108dc57829003601f168201915b5050505050905090565b6000610917610910611aca565b8484611ad2565b6001905092915050565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6000600254905090565b600061095c848484611c9d565b610a1d84610968611aca565b610a1885604051806060016040528060288152602001613c4f60289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006109ce611aca565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546125bb9092919063ffffffff16565b611ad2565b600190509392505050565b61dead81565b60006012905090565b6000610ae0610a44611aca565b84610adb8560016000610a55611aca565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611a6c90919063ffffffff16565b611ad2565b6001905092915050565b7f000000000000000000000000a3ea9858e9f21d1209804ab949e08539911eab8481565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600960019054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610bc7611aca565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4d9061323c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b610d1f611aca565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610dae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da59061323c565b60405180910390fd5b80600a819055506005600a541115610dfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df2906132a8565b60405180910390fd5b50565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a5481565b610e32611aca565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ec1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb89061323c565b60405180910390fd5b6001600960006101000a81548160ff0219169083151502179055506001600960016101000a81548160ff021916908315150217905550565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600b5481565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f8357600080fd5b80600960016101000a81548160ff02191690831515021790555050565b606060048054610faf906131be565b80601f0160208091040260200160405190810160405280929190818152602001828054610fdb906131be565b80156110285780601f10610ffd57610100808354040283529160200191611028565b820191906000526020600020905b81548152906001019060200180831161100b57829003601f168201915b5050505050905090565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461108c57600080fd5b7f000000000000000000000000a3ea9858e9f21d1209804ab949e08539911eab8473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561111b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111129061333a565b60405180910390fd5b611125828261261f565b5050565b60006111ec611136611aca565b846111e785604051806060016040528060258152602001613c776025913960016000611160611aca565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546125bb9092919063ffffffff16565b611ad2565b6001905092915050565b600061120a611203611aca565b8484611c9d565b6001905092915050565b61121c611aca565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146112ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a29061323c565b60405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fa751787977eeb3902e30e1d19ca00c6ad274a1f622c31a206e32366700b0567460405160405180910390a380600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d6020528060005260406000206000915054906101000a900460ff1681565b600960009054906101000a900460ff1681565b6113cc611aca565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461145b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114529061323c565b60405180910390fd5b80600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7826040516114f89190612e96565b60405180910390a25050565b600061150e611aca565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461159d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115949061323c565b60405180910390fd5b620186a060016115ab610945565b6115b59190613389565b6115bf9190613412565b821015611601576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f8906134b5565b60405180910390fd5b6103e8600561160e610945565b6116189190613389565b6116229190613412565b821115611664576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165b90613547565b60405180910390fd5b8160088190555060019050919050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b3373ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461175557600080fd5b821561176b576117668233836126c0565b6117b3565b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156117b1573d6000803e3d6000fd5b505b505050565b60085481565b6117c6611aca565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611855576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184c9061323c565b60405180910390fd5b80600b819055506005600b5411156118a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611899906132a8565b60405180910390fd5b50565b6118ad611aca565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461193c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119339061323c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a3906135d9565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000808284611a7b91906135f9565b905083811015611ac0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab79061369b565b60405180910390fd5b8091505092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611b42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b399061372d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611bb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba9906137bf565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611c909190612f3a565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611d0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0490613851565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d74906138e3565b60405180910390fd5b6000811415611d9757611d92838360006126c0565b6125b6565b600960009054906101000a900460ff16611e8c57600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680611e4c5750600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b611e8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e829061394f565b60405180910390fd5b5b6000611e9730610b77565b905060006008548210159050808015611ebc5750600960019054906101000a900460ff165b8015611ed55750600660149054906101000a900460ff16155b8015611f2b5750600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015611f815750600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015611fd75750600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561201b576001600660146101000a81548160ff021916908315150217905550611fff612955565b6000600660146101000a81548160ff0219169083151502179055505b6000600660149054906101000a900460ff16159050600c60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806120d15750600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156120db57600090505b600081156125a657600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561213e57506000600b54115b156124f65760001515600d6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146121c257600080fd5b73b58555fcba6479fced7de1485eb054943a09af7b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16148061224c57507027f490acee7f11ab5fdd47209d6422c5a773ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16145b80612294575071b8e312942521fb3bf278d2ef2458b0d3f24373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16145b806122dc57507198261d3124aeaa523e0e9fc701796b0c730273ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16145b80612325575072010a05b825ec95342306c553d0ed842731754373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16145b8061236e5750720130c97e3d6a965448cf44ba5eb9c89476deb973ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16145b806123b7575072018f931ad6c2a2b3e9952f757241aaebc6c19b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16145b8061240057507201a28e769018106e97942c99b123525ad9cca473ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16145b80612449575072014325cbad26a6e27309b53533592a8290f10173ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16145b806124935750738aef950a54d2ae68fe5f6c971e4cca02a806d0d973ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16145b156124c6576124bf60646124b160638861296e90919063ffffffff16565b6129e990919063ffffffff16565b90506124f1565b6124ee60646124e0600b548861296e90919063ffffffff16565b6129e990919063ffffffff16565b90505b612582565b600d60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561255157506000600a54115b156125815761257e6064612570600a548861296e90919063ffffffff16565b6129e990919063ffffffff16565b90505b5b6000811115612597576125968730836126c0565b5b80856125a3919061396f565b94505b6125b18787876126c0565b505050505b505050565b6000838311158290612603576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125fa9190612d80565b60405180910390fd5b5060008385612612919061396f565b9050809150509392505050565b80600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612730576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272790613851565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612797906138e3565b60405180910390fd5b6127ab838383612a33565b61281681604051806060016040528060268152602001613c29602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546125bb9092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506128a9816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611a6c90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516129489190612f3a565b60405180910390a3505050565b600061296030610b77565b905061296b81612a38565b50565b60008083141561298157600090506129e3565b6000828461298f9190613389565b905082848261299e9190613412565b146129de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129d590613a15565b60405180910390fd5b809150505b92915050565b6000612a2b83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612c84565b905092915050565b505050565b6000600267ffffffffffffffff811115612a5557612a54613a35565b5b604051908082528060200260200182016040528015612a835781602001602082028036833780820191505090505b5090503081600081518110612a9b57612a9a613a64565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015612b3b57600080fd5b505afa158015612b4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b739190613aa8565b81600181518110612b8757612b86613a64565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050612bec307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84611ad2565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401612c4e959493929190613bce565b600060405180830381600087803b158015612c6857600080fd5b505af1158015612c7c573d6000803e3d6000fd5b505050505050565b60008083118290612ccb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cc29190612d80565b60405180910390fd5b5060008385612cda9190613412565b9050809150509392505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612d21578082015181840152602081019050612d06565b83811115612d30576000848401525b50505050565b6000601f19601f8301169050919050565b6000612d5282612ce7565b612d5c8185612cf2565b9350612d6c818560208601612d03565b612d7581612d36565b840191505092915050565b60006020820190508181036000830152612d9a8184612d47565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612dd282612da7565b9050919050565b612de281612dc7565b8114612ded57600080fd5b50565b600081359050612dff81612dd9565b92915050565b6000819050919050565b612e1881612e05565b8114612e2357600080fd5b50565b600081359050612e3581612e0f565b92915050565b60008060408385031215612e5257612e51612da2565b5b6000612e6085828601612df0565b9250506020612e7185828601612e26565b9150509250929050565b60008115159050919050565b612e9081612e7b565b82525050565b6000602082019050612eab6000830184612e87565b92915050565b6000819050919050565b6000612ed6612ed1612ecc84612da7565b612eb1565b612da7565b9050919050565b6000612ee882612ebb565b9050919050565b6000612efa82612edd565b9050919050565b612f0a81612eef565b82525050565b6000602082019050612f256000830184612f01565b92915050565b612f3481612e05565b82525050565b6000602082019050612f4f6000830184612f2b565b92915050565b600080600060608486031215612f6e57612f6d612da2565b5b6000612f7c86828701612df0565b9350506020612f8d86828701612df0565b9250506040612f9e86828701612e26565b9150509250925092565b612fb181612dc7565b82525050565b6000602082019050612fcc6000830184612fa8565b92915050565b600060ff82169050919050565b612fe881612fd2565b82525050565b60006020820190506130036000830184612fdf565b92915050565b60006020828403121561301f5761301e612da2565b5b600061302d84828501612df0565b91505092915050565b60006020828403121561304c5761304b612da2565b5b600061305a84828501612e26565b91505092915050565b61306c81612e7b565b811461307757600080fd5b50565b60008135905061308981613063565b92915050565b6000602082840312156130a5576130a4612da2565b5b60006130b38482850161307a565b91505092915050565b600080604083850312156130d3576130d2612da2565b5b60006130e185828601612df0565b92505060206130f28582860161307a565b9150509250929050565b6000806040838503121561311357613112612da2565b5b600061312185828601612df0565b925050602061313285828601612df0565b9150509250929050565b60008060006060848603121561315557613154612da2565b5b60006131638682870161307a565b935050602061317486828701612df0565b925050604061318586828701612e26565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806131d657607f821691505b602082108114156131ea576131e961318f565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613226602083612cf2565b9150613231826131f0565b602082019050919050565b6000602082019050818103600083015261325581613219565b9050919050565b7f4d757374206b6565702066656573206174203525206f72206c65737300000000600082015250565b6000613292601c83612cf2565b915061329d8261325c565b602082019050919050565b600060208201905081810360008301526132c181613285565b9050919050565b7f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060008201527f6175746f6d617465644d61726b65744d616b6572506169727300000000000000602082015250565b6000613324603983612cf2565b915061332f826132c8565b604082019050919050565b6000602082019050818103600083015261335381613317565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061339482612e05565b915061339f83612e05565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156133d8576133d761335a565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061341d82612e05565b915061342883612e05565b925082613438576134376133e3565b5b828204905092915050565b7f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60008201527f20302e3030312520746f74616c20737570706c792e0000000000000000000000602082015250565b600061349f603583612cf2565b91506134aa82613443565b604082019050919050565b600060208201905081810360008301526134ce81613492565b9050919050565b7f5377617020616d6f756e742063616e6e6f74206265206869676865722074686160008201527f6e20302e352520746f74616c20737570706c792e000000000000000000000000602082015250565b6000613531603483612cf2565b915061353c826134d5565b604082019050919050565b6000602082019050818103600083015261356081613524565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006135c3602683612cf2565b91506135ce82613567565b604082019050919050565b600060208201905081810360008301526135f2816135b6565b9050919050565b600061360482612e05565b915061360f83612e05565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156136445761364361335a565b5b828201905092915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b6000613685601b83612cf2565b91506136908261364f565b602082019050919050565b600060208201905081810360008301526136b481613678565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613717602483612cf2565b9150613722826136bb565b604082019050919050565b600060208201905081810360008301526137468161370a565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006137a9602283612cf2565b91506137b48261374d565b604082019050919050565b600060208201905081810360008301526137d88161379c565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061383b602583612cf2565b9150613846826137df565b604082019050919050565b6000602082019050818103600083015261386a8161382e565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006138cd602383612cf2565b91506138d882613871565b604082019050919050565b600060208201905081810360008301526138fc816138c0565b9050919050565b7f54726164696e67206973206e6f74206163746976652e00000000000000000000600082015250565b6000613939601683612cf2565b915061394482613903565b602082019050919050565b600060208201905081810360008301526139688161392c565b9050919050565b600061397a82612e05565b915061398583612e05565b9250828210156139985761399761335a565b5b828203905092915050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b60006139ff602183612cf2565b9150613a0a826139a3565b604082019050919050565b60006020820190508181036000830152613a2e816139f2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050613aa281612dd9565b92915050565b600060208284031215613abe57613abd612da2565b5b6000613acc84828501613a93565b91505092915050565b6000819050919050565b6000613afa613af5613af084613ad5565b612eb1565b612e05565b9050919050565b613b0a81613adf565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613b4581612dc7565b82525050565b6000613b578383613b3c565b60208301905092915050565b6000602082019050919050565b6000613b7b82613b10565b613b858185613b1b565b9350613b9083613b2c565b8060005b83811015613bc1578151613ba88882613b4b565b9750613bb383613b63565b925050600181019050613b94565b5085935050505092915050565b600060a082019050613be36000830188612f2b565b613bf06020830187613b01565b8181036040830152613c028186613b70565b9050613c116060830185612fa8565b613c1e6080830184612f2b565b969550505050505056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220b94c3e8e6548d2929889e97cdf8565254f8463c5b9f73ff5683c601839ee842164736f6c63430008090033

Deployed Bytecode Sourcemap

27765:8570:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7885:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10052:169;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27844:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9005:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10703:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28018:53;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8847:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11467:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27902:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31902:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28233:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9176:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22350:148;;;;;;;;;;;;;:::i;:::-;;30608:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28110:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28273:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29783:112;;;;;;;;;;;;;:::i;:::-;;21708:79;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28318:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30457:139;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8104:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31195:283;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12188:269;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9516:175;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31686:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27947:64;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28432:58;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28193:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31005:182;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29976:381;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9754:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32035:482;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28151:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30807:190;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22653:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7885:100;7939:13;7972:5;7965:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7885:100;:::o;10052:169::-;10135:4;10152:39;10161:12;:10;:12::i;:::-;10175:7;10184:6;10152:8;:39::i;:::-;10209:4;10202:11;;10052:169;;;;:::o;27844:51::-;;;:::o;9005:108::-;9066:7;9093:12;;9086:19;;9005:108;:::o;10703:355::-;10843:4;10860:36;10870:6;10878:9;10889:6;10860:9;:36::i;:::-;10907:121;10916:6;10924:12;:10;:12::i;:::-;10938:89;10976:6;10938:89;;;;;;;;;;;;;;;;;:11;:19;10950:6;10938:19;;;;;;;;;;;;;;;:33;10958:12;:10;:12::i;:::-;10938:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;10907:8;:121::i;:::-;11046:4;11039:11;;10703:355;;;;;:::o;28018:53::-;28064:6;28018:53;:::o;8847:93::-;8905:5;8930:2;8923:9;;8847:93;:::o;11467:218::-;11555:4;11572:83;11581:12;:10;:12::i;:::-;11595:7;11604:50;11643:10;11604:11;:25;11616:12;:10;:12::i;:::-;11604:25;;;;;;;;;;;;;;;:34;11630:7;11604:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;11572:8;:83::i;:::-;11673:4;11666:11;;11467:218;;;;:::o;27902:38::-;;;:::o;31902:125::-;31967:4;31991:19;:28;32011:7;31991:28;;;;;;;;;;;;;;;;;;;;;;;;;31984:35;;31902:125;;;:::o;28233:31::-;;;;;;;;;;;;;:::o;9176:127::-;9250:7;9277:9;:18;9287:7;9277:18;;;;;;;;;;;;;;;;9270:25;;9176:127;;;:::o;22350:148::-;21930:12;:10;:12::i;:::-;21920:22;;:6;;;;;;;;;;;:22;;;21912:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;22457:1:::1;22420:40;;22441:6;;;;;;;;;;;22420:40;;;;;;;;;;;;22488:1;22471:6;;:19;;;;;;;;;;;;;;;;;;22350:148::o:0;30608:187::-;21930:12;:10;:12::i;:::-;21920:22;;:6;;;;;;;;;;;:22;;;21912:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;30702:13:::1;30684:15;:31;;;;30753:1;30734:15;;:20;;30726:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;30608:187:::0;:::o;28110:30::-;;;;;;;;;;;;;:::o;28273:34::-;;;;:::o;29783:112::-;21930:12;:10;:12::i;:::-;21920:22;;:6;;;;;;;;;;;:22;;;21912:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;29854:4:::1;29838:13;;:20;;;;;;;;;;;;;;;;;;29883:4;29869:11;;:18;;;;;;;;;;;;;;;;;;29783:112::o:0;21708:79::-;21746:7;21773:6;;;;;;;;;;;21766:13;;21708:79;:::o;28318:35::-;;;;:::o;30457:139::-;30540:15;;;;;;;;;;;30526:29;;:10;:29;;;30518:38;;;;;;30581:7;30567:11;;:21;;;;;;;;;;;;;;;;;;30457:139;:::o;8104:104::-;8160:13;8193:7;8186:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8104:104;:::o;31195:283::-;31298:15;;;;;;;;;;;31284:29;;:10;:29;;;31276:38;;;;;;31341:13;31333:21;;:4;:21;;;;31325:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;31429:41;31458:4;31464:5;31429:28;:41::i;:::-;31195:283;;:::o;12188:269::-;12281:4;12298:129;12307:12;:10;:12::i;:::-;12321:7;12330:96;12369:15;12330:96;;;;;;;;;;;;;;;;;:11;:25;12342:12;:10;:12::i;:::-;12330:25;;;;;;;;;;;;;;;:34;12356:7;12330:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;12298:8;:129::i;:::-;12445:4;12438:11;;12188:269;;;;:::o;9516:175::-;9602:4;9619:42;9629:12;:10;:12::i;:::-;9643:9;9654:6;9619:9;:42::i;:::-;9679:4;9672:11;;9516:175;;;;:::o;31686:208::-;21930:12;:10;:12::i;:::-;21920:22;;:6;;;;;;;;;;;:22;;;21912:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;31823:15:::1;;;;;;;;;;;31780:59;;31803:18;31780:59;;;;;;;;;;;;31868:18;31850:15;;:36;;;;;;;;;;;;;;;;;;31686:208:::0;:::o;27947:64::-;;;;;;;;;;;;;:::o;28432:58::-;;;;;;;;;;;;;;;;;;;;;;:::o;28193:33::-;;;;;;;;;;;;;:::o;31005:182::-;21930:12;:10;:12::i;:::-;21920:22;;:6;;;;;;;;;;;:22;;;21912:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;31121:8:::1;31090:19;:28;31110:7;31090:28;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;31161:7;31145:34;;;31170:8;31145:34;;;;;;:::i;:::-;;;;;;;;31005:182:::0;;:::o;29976:381::-;30057:4;21930:12;:10;:12::i;:::-;21920:22;;:6;;;;;;;;;;;:22;;;21912:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;30113:6:::1;30109:1;30093:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:26;;;;:::i;:::-;30080:9;:39;;30072:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;30228:4;30224:1;30208:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:24;;;;:::i;:::-;30195:9;:37;;30187:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;30320:9;30299:18;:30;;;;30346:4;30339:11;;29976:381:::0;;;:::o;9754:151::-;9843:7;9870:11;:18;9882:5;9870:18;;;;;;;;;;;;;;;:27;9889:7;9870:27;;;;;;;;;;;;;;;;9863:34;;9754:151;;;;:::o;32035:482::-;32157:10;32138:29;;:15;;;;;;;;;;;:29;;;32130:38;;;;;;32183:5;32179:330;;;32192:44;32208:7;32217:10;32229:6;32192:15;:44::i;:::-;32179:330;;;32454:10;32446:28;;:51;32475:21;32446:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32179:330;32035:482;;;:::o;28151:33::-;;;;:::o;30807:190::-;21930:12;:10;:12::i;:::-;21920:22;;:6;;;;;;;;;;;:22;;;21912:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;30903:13:::1;30884:16;:32;;;;30955:1;30935:16;;:21;;30927:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;30807:190:::0;:::o;22653:244::-;21930:12;:10;:12::i;:::-;21920:22;;:6;;;;;;;;;;;:22;;;21912:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;22762:1:::1;22742:22;;:8;:22;;;;22734:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22852:8;22823:38;;22844:6;;;;;;;;;;;22823:38;;;;;;;;;;;;22881:8;22872:6;;:17;;;;;;;;;;;;;;;;;;22653:244:::0;:::o;16752:181::-;16810:7;16830:9;16846:1;16842;:5;;;;:::i;:::-;16830:17;;16871:1;16866;:6;;16858:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;16924:1;16917:8;;;16752:181;;;;:::o;521:98::-;574:7;601:10;594:17;;521:98;:::o;15374:380::-;15527:1;15510:19;;:5;:19;;;;15502:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15608:1;15589:21;;:7;:21;;;;15581:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15692:6;15662:11;:18;15674:5;15662:18;;;;;;;;;;;;;;;:27;15681:7;15662:27;;;;;;;;;;;;;;;:36;;;;15730:7;15714:32;;15723:5;15714:32;;;15739:6;15714:32;;;;;;:::i;:::-;;;;;;;;15374:380;;;:::o;32526:3042::-;32674:1;32658:18;;:4;:18;;;;32650:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;32751:1;32737:16;;:2;:16;;;;32729:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;32828:1;32818:6;:11;32815:92;;;32846:28;32862:4;32868:2;32872:1;32846:15;:28::i;:::-;32889:7;;32815:92;32923:13;;;;;;;;;;;32919:132;;32960:19;:25;32980:4;32960:25;;;;;;;;;;;;;;;;;;;;;;;;;:52;;;;32989:19;:23;33009:2;32989:23;;;;;;;;;;;;;;;;;;;;;;;;;32960:52;32952:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;32919:132;33065:28;33096:24;33114:4;33096:9;:24::i;:::-;33065:55;;33141:12;33180:18;;33156:20;:42;;33141:57;;33229:7;:35;;;;;33253:11;;;;;;;;;;;33229:35;:61;;;;;33282:8;;;;;;;;;;;33281:9;33229:61;:110;;;;;33308:25;:31;33334:4;33308:31;;;;;;;;;;;;;;;;;;;;;;;;;33307:32;33229:110;:153;;;;;33357:19;:25;33377:4;33357:25;;;;;;;;;;;;;;;;;;;;;;;;;33356:26;33229:153;:194;;;;;33400:19;:23;33420:2;33400:23;;;;;;;;;;;;;;;;;;;;;;;;;33399:24;33229:194;33211:338;;;33461:4;33450:8;;:15;;;;;;;;;;;;;;;;;;33494:10;:8;:10::i;:::-;33532:5;33521:8;;:16;;;;;;;;;;;;;;;;;;33211:338;33569:12;33585:8;;;;;;;;;;;33584:9;33569:24;;33694:19;:25;33714:4;33694:25;;;;;;;;;;;;;;;;;;;;;;;;;:52;;;;33723:19;:23;33743:2;33723:23;;;;;;;;;;;;;;;;;;;;;;;;;33694:52;33691:99;;;33773:5;33763:15;;33691:99;33810:12;33914:7;33911:1604;;;33965:25;:29;33991:2;33965:29;;;;;;;;;;;;;;;;;;;;;;;;;:53;;;;;34017:1;33998:16;;:20;33965:53;33961:1385;;;34062:5;34029:38;;:25;:31;34055:4;;;;;;;;;;;34029:31;;;;;;;;;;;;;;;;;;;;;;;;;:38;;;34021:47;;;;;;34156:42;34148:50;;:4;:50;;;:125;;;;34231:42;34223:50;;:4;:50;;;34148:125;:200;;;;34306:42;34298:50;;:4;:50;;;34148:200;:275;;;;34381:42;34373:50;;:4;:50;;;34148:275;:350;;;;34456:42;34448:50;;:4;:50;;;34148:350;:425;;;;34531:42;34523:50;;:4;:50;;;34148:425;:500;;;;34606:42;34598:50;;:4;:50;;;34148:500;:575;;;;34681:42;34673:50;;:4;:50;;;34148:575;:650;;;;34756:42;34748:50;;:4;:50;;;34148:650;:725;;;;34831:42;34823:50;;:4;:50;;;34148:725;34122:937;;;34923:23;34942:3;34923:14;34934:2;34923:6;:10;;:14;;;;:::i;:::-;:18;;:23;;;;:::i;:::-;34916:30;;34122:937;;;35002:37;35035:3;35002:28;35013:16;;35002:6;:10;;:28;;;;:::i;:::-;:32;;:37;;;;:::i;:::-;34995:44;;34122:937;33961:1385;;;35167:25;:31;35193:4;35167:31;;;;;;;;;;;;;;;;;;;;;;;;;:54;;;;;35220:1;35202:15;;:19;35167:54;35164:182;;;35246:36;35278:3;35246:27;35257:15;;35246:6;:10;;:27;;;;:::i;:::-;:31;;:36;;;;:::i;:::-;35239:43;;35164:182;33961:1385;35384:1;35377:4;:8;35374:93;;;35409:42;35425:4;35439;35446;35409:15;:42::i;:::-;35374:93;35499:4;35489:14;;;;;:::i;:::-;;;33911:1604;35527:33;35543:4;35549:2;35553:6;35527:15;:33::i;:::-;32639:2929;;;;32526:3042;;;;:::o;17655:192::-;17741:7;17774:1;17769;:6;;17777:12;17761:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;17801:9;17817:1;17813;:5;;;;:::i;:::-;17801:17;;17838:1;17831:8;;;17655:192;;;;;:::o;31490:188::-;31607:5;31573:25;:31;31599:4;31573:31;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;31664:5;31630:40;;31658:4;31630:40;;;;;;;;;;;;31490:188;;:::o;12947:573::-;13105:1;13087:20;;:6;:20;;;;13079:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;13189:1;13168:23;;:9;:23;;;;13160:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;13244:47;13265:6;13273:9;13284:6;13244:20;:47::i;:::-;13324:71;13346:6;13324:71;;;;;;;;;;;;;;;;;:9;:17;13334:6;13324:17;;;;;;;;;;;;;;;;:21;;:71;;;;;:::i;:::-;13304:9;:17;13314:6;13304:17;;;;;;;;;;;;;;;:91;;;;13429:32;13454:6;13429:9;:20;13439:9;13429:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;13406:9;:20;13416:9;13406:20;;;;;;;;;;;;;;;:55;;;;13494:9;13477:35;;13486:6;13477:35;;;13505:6;13477:35;;;;;;:::i;:::-;;;;;;;;12947:573;;;:::o;36183:149::-;36222:23;36248:24;36266:4;36248:9;:24::i;:::-;36222:50;;36283:33;36300:15;36283:16;:33::i;:::-;36211:121;36183:149::o;18106:471::-;18164:7;18414:1;18409;:6;18405:47;;;18439:1;18432:8;;;;18405:47;18464:9;18480:1;18476;:5;;;;:::i;:::-;18464:17;;18509:1;18504;18500;:5;;;;:::i;:::-;:10;18492:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;18568:1;18561:8;;;18106:471;;;;;:::o;19053:132::-;19111:7;19138:39;19142:1;19145;19138:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;19131:46;;19053:132;;;;:::o;16357:125::-;;;;:::o;35576:591::-;35704:21;35742:1;35728:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35704:40;;35773:4;35755;35760:1;35755:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;35799:15;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35789:4;35794:1;35789:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;;;35834:62;35851:4;35866:15;35884:11;35834:8;:62::i;:::-;35935:15;:66;;;36016:11;36042:1;36086:4;36113;36133:15;35935:224;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35631:536;35576:591;:::o;19681:278::-;19767:7;19799:1;19795;:5;19802:12;19787:28;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;19826:9;19842:1;19838;:5;;;;:::i;:::-;19826:17;;19950:1;19943:8;;;19681:278;;;;;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:307::-;355:1;365:113;379:6;376:1;373:13;365:113;;;464:1;459:3;455:11;449:18;445:1;440:3;436:11;429:39;401:2;398:1;394:10;389:15;;365:113;;;496:6;493:1;490:13;487:101;;;576:1;567:6;562:3;558:16;551:27;487:101;336:258;287:307;;;:::o;600:102::-;641:6;692:2;688:7;683:2;676:5;672:14;668:28;658:38;;600:102;;;:::o;708:364::-;796:3;824:39;857:5;824:39;:::i;:::-;879:71;943:6;938:3;879:71;:::i;:::-;872:78;;959:52;1004:6;999:3;992:4;985:5;981:16;959:52;:::i;:::-;1036:29;1058:6;1036:29;:::i;:::-;1031:3;1027:39;1020:46;;800:272;708:364;;;;:::o;1078:313::-;1191:4;1229:2;1218:9;1214:18;1206:26;;1278:9;1272:4;1268:20;1264:1;1253:9;1249:17;1242:47;1306:78;1379:4;1370:6;1306:78;:::i;:::-;1298:86;;1078:313;;;;:::o;1478:117::-;1587:1;1584;1577:12;1724:126;1761:7;1801:42;1794:5;1790:54;1779:65;;1724:126;;;:::o;1856:96::-;1893:7;1922:24;1940:5;1922:24;:::i;:::-;1911:35;;1856:96;;;:::o;1958:122::-;2031:24;2049:5;2031:24;:::i;:::-;2024:5;2021:35;2011:63;;2070:1;2067;2060:12;2011:63;1958:122;:::o;2086:139::-;2132:5;2170:6;2157:20;2148:29;;2186:33;2213:5;2186:33;:::i;:::-;2086:139;;;;:::o;2231:77::-;2268:7;2297:5;2286:16;;2231:77;;;:::o;2314:122::-;2387:24;2405:5;2387:24;:::i;:::-;2380:5;2377:35;2367:63;;2426:1;2423;2416:12;2367:63;2314:122;:::o;2442:139::-;2488:5;2526:6;2513:20;2504:29;;2542:33;2569:5;2542:33;:::i;:::-;2442:139;;;;:::o;2587:474::-;2655:6;2663;2712:2;2700:9;2691:7;2687:23;2683:32;2680:119;;;2718:79;;:::i;:::-;2680:119;2838:1;2863:53;2908:7;2899:6;2888:9;2884:22;2863:53;:::i;:::-;2853:63;;2809:117;2965:2;2991:53;3036:7;3027:6;3016:9;3012:22;2991:53;:::i;:::-;2981:63;;2936:118;2587:474;;;;;:::o;3067:90::-;3101:7;3144:5;3137:13;3130:21;3119:32;;3067:90;;;:::o;3163:109::-;3244:21;3259:5;3244:21;:::i;:::-;3239:3;3232:34;3163:109;;:::o;3278:210::-;3365:4;3403:2;3392:9;3388:18;3380:26;;3416:65;3478:1;3467:9;3463:17;3454:6;3416:65;:::i;:::-;3278:210;;;;:::o;3494:60::-;3522:3;3543:5;3536:12;;3494:60;;;:::o;3560:142::-;3610:9;3643:53;3661:34;3670:24;3688:5;3670:24;:::i;:::-;3661:34;:::i;:::-;3643:53;:::i;:::-;3630:66;;3560:142;;;:::o;3708:126::-;3758:9;3791:37;3822:5;3791:37;:::i;:::-;3778:50;;3708:126;;;:::o;3840:153::-;3917:9;3950:37;3981:5;3950:37;:::i;:::-;3937:50;;3840:153;;;:::o;3999:185::-;4113:64;4171:5;4113:64;:::i;:::-;4108:3;4101:77;3999:185;;:::o;4190:276::-;4310:4;4348:2;4337:9;4333:18;4325:26;;4361:98;4456:1;4445:9;4441:17;4432:6;4361:98;:::i;:::-;4190:276;;;;:::o;4472:118::-;4559:24;4577:5;4559:24;:::i;:::-;4554:3;4547:37;4472:118;;:::o;4596:222::-;4689:4;4727:2;4716:9;4712:18;4704:26;;4740:71;4808:1;4797:9;4793:17;4784:6;4740:71;:::i;:::-;4596:222;;;;:::o;4824:619::-;4901:6;4909;4917;4966:2;4954:9;4945:7;4941:23;4937:32;4934:119;;;4972:79;;:::i;:::-;4934:119;5092:1;5117:53;5162:7;5153:6;5142:9;5138:22;5117:53;:::i;:::-;5107:63;;5063:117;5219:2;5245:53;5290:7;5281:6;5270:9;5266:22;5245:53;:::i;:::-;5235:63;;5190:118;5347:2;5373:53;5418:7;5409:6;5398:9;5394:22;5373:53;:::i;:::-;5363:63;;5318:118;4824:619;;;;;:::o;5449:118::-;5536:24;5554:5;5536:24;:::i;:::-;5531:3;5524:37;5449:118;;:::o;5573:222::-;5666:4;5704:2;5693:9;5689:18;5681:26;;5717:71;5785:1;5774:9;5770:17;5761:6;5717:71;:::i;:::-;5573:222;;;;:::o;5801:86::-;5836:7;5876:4;5869:5;5865:16;5854:27;;5801:86;;;:::o;5893:112::-;5976:22;5992:5;5976:22;:::i;:::-;5971:3;5964:35;5893:112;;:::o;6011:214::-;6100:4;6138:2;6127:9;6123:18;6115:26;;6151:67;6215:1;6204:9;6200:17;6191:6;6151:67;:::i;:::-;6011:214;;;;:::o;6231:329::-;6290:6;6339:2;6327:9;6318:7;6314:23;6310:32;6307:119;;;6345:79;;:::i;:::-;6307:119;6465:1;6490:53;6535:7;6526:6;6515:9;6511:22;6490:53;:::i;:::-;6480:63;;6436:117;6231:329;;;;:::o;6566:::-;6625:6;6674:2;6662:9;6653:7;6649:23;6645:32;6642:119;;;6680:79;;:::i;:::-;6642:119;6800:1;6825:53;6870:7;6861:6;6850:9;6846:22;6825:53;:::i;:::-;6815:63;;6771:117;6566:329;;;;:::o;6901:116::-;6971:21;6986:5;6971:21;:::i;:::-;6964:5;6961:32;6951:60;;7007:1;7004;6997:12;6951:60;6901:116;:::o;7023:133::-;7066:5;7104:6;7091:20;7082:29;;7120:30;7144:5;7120:30;:::i;:::-;7023:133;;;;:::o;7162:323::-;7218:6;7267:2;7255:9;7246:7;7242:23;7238:32;7235:119;;;7273:79;;:::i;:::-;7235:119;7393:1;7418:50;7460:7;7451:6;7440:9;7436:22;7418:50;:::i;:::-;7408:60;;7364:114;7162:323;;;;:::o;7491:468::-;7556:6;7564;7613:2;7601:9;7592:7;7588:23;7584:32;7581:119;;;7619:79;;:::i;:::-;7581:119;7739:1;7764:53;7809:7;7800:6;7789:9;7785:22;7764:53;:::i;:::-;7754:63;;7710:117;7866:2;7892:50;7934:7;7925:6;7914:9;7910:22;7892:50;:::i;:::-;7882:60;;7837:115;7491:468;;;;;:::o;7965:474::-;8033:6;8041;8090:2;8078:9;8069:7;8065:23;8061:32;8058:119;;;8096:79;;:::i;:::-;8058:119;8216:1;8241:53;8286:7;8277:6;8266:9;8262:22;8241:53;:::i;:::-;8231:63;;8187:117;8343:2;8369:53;8414:7;8405:6;8394:9;8390:22;8369:53;:::i;:::-;8359:63;;8314:118;7965:474;;;;;:::o;8445:613::-;8519:6;8527;8535;8584:2;8572:9;8563:7;8559:23;8555:32;8552:119;;;8590:79;;:::i;:::-;8552:119;8710:1;8735:50;8777:7;8768:6;8757:9;8753:22;8735:50;:::i;:::-;8725:60;;8681:114;8834:2;8860:53;8905:7;8896:6;8885:9;8881:22;8860:53;:::i;:::-;8850:63;;8805:118;8962:2;8988:53;9033:7;9024:6;9013:9;9009:22;8988:53;:::i;:::-;8978:63;;8933:118;8445:613;;;;;:::o;9064:180::-;9112:77;9109:1;9102:88;9209:4;9206:1;9199:15;9233:4;9230:1;9223:15;9250:320;9294:6;9331:1;9325:4;9321:12;9311:22;;9378:1;9372:4;9368:12;9399:18;9389:81;;9455:4;9447:6;9443:17;9433:27;;9389:81;9517:2;9509:6;9506:14;9486:18;9483:38;9480:84;;;9536:18;;:::i;:::-;9480:84;9301:269;9250:320;;;:::o;9576:182::-;9716:34;9712:1;9704:6;9700:14;9693:58;9576:182;:::o;9764:366::-;9906:3;9927:67;9991:2;9986:3;9927:67;:::i;:::-;9920:74;;10003:93;10092:3;10003:93;:::i;:::-;10121:2;10116:3;10112:12;10105:19;;9764:366;;;:::o;10136:419::-;10302:4;10340:2;10329:9;10325:18;10317:26;;10389:9;10383:4;10379:20;10375:1;10364:9;10360:17;10353:47;10417:131;10543:4;10417:131;:::i;:::-;10409:139;;10136:419;;;:::o;10561:178::-;10701:30;10697:1;10689:6;10685:14;10678:54;10561:178;:::o;10745:366::-;10887:3;10908:67;10972:2;10967:3;10908:67;:::i;:::-;10901:74;;10984:93;11073:3;10984:93;:::i;:::-;11102:2;11097:3;11093:12;11086:19;;10745:366;;;:::o;11117:419::-;11283:4;11321:2;11310:9;11306:18;11298:26;;11370:9;11364:4;11360:20;11356:1;11345:9;11341:17;11334:47;11398:131;11524:4;11398:131;:::i;:::-;11390:139;;11117:419;;;:::o;11542:244::-;11682:34;11678:1;11670:6;11666:14;11659:58;11751:27;11746:2;11738:6;11734:15;11727:52;11542:244;:::o;11792:366::-;11934:3;11955:67;12019:2;12014:3;11955:67;:::i;:::-;11948:74;;12031:93;12120:3;12031:93;:::i;:::-;12149:2;12144:3;12140:12;12133:19;;11792:366;;;:::o;12164:419::-;12330:4;12368:2;12357:9;12353:18;12345:26;;12417:9;12411:4;12407:20;12403:1;12392:9;12388:17;12381:47;12445:131;12571:4;12445:131;:::i;:::-;12437:139;;12164:419;;;:::o;12589:180::-;12637:77;12634:1;12627:88;12734:4;12731:1;12724:15;12758:4;12755:1;12748:15;12775:348;12815:7;12838:20;12856:1;12838:20;:::i;:::-;12833:25;;12872:20;12890:1;12872:20;:::i;:::-;12867:25;;13060:1;12992:66;12988:74;12985:1;12982:81;12977:1;12970:9;12963:17;12959:105;12956:131;;;13067:18;;:::i;:::-;12956:131;13115:1;13112;13108:9;13097:20;;12775:348;;;;:::o;13129:180::-;13177:77;13174:1;13167:88;13274:4;13271:1;13264:15;13298:4;13295:1;13288:15;13315:185;13355:1;13372:20;13390:1;13372:20;:::i;:::-;13367:25;;13406:20;13424:1;13406:20;:::i;:::-;13401:25;;13445:1;13435:35;;13450:18;;:::i;:::-;13435:35;13492:1;13489;13485:9;13480:14;;13315:185;;;;:::o;13506:240::-;13646:34;13642:1;13634:6;13630:14;13623:58;13715:23;13710:2;13702:6;13698:15;13691:48;13506:240;:::o;13752:366::-;13894:3;13915:67;13979:2;13974:3;13915:67;:::i;:::-;13908:74;;13991:93;14080:3;13991:93;:::i;:::-;14109:2;14104:3;14100:12;14093:19;;13752:366;;;:::o;14124:419::-;14290:4;14328:2;14317:9;14313:18;14305:26;;14377:9;14371:4;14367:20;14363:1;14352:9;14348:17;14341:47;14405:131;14531:4;14405:131;:::i;:::-;14397:139;;14124:419;;;:::o;14549:239::-;14689:34;14685:1;14677:6;14673:14;14666:58;14758:22;14753:2;14745:6;14741:15;14734:47;14549:239;:::o;14794:366::-;14936:3;14957:67;15021:2;15016:3;14957:67;:::i;:::-;14950:74;;15033:93;15122:3;15033:93;:::i;:::-;15151:2;15146:3;15142:12;15135:19;;14794:366;;;:::o;15166:419::-;15332:4;15370:2;15359:9;15355:18;15347:26;;15419:9;15413:4;15409:20;15405:1;15394:9;15390:17;15383:47;15447:131;15573:4;15447:131;:::i;:::-;15439:139;;15166:419;;;:::o;15591:225::-;15731:34;15727:1;15719:6;15715:14;15708:58;15800:8;15795:2;15787:6;15783:15;15776:33;15591:225;:::o;15822:366::-;15964:3;15985:67;16049:2;16044:3;15985:67;:::i;:::-;15978:74;;16061:93;16150:3;16061:93;:::i;:::-;16179:2;16174:3;16170:12;16163:19;;15822:366;;;:::o;16194:419::-;16360:4;16398:2;16387:9;16383:18;16375:26;;16447:9;16441:4;16437:20;16433:1;16422:9;16418:17;16411:47;16475:131;16601:4;16475:131;:::i;:::-;16467:139;;16194:419;;;:::o;16619:305::-;16659:3;16678:20;16696:1;16678:20;:::i;:::-;16673:25;;16712:20;16730:1;16712:20;:::i;:::-;16707:25;;16866:1;16798:66;16794:74;16791:1;16788:81;16785:107;;;16872:18;;:::i;:::-;16785:107;16916:1;16913;16909:9;16902:16;;16619:305;;;;:::o;16930:177::-;17070:29;17066:1;17058:6;17054:14;17047:53;16930:177;:::o;17113:366::-;17255:3;17276:67;17340:2;17335:3;17276:67;:::i;:::-;17269:74;;17352:93;17441:3;17352:93;:::i;:::-;17470:2;17465:3;17461:12;17454:19;;17113:366;;;:::o;17485:419::-;17651:4;17689:2;17678:9;17674:18;17666:26;;17738:9;17732:4;17728:20;17724:1;17713:9;17709:17;17702:47;17766:131;17892:4;17766:131;:::i;:::-;17758:139;;17485:419;;;:::o;17910:223::-;18050:34;18046:1;18038:6;18034:14;18027:58;18119:6;18114:2;18106:6;18102:15;18095:31;17910:223;:::o;18139:366::-;18281:3;18302:67;18366:2;18361:3;18302:67;:::i;:::-;18295:74;;18378:93;18467:3;18378:93;:::i;:::-;18496:2;18491:3;18487:12;18480:19;;18139:366;;;:::o;18511:419::-;18677:4;18715:2;18704:9;18700:18;18692:26;;18764:9;18758:4;18754:20;18750:1;18739:9;18735:17;18728:47;18792:131;18918:4;18792:131;:::i;:::-;18784:139;;18511:419;;;:::o;18936:221::-;19076:34;19072:1;19064:6;19060:14;19053:58;19145:4;19140:2;19132:6;19128:15;19121:29;18936:221;:::o;19163:366::-;19305:3;19326:67;19390:2;19385:3;19326:67;:::i;:::-;19319:74;;19402:93;19491:3;19402:93;:::i;:::-;19520:2;19515:3;19511:12;19504:19;;19163:366;;;:::o;19535:419::-;19701:4;19739:2;19728:9;19724:18;19716:26;;19788:9;19782:4;19778:20;19774:1;19763:9;19759:17;19752:47;19816:131;19942:4;19816:131;:::i;:::-;19808:139;;19535:419;;;:::o;19960:224::-;20100:34;20096:1;20088:6;20084:14;20077:58;20169:7;20164:2;20156:6;20152:15;20145:32;19960:224;:::o;20190:366::-;20332:3;20353:67;20417:2;20412:3;20353:67;:::i;:::-;20346:74;;20429:93;20518:3;20429:93;:::i;:::-;20547:2;20542:3;20538:12;20531:19;;20190:366;;;:::o;20562:419::-;20728:4;20766:2;20755:9;20751:18;20743:26;;20815:9;20809:4;20805:20;20801:1;20790:9;20786:17;20779:47;20843:131;20969:4;20843:131;:::i;:::-;20835:139;;20562:419;;;:::o;20987:222::-;21127:34;21123:1;21115:6;21111:14;21104:58;21196:5;21191:2;21183:6;21179:15;21172:30;20987:222;:::o;21215:366::-;21357:3;21378:67;21442:2;21437:3;21378:67;:::i;:::-;21371:74;;21454:93;21543:3;21454:93;:::i;:::-;21572:2;21567:3;21563:12;21556:19;;21215:366;;;:::o;21587:419::-;21753:4;21791:2;21780:9;21776:18;21768:26;;21840:9;21834:4;21830:20;21826:1;21815:9;21811:17;21804:47;21868:131;21994:4;21868:131;:::i;:::-;21860:139;;21587:419;;;:::o;22012:172::-;22152:24;22148:1;22140:6;22136:14;22129:48;22012:172;:::o;22190:366::-;22332:3;22353:67;22417:2;22412:3;22353:67;:::i;:::-;22346:74;;22429:93;22518:3;22429:93;:::i;:::-;22547:2;22542:3;22538:12;22531:19;;22190:366;;;:::o;22562:419::-;22728:4;22766:2;22755:9;22751:18;22743:26;;22815:9;22809:4;22805:20;22801:1;22790:9;22786:17;22779:47;22843:131;22969:4;22843:131;:::i;:::-;22835:139;;22562:419;;;:::o;22987:191::-;23027:4;23047:20;23065:1;23047:20;:::i;:::-;23042:25;;23081:20;23099:1;23081:20;:::i;:::-;23076:25;;23120:1;23117;23114:8;23111:34;;;23125:18;;:::i;:::-;23111:34;23170:1;23167;23163:9;23155:17;;22987:191;;;;:::o;23184:220::-;23324:34;23320:1;23312:6;23308:14;23301:58;23393:3;23388:2;23380:6;23376:15;23369:28;23184:220;:::o;23410:366::-;23552:3;23573:67;23637:2;23632:3;23573:67;:::i;:::-;23566:74;;23649:93;23738:3;23649:93;:::i;:::-;23767:2;23762:3;23758:12;23751:19;;23410:366;;;:::o;23782:419::-;23948:4;23986:2;23975:9;23971:18;23963:26;;24035:9;24029:4;24025:20;24021:1;24010:9;24006:17;23999:47;24063:131;24189:4;24063:131;:::i;:::-;24055:139;;23782:419;;;:::o;24207:180::-;24255:77;24252:1;24245:88;24352:4;24349:1;24342:15;24376:4;24373:1;24366:15;24393:180;24441:77;24438:1;24431:88;24538:4;24535:1;24528:15;24562:4;24559:1;24552:15;24579:143;24636:5;24667:6;24661:13;24652:22;;24683:33;24710:5;24683:33;:::i;:::-;24579:143;;;;:::o;24728:351::-;24798:6;24847:2;24835:9;24826:7;24822:23;24818:32;24815:119;;;24853:79;;:::i;:::-;24815:119;24973:1;24998:64;25054:7;25045:6;25034:9;25030:22;24998:64;:::i;:::-;24988:74;;24944:128;24728:351;;;;:::o;25085:85::-;25130:7;25159:5;25148:16;;25085:85;;;:::o;25176:158::-;25234:9;25267:61;25285:42;25294:32;25320:5;25294:32;:::i;:::-;25285:42;:::i;:::-;25267:61;:::i;:::-;25254:74;;25176:158;;;:::o;25340:147::-;25435:45;25474:5;25435:45;:::i;:::-;25430:3;25423:58;25340:147;;:::o;25493:114::-;25560:6;25594:5;25588:12;25578:22;;25493:114;;;:::o;25613:184::-;25712:11;25746:6;25741:3;25734:19;25786:4;25781:3;25777:14;25762:29;;25613:184;;;;:::o;25803:132::-;25870:4;25893:3;25885:11;;25923:4;25918:3;25914:14;25906:22;;25803:132;;;:::o;25941:108::-;26018:24;26036:5;26018:24;:::i;:::-;26013:3;26006:37;25941:108;;:::o;26055:179::-;26124:10;26145:46;26187:3;26179:6;26145:46;:::i;:::-;26223:4;26218:3;26214:14;26200:28;;26055:179;;;;:::o;26240:113::-;26310:4;26342;26337:3;26333:14;26325:22;;26240:113;;;:::o;26389:732::-;26508:3;26537:54;26585:5;26537:54;:::i;:::-;26607:86;26686:6;26681:3;26607:86;:::i;:::-;26600:93;;26717:56;26767:5;26717:56;:::i;:::-;26796:7;26827:1;26812:284;26837:6;26834:1;26831:13;26812:284;;;26913:6;26907:13;26940:63;26999:3;26984:13;26940:63;:::i;:::-;26933:70;;27026:60;27079:6;27026:60;:::i;:::-;27016:70;;26872:224;26859:1;26856;26852:9;26847:14;;26812:284;;;26816:14;27112:3;27105:10;;26513:608;;;26389:732;;;;:::o;27127:831::-;27390:4;27428:3;27417:9;27413:19;27405:27;;27442:71;27510:1;27499:9;27495:17;27486:6;27442:71;:::i;:::-;27523:80;27599:2;27588:9;27584:18;27575:6;27523:80;:::i;:::-;27650:9;27644:4;27640:20;27635:2;27624:9;27620:18;27613:48;27678:108;27781:4;27772:6;27678:108;:::i;:::-;27670:116;;27796:72;27864:2;27853:9;27849:18;27840:6;27796:72;:::i;:::-;27878:73;27946:3;27935:9;27931:19;27922:6;27878:73;:::i;:::-;27127:831;;;;;;;;:::o

Swarm Source

ipfs://b94c3e8e6548d2929889e97cdf8565254f8463c5b9f73ff5683c601839ee8421
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.