ETH Price: $3,289.84 (-0.70%)
Gas: 6 Gwei

Token

Floki Adventure (FIAT)
 

Overview

Max Total Supply

1,000,000,000,000,000 FIAT

Holders

228

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
0.172932106 FIAT

Value
$0.00
0x3ee4636fb0e4933cbb6be5057c22603f6bb50214
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Floki Adventure is a token on the Ethereum Blockchain that offers auto redistribution on every transaction. It's purpose is to serve as the utility token for a play-to-earn (P2E) mobile video game (Floki Adventure)

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
FlokiAdventure

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 2 of 7: FlokiAdventure.sol
import './SafeMath.sol';
import './IER20.sol';
import './IUniswapV2Factory.sol';
import './Context.sol';
import './Ownable.sol';

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

contract FlokiAdventure is Context, IERC20, Ownable {
    using SafeMath for uint256;
    using Address for address;

    uint8 private _decimals = 9;

    string private _name = "Floki Adventure";                                           // name
    string private _symbol = "FIAT";                                                    // symbol
    uint256 private _tTotal = 1000 * 10**12 * 10**uint256(_decimals);                   // total supply

    // % to holders
    uint256 private _defaultTaxFee = 2;                                                 // reflections on buy
    uint256 private _taxFee = _defaultTaxFee;
    uint256 private _previousTaxFee = _taxFee;

    // % to swap & send to marketing wallet
    uint256 private _defaultMarketingFee = 6;                                           // marketing fees on buy
    uint256 private _marketingFee = _defaultMarketingFee;
    uint256 private _previousMarketingFee = _marketingFee;

    uint256 private _taxFee4Sellers = 2;                                                // reflections on sell
    uint256 private _marketingFee4Sellers = 6;                                          // marketing fees on sell

    bool private _feesOnSellersAndBuyers = true;

    uint256 private _numTokensToExchangeForMarketing = _tTotal.div(100).div(100);                           // contract balance to trigger swap & send
    address payable private _marketingWallet = payable(0xff3EcC3486b5B273f802C96Aa7F4A5E9d074a591);         // marketing wallet

    mapping (address => uint256) private _rOwned;
    mapping (address => uint256) private _tOwned;
    mapping (address => mapping (address => uint256)) private _allowances;
    mapping (address => bool) private _isExcludedFromFee;
    mapping (address => bool) private _isExcluded;

    address[] private _excluded;
    uint256 private constant MAX = ~uint256(0);
    uint256 private _tFeeTotal;
    uint256 private _rTotal = (MAX - (MAX % _tTotal));

    IUniswapV2Router02 private immutable _uniswapV2Router;
    address private immutable _uniswapV2Pair;

    bool private _inSwapAndSend;
    bool private swapAndSendEnabled = true;

    event SwapAndSendEnabledUpdated(bool enabled);

    modifier lockTheSwap {
        _inSwapAndSend = true;
        _;
        _inSwapAndSend = false;
    }

    constructor () {
        _rOwned[_msgSender()] = _rTotal;

        IUniswapV2Router02 uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        
        // Create a uniswap pair for this new token
        _uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(address(this), uniswapV2Router.WETH());
        _uniswapV2Router = uniswapV2Router;

        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[address(this)] = true;

        emit Transfer(address(0), _msgSender(), _tTotal);
    }

    function name() public view returns (string memory) {
        return _name;
    }

    function symbol() public view returns (string memory) {
        return _symbol;
    }

    function decimals() public view returns (uint8) {
        return _decimals;
    }

    function totalSupply() public view override returns (uint256) {
        return _tTotal;
    }

    function balanceOf(address account) public view override returns (uint256) {
        if (_isExcluded[account]) {
            return _tOwned[account];
        }
        return tokenFromReflection(_rOwned[account]);
    }

    function transfer(address recipient, uint256 amount) public override returns (bool) {
        transfer(_msgSender(), recipient, amount);
        return true;
    }

    function allowance(address owner, address spender) public view override returns (uint256) {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount) public override returns (bool) {
        approve(_msgSender(), spender, amount);
        return true;
    }

    function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
        transfer(sender, recipient, amount);
        approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }

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

    function isExcludedFromReward(address account) public view returns (bool) {
        return _isExcluded[account];
    }

    function totalFees() public view returns (uint256) {
        return _tFeeTotal;
    }

    function reflectionFromToken(uint256 tAmount, bool deductTransferFee) public view returns(uint256) {
        require(tAmount <= _tTotal, "Amount must be less than supply");
        if (!deductTransferFee) {
            (uint256 rAmount,,,,,) = getValues(tAmount);
            return rAmount;
        } else {
            (,uint256 rTransferAmount,,,,) = getValues(tAmount);
            return rTransferAmount;
        }
    }

    function tokenFromReflection(uint256 rAmount) public view returns(uint256) {
        require(rAmount <= _rTotal, "Amount must be less than total reflections");
        uint256 currentRate =  getRate();
        return rAmount.div(currentRate);
    }

    function excludeFromReward(address account) public onlyOwner() {
        // require(account != 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D, 'We can not exclude Uniswap router.');
        require(!_isExcluded[account], "Account is already excluded");
        if(_rOwned[account] > 0) {
            _tOwned[account] = tokenFromReflection(_rOwned[account]);
        }
        _isExcluded[account] = true;
        _excluded.push(account);
    }

    function includeInReward(address account) external onlyOwner() {
        require(_isExcluded[account], "Account is already excluded");
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_excluded[i] == account) {
                _excluded[i] = _excluded[_excluded.length - 1];
                _tOwned[account] = 0;
                _isExcluded[account] = false;
                _excluded.pop();
                break;
            }
        }
    }

    function excludeFromFee(address account) public onlyOwner() {
        _isExcludedFromFee[account] = true;
    }

    function includeInFee(address account) public onlyOwner() {
        _isExcludedFromFee[account] = false;
    }

    function removeAllFee() private {
        if(_taxFee == 0 && _marketingFee == 0) return;

        _previousTaxFee = _taxFee;
        _previousMarketingFee = _marketingFee;

        _taxFee = 0;
        _marketingFee = 0;
    }

    function restoreAllFee() private {
        _taxFee = _previousTaxFee;
        _marketingFee = _previousMarketingFee;
    }

    //to recieve ETH when swaping
    receive() external payable {}

    function reflectFee(uint256 rFee, uint256 tFee) private {
        _rTotal = _rTotal.sub(rFee);
        _tFeeTotal = _tFeeTotal.add(tFee);
    }

    function getValues(uint256 tAmount) private view returns (uint256, uint256, uint256, uint256, uint256, uint256) {
        (uint256 tTransferAmount, uint256 tFee, uint256 tMarketing) = getTValues(tAmount);
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = getRValues(tAmount, tFee, tMarketing, getRate());
        return (rAmount, rTransferAmount, rFee, tTransferAmount, tFee, tMarketing);
    }

    function getTValues(uint256 tAmount) private view returns (uint256, uint256, uint256) {
        uint256 tFee = calculateTaxFee(tAmount);
        uint256 tMarketing = calculateMarketingFee(tAmount);
        uint256 tTransferAmount = tAmount.sub(tFee).sub(tMarketing);
        return (tTransferAmount, tFee, tMarketing);
    }

    function getRValues(uint256 tAmount, uint256 tFee, uint256 tMarketing, uint256 currentRate) private pure returns (uint256, uint256, uint256) {
        uint256 rAmount = tAmount.mul(currentRate);
        uint256 rFee = tFee.mul(currentRate);
        uint256 rMarketing = tMarketing.mul(currentRate);
        uint256 rTransferAmount = rAmount.sub(rFee).sub(rMarketing);
        return (rAmount, rTransferAmount, rFee);
    }

    function getRate() private view returns(uint256) {
        (uint256 rSupply, uint256 tSupply) = getCurrentSupply();
        return rSupply.div(tSupply);
    }

    function getCurrentSupply() private view returns(uint256, uint256) {
        uint256 rSupply = _rTotal;
        uint256 tSupply = _tTotal;
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_rOwned[_excluded[i]] > rSupply || _tOwned[_excluded[i]] > tSupply) return (_rTotal, _tTotal);
            rSupply = rSupply.sub(_rOwned[_excluded[i]]);
            tSupply = tSupply.sub(_tOwned[_excluded[i]]);
        }
        if (rSupply < _rTotal.div(_tTotal)) return (_rTotal, _tTotal);
        return (rSupply, tSupply);
    }

    function takeMarketing(uint256 tMarketing) private {
        uint256 currentRate =  getRate();
        uint256 rMarketing = tMarketing.mul(currentRate);
        _rOwned[address(this)] = _rOwned[address(this)].add(rMarketing);
        if(_isExcluded[address(this)])
            _tOwned[address(this)] = _tOwned[address(this)].add(tMarketing);
    }

    function calculateTaxFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_taxFee).div(
            10**2
        );
    }

    function calculateMarketingFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_marketingFee).div(
            10**2
        );
    }

    function isExcludedFromFee(address account) public view returns(bool) {
        return _isExcludedFromFee[account];
    }

    function approve(address owner, address spender, uint256 amount) private {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

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

    function transfer(address from, address to, uint256 amount) private {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");

        uint256 contractTokenBalance = balanceOf(address(this));
        bool overMinTokenBalance = contractTokenBalance >= _numTokensToExchangeForMarketing;

        if (overMinTokenBalance
            && !_inSwapAndSend 
            && from != _uniswapV2Pair 
            && swapAndSendEnabled) {
            swapAndSend(contractTokenBalance);
        }

        if(_feesOnSellersAndBuyers) {
            setFees(to);
        }

        bool takeFee = true;
        if(_isExcludedFromFee[from] || _isExcludedFromFee[to]) {
            takeFee = false;
        }

        tokenTransfer(from,to,amount,takeFee);
    }

    function setFees(address recipient) private {
        _taxFee = _defaultTaxFee;
        _marketingFee = _defaultMarketingFee;

        // set fees on sell
        if (recipient == _uniswapV2Pair) {
            _taxFee = _taxFee4Sellers;
            _marketingFee = _marketingFee4Sellers;
        }
    }

    function swapAndSend(uint256 contractTokenBalance) private lockTheSwap {
        // 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), contractTokenBalance);

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

        uint256 contractETHBalance = address(this).balance;
        if(contractETHBalance > 0) {
            _marketingWallet.transfer(contractETHBalance);
        }
    }

    function tokenTransfer(address sender, address recipient, uint256 amount,bool takeFee) private {
        if(!takeFee) {
            removeAllFee();
        }

        if (_isExcluded[sender] && !_isExcluded[recipient]) {
            transferFromExcluded(sender, recipient, amount);
        } else if (!_isExcluded[sender] && _isExcluded[recipient]) {
            transferToExcluded(sender, recipient, amount);
        } else if (!_isExcluded[sender] && !_isExcluded[recipient]) {
            transferStandard(sender, recipient, amount);
        } else if (_isExcluded[sender] && _isExcluded[recipient]) {
            transferBothExcluded(sender, recipient, amount);
        } else {
            transferStandard(sender, recipient, amount);
        }

        if(!takeFee)
            restoreAllFee();
    }

    function transferStandard(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tMarketing) = getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        takeMarketing(tMarketing);
        reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function transferToExcluded(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tMarketing) = getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        takeMarketing(tMarketing);
        reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function transferFromExcluded(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tMarketing) = getValues(tAmount);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        takeMarketing(tMarketing);
        reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function transferBothExcluded(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tMarketing) = getValues(tAmount);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        takeMarketing(tMarketing);
        reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function setDefaultTaxFee(uint256 defaultTaxFee) external onlyOwner() {
        _defaultTaxFee = defaultTaxFee;
    }

    function setTaxFee4Sellers(uint256 taxFee4Sellers) external onlyOwner() {
        _taxFee4Sellers = taxFee4Sellers;
    }

    function setDefaultMarketingFee(uint256 defaultMarketingFee) external onlyOwner() {
        _defaultMarketingFee = defaultMarketingFee;
    }

    function setMarketingFee4Sellers(uint256 marketingFee4Sellers) external onlyOwner() {
        _marketingFee4Sellers = marketingFee4Sellers;
    }

    function setFeesOnSellersAndBuyers(bool feesOnSellersAndBuyers) public onlyOwner() {
        _feesOnSellersAndBuyers = feesOnSellersAndBuyers;
    }

    function setSwapAndSendEnabled(bool enabled) public onlyOwner() {
        swapAndSendEnabled = enabled;
        emit SwapAndSendEnabledUpdated(enabled);
    }

    function setNumTokensToExchangeForMarketing(uint256 numTokensToExchangeForMarketing) public onlyOwner() {
        _numTokensToExchangeForMarketing = numTokensToExchangeForMarketing;
    }

    function setMarketingWallet(address payable marketWallet) external onlyOwner() {
        _marketingWallet = marketWallet;
    }
}

File 1 of 7: Context.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
    * @dev Returns true if `account` is a contract.
    *
    * [IMPORTANT]
    * ====
    * It is unsafe to assume that an address for which this function returns
    * false is an externally-owned account (EOA) and not a contract.
    *
    * Among others, `isContract` will return false for the following
    * types of addresses:
    *
    *  - an externally-owned account
    *  - a contract in construction
    *  - an address where a contract will be created
    *  - an address where a contract lived, but was destroyed
    * ====
    */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

    /**
    * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
    * `recipient`, forwarding all available gas and reverting on errors.
    *
    * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
    * of certain opcodes, possibly making contracts go over the 2300 gas limit
    * imposed by `transfer`, making them unable to receive funds via
    * `transfer`. {sendValue} removes this limitation.
    *
    * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
    *
    * IMPORTANT: because control is transferred to `recipient`, care must be
    * taken to not create reentrancy vulnerabilities. Consider using
    * {ReentrancyGuard} or the
    * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
    */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
    * @dev Performs a Solidity function call using a low level `call`. A
    * plain`call` is an unsafe replacement for a function call: use this
    * function instead.
    *
    * If `target` reverts with a revert reason, it is bubbled up by this
    * function (like regular Solidity function calls).
    *
    * Returns the raw returned data. To convert to the expected return value,
    * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
    *
    * Requirements:
    *
    * - `target` must be a contract.
    * - calling `target` with `data` must not revert.
    *
    * _Available since v3.1._
    */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    /**
    * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
    * `errorMessage` as a fallback revert reason when `target` reverts.
    *
    * _Available since v3.1._
    */
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
    * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
    * but also transferring `value` wei to `target`.
    *
    * Requirements:
    *
    * - the calling contract must have an ETH balance of at least `value`.
    * - the called Solidity function must be `payable`.
    *
    * _Available since v3.1._
    */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
    * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
    * with `errorMessage` as a fallback revert reason when `target` reverts.
    *
    * _Available since v3.1._
    */
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
    * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
    * but performing a static call.
    *
    * _Available since v3.3._
    */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
    * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
    * but performing a static call.
    *
    * _Available since v3.3._
    */
    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
    * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
    * but performing a delegate call.
    *
    * _Available since v3.4._
    */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
    * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
    * but performing a delegate call.
    *
    * _Available since v3.4._
    */
    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 3 of 7: IER20.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

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

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

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

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

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

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

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

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

File 4 of 7: IUniswapV2Factory.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

interface IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

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

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

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

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

interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;

    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

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

File 5 of 7: Migrations.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.4.22 <0.9.0;

contract Migrations {
  address public owner = msg.sender;
  uint public last_completed_migration;

  modifier restricted() {
    require(
      msg.sender == owner,
      "This function is restricted to the contract's owner"
    );
    _;
  }

  function setCompleted(uint completed) public restricted {
    last_completed_migration = completed;
  }
}

File 6 of 7: Ownable.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

import './Context.sol';

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
    * @dev Initializes the contract setting the deployer as the initial owner.
    */
    constructor () {
        _owner = _msgSender();
        emit OwnershipTransferred(address(0), _owner);
    }

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

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

    /**
    * @dev Leaves the contract without owner. It will not be possible to call
    * `onlyOwner` functions anymore. Can only be called by the current owner.
    *
    * NOTE: Renouncing ownership will leave the contract without an owner,
    * thereby removing any functionality that is only available to the owner.
    */
    function renounceOwnership() public virtual onlyOwner {
        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) private onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

File 7 of 7: SafeMath.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
    * @dev Returns the addition of two unsigned integers, with an overflow flag.
    *
    * _Available since v3.4._
    */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
    * @dev Returns the substraction of two unsigned integers, with an overflow flag.
    *
    * _Available since v3.4._
    */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
    * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
    *
    * _Available since v3.4._
    */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
    * @dev Returns the division of two unsigned integers, with a division by zero flag.
    *
    * _Available since v3.4._
    */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
    * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
    *
    * _Available since v3.4._
    */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

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

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

    /**
    * @dev Returns the multiplication of two unsigned integers, reverting on
    * overflow.
    *
    * Counterpart to Solidity's `*` operator.
    *
    * Requirements:
    *
    * - Multiplication cannot overflow.
    */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
    * @dev Returns the integer division of two unsigned integers, reverting on
    * division by zero. The result is rounded towards zero.
    *
    * Counterpart to Solidity's `/` operator.
    *
    * Requirements:
    *
    * - The divisor cannot be zero.
    */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

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

    /**
    * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
    * overflow (when the result is negative).
    *
    * CAUTION: This function is deprecated because it requires allocating memory for the error
    * message unnecessarily. For custom revert reasons use {trySub}.
    *
    * Counterpart to Solidity's `-` operator.
    *
    * Requirements:
    *
    * - Subtraction cannot overflow.
    */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

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

    /**
    * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
    * reverting with custom message when dividing by zero.
    *
    * CAUTION: This function is deprecated because it requires allocating memory for the error
    * message unnecessarily. For custom revert reasons use {tryMod}.
    *
    * Counterpart to Solidity's `%` operator. This function uses a `revert`
    * opcode (which leaves remaining gas untouched) while Solidity uses an
    * invalid opcode to revert (consuming all remaining gas).
    *
    * Requirements:
    *
    * - The divisor cannot be zero.
    */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndSendEnabledUpdated","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"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"defaultMarketingFee","type":"uint256"}],"name":"setDefaultMarketingFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"defaultTaxFee","type":"uint256"}],"name":"setDefaultTaxFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"feesOnSellersAndBuyers","type":"bool"}],"name":"setFeesOnSellersAndBuyers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketingFee4Sellers","type":"uint256"}],"name":"setMarketingFee4Sellers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"marketWallet","type":"address"}],"name":"setMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numTokensToExchangeForMarketing","type":"uint256"}],"name":"setNumTokensToExchangeForMarketing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setSwapAndSendEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"taxFee4Sellers","type":"uint256"}],"name":"setTaxFee4Sellers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c06040526009600060146101000a81548160ff021916908360ff1602179055506040518060400160405280600f81526020017f466c6f6b6920416476656e747572650000000000000000000000000000000000815250600190805190602001906200006d929190620006d9565b506040518060400160405280600481526020017f464941540000000000000000000000000000000000000000000000000000000081525060029080519060200190620000bb929190620006d9565b50600060149054906101000a900460ff1660ff16600a620000dd9190620008cb565b66038d7ea4c68000620000f1919062000a08565b600355600260045560045460055560055460065560066007556007546008556008546009556002600a556006600b556001600c60006101000a81548160ff0219169083151502179055506200017260646200015e60646003546200069060201b62001cb51790919060201c565b6200069060201b62001cb51790919060201c565b600d5573ff3ecc3486b5b273f802c96aa7f4a5e9d074a591600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600354600019620001dc919062000b18565b600019620001eb919062000a69565b6016556001601760016101000a81548160ff0219169083151502179055503480156200021657600080fd5b5062000227620006a860201b60201c565b6000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3601654600f6000620002f8620006a860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000737a250d5630b4cf539739df2c5dacb4c659f2488d90508073ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156200039657600080fd5b505afa158015620003ab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003d19190620007a0565b73ffffffffffffffffffffffffffffffffffffffff1663c9c65396308373ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200043457600080fd5b505afa15801562000449573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200046f9190620007a0565b6040518363ffffffff1660e01b81526004016200048e929190620007ee565b602060405180830381600087803b158015620004a957600080fd5b505af1158015620004be573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004e49190620007a0565b73ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b8152505060016012600062000567620006b060201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601260003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555062000620620006a860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6003546040516200068191906200081b565b60405180910390a35062000c04565b60008183620006a0919062000838565b905092915050565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620006e79062000ae2565b90600052602060002090601f0160209004810192826200070b576000855562000757565b82601f106200072657805160ff191683800117855562000757565b8280016001018555821562000757579182015b828111156200075657825182559160200191906001019062000739565b5b5090506200076691906200076a565b5090565b5b80821115620007855760008160009055506001016200076b565b5090565b6000815190506200079a8162000bea565b92915050565b600060208284031215620007b357600080fd5b6000620007c38482850162000789565b91505092915050565b620007d78162000aa4565b82525050565b620007e88162000ad8565b82525050565b6000604082019050620008056000830185620007cc565b620008146020830184620007cc565b9392505050565b6000602082019050620008326000830184620007dd565b92915050565b6000620008458262000ad8565b9150620008528362000ad8565b92508262000865576200086462000b7f565b5b828204905092915050565b6000808291508390505b6001851115620008c2578086048111156200089a576200089962000b50565b5b6001851615620008aa5780820291505b8081029050620008ba8562000bdd565b94506200087a565b94509492505050565b6000620008d88262000ad8565b9150620008e58362000ad8565b9250620009147fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846200091c565b905092915050565b6000826200092e576001905062000a01565b816200093e576000905062000a01565b8160018114620009575760028114620009625762000998565b600191505062000a01565b60ff84111562000977576200097662000b50565b5b8360020a91508482111562000991576200099062000b50565b5b5062000a01565b5060208310610133831016604e8410600b8410161715620009d25782820a905083811115620009cc57620009cb62000b50565b5b62000a01565b620009e1848484600162000870565b92509050818404811115620009fb57620009fa62000b50565b5b81810290505b9392505050565b600062000a158262000ad8565b915062000a228362000ad8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562000a5e5762000a5d62000b50565b5b828202905092915050565b600062000a768262000ad8565b915062000a838362000ad8565b92508282101562000a995762000a9862000b50565b5b828203905092915050565b600062000ab18262000ab8565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000600282049050600182168062000afb57607f821691505b6020821081141562000b125762000b1162000bae565b5b50919050565b600062000b258262000ad8565b915062000b328362000ad8565b92508262000b455762000b4462000b7f565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60008160011c9050919050565b62000bf58162000aa4565b811462000c0157600080fd5b50565b60805160601c60a05160601c61469b62000c4560003960008181611ffb01526125c801526000818161234d01528181612463015261248a015261469b6000f3fe6080604052600436106101d15760003560e01c806357e0a1d0116100f757806395d89b4111610095578063d54994db11610064578063d54994db146106c9578063dd62ed3e146106f2578063dfcea7ec1461072f578063ea2f0b3714610758576101d8565b806395d89b41146105fb578063a08f676014610626578063a457c2d71461064f578063a9059cbb1461068c576101d8565b8063715018a6116100d1578063715018a61461055357806388f820201461056a5780638bff4c06146105a75780638da5cb5b146105d0576101d8565b806357e0a1d0146104c45780635d098b38146104ed57806370a0823114610516576101d8565b8063313ce5671161016f578063437823ec1161013e578063437823ec146103f85780634549b0391461042157806352390c021461045e5780635342acb414610487576101d8565b8063313ce5671461033e5780633685d4191461036957806339509351146103925780633dee3b7a146103cf576101d8565b806318160ddd116101ab57806318160ddd1461027057806323b872dd1461029b5780632663236f146102d85780632d83811914610301576101d8565b806306fdde03146101dd578063095ea7b31461020857806313114a9d14610245576101d8565b366101d857005b600080fd5b3480156101e957600080fd5b506101f2610781565b6040516101ff9190613e66565b60405180910390f35b34801561021457600080fd5b5061022f600480360381019061022a9190613b22565b610813565b60405161023c9190613e4b565b60405180910390f35b34801561025157600080fd5b5061025a610831565b6040516102679190613fa8565b60405180910390f35b34801561027c57600080fd5b5061028561083b565b6040516102929190613fa8565b60405180910390f35b3480156102a757600080fd5b506102c260048036038101906102bd9190613ad3565b610845565b6040516102cf9190613e4b565b60405180910390f35b3480156102e457600080fd5b506102ff60048036038101906102fa9190613b5e565b61091e565b005b34801561030d57600080fd5b5061032860048036038101906103239190613b87565b6109ee565b6040516103359190613fa8565b60405180910390f35b34801561034a57600080fd5b50610353610a5c565b604051610360919061401d565b60405180910390f35b34801561037557600080fd5b50610390600480360381019061038b9190613a1c565b610a72565b005b34801561039e57600080fd5b506103b960048036038101906103b49190613b22565b610e40565b6040516103c69190613e4b565b60405180910390f35b3480156103db57600080fd5b506103f660048036038101906103f19190613b87565b610ef3565b005b34801561040457600080fd5b5061041f600480360381019061041a9190613a1c565b610f79565b005b34801561042d57600080fd5b5061044860048036038101906104439190613bb0565b611050565b6040516104559190613fa8565b60405180910390f35b34801561046a57600080fd5b5061048560048036038101906104809190613a1c565b6110d4565b005b34801561049357600080fd5b506104ae60048036038101906104a99190613a1c565b61136f565b6040516104bb9190613e4b565b60405180910390f35b3480156104d057600080fd5b506104eb60048036038101906104e69190613b5e565b6113c5565b005b3480156104f957600080fd5b50610514600480360381019061050f9190613a6e565b61145e565b005b34801561052257600080fd5b5061053d60048036038101906105389190613a1c565b61151e565b60405161054a9190613fa8565b60405180910390f35b34801561055f57600080fd5b50610568611609565b005b34801561057657600080fd5b50610591600480360381019061058c9190613a1c565b611743565b60405161059e9190613e4b565b60405180910390f35b3480156105b357600080fd5b506105ce60048036038101906105c99190613b87565b611799565b005b3480156105dc57600080fd5b506105e561181f565b6040516105f29190613e30565b60405180910390f35b34801561060757600080fd5b50610610611848565b60405161061d9190613e66565b60405180910390f35b34801561063257600080fd5b5061064d60048036038101906106489190613b87565b6118da565b005b34801561065b57600080fd5b5061067660048036038101906106719190613b22565b611960565b6040516106839190613e4b565b60405180910390f35b34801561069857600080fd5b506106b360048036038101906106ae9190613b22565b611a2d565b6040516106c09190613e4b565b60405180910390f35b3480156106d557600080fd5b506106f060048036038101906106eb9190613b87565b611a4b565b005b3480156106fe57600080fd5b5061071960048036038101906107149190613a97565b611ad1565b6040516107269190613fa8565b60405180910390f35b34801561073b57600080fd5b5061075660048036038101906107519190613b87565b611b58565b005b34801561076457600080fd5b5061077f600480360381019061077a9190613a1c565b611bde565b005b6060600180546107909061424e565b80601f01602080910402602001604051908101604052809291908181526020018280546107bc9061424e565b80156108095780601f106107de57610100808354040283529160200191610809565b820191906000526020600020905b8154815290600101906020018083116107ec57829003601f168201915b5050505050905090565b6000610827610820611ccb565b8484611cd3565b6001905092915050565b6000601554905090565b6000600354905090565b6000610852848484611e9e565b6109138461085e611ccb565b61090e8560405180606001604052806028815260200161461960289139601160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006108c4611ccb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546121559092919063ffffffff16565b611cd3565b600190509392505050565b610926611ccb565b73ffffffffffffffffffffffffffffffffffffffff1661094461181f565b73ffffffffffffffffffffffffffffffffffffffff161461099a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099190613f28565b60405180910390fd5b80601760016101000a81548160ff0219169083151502179055507f3efb3f9ce66ef48ce5be6bff57df61c60b91f67f10f414ed7cd767b1c9cdad7d816040516109e39190613e4b565b60405180910390a150565b6000601654821115610a35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2c90613ea8565b60405180910390fd5b6000610a3f6121aa565b9050610a548184611cb590919063ffffffff16565b915050919050565b60008060149054906101000a900460ff16905090565b610a7a611ccb565b73ffffffffffffffffffffffffffffffffffffffff16610a9861181f565b73ffffffffffffffffffffffffffffffffffffffff1614610aee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae590613f28565b60405180910390fd5b601360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610b7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7190613ee8565b60405180910390fd5b60005b601480549050811015610e3c578173ffffffffffffffffffffffffffffffffffffffff1660148281548110610bdb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610e295760146001601480549050610c36919061416e565b81548110610c6d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660148281548110610cd2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506014805480610def577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690559055610e3c565b8080610e3490614280565b915050610b7d565b5050565b6000610ee9610e4d611ccb565b84610ee48560116000610e5e611ccb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546121d590919063ffffffff16565b611cd3565b6001905092915050565b610efb611ccb565b73ffffffffffffffffffffffffffffffffffffffff16610f1961181f565b73ffffffffffffffffffffffffffffffffffffffff1614610f6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6690613f28565b60405180910390fd5b80600d8190555050565b610f81611ccb565b73ffffffffffffffffffffffffffffffffffffffff16610f9f61181f565b73ffffffffffffffffffffffffffffffffffffffff1614610ff5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fec90613f28565b60405180910390fd5b6001601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600354831115611097576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108e90613f08565b60405180910390fd5b816110b75760006110a7846121eb565b50505050509050809150506110ce565b60006110c2846121eb565b50505050915050809150505b92915050565b6110dc611ccb565b73ffffffffffffffffffffffffffffffffffffffff166110fa61181f565b73ffffffffffffffffffffffffffffffffffffffff1614611150576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114790613f28565b60405180910390fd5b601360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156111dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d490613ee8565b60405180910390fd5b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156112b15761126d600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546109ee565b601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6001601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506014819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6113cd611ccb565b73ffffffffffffffffffffffffffffffffffffffff166113eb61181f565b73ffffffffffffffffffffffffffffffffffffffff1614611441576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143890613f28565b60405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b611466611ccb565b73ffffffffffffffffffffffffffffffffffffffff1661148461181f565b73ffffffffffffffffffffffffffffffffffffffff16146114da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d190613f28565b60405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156115b957601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050611604565b611601600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546109ee565b90505b919050565b611611611ccb565b73ffffffffffffffffffffffffffffffffffffffff1661162f61181f565b73ffffffffffffffffffffffffffffffffffffffff1614611685576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167c90613f28565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6117a1611ccb565b73ffffffffffffffffffffffffffffffffffffffff166117bf61181f565b73ffffffffffffffffffffffffffffffffffffffff1614611815576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180c90613f28565b60405180910390fd5b80600a8190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600280546118579061424e565b80601f01602080910402602001604051908101604052809291908181526020018280546118839061424e565b80156118d05780601f106118a5576101008083540402835291602001916118d0565b820191906000526020600020905b8154815290600101906020018083116118b357829003601f168201915b5050505050905090565b6118e2611ccb565b73ffffffffffffffffffffffffffffffffffffffff1661190061181f565b73ffffffffffffffffffffffffffffffffffffffff1614611956576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194d90613f28565b60405180910390fd5b80600b8190555050565b6000611a2361196d611ccb565b84611a1e856040518060600160405280602581526020016146416025913960116000611997611ccb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546121559092919063ffffffff16565b611cd3565b6001905092915050565b6000611a41611a3a611ccb565b8484611e9e565b6001905092915050565b611a53611ccb565b73ffffffffffffffffffffffffffffffffffffffff16611a7161181f565b73ffffffffffffffffffffffffffffffffffffffff1614611ac7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abe90613f28565b60405180910390fd5b8060078190555050565b6000601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611b60611ccb565b73ffffffffffffffffffffffffffffffffffffffff16611b7e61181f565b73ffffffffffffffffffffffffffffffffffffffff1614611bd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bcb90613f28565b60405180910390fd5b8060048190555050565b611be6611ccb565b73ffffffffffffffffffffffffffffffffffffffff16611c0461181f565b73ffffffffffffffffffffffffffffffffffffffff1614611c5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5190613f28565b60405180910390fd5b6000601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60008183611cc391906140e3565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611d43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3a90613f88565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611db3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611daa90613ec8565b60405180910390fd5b80601160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611e919190613fa8565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611f0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0590613f68565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7590613e88565b60405180910390fd5b60008111611fc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb890613f48565b60405180910390fd5b6000611fcc3061151e565b90506000600d548210159050808015611ff25750601760009054906101000a900460ff16155b801561204a57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b80156120625750601760019054906101000a900460ff165b156120715761207082612247565b5b600c60009054906101000a900460ff16156120905761208f846125b4565b5b600060019050601260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806121375750601260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1561214157600090505b61214d86868684612630565b505050505050565b600083831115829061219d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121949190613e66565b60405180910390fd5b5082840390509392505050565b60008060006121b7612941565b915091506121ce8183611cb590919063ffffffff16565b9250505090565b600081836121e3919061408d565b905092915050565b60008060008060008060008060006122028a612c8c565b92509250925060008060006122208d868661221b6121aa565b612ce6565b9250925092508282828888889b509b509b509b509b509b5050505050505091939550919395565b6001601760006101000a81548160ff0219169083151502179055506000600267ffffffffffffffff8111156122a5577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156122d35781602001602082028036833780820191505090505b5090503081600081518110612311577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156123b157600080fd5b505afa1580156123c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123e99190613a45565b81600181518110612423577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050612488307f000000000000000000000000000000000000000000000000000000000000000084611cd3565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b81526004016124ea959493929190613fc3565b600060405180830381600087803b15801561250457600080fd5b505af1158015612518573d6000803e3d6000fd5b505050506000479050600081111561259457600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015612592573d6000803e3d6000fd5b505b50506000601760006101000a81548160ff02191690831515021790555050565b6004546005819055506007546008819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561262d57600a54600581905550600b546008819055505b50565b8061263e5761263d612d6f565b5b601360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156126e15750601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156126f6576126f1848484612db2565b61292d565b601360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156127995750601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156127ae576127a9848484613012565b61292c565b601360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156128525750601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561286757612862848484613272565b61292b565b601360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156129095750601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1561291e5761291984848461343d565b61292a565b612929848484613272565b5b5b5b5b8061293b5761293a613732565b5b50505050565b600080600060165490506000600354905060005b601480549050811015612c4f5782600f6000601484815481106129a1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541180612ab55750816010600060148481548110612a4d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054115b15612acc5760165460035494509450505050612c88565b612b82600f600060148481548110612b0d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548461374690919063ffffffff16565b9250612c3a6010600060148481548110612bc5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548361374690919063ffffffff16565b91508080612c4790614280565b915050612955565b50612c67600354601654611cb590919063ffffffff16565b821015612c7f57601654600354935093505050612c88565b81819350935050505b9091565b600080600080612c9b8561375c565b90506000612ca88661378d565b90506000612cd182612cc3858a61374690919063ffffffff16565b61374690919063ffffffff16565b90508083839550955095505050509193909250565b600080600080612cff85896137be90919063ffffffff16565b90506000612d1686896137be90919063ffffffff16565b90506000612d2d87896137be90919063ffffffff16565b90506000612d5682612d48858761374690919063ffffffff16565b61374690919063ffffffff16565b9050838184965096509650505050509450945094915050565b6000600554148015612d8357506000600854145b15612d8d57612db0565b600554600681905550600854600981905550600060058190555060006008819055505b565b600080600080600080612dc4876121eb565b955095509550955095509550612e2287601060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461374690919063ffffffff16565b601060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612eb786600f60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461374690919063ffffffff16565b600f60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612f4c85600f60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546121d590919063ffffffff16565b600f60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612f98816137d4565b612fa28483613979565b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051612fff9190613fa8565b60405180910390a3505050505050505050565b600080600080600080613024876121eb565b95509550955095509550955061308286600f60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461374690919063ffffffff16565b600f60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061311783601060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546121d590919063ffffffff16565b601060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506131ac85600f60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546121d590919063ffffffff16565b600f60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506131f8816137d4565b6132028483613979565b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161325f9190613fa8565b60405180910390a3505050505050505050565b600080600080600080613284876121eb565b9550955095509550955095506132e286600f60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461374690919063ffffffff16565b600f60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061337785600f60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546121d590919063ffffffff16565b600f60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506133c3816137d4565b6133cd8483613979565b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161342a9190613fa8565b60405180910390a3505050505050505050565b60008060008060008061344f876121eb565b9550955095509550955095506134ad87601060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461374690919063ffffffff16565b601060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061354286600f60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461374690919063ffffffff16565b600f60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506135d783601060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546121d590919063ffffffff16565b601060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061366c85600f60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546121d590919063ffffffff16565b600f60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506136b8816137d4565b6136c28483613979565b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161371f9190613fa8565b60405180910390a3505050505050505050565b600654600581905550600954600881905550565b60008183613754919061416e565b905092915050565b60006137866064613778600554856137be90919063ffffffff16565b611cb590919063ffffffff16565b9050919050565b60006137b760646137a9600854856137be90919063ffffffff16565b611cb590919063ffffffff16565b9050919050565b600081836137cc9190614114565b905092915050565b60006137de6121aa565b905060006137f582846137be90919063ffffffff16565b905061384981600f60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546121d590919063ffffffff16565b600f60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550601360003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156139745761393083601060003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546121d590919063ffffffff16565b601060003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b505050565b61398e8260165461374690919063ffffffff16565b6016819055506139a9816015546121d590919063ffffffff16565b6015819055505050565b6000813590506139c2816145bc565b92915050565b6000815190506139d7816145bc565b92915050565b6000813590506139ec816145d3565b92915050565b600081359050613a01816145ea565b92915050565b600081359050613a1681614601565b92915050565b600060208284031215613a2e57600080fd5b6000613a3c848285016139b3565b91505092915050565b600060208284031215613a5757600080fd5b6000613a65848285016139c8565b91505092915050565b600060208284031215613a8057600080fd5b6000613a8e848285016139dd565b91505092915050565b60008060408385031215613aaa57600080fd5b6000613ab8858286016139b3565b9250506020613ac9858286016139b3565b9150509250929050565b600080600060608486031215613ae857600080fd5b6000613af6868287016139b3565b9350506020613b07868287016139b3565b9250506040613b1886828701613a07565b9150509250925092565b60008060408385031215613b3557600080fd5b6000613b43858286016139b3565b9250506020613b5485828601613a07565b9150509250929050565b600060208284031215613b7057600080fd5b6000613b7e848285016139f2565b91505092915050565b600060208284031215613b9957600080fd5b6000613ba784828501613a07565b91505092915050565b60008060408385031215613bc357600080fd5b6000613bd185828601613a07565b9250506020613be2858286016139f2565b9150509250929050565b6000613bf88383613c04565b60208301905092915050565b613c0d816141a2565b82525050565b613c1c816141a2565b82525050565b6000613c2d82614048565b613c37818561406b565b9350613c4283614038565b8060005b83811015613c73578151613c5a8882613bec565b9750613c658361405e565b925050600181019050613c46565b5085935050505092915050565b613c89816141c6565b82525050565b613c9881614209565b82525050565b6000613ca982614053565b613cb3818561407c565b9350613cc381856020860161421b565b613ccc81614356565b840191505092915050565b6000613ce460238361407c565b9150613cef82614367565b604082019050919050565b6000613d07602a8361407c565b9150613d12826143b6565b604082019050919050565b6000613d2a60228361407c565b9150613d3582614405565b604082019050919050565b6000613d4d601b8361407c565b9150613d5882614454565b602082019050919050565b6000613d70601f8361407c565b9150613d7b8261447d565b602082019050919050565b6000613d9360208361407c565b9150613d9e826144a6565b602082019050919050565b6000613db660298361407c565b9150613dc1826144cf565b604082019050919050565b6000613dd960258361407c565b9150613de48261451e565b604082019050919050565b6000613dfc60248361407c565b9150613e078261456d565b604082019050919050565b613e1b816141f2565b82525050565b613e2a816141fc565b82525050565b6000602082019050613e456000830184613c13565b92915050565b6000602082019050613e606000830184613c80565b92915050565b60006020820190508181036000830152613e808184613c9e565b905092915050565b60006020820190508181036000830152613ea181613cd7565b9050919050565b60006020820190508181036000830152613ec181613cfa565b9050919050565b60006020820190508181036000830152613ee181613d1d565b9050919050565b60006020820190508181036000830152613f0181613d40565b9050919050565b60006020820190508181036000830152613f2181613d63565b9050919050565b60006020820190508181036000830152613f4181613d86565b9050919050565b60006020820190508181036000830152613f6181613da9565b9050919050565b60006020820190508181036000830152613f8181613dcc565b9050919050565b60006020820190508181036000830152613fa181613def565b9050919050565b6000602082019050613fbd6000830184613e12565b92915050565b600060a082019050613fd86000830188613e12565b613fe56020830187613c8f565b8181036040830152613ff78186613c22565b90506140066060830185613c13565b6140136080830184613e12565b9695505050505050565b60006020820190506140326000830184613e21565b92915050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b6000614098826141f2565b91506140a3836141f2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156140d8576140d76142c9565b5b828201905092915050565b60006140ee826141f2565b91506140f9836141f2565b925082614109576141086142f8565b5b828204905092915050565b600061411f826141f2565b915061412a836141f2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614163576141626142c9565b5b828202905092915050565b6000614179826141f2565b9150614184836141f2565b925082821015614197576141966142c9565b5b828203905092915050565b60006141ad826141d2565b9050919050565b60006141bf826141d2565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000614214826141f2565b9050919050565b60005b8381101561423957808201518184015260208101905061421e565b83811115614248576000848401525b50505050565b6000600282049050600182168061426657607f821691505b6020821081141561427a57614279614327565b5b50919050565b600061428b826141f2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156142be576142bd6142c9565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260008201527f65666c656374696f6e7300000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f4163636f756e7420697320616c7265616479206578636c756465640000000000600082015250565b7f416d6f756e74206d757374206265206c657373207468616e20737570706c7900600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6145c5816141a2565b81146145d057600080fd5b50565b6145dc816141b4565b81146145e757600080fd5b50565b6145f3816141c6565b81146145fe57600080fd5b50565b61460a816141f2565b811461461557600080fd5b5056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212204d03b3ae41027619514b76afb5264f93ef8a6a1b561a98873aaa417c17c1eec364736f6c63430008040033

Deployed Bytecode

0x6080604052600436106101d15760003560e01c806357e0a1d0116100f757806395d89b4111610095578063d54994db11610064578063d54994db146106c9578063dd62ed3e146106f2578063dfcea7ec1461072f578063ea2f0b3714610758576101d8565b806395d89b41146105fb578063a08f676014610626578063a457c2d71461064f578063a9059cbb1461068c576101d8565b8063715018a6116100d1578063715018a61461055357806388f820201461056a5780638bff4c06146105a75780638da5cb5b146105d0576101d8565b806357e0a1d0146104c45780635d098b38146104ed57806370a0823114610516576101d8565b8063313ce5671161016f578063437823ec1161013e578063437823ec146103f85780634549b0391461042157806352390c021461045e5780635342acb414610487576101d8565b8063313ce5671461033e5780633685d4191461036957806339509351146103925780633dee3b7a146103cf576101d8565b806318160ddd116101ab57806318160ddd1461027057806323b872dd1461029b5780632663236f146102d85780632d83811914610301576101d8565b806306fdde03146101dd578063095ea7b31461020857806313114a9d14610245576101d8565b366101d857005b600080fd5b3480156101e957600080fd5b506101f2610781565b6040516101ff9190613e66565b60405180910390f35b34801561021457600080fd5b5061022f600480360381019061022a9190613b22565b610813565b60405161023c9190613e4b565b60405180910390f35b34801561025157600080fd5b5061025a610831565b6040516102679190613fa8565b60405180910390f35b34801561027c57600080fd5b5061028561083b565b6040516102929190613fa8565b60405180910390f35b3480156102a757600080fd5b506102c260048036038101906102bd9190613ad3565b610845565b6040516102cf9190613e4b565b60405180910390f35b3480156102e457600080fd5b506102ff60048036038101906102fa9190613b5e565b61091e565b005b34801561030d57600080fd5b5061032860048036038101906103239190613b87565b6109ee565b6040516103359190613fa8565b60405180910390f35b34801561034a57600080fd5b50610353610a5c565b604051610360919061401d565b60405180910390f35b34801561037557600080fd5b50610390600480360381019061038b9190613a1c565b610a72565b005b34801561039e57600080fd5b506103b960048036038101906103b49190613b22565b610e40565b6040516103c69190613e4b565b60405180910390f35b3480156103db57600080fd5b506103f660048036038101906103f19190613b87565b610ef3565b005b34801561040457600080fd5b5061041f600480360381019061041a9190613a1c565b610f79565b005b34801561042d57600080fd5b5061044860048036038101906104439190613bb0565b611050565b6040516104559190613fa8565b60405180910390f35b34801561046a57600080fd5b5061048560048036038101906104809190613a1c565b6110d4565b005b34801561049357600080fd5b506104ae60048036038101906104a99190613a1c565b61136f565b6040516104bb9190613e4b565b60405180910390f35b3480156104d057600080fd5b506104eb60048036038101906104e69190613b5e565b6113c5565b005b3480156104f957600080fd5b50610514600480360381019061050f9190613a6e565b61145e565b005b34801561052257600080fd5b5061053d60048036038101906105389190613a1c565b61151e565b60405161054a9190613fa8565b60405180910390f35b34801561055f57600080fd5b50610568611609565b005b34801561057657600080fd5b50610591600480360381019061058c9190613a1c565b611743565b60405161059e9190613e4b565b60405180910390f35b3480156105b357600080fd5b506105ce60048036038101906105c99190613b87565b611799565b005b3480156105dc57600080fd5b506105e561181f565b6040516105f29190613e30565b60405180910390f35b34801561060757600080fd5b50610610611848565b60405161061d9190613e66565b60405180910390f35b34801561063257600080fd5b5061064d60048036038101906106489190613b87565b6118da565b005b34801561065b57600080fd5b5061067660048036038101906106719190613b22565b611960565b6040516106839190613e4b565b60405180910390f35b34801561069857600080fd5b506106b360048036038101906106ae9190613b22565b611a2d565b6040516106c09190613e4b565b60405180910390f35b3480156106d557600080fd5b506106f060048036038101906106eb9190613b87565b611a4b565b005b3480156106fe57600080fd5b5061071960048036038101906107149190613a97565b611ad1565b6040516107269190613fa8565b60405180910390f35b34801561073b57600080fd5b5061075660048036038101906107519190613b87565b611b58565b005b34801561076457600080fd5b5061077f600480360381019061077a9190613a1c565b611bde565b005b6060600180546107909061424e565b80601f01602080910402602001604051908101604052809291908181526020018280546107bc9061424e565b80156108095780601f106107de57610100808354040283529160200191610809565b820191906000526020600020905b8154815290600101906020018083116107ec57829003601f168201915b5050505050905090565b6000610827610820611ccb565b8484611cd3565b6001905092915050565b6000601554905090565b6000600354905090565b6000610852848484611e9e565b6109138461085e611ccb565b61090e8560405180606001604052806028815260200161461960289139601160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006108c4611ccb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546121559092919063ffffffff16565b611cd3565b600190509392505050565b610926611ccb565b73ffffffffffffffffffffffffffffffffffffffff1661094461181f565b73ffffffffffffffffffffffffffffffffffffffff161461099a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099190613f28565b60405180910390fd5b80601760016101000a81548160ff0219169083151502179055507f3efb3f9ce66ef48ce5be6bff57df61c60b91f67f10f414ed7cd767b1c9cdad7d816040516109e39190613e4b565b60405180910390a150565b6000601654821115610a35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2c90613ea8565b60405180910390fd5b6000610a3f6121aa565b9050610a548184611cb590919063ffffffff16565b915050919050565b60008060149054906101000a900460ff16905090565b610a7a611ccb565b73ffffffffffffffffffffffffffffffffffffffff16610a9861181f565b73ffffffffffffffffffffffffffffffffffffffff1614610aee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae590613f28565b60405180910390fd5b601360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610b7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7190613ee8565b60405180910390fd5b60005b601480549050811015610e3c578173ffffffffffffffffffffffffffffffffffffffff1660148281548110610bdb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610e295760146001601480549050610c36919061416e565b81548110610c6d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660148281548110610cd2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506014805480610def577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690559055610e3c565b8080610e3490614280565b915050610b7d565b5050565b6000610ee9610e4d611ccb565b84610ee48560116000610e5e611ccb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546121d590919063ffffffff16565b611cd3565b6001905092915050565b610efb611ccb565b73ffffffffffffffffffffffffffffffffffffffff16610f1961181f565b73ffffffffffffffffffffffffffffffffffffffff1614610f6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6690613f28565b60405180910390fd5b80600d8190555050565b610f81611ccb565b73ffffffffffffffffffffffffffffffffffffffff16610f9f61181f565b73ffffffffffffffffffffffffffffffffffffffff1614610ff5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fec90613f28565b60405180910390fd5b6001601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600354831115611097576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108e90613f08565b60405180910390fd5b816110b75760006110a7846121eb565b50505050509050809150506110ce565b60006110c2846121eb565b50505050915050809150505b92915050565b6110dc611ccb565b73ffffffffffffffffffffffffffffffffffffffff166110fa61181f565b73ffffffffffffffffffffffffffffffffffffffff1614611150576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114790613f28565b60405180910390fd5b601360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156111dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d490613ee8565b60405180910390fd5b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156112b15761126d600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546109ee565b601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6001601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506014819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6113cd611ccb565b73ffffffffffffffffffffffffffffffffffffffff166113eb61181f565b73ffffffffffffffffffffffffffffffffffffffff1614611441576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143890613f28565b60405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b611466611ccb565b73ffffffffffffffffffffffffffffffffffffffff1661148461181f565b73ffffffffffffffffffffffffffffffffffffffff16146114da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d190613f28565b60405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156115b957601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050611604565b611601600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546109ee565b90505b919050565b611611611ccb565b73ffffffffffffffffffffffffffffffffffffffff1661162f61181f565b73ffffffffffffffffffffffffffffffffffffffff1614611685576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167c90613f28565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6117a1611ccb565b73ffffffffffffffffffffffffffffffffffffffff166117bf61181f565b73ffffffffffffffffffffffffffffffffffffffff1614611815576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180c90613f28565b60405180910390fd5b80600a8190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600280546118579061424e565b80601f01602080910402602001604051908101604052809291908181526020018280546118839061424e565b80156118d05780601f106118a5576101008083540402835291602001916118d0565b820191906000526020600020905b8154815290600101906020018083116118b357829003601f168201915b5050505050905090565b6118e2611ccb565b73ffffffffffffffffffffffffffffffffffffffff1661190061181f565b73ffffffffffffffffffffffffffffffffffffffff1614611956576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194d90613f28565b60405180910390fd5b80600b8190555050565b6000611a2361196d611ccb565b84611a1e856040518060600160405280602581526020016146416025913960116000611997611ccb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546121559092919063ffffffff16565b611cd3565b6001905092915050565b6000611a41611a3a611ccb565b8484611e9e565b6001905092915050565b611a53611ccb565b73ffffffffffffffffffffffffffffffffffffffff16611a7161181f565b73ffffffffffffffffffffffffffffffffffffffff1614611ac7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abe90613f28565b60405180910390fd5b8060078190555050565b6000601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611b60611ccb565b73ffffffffffffffffffffffffffffffffffffffff16611b7e61181f565b73ffffffffffffffffffffffffffffffffffffffff1614611bd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bcb90613f28565b60405180910390fd5b8060048190555050565b611be6611ccb565b73ffffffffffffffffffffffffffffffffffffffff16611c0461181f565b73ffffffffffffffffffffffffffffffffffffffff1614611c5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5190613f28565b60405180910390fd5b6000601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60008183611cc391906140e3565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611d43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3a90613f88565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611db3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611daa90613ec8565b60405180910390fd5b80601160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611e919190613fa8565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611f0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0590613f68565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7590613e88565b60405180910390fd5b60008111611fc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb890613f48565b60405180910390fd5b6000611fcc3061151e565b90506000600d548210159050808015611ff25750601760009054906101000a900460ff16155b801561204a57507f000000000000000000000000b1440c49092b22e423ea9cacf61a803c0cbbf0ca73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b80156120625750601760019054906101000a900460ff165b156120715761207082612247565b5b600c60009054906101000a900460ff16156120905761208f846125b4565b5b600060019050601260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806121375750601260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1561214157600090505b61214d86868684612630565b505050505050565b600083831115829061219d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121949190613e66565b60405180910390fd5b5082840390509392505050565b60008060006121b7612941565b915091506121ce8183611cb590919063ffffffff16565b9250505090565b600081836121e3919061408d565b905092915050565b60008060008060008060008060006122028a612c8c565b92509250925060008060006122208d868661221b6121aa565b612ce6565b9250925092508282828888889b509b509b509b509b509b5050505050505091939550919395565b6001601760006101000a81548160ff0219169083151502179055506000600267ffffffffffffffff8111156122a5577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156122d35781602001602082028036833780820191505090505b5090503081600081518110612311577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156123b157600080fd5b505afa1580156123c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123e99190613a45565b81600181518110612423577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050612488307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84611cd3565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b81526004016124ea959493929190613fc3565b600060405180830381600087803b15801561250457600080fd5b505af1158015612518573d6000803e3d6000fd5b505050506000479050600081111561259457600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015612592573d6000803e3d6000fd5b505b50506000601760006101000a81548160ff02191690831515021790555050565b6004546005819055506007546008819055507f000000000000000000000000b1440c49092b22e423ea9cacf61a803c0cbbf0ca73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561262d57600a54600581905550600b546008819055505b50565b8061263e5761263d612d6f565b5b601360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156126e15750601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156126f6576126f1848484612db2565b61292d565b601360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156127995750601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156127ae576127a9848484613012565b61292c565b601360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156128525750601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561286757612862848484613272565b61292b565b601360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156129095750601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1561291e5761291984848461343d565b61292a565b612929848484613272565b5b5b5b5b8061293b5761293a613732565b5b50505050565b600080600060165490506000600354905060005b601480549050811015612c4f5782600f6000601484815481106129a1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541180612ab55750816010600060148481548110612a4d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054115b15612acc5760165460035494509450505050612c88565b612b82600f600060148481548110612b0d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548461374690919063ffffffff16565b9250612c3a6010600060148481548110612bc5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548361374690919063ffffffff16565b91508080612c4790614280565b915050612955565b50612c67600354601654611cb590919063ffffffff16565b821015612c7f57601654600354935093505050612c88565b81819350935050505b9091565b600080600080612c9b8561375c565b90506000612ca88661378d565b90506000612cd182612cc3858a61374690919063ffffffff16565b61374690919063ffffffff16565b90508083839550955095505050509193909250565b600080600080612cff85896137be90919063ffffffff16565b90506000612d1686896137be90919063ffffffff16565b90506000612d2d87896137be90919063ffffffff16565b90506000612d5682612d48858761374690919063ffffffff16565b61374690919063ffffffff16565b9050838184965096509650505050509450945094915050565b6000600554148015612d8357506000600854145b15612d8d57612db0565b600554600681905550600854600981905550600060058190555060006008819055505b565b600080600080600080612dc4876121eb565b955095509550955095509550612e2287601060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461374690919063ffffffff16565b601060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612eb786600f60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461374690919063ffffffff16565b600f60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612f4c85600f60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546121d590919063ffffffff16565b600f60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612f98816137d4565b612fa28483613979565b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051612fff9190613fa8565b60405180910390a3505050505050505050565b600080600080600080613024876121eb565b95509550955095509550955061308286600f60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461374690919063ffffffff16565b600f60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061311783601060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546121d590919063ffffffff16565b601060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506131ac85600f60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546121d590919063ffffffff16565b600f60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506131f8816137d4565b6132028483613979565b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161325f9190613fa8565b60405180910390a3505050505050505050565b600080600080600080613284876121eb565b9550955095509550955095506132e286600f60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461374690919063ffffffff16565b600f60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061337785600f60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546121d590919063ffffffff16565b600f60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506133c3816137d4565b6133cd8483613979565b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161342a9190613fa8565b60405180910390a3505050505050505050565b60008060008060008061344f876121eb565b9550955095509550955095506134ad87601060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461374690919063ffffffff16565b601060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061354286600f60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461374690919063ffffffff16565b600f60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506135d783601060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546121d590919063ffffffff16565b601060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061366c85600f60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546121d590919063ffffffff16565b600f60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506136b8816137d4565b6136c28483613979565b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161371f9190613fa8565b60405180910390a3505050505050505050565b600654600581905550600954600881905550565b60008183613754919061416e565b905092915050565b60006137866064613778600554856137be90919063ffffffff16565b611cb590919063ffffffff16565b9050919050565b60006137b760646137a9600854856137be90919063ffffffff16565b611cb590919063ffffffff16565b9050919050565b600081836137cc9190614114565b905092915050565b60006137de6121aa565b905060006137f582846137be90919063ffffffff16565b905061384981600f60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546121d590919063ffffffff16565b600f60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550601360003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156139745761393083601060003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546121d590919063ffffffff16565b601060003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b505050565b61398e8260165461374690919063ffffffff16565b6016819055506139a9816015546121d590919063ffffffff16565b6015819055505050565b6000813590506139c2816145bc565b92915050565b6000815190506139d7816145bc565b92915050565b6000813590506139ec816145d3565b92915050565b600081359050613a01816145ea565b92915050565b600081359050613a1681614601565b92915050565b600060208284031215613a2e57600080fd5b6000613a3c848285016139b3565b91505092915050565b600060208284031215613a5757600080fd5b6000613a65848285016139c8565b91505092915050565b600060208284031215613a8057600080fd5b6000613a8e848285016139dd565b91505092915050565b60008060408385031215613aaa57600080fd5b6000613ab8858286016139b3565b9250506020613ac9858286016139b3565b9150509250929050565b600080600060608486031215613ae857600080fd5b6000613af6868287016139b3565b9350506020613b07868287016139b3565b9250506040613b1886828701613a07565b9150509250925092565b60008060408385031215613b3557600080fd5b6000613b43858286016139b3565b9250506020613b5485828601613a07565b9150509250929050565b600060208284031215613b7057600080fd5b6000613b7e848285016139f2565b91505092915050565b600060208284031215613b9957600080fd5b6000613ba784828501613a07565b91505092915050565b60008060408385031215613bc357600080fd5b6000613bd185828601613a07565b9250506020613be2858286016139f2565b9150509250929050565b6000613bf88383613c04565b60208301905092915050565b613c0d816141a2565b82525050565b613c1c816141a2565b82525050565b6000613c2d82614048565b613c37818561406b565b9350613c4283614038565b8060005b83811015613c73578151613c5a8882613bec565b9750613c658361405e565b925050600181019050613c46565b5085935050505092915050565b613c89816141c6565b82525050565b613c9881614209565b82525050565b6000613ca982614053565b613cb3818561407c565b9350613cc381856020860161421b565b613ccc81614356565b840191505092915050565b6000613ce460238361407c565b9150613cef82614367565b604082019050919050565b6000613d07602a8361407c565b9150613d12826143b6565b604082019050919050565b6000613d2a60228361407c565b9150613d3582614405565b604082019050919050565b6000613d4d601b8361407c565b9150613d5882614454565b602082019050919050565b6000613d70601f8361407c565b9150613d7b8261447d565b602082019050919050565b6000613d9360208361407c565b9150613d9e826144a6565b602082019050919050565b6000613db660298361407c565b9150613dc1826144cf565b604082019050919050565b6000613dd960258361407c565b9150613de48261451e565b604082019050919050565b6000613dfc60248361407c565b9150613e078261456d565b604082019050919050565b613e1b816141f2565b82525050565b613e2a816141fc565b82525050565b6000602082019050613e456000830184613c13565b92915050565b6000602082019050613e606000830184613c80565b92915050565b60006020820190508181036000830152613e808184613c9e565b905092915050565b60006020820190508181036000830152613ea181613cd7565b9050919050565b60006020820190508181036000830152613ec181613cfa565b9050919050565b60006020820190508181036000830152613ee181613d1d565b9050919050565b60006020820190508181036000830152613f0181613d40565b9050919050565b60006020820190508181036000830152613f2181613d63565b9050919050565b60006020820190508181036000830152613f4181613d86565b9050919050565b60006020820190508181036000830152613f6181613da9565b9050919050565b60006020820190508181036000830152613f8181613dcc565b9050919050565b60006020820190508181036000830152613fa181613def565b9050919050565b6000602082019050613fbd6000830184613e12565b92915050565b600060a082019050613fd86000830188613e12565b613fe56020830187613c8f565b8181036040830152613ff78186613c22565b90506140066060830185613c13565b6140136080830184613e12565b9695505050505050565b60006020820190506140326000830184613e21565b92915050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b6000614098826141f2565b91506140a3836141f2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156140d8576140d76142c9565b5b828201905092915050565b60006140ee826141f2565b91506140f9836141f2565b925082614109576141086142f8565b5b828204905092915050565b600061411f826141f2565b915061412a836141f2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614163576141626142c9565b5b828202905092915050565b6000614179826141f2565b9150614184836141f2565b925082821015614197576141966142c9565b5b828203905092915050565b60006141ad826141d2565b9050919050565b60006141bf826141d2565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000614214826141f2565b9050919050565b60005b8381101561423957808201518184015260208101905061421e565b83811115614248576000848401525b50505050565b6000600282049050600182168061426657607f821691505b6020821081141561427a57614279614327565b5b50919050565b600061428b826141f2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156142be576142bd6142c9565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260008201527f65666c656374696f6e7300000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f4163636f756e7420697320616c7265616479206578636c756465640000000000600082015250565b7f416d6f756e74206d757374206265206c657373207468616e20737570706c7900600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6145c5816141a2565b81146145d057600080fd5b50565b6145dc816141b4565b81146145e757600080fd5b50565b6145f3816141c6565b81146145fe57600080fd5b50565b61460a816141f2565b811461461557600080fd5b5056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212204d03b3ae41027619514b76afb5264f93ef8a6a1b561a98873aaa417c17c1eec364736f6c63430008040033

Deployed Bytecode Sourcemap

187:16659:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3054:81;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3959:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5050:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3319:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4122:307;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16360:158;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5572:248;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3232:81;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6271:468;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4435:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16524:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6745:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5141:425;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5826:439;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10122:121;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16206:148;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16717:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3418:219;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1639:145:5;;;;;;;;;;;;;:::i;:::-;;4926:118:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15781:121;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1015:85:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3141::1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16055:145;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4655:265;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3643:163;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15908:141;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3812;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15658:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6862:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3054:81;3091:13;3123:5;3116:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3054:81;:::o;3959:157::-;4034:4;4050:38;4058:12;:10;:12::i;:::-;4072:7;4081:6;4050:7;:38::i;:::-;4105:4;4098:11;;3959:157;;;;:::o;5050:85::-;5092:7;5118:10;;5111:17;;5050:85;:::o;3319:93::-;3372:7;3398;;3391:14;;3319:93;:::o;4122:307::-;4220:4;4236:35;4245:6;4253:9;4264:6;4236:8;:35::i;:::-;4281:120;4289:6;4297:12;:10;:12::i;:::-;4311:89;4349:6;4311:89;;;;;;;;;;;;;;;;;:11;:19;4323:6;4311:19;;;;;;;;;;;;;;;:33;4331:12;:10;:12::i;:::-;4311:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;4281:7;:120::i;:::-;4418:4;4411:11;;4122:307;;;;;:::o;16360:158::-;1236:12:5;:10;:12::i;:::-;1225:23;;:7;:5;:7::i;:::-;:23;;;1217:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;16455:7:1::1;16434:18;;:28;;;;;;;;;;;;;;;;;;16477:34;16503:7;16477:34;;;;;;:::i;:::-;;;;;;;;16360:158:::0;:::o;5572:248::-;5638:7;5676;;5665;:18;;5657:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5740:19;5763:9;:7;:9::i;:::-;5740:32;;5789:24;5801:11;5789:7;:11;;:24;;;;:::i;:::-;5782:31;;;5572:248;;;:::o;3232:81::-;3273:5;3297:9;;;;;;;;;;;3290:16;;3232:81;:::o;6271:468::-;1236:12:5;:10;:12::i;:::-;1225:23;;:7;:5;:7::i;:::-;:23;;;1217:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6352:11:1::1;:20;6364:7;6352:20;;;;;;;;;;;;;;;;;;;;;;;;;6344:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;6419:9;6414:319;6438:9;:16;;;;6434:1;:20;6414:319;;;6495:7;6479:23;;:9;6489:1;6479:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:23;;;6475:248;;;6537:9;6566:1;6547:9;:16;;;;:20;;;;:::i;:::-;6537:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6522:9;6532:1;6522:12;;;;;;;;;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;6605:1;6586:7;:16;6594:7;6586:16;;;;;;;;;;;;;;;:20;;;;6647:5;6624:11;:20;6636:7;6624:20;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;6670:9;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6703:5;;6475:248;6456:3;;;;;:::i;:::-;;;;6414:319;;;;6271:468:::0;:::o;4435:214::-;4523:4;4539:82;4547:12;:10;:12::i;:::-;4561:7;4570:50;4609:10;4570:11;:25;4582:12;:10;:12::i;:::-;4570:25;;;;;;;;;;;;;;;:34;4596:7;4570:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;4539:7;:82::i;:::-;4638:4;4631:11;;4435:214;;;;:::o;16524:187::-;1236:12:5;:10;:12::i;:::-;1225:23;;:7;:5;:7::i;:::-;:23;;;1217:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;16673:31:1::1;16638:32;:66;;;;16524:187:::0;:::o;6745:111::-;1236:12:5;:10;:12::i;:::-;1225:23;;:7;:5;:7::i;:::-;:23;;;1217:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6845:4:1::1;6815:18;:27;6834:7;6815:27;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;6745:111:::0;:::o;5141:425::-;5231:7;5269;;5258;:18;;5250:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;5327:17;5322:238;;5361:15;5385:18;5395:7;5385:9;:18::i;:::-;5360:43;;;;;;;5424:7;5417:14;;;;;5322:238;5464:23;5495:18;5505:7;5495:9;:18::i;:::-;5462:51;;;;;;;5534:15;5527:22;;;5141:425;;;;;:::o;5826:439::-;1236:12:5;:10;:12::i;:::-;1225:23;;:7;:5;:7::i;:::-;:23;;;1217:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6021:11:1::1;:20;6033:7;6021:20;;;;;;;;;;;;;;;;;;;;;;;;;6020:21;6012:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;6105:1;6086:7;:16;6094:7;6086:16;;;;;;;;;;;;;;;;:20;6083:106;;;6141:37;6161:7;:16;6169:7;6161:16;;;;;;;;;;;;;;;;6141:19;:37::i;:::-;6122:7;:16;6130:7;6122:16;;;;;;;;;;;;;;;:56;;;;6083:106;6221:4;6198:11;:20;6210:7;6198:20;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;6235:9;6250:7;6235:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5826:439:::0;:::o;10122:121::-;10186:4;10209:18;:27;10228:7;10209:27;;;;;;;;;;;;;;;;;;;;;;;;;10202:34;;10122:121;;;:::o;16206:148::-;1236:12:5;:10;:12::i;:::-;1225:23;;:7;:5;:7::i;:::-;:23;;;1217:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;16325:22:1::1;16299:23;;:48;;;;;;;;;;;;;;;;;;16206:148:::0;:::o;16717:127::-;1236:12:5;:10;:12::i;:::-;1225:23;;:7;:5;:7::i;:::-;:23;;;1217:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;16825:12:1::1;16806:16;;:31;;;;;;;;;;;;;;;;;;16717:127:::0;:::o;3418:219::-;3484:7;3507:11;:20;3519:7;3507:20;;;;;;;;;;;;;;;;;;;;;;;;;3503:74;;;3550:7;:16;3558:7;3550:16;;;;;;;;;;;;;;;;3543:23;;;;3503:74;3593:37;3613:7;:16;3621:7;3613:16;;;;;;;;;;;;;;;;3593:19;:37::i;:::-;3586:44;;3418:219;;;;:::o;1639:145:5:-;1236:12;:10;:12::i;:::-;1225:23;;:7;:5;:7::i;:::-;:23;;;1217:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1745:1:::1;1708:40;;1729:6;::::0;::::1;;;;;;;;1708:40;;;;;;;;;;;;1775:1;1758:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;1639:145::o:0;4926:118:1:-;4994:4;5017:11;:20;5029:7;5017:20;;;;;;;;;;;;;;;;;;;;;;;;;5010:27;;4926:118;;;:::o;15781:121::-;1236:12:5;:10;:12::i;:::-;1225:23;;:7;:5;:7::i;:::-;:23;;;1217:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15881:14:1::1;15863:15;:32;;;;15781:121:::0;:::o;1015:85:5:-;1061:7;1087:6;;;;;;;;;;;1080:13;;1015:85;:::o;3141::1:-;3180:13;3212:7;3205:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3141:85;:::o;16055:145::-;1236:12:5;:10;:12::i;:::-;1225:23;;:7;:5;:7::i;:::-;:23;;;1217:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;16173:20:1::1;16149:21;:44;;;;16055:145:::0;:::o;4655:265::-;4748:4;4764:128;4772:12;:10;:12::i;:::-;4786:7;4795:96;4834:15;4795:96;;;;;;;;;;;;;;;;;:11;:25;4807:12;:10;:12::i;:::-;4795:25;;;;;;;;;;;;;;;:34;4821:7;4795:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;4764:7;:128::i;:::-;4909:4;4902:11;;4655:265;;;;:::o;3643:163::-;3721:4;3737:41;3746:12;:10;:12::i;:::-;3760:9;3771:6;3737:8;:41::i;:::-;3795:4;3788:11;;3643:163;;;;:::o;15908:141::-;1236:12:5;:10;:12::i;:::-;1225:23;;:7;:5;:7::i;:::-;:23;;;1217:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;16023:19:1::1;16000:20;:42;;;;15908:141:::0;:::o;3812:::-;3893:7;3919:11;:18;3931:5;3919:18;;;;;;;;;;;;;;;:27;3938:7;3919:27;;;;;;;;;;;;;;;;3912:34;;3812:141;;;;:::o;15658:117::-;1236:12:5;:10;:12::i;:::-;1225:23;;:7;:5;:7::i;:::-;:23;;;1217:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15755:13:1::1;15738:14;:30;;;;15658:117:::0;:::o;6862:110::-;1236:12:5;:10;:12::i;:::-;1225:23;;:7;:5;:7::i;:::-;:23;;;1217:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6960:5:1::1;6930:18;:27;6949:7;6930:27;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;6862:110:::0;:::o;3710:96:6:-;3768:7;3798:1;3794;:5;;;;:::i;:::-;3787:12;;3710:96;;;;:::o;585::0:-;638:7;664:10;657:17;;585:96;:::o;10249:330:1:-;10357:1;10340:19;;:5;:19;;;;10332:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10437:1;10418:21;;:7;:21;;;;10410:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10519:6;10489:11;:18;10501:5;10489:18;;;;;;;;;;;;;;;:27;10508:7;10489:27;;;;;;;;;;;;;;;:36;;;;10556:7;10540:32;;10549:5;10540:32;;;10565:6;10540:32;;;;;;:::i;:::-;;;;;;;;10249:330;;;:::o;10585:914::-;10687:1;10671:18;;:4;:18;;;;10663:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10763:1;10749:16;;:2;:16;;;;10741:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;10832:1;10823:6;:10;10815:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;10890:28;10921:24;10939:4;10921:9;:24::i;:::-;10890:55;;10955:24;11006:32;;10982:20;:56;;10955:83;;11053:19;:50;;;;;11089:14;;;;;;;;;;;11088:15;11053:50;:89;;;;;11128:14;11120:22;;:4;:22;;;;11053:89;:124;;;;;11159:18;;;;;;;;;;;11053:124;11049:188;;;11193:33;11205:20;11193:11;:33::i;:::-;11049:188;11250:23;;;;;;;;;;;11247:64;;;11289:11;11297:2;11289:7;:11::i;:::-;11247:64;11321:12;11336:4;11321:19;;11353:18;:24;11372:4;11353:24;;;;;;;;;;;;;;;;;;;;;;;;;:50;;;;11381:18;:22;11400:2;11381:22;;;;;;;;;;;;;;;;;;;;;;;;;11353:50;11350:95;;;11429:5;11419:15;;11350:95;11455:37;11469:4;11474:2;11477:6;11484:7;11455:13;:37::i;:::-;10585:914;;;;;;:::o;4796:201:6:-;4882:7;4938:1;4933;:6;;4941:12;4925:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;4979:1;4975;:5;4968:12;;4796:201;;;;;:::o;8731:158:1:-;8771:7;8791:15;8808;8827:18;:16;:18::i;:::-;8790:55;;;;8862:20;8874:7;8862;:11;;:20;;;;:::i;:::-;8855:27;;;;8731:158;:::o;2642:96:6:-;2700:7;2730:1;2726;:5;;;;:::i;:::-;2719:12;;2642:96;;;;:::o;7556:411:1:-;7614:7;7623;7632;7641;7650;7659;7679:23;7704:12;7718:18;7740:19;7751:7;7740:10;:19::i;:::-;7678:81;;;;;;7770:15;7787:23;7812:12;7828:48;7839:7;7848:4;7854:10;7866:9;:7;:9::i;:::-;7828:10;:48::i;:::-;7769:107;;;;;;7894:7;7903:15;7920:4;7926:15;7943:4;7949:10;7886:74;;;;;;;;;;;;;;;;;;7556:411;;;;;;;:::o;11814:776::-;2435:4;2418:14;;:21;;;;;;;;;;;;;;;;;;11954::::1;11992:1;11978:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11954:40;;12022:4;12004;12009:1;12004:7;;;;;;;;;;;;;;;;;;;;;:23;;;;;;;;;::::0;::::1;12047:16;:21;;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12037:4;12042:1;12037:7;;;;;;;;;;;;;;;;;;;;;:33;;;;;;;;;::::0;::::1;12081:71;12097:4;12112:16;12131:20;12081:7;:71::i;:::-;12188:16;:67;;;12269:20;12303:1;12346:4;12372;12391:15;12188:228;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;12427:26;12456:21;12427:50;;12511:1;12490:18;:22;12487:97;;;12528:16;;;;;;;;;;;:25;;:45;12554:18;12528:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;12487:97;2449:1;;2477:5:::0;2460:14;;:22;;;;;;;;;;;;;;;;;;11814:776;:::o;11505:303::-;11569:14;;11559:7;:24;;;;11609:20;;11593:13;:36;;;;11685:14;11672:27;;:9;:27;;;11668:134;;;11725:15;;11715:7;:25;;;;11770:21;;11754:13;:37;;;;11668:134;11505:303;:::o;12596:806::-;12705:7;12701:52;;12728:14;:12;:14::i;:::-;12701:52;12767:11;:19;12779:6;12767:19;;;;;;;;;;;;;;;;;;;;;;;;;:46;;;;;12791:11;:22;12803:9;12791:22;;;;;;;;;;;;;;;;;;;;;;;;;12790:23;12767:46;12763:582;;;12829:47;12850:6;12858:9;12869:6;12829:20;:47::i;:::-;12763:582;;;12898:11;:19;12910:6;12898:19;;;;;;;;;;;;;;;;;;;;;;;;;12897:20;:46;;;;;12921:11;:22;12933:9;12921:22;;;;;;;;;;;;;;;;;;;;;;;;;12897:46;12893:452;;;12959:45;12978:6;12986:9;12997:6;12959:18;:45::i;:::-;12893:452;;;13026:11;:19;13038:6;13026:19;;;;;;;;;;;;;;;;;;;;;;;;;13025:20;:47;;;;;13050:11;:22;13062:9;13050:22;;;;;;;;;;;;;;;;;;;;;;;;;13049:23;13025:47;13021:324;;;13088:43;13105:6;13113:9;13124:6;13088:16;:43::i;:::-;13021:324;;;13152:11;:19;13164:6;13152:19;;;;;;;;;;;;;;;;;;;;;;;;;:45;;;;;13175:11;:22;13187:9;13175:22;;;;;;;;;;;;;;;;;;;;;;;;;13152:45;13148:197;;;13213:47;13234:6;13242:9;13253:6;13213:20;:47::i;:::-;13148:197;;;13291:43;13308:6;13316:9;13327:6;13291:16;:43::i;:::-;13148:197;13021:324;12893:452;12763:582;13359:7;13355:40;;13380:15;:13;:15::i;:::-;13355:40;12596:806;;;;:::o;8895:544::-;8944:7;8953;8972:15;8990:7;;8972:25;;9007:15;9025:7;;9007:25;;9047:9;9042:285;9066:9;:16;;;;9062:1;:20;9042:285;;;9131:7;9107;:21;9115:9;9125:1;9115:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9107:21;;;;;;;;;;;;;;;;:31;:66;;;;9166:7;9142;:21;9150:9;9160:1;9150:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9142:21;;;;;;;;;;;;;;;;:31;9107:66;9103:97;;;9183:7;;9192;;9175:25;;;;;;;;;9103:97;9224:34;9236:7;:21;9244:9;9254:1;9244:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9236:21;;;;;;;;;;;;;;;;9224:7;:11;;:34;;;;:::i;:::-;9214:44;;9282:34;9294:7;:21;9302:9;9312:1;9302:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9294:21;;;;;;;;;;;;;;;;9282:7;:11;;:34;;;;:::i;:::-;9272:44;;9084:3;;;;;:::i;:::-;;;;9042:285;;;;9350:20;9362:7;;9350;;:11;;:20;;;;:::i;:::-;9340:7;:30;9336:61;;;9380:7;;9389;;9372:25;;;;;;;;9336:61;9415:7;9424;9407:25;;;;;;8895:544;;;:::o;7973:324::-;8032:7;8041;8050;8069:12;8084:24;8100:7;8084:15;:24::i;:::-;8069:39;;8118:18;8139:30;8161:7;8139:21;:30::i;:::-;8118:51;;8179:23;8205:33;8227:10;8205:17;8217:4;8205:7;:11;;:17;;;;:::i;:::-;:21;;:33;;;;:::i;:::-;8179:59;;8256:15;8273:4;8279:10;8248:42;;;;;;;;;7973:324;;;;;:::o;8303:422::-;8417:7;8426;8435;8454:15;8472:24;8484:11;8472:7;:11;;:24;;;;:::i;:::-;8454:42;;8506:12;8521:21;8530:11;8521:4;:8;;:21;;;;:::i;:::-;8506:36;;8552:18;8573:27;8588:11;8573:10;:14;;:27;;;;:::i;:::-;8552:48;;8610:23;8636:33;8658:10;8636:17;8648:4;8636:7;:11;;:17;;;;:::i;:::-;:21;;:33;;;;:::i;:::-;8610:59;;8687:7;8696:15;8713:4;8679:39;;;;;;;;;;8303:422;;;;;;;;:::o;6978:226::-;7034:1;7023:7;;:12;:34;;;;;7056:1;7039:13;;:18;7023:34;7020:46;;;7059:7;;7020:46;7094:7;;7076:15;:25;;;;7135:13;;7111:21;:37;;;;7169:1;7159:7;:11;;;;7196:1;7180:13;:17;;;;6978:226;:::o;14474:551::-;14575:15;14592:23;14617:12;14631:23;14656:12;14670:18;14692;14702:7;14692:9;:18::i;:::-;14574:136;;;;;;;;;;;;14738:28;14758:7;14738;:15;14746:6;14738:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;14720:7;:15;14728:6;14720:15;;;;;;;;;;;;;;;:46;;;;14794:28;14814:7;14794;:15;14802:6;14794:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;14776:7;:15;14784:6;14776:15;;;;;;;;;;;;;;;:46;;;;14853:39;14876:15;14853:7;:18;14861:9;14853:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;14832:7;:18;14840:9;14832:18;;;;;;;;;;;;;;;:60;;;;14902:25;14916:10;14902:13;:25::i;:::-;14937:22;14948:4;14954;14937:10;:22::i;:::-;14991:9;14974:44;;14983:6;14974:44;;;15002:15;14974:44;;;;;;:::i;:::-;;;;;;;;14474:551;;;;;;;;;:::o;13905:563::-;14004:15;14021:23;14046:12;14060:23;14085:12;14099:18;14121;14131:7;14121:9;:18::i;:::-;14003:136;;;;;;;;;;;;14167:28;14187:7;14167;:15;14175:6;14167:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;14149:7;:15;14157:6;14149:15;;;;;;;;;;;;;;;:46;;;;14226:39;14249:15;14226:7;:18;14234:9;14226:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;14205:7;:18;14213:9;14205:18;;;;;;;;;;;;;;;:60;;;;14296:39;14319:15;14296:7;:18;14304:9;14296:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;14275:7;:18;14283:9;14275:18;;;;;;;;;;;;;;;:60;;;;14345:25;14359:10;14345:13;:25::i;:::-;14380:22;14391:4;14397;14380:10;:22::i;:::-;14434:9;14417:44;;14426:6;14417:44;;;14445:15;14417:44;;;;;;:::i;:::-;;;;;;;;13905:563;;;;;;;;;:::o;13408:491::-;13505:15;13522:23;13547:12;13561:23;13586:12;13600:18;13622;13632:7;13622:9;:18::i;:::-;13504:136;;;;;;;;;;;;13668:28;13688:7;13668;:15;13676:6;13668:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;13650:7;:15;13658:6;13650:15;;;;;;;;;;;;;;;:46;;;;13727:39;13750:15;13727:7;:18;13735:9;13727:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;13706:7;:18;13714:9;13706:18;;;;;;;;;;;;;;;:60;;;;13776:25;13790:10;13776:13;:25::i;:::-;13811:22;13822:4;13828;13811:10;:22::i;:::-;13865:9;13848:44;;13857:6;13848:44;;;13876:15;13848:44;;;;;;:::i;:::-;;;;;;;;13408:491;;;;;;;;;:::o;15031:621::-;15132:15;15149:23;15174:12;15188:23;15213:12;15227:18;15249;15259:7;15249:9;:18::i;:::-;15131:136;;;;;;;;;;;;15295:28;15315:7;15295;:15;15303:6;15295:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;15277:7;:15;15285:6;15277:15;;;;;;;;;;;;;;;:46;;;;15351:28;15371:7;15351;:15;15359:6;15351:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;15333:7;:15;15341:6;15333:15;;;;;;;;;;;;;;;:46;;;;15410:39;15433:15;15410:7;:18;15418:9;15410:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;15389:7;:18;15397:9;15389:18;;;;;;;;;;;;;;;:60;;;;15480:39;15503:15;15480:7;:18;15488:9;15480:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;15459:7;:18;15467:9;15459:18;;;;;;;;;;;;;;;:60;;;;15529:25;15543:10;15529:13;:25::i;:::-;15564:22;15575:4;15581;15564:10;:22::i;:::-;15618:9;15601:44;;15610:6;15601:44;;;15629:15;15601:44;;;;;;:::i;:::-;;;;;;;;15031:621;;;;;;;;;:::o;7210:122::-;7263:15;;7253:7;:25;;;;7304:21;;7288:13;:37;;;;7210:122::o;3000:96:6:-;3058:7;3088:1;3084;:5;;;;:::i;:::-;3077:12;;3000:96;;;;:::o;9798:150:1:-;9862:7;9888:53;9926:5;9888:20;9900:7;;9888;:11;;:20;;;;:::i;:::-;:24;;:53;;;;:::i;:::-;9881:60;;9798:150;;;:::o;9954:162::-;10024:7;10050:59;10094:5;10050:26;10062:13;;10050:7;:11;;:26;;;;:::i;:::-;:30;;:59;;;;:::i;:::-;10043:66;;9954:162;;;:::o;3334:96:6:-;3392:7;3422:1;3418;:5;;;;:::i;:::-;3411:12;;3334:96;;;;:::o;9445:347:1:-;9506:19;9529:9;:7;:9::i;:::-;9506:32;;9548:18;9569:27;9584:11;9569:10;:14;;:27;;;;:::i;:::-;9548:48;;9631:38;9658:10;9631:7;:22;9647:4;9631:22;;;;;;;;;;;;;;;;:26;;:38;;;;:::i;:::-;9606:7;:22;9622:4;9606:22;;;;;;;;;;;;;;;:63;;;;9682:11;:26;9702:4;9682:26;;;;;;;;;;;;;;;;;;;;;;;;;9679:106;;;9747:38;9774:10;9747:7;:22;9763:4;9747:22;;;;;;;;;;;;;;;;:26;;:38;;;;:::i;:::-;9722:7;:22;9738:4;9722:22;;;;;;;;;;;;;;;:63;;;;9679:106;9445:347;;;:::o;7407:143::-;7483:17;7495:4;7483:7;;:11;;:17;;;;:::i;:::-;7473:7;:27;;;;7523:20;7538:4;7523:10;;:14;;:20;;;;:::i;:::-;7510:10;:33;;;;7407:143;;:::o;7:139:7:-;53:5;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;59:87;;;;:::o;152:143::-;209:5;240:6;234:13;225:22;;256:33;283:5;256:33;:::i;:::-;215:80;;;;:::o;301:155::-;355:5;393:6;380:20;371:29;;409:41;444:5;409:41;:::i;:::-;361:95;;;;:::o;462:133::-;505:5;543:6;530:20;521:29;;559:30;583:5;559:30;:::i;:::-;511:84;;;;:::o;601:139::-;647:5;685:6;672:20;663:29;;701:33;728:5;701:33;:::i;:::-;653:87;;;;:::o;746:262::-;805:6;854:2;842:9;833:7;829:23;825:32;822:2;;;870:1;867;860:12;822:2;913:1;938:53;983:7;974:6;963:9;959:22;938:53;:::i;:::-;928:63;;884:117;812:196;;;;:::o;1014:284::-;1084:6;1133:2;1121:9;1112:7;1108:23;1104:32;1101:2;;;1149:1;1146;1139:12;1101:2;1192:1;1217:64;1273:7;1264:6;1253:9;1249:22;1217:64;:::i;:::-;1207:74;;1163:128;1091:207;;;;:::o;1304:278::-;1371:6;1420:2;1408:9;1399:7;1395:23;1391:32;1388:2;;;1436:1;1433;1426:12;1388:2;1479:1;1504:61;1557:7;1548:6;1537:9;1533:22;1504:61;:::i;:::-;1494:71;;1450:125;1378:204;;;;:::o;1588:407::-;1656:6;1664;1713:2;1701:9;1692:7;1688:23;1684:32;1681:2;;;1729:1;1726;1719:12;1681:2;1772:1;1797:53;1842:7;1833:6;1822:9;1818:22;1797:53;:::i;:::-;1787:63;;1743:117;1899:2;1925:53;1970:7;1961:6;1950:9;1946:22;1925:53;:::i;:::-;1915:63;;1870:118;1671:324;;;;;:::o;2001:552::-;2078:6;2086;2094;2143:2;2131:9;2122:7;2118:23;2114:32;2111:2;;;2159:1;2156;2149:12;2111:2;2202:1;2227:53;2272:7;2263:6;2252:9;2248:22;2227:53;:::i;:::-;2217:63;;2173:117;2329:2;2355:53;2400:7;2391:6;2380:9;2376:22;2355:53;:::i;:::-;2345:63;;2300:118;2457:2;2483:53;2528:7;2519:6;2508:9;2504:22;2483:53;:::i;:::-;2473:63;;2428:118;2101:452;;;;;:::o;2559:407::-;2627:6;2635;2684:2;2672:9;2663:7;2659:23;2655:32;2652:2;;;2700:1;2697;2690:12;2652:2;2743:1;2768:53;2813:7;2804:6;2793:9;2789:22;2768:53;:::i;:::-;2758:63;;2714:117;2870:2;2896:53;2941:7;2932:6;2921:9;2917:22;2896:53;:::i;:::-;2886:63;;2841:118;2642:324;;;;;:::o;2972:256::-;3028:6;3077:2;3065:9;3056:7;3052:23;3048:32;3045:2;;;3093:1;3090;3083:12;3045:2;3136:1;3161:50;3203:7;3194:6;3183:9;3179:22;3161:50;:::i;:::-;3151:60;;3107:114;3035:193;;;;:::o;3234:262::-;3293:6;3342:2;3330:9;3321:7;3317:23;3313:32;3310:2;;;3358:1;3355;3348:12;3310:2;3401:1;3426:53;3471:7;3462:6;3451:9;3447:22;3426:53;:::i;:::-;3416:63;;3372:117;3300:196;;;;:::o;3502:401::-;3567:6;3575;3624:2;3612:9;3603:7;3599:23;3595:32;3592:2;;;3640:1;3637;3630:12;3592:2;3683:1;3708:53;3753:7;3744:6;3733:9;3729:22;3708:53;:::i;:::-;3698:63;;3654:117;3810:2;3836:50;3878:7;3869:6;3858:9;3854:22;3836:50;:::i;:::-;3826:60;;3781:115;3582:321;;;;;:::o;3909:179::-;3978:10;3999:46;4041:3;4033:6;3999:46;:::i;:::-;4077:4;4072:3;4068:14;4054:28;;3989:99;;;;:::o;4094:108::-;4171:24;4189:5;4171:24;:::i;:::-;4166:3;4159:37;4149:53;;:::o;4208:118::-;4295:24;4313:5;4295:24;:::i;:::-;4290:3;4283:37;4273:53;;:::o;4362:732::-;4481:3;4510:54;4558:5;4510:54;:::i;:::-;4580:86;4659:6;4654:3;4580:86;:::i;:::-;4573:93;;4690:56;4740:5;4690:56;:::i;:::-;4769:7;4800:1;4785:284;4810:6;4807:1;4804:13;4785:284;;;4886:6;4880:13;4913:63;4972:3;4957:13;4913:63;:::i;:::-;4906:70;;4999:60;5052:6;4999:60;:::i;:::-;4989:70;;4845:224;4832:1;4829;4825:9;4820:14;;4785:284;;;4789:14;5085:3;5078:10;;4486:608;;;;;;;:::o;5100:109::-;5181:21;5196:5;5181:21;:::i;:::-;5176:3;5169:34;5159:50;;:::o;5215:147::-;5310:45;5349:5;5310:45;:::i;:::-;5305:3;5298:58;5288:74;;:::o;5368:364::-;5456:3;5484:39;5517:5;5484:39;:::i;:::-;5539:71;5603:6;5598:3;5539:71;:::i;:::-;5532:78;;5619:52;5664:6;5659:3;5652:4;5645:5;5641:16;5619:52;:::i;:::-;5696:29;5718:6;5696:29;:::i;:::-;5691:3;5687:39;5680:46;;5460:272;;;;;:::o;5738:366::-;5880:3;5901:67;5965:2;5960:3;5901:67;:::i;:::-;5894:74;;5977:93;6066:3;5977:93;:::i;:::-;6095:2;6090:3;6086:12;6079:19;;5884:220;;;:::o;6110:366::-;6252:3;6273:67;6337:2;6332:3;6273:67;:::i;:::-;6266:74;;6349:93;6438:3;6349:93;:::i;:::-;6467:2;6462:3;6458:12;6451:19;;6256:220;;;:::o;6482:366::-;6624:3;6645:67;6709:2;6704:3;6645:67;:::i;:::-;6638:74;;6721:93;6810:3;6721:93;:::i;:::-;6839:2;6834:3;6830:12;6823:19;;6628:220;;;:::o;6854:366::-;6996:3;7017:67;7081:2;7076:3;7017:67;:::i;:::-;7010:74;;7093:93;7182:3;7093:93;:::i;:::-;7211:2;7206:3;7202:12;7195:19;;7000:220;;;:::o;7226:366::-;7368:3;7389:67;7453:2;7448:3;7389:67;:::i;:::-;7382:74;;7465:93;7554:3;7465:93;:::i;:::-;7583:2;7578:3;7574:12;7567:19;;7372:220;;;:::o;7598:366::-;7740:3;7761:67;7825:2;7820:3;7761:67;:::i;:::-;7754:74;;7837:93;7926:3;7837:93;:::i;:::-;7955:2;7950:3;7946:12;7939:19;;7744:220;;;:::o;7970:366::-;8112:3;8133:67;8197:2;8192:3;8133:67;:::i;:::-;8126:74;;8209:93;8298:3;8209:93;:::i;:::-;8327:2;8322:3;8318:12;8311:19;;8116:220;;;:::o;8342:366::-;8484:3;8505:67;8569:2;8564:3;8505:67;:::i;:::-;8498:74;;8581:93;8670:3;8581:93;:::i;:::-;8699:2;8694:3;8690:12;8683:19;;8488:220;;;:::o;8714:366::-;8856:3;8877:67;8941:2;8936:3;8877:67;:::i;:::-;8870:74;;8953:93;9042:3;8953:93;:::i;:::-;9071:2;9066:3;9062:12;9055:19;;8860:220;;;:::o;9086:118::-;9173:24;9191:5;9173:24;:::i;:::-;9168:3;9161:37;9151:53;;:::o;9210:112::-;9293:22;9309:5;9293:22;:::i;:::-;9288:3;9281:35;9271:51;;:::o;9328:222::-;9421:4;9459:2;9448:9;9444:18;9436:26;;9472:71;9540:1;9529:9;9525:17;9516:6;9472:71;:::i;:::-;9426:124;;;;:::o;9556:210::-;9643:4;9681:2;9670:9;9666:18;9658:26;;9694:65;9756:1;9745:9;9741:17;9732:6;9694:65;:::i;:::-;9648:118;;;;:::o;9772:313::-;9885:4;9923:2;9912:9;9908:18;9900:26;;9972:9;9966:4;9962:20;9958:1;9947:9;9943:17;9936:47;10000:78;10073:4;10064:6;10000:78;:::i;:::-;9992:86;;9890:195;;;;:::o;10091:419::-;10257:4;10295:2;10284:9;10280:18;10272:26;;10344:9;10338:4;10334:20;10330:1;10319:9;10315:17;10308:47;10372:131;10498:4;10372:131;:::i;:::-;10364:139;;10262:248;;;:::o;10516:419::-;10682:4;10720:2;10709:9;10705:18;10697:26;;10769:9;10763:4;10759:20;10755:1;10744:9;10740:17;10733:47;10797:131;10923:4;10797:131;:::i;:::-;10789:139;;10687:248;;;:::o;10941:419::-;11107:4;11145:2;11134:9;11130:18;11122:26;;11194:9;11188:4;11184:20;11180:1;11169:9;11165:17;11158:47;11222:131;11348:4;11222:131;:::i;:::-;11214:139;;11112:248;;;:::o;11366:419::-;11532:4;11570:2;11559:9;11555:18;11547:26;;11619:9;11613:4;11609:20;11605:1;11594:9;11590:17;11583:47;11647:131;11773:4;11647:131;:::i;:::-;11639:139;;11537:248;;;:::o;11791:419::-;11957:4;11995:2;11984:9;11980:18;11972:26;;12044:9;12038:4;12034:20;12030:1;12019:9;12015:17;12008:47;12072:131;12198:4;12072:131;:::i;:::-;12064:139;;11962:248;;;:::o;12216:419::-;12382:4;12420:2;12409:9;12405:18;12397:26;;12469:9;12463:4;12459:20;12455:1;12444:9;12440:17;12433:47;12497:131;12623:4;12497:131;:::i;:::-;12489:139;;12387:248;;;:::o;12641:419::-;12807:4;12845:2;12834:9;12830:18;12822:26;;12894:9;12888:4;12884:20;12880:1;12869:9;12865:17;12858:47;12922:131;13048:4;12922:131;:::i;:::-;12914:139;;12812:248;;;:::o;13066:419::-;13232:4;13270:2;13259:9;13255:18;13247:26;;13319:9;13313:4;13309:20;13305:1;13294:9;13290:17;13283:47;13347:131;13473:4;13347:131;:::i;:::-;13339:139;;13237:248;;;:::o;13491:419::-;13657:4;13695:2;13684:9;13680:18;13672:26;;13744:9;13738:4;13734:20;13730:1;13719:9;13715:17;13708:47;13772:131;13898:4;13772:131;:::i;:::-;13764:139;;13662:248;;;:::o;13916:222::-;14009:4;14047:2;14036:9;14032:18;14024:26;;14060:71;14128:1;14117:9;14113:17;14104:6;14060:71;:::i;:::-;14014:124;;;;:::o;14144:831::-;14407:4;14445:3;14434:9;14430:19;14422:27;;14459:71;14527:1;14516:9;14512:17;14503:6;14459:71;:::i;:::-;14540:80;14616:2;14605:9;14601:18;14592:6;14540:80;:::i;:::-;14667:9;14661:4;14657:20;14652:2;14641:9;14637:18;14630:48;14695:108;14798:4;14789:6;14695:108;:::i;:::-;14687:116;;14813:72;14881:2;14870:9;14866:18;14857:6;14813:72;:::i;:::-;14895:73;14963:3;14952:9;14948:19;14939:6;14895:73;:::i;:::-;14412:563;;;;;;;;:::o;14981:214::-;15070:4;15108:2;15097:9;15093:18;15085:26;;15121:67;15185:1;15174:9;15170:17;15161:6;15121:67;:::i;:::-;15075:120;;;;:::o;15201:132::-;15268:4;15291:3;15283:11;;15321:4;15316:3;15312:14;15304:22;;15273:60;;;:::o;15339:114::-;15406:6;15440:5;15434:12;15424:22;;15413:40;;;:::o;15459:99::-;15511:6;15545:5;15539:12;15529:22;;15518:40;;;:::o;15564:113::-;15634:4;15666;15661:3;15657:14;15649:22;;15639:38;;;:::o;15683:184::-;15782:11;15816:6;15811:3;15804:19;15856:4;15851:3;15847:14;15832:29;;15794:73;;;;:::o;15873:169::-;15957:11;15991:6;15986:3;15979:19;16031:4;16026:3;16022:14;16007:29;;15969:73;;;;:::o;16048:305::-;16088:3;16107:20;16125:1;16107:20;:::i;:::-;16102:25;;16141:20;16159:1;16141:20;:::i;:::-;16136:25;;16295:1;16227:66;16223:74;16220:1;16217:81;16214:2;;;16301:18;;:::i;:::-;16214:2;16345:1;16342;16338:9;16331:16;;16092:261;;;;:::o;16359:185::-;16399:1;16416:20;16434:1;16416:20;:::i;:::-;16411:25;;16450:20;16468:1;16450:20;:::i;:::-;16445:25;;16489:1;16479:2;;16494:18;;:::i;:::-;16479:2;16536:1;16533;16529:9;16524:14;;16401:143;;;;:::o;16550:348::-;16590:7;16613:20;16631:1;16613:20;:::i;:::-;16608:25;;16647:20;16665:1;16647:20;:::i;:::-;16642:25;;16835:1;16767:66;16763:74;16760:1;16757:81;16752:1;16745:9;16738:17;16734:105;16731:2;;;16842:18;;:::i;:::-;16731:2;16890:1;16887;16883:9;16872:20;;16598:300;;;;:::o;16904:191::-;16944:4;16964:20;16982:1;16964:20;:::i;:::-;16959:25;;16998:20;17016:1;16998:20;:::i;:::-;16993:25;;17037:1;17034;17031:8;17028:2;;;17042:18;;:::i;:::-;17028:2;17087:1;17084;17080:9;17072:17;;16949:146;;;;:::o;17101:96::-;17138:7;17167:24;17185:5;17167:24;:::i;:::-;17156:35;;17146:51;;;:::o;17203:104::-;17248:7;17277:24;17295:5;17277:24;:::i;:::-;17266:35;;17256:51;;;:::o;17313:90::-;17347:7;17390:5;17383:13;17376:21;17365:32;;17355:48;;;:::o;17409:126::-;17446:7;17486:42;17479:5;17475:54;17464:65;;17454:81;;;:::o;17541:77::-;17578:7;17607:5;17596:16;;17586:32;;;:::o;17624:86::-;17659:7;17699:4;17692:5;17688:16;17677:27;;17667:43;;;:::o;17716:121::-;17774:9;17807:24;17825:5;17807:24;:::i;:::-;17794:37;;17784:53;;;:::o;17843:307::-;17911:1;17921:113;17935:6;17932:1;17929:13;17921:113;;;18020:1;18015:3;18011:11;18005:18;18001:1;17996:3;17992:11;17985:39;17957:2;17954:1;17950:10;17945:15;;17921:113;;;18052:6;18049:1;18046:13;18043:2;;;18132:1;18123:6;18118:3;18114:16;18107:27;18043:2;17892:258;;;;:::o;18156:320::-;18200:6;18237:1;18231:4;18227:12;18217:22;;18284:1;18278:4;18274:12;18305:18;18295:2;;18361:4;18353:6;18349:17;18339:27;;18295:2;18423;18415:6;18412:14;18392:18;18389:38;18386:2;;;18442:18;;:::i;:::-;18386:2;18207:269;;;;:::o;18482:233::-;18521:3;18544:24;18562:5;18544:24;:::i;:::-;18535:33;;18590:66;18583:5;18580:77;18577:2;;;18660:18;;:::i;:::-;18577:2;18707:1;18700:5;18696:13;18689:20;;18525:190;;;:::o;18721:180::-;18769:77;18766:1;18759:88;18866:4;18863:1;18856:15;18890:4;18887:1;18880:15;18907:180;18955:77;18952:1;18945:88;19052:4;19049:1;19042:15;19076:4;19073:1;19066:15;19093:180;19141:77;19138:1;19131:88;19238:4;19235:1;19228:15;19262:4;19259:1;19252:15;19279:102;19320:6;19371:2;19367:7;19362:2;19355:5;19351:14;19347:28;19337:38;;19327:54;;;:::o;19387:222::-;19527:34;19523:1;19515:6;19511:14;19504:58;19596:5;19591:2;19583:6;19579:15;19572:30;19493:116;:::o;19615:229::-;19755:34;19751:1;19743:6;19739:14;19732:58;19824:12;19819:2;19811:6;19807:15;19800:37;19721:123;:::o;19850:221::-;19990:34;19986:1;19978:6;19974:14;19967:58;20059:4;20054:2;20046:6;20042:15;20035:29;19956:115;:::o;20077:177::-;20217:29;20213:1;20205:6;20201:14;20194:53;20183:71;:::o;20260:181::-;20400:33;20396:1;20388:6;20384:14;20377:57;20366:75;:::o;20447:182::-;20587:34;20583:1;20575:6;20571:14;20564:58;20553:76;:::o;20635:228::-;20775:34;20771:1;20763:6;20759:14;20752:58;20844:11;20839:2;20831:6;20827:15;20820:36;20741:122;:::o;20869:224::-;21009:34;21005:1;20997:6;20993:14;20986:58;21078:7;21073:2;21065:6;21061:15;21054:32;20975:118;:::o;21099:223::-;21239:34;21235:1;21227:6;21223:14;21216:58;21308:6;21303:2;21295:6;21291:15;21284:31;21205:117;:::o;21328:122::-;21401:24;21419:5;21401:24;:::i;:::-;21394:5;21391:35;21381:2;;21440:1;21437;21430:12;21381:2;21371:79;:::o;21456:138::-;21537:32;21563:5;21537:32;:::i;:::-;21530:5;21527:43;21517:2;;21584:1;21581;21574:12;21517:2;21507:87;:::o;21600:116::-;21670:21;21685:5;21670:21;:::i;:::-;21663:5;21660:32;21650:2;;21706:1;21703;21696:12;21650:2;21640:76;:::o;21722:122::-;21795:24;21813:5;21795:24;:::i;:::-;21788:5;21785:35;21775:2;;21834:1;21831;21824:12;21775:2;21765:79;:::o

Swarm Source

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