ETH Price: $3,468.37 (+2.38%)
Gas: 13 Gwei

Token

Parma Token (PARMA)
 

Overview

Max Total Supply

94,935,005,661.5121178577162176 PARMA

Holders

1,303 (0.00%)

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
46,693,597.469701201689216104 PARMA

Value
$0.00
0xd170c102dd8ff7b5fe04b541bed573ccb29b67f9
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Parma takes the utility of a “culture” token to the next level. PARMA gives access to exclusive community experiments while also maintaining the token is 100% fair launch, with no team or presale tokens.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
PARMA

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license, Audited

Contract Source Code (Solidity Multiple files format)Audit Report

File 2 of 11: Contract.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC20.sol";
import "./Ownable.sol";
import "./SafeMath.sol";

import "./IUniswapV2Pair.sol";
import "./IUniswapV2Router02.sol";
import "./IUniswapV2Factory.sol";

/*
    @Parma Token
    - Website: https://parmatoken.com/
    - Telegram: https://t.me/ParmaToken

    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    @@@@@@@@@@@@@@@@@@@@@@     @@@@@@@@@@@@@@@@@@@@@@@@@@@     @@@@@@@@@@@@@@@@@@@@@
    @@@@@@@@@@@@@@@@@@   @@@@@@@@   @@@@@       @@@@@   @@@@@@@@   @@@@@@@@@@@@@@@@@
    @@@@@@@@@@@@@@@@  @@  ,,,,,  @@  @@@@@@@@@@@@@@@  @@  ,,,,,  @@  @@@@@@@@@@@@@@@
    @@@@@@@@@@@@@@@  @@ ,,,,,,,,, @@@%             ,@@@ ,,,,,,,,, @@  @@@@@@@@@@@@@@
    @@@@@@@@@@@@@@@  @ ,,,,,,,,,,, @@@@@ @@@@@@@ @@@@@@,,,,,,,,,,, @  @@@@@@@@@@@@@@
    @@@@@@@@@@@@@@@  @ ,,,,,,,,,,, @@(             *@@ ,,,,,,,,,,, @  @@@@@@@@@@@@@@
    @@@@@@@@@@@@@   @@@ ,,,,,,,,@@                     @@,,,,,,,, @@@   @@@@@@@@@@@@
    @@@@@@@@@@@  &@@   @@ ,,,, @                         @ ,,,, @@   @@#  @@@@@@@@@@
    @@@@@@@@@@  @@       @@@  @                           @  @@@       @@  @@@@@@@@@
    @@@@@@@@  @@             @                             @             @@  @@@@@@@
    @@@@@@@  @@             @                               @             @@  @@@@@@
    @@@@@@  @@            @@       @@@            @@@@       @@            @@  @@@@@
    @@@@@@ @@            @@       @@@@@           @@@@        @@            @@ @@@@@
    @@@@@  @@            @          @@             @@          @            @@  @@@@
    @@@@@  @             @@                                   @@             @  @@@@
    @@@@@ %@               @      &@@@  @@,,,,,@@ @@@@       @               @, @@@@
    @@@@@ .@        #@@@@@@@ @@   @@@@   @*,,,@@   @@@%   @@/@@@@@@@         @  @@@@
    @@@@@  @                @@@@@@@@              @@.....@@@                 @  @@@@
    @@@@@  @@         @@@             @@,    @@@......,,@.....@@@@@         @@  @@@@
    @@@@@@  @,                           @@......................@@        &@  @@@@@
    @@@@@@@  @                      @@@.............................@      @  @@@@@@
    @@@@@@@@  @.                @@...,@*..............................@  @@  @@@@@@@
    @@@@@@@@@  @@             @@.......................@@@@@@,,,,,,,,,,@@@  @@@@@@@@
    @@@@@@@@@@   @@     @@.......&@@@@@(,,,,,,,,,,,,,,,,,,,,,,,@*@,,,,,@   @@@@@@@@@
    @@@@@@@@@@@@  .@@  @,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,**%,,@@   @@@@@@@@@@
    @@@@@@@@@@@@@@   @@  @@,,,,@**,,,,,,,,,,,,,,,,,,,,@******@,,,,,,@  @@@@@@@@@@@@@
    @@@@@@@@@@@@@@@@@   @@@@,,,,,,,,,,,@**@,,,,,,,,,,,*********,,,,,,@@   @@@@@@@@@@
    @@@@@@@@@@@@@@@@@@@@  @@,,,,,,,,,,,,,,,,,,,,,,,,,,,,@****@,,,,,,,,,@  @@@@@@@@@@
    @@@@@@@@@@@@@@@@@@  @@,,,,,,,,,,,,,,,,,,,,,,,,,,@*,,,,,,,,,,,,(,,,,@  @@@@@@@@@@
    @@@@@@@@@@@@@@@@@@  @,,,,@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@  @@@@@@@@@@
    @@@@@@@@@@@@@@@@@@  @,,,,,,,,,,,,,,,@@    @&,,,,,,,,@@@@@@@@@@@      @@@@@@@@@@@
    @@@@@@@@@@@@@@@@@@@ @@,,,,,,,,@@@@@@  @@@@               @@@@@@@@@@@@@@@@@@@@@@@
    @@@@@@@@@@@@@@@@@@@              *@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
*/

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

    IUniswapV2Router02 private uniswapV2Router;
    address private uniswapV2Pair;

    mapping (address => bool) private _isBlacklisted;
    bool private _swapping;
    uint256 private _launchTime;

    address private feeWallet;
    
    uint256 public maxTransactionAmount;
    uint256 public swapTokensAtAmount;
    uint256 public maxWallet;
        
    bool public limitsInEffect = true;
    bool public tradingActive = false;
    
    // Anti-bot and anti-whale mappings and variables
    mapping(address => uint256) private _holderLastTransferTimestamp; // to hold last Transfers temporarily during launch
    bool public transferDelayEnabled = true;

    uint256 public totalFees;
    uint256 private _marketingFee;
    uint256 private _liquidityFee;
    uint256 private _devFee;
    
    uint256 private _tokensForMarketing;
    uint256 private _tokensForLiquidity;
    uint256 private _tokensForDev;
    
    uint256 private _burnFee;

    // exlcude from fees and max transaction amount
    mapping (address => bool) private _isExcludedFromFees;
    mapping (address => bool) private _isExcludedMaxTransactionAmount;

    // store addresses that a automatic market maker pairs. Any transfer *to* these addresses
    // could be subject to a maximum transfer amount
    mapping (address => bool) private automatedMarketMakerPairs;

    event ExcludeFromFees(address indexed account, bool isExcluded);
    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);
    event feeWalletUpdated(address indexed newWallet, address indexed oldWallet);
    event SwapAndLiquify(uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiquidity);

    constructor() ERC20("Parma Token", "PARMA") {
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        
        excludeFromMaxTransaction(address(_uniswapV2Router), true);
        uniswapV2Router = _uniswapV2Router;
        
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()).createPair(address(this), _uniswapV2Router.WETH());
        excludeFromMaxTransaction(address(uniswapV2Pair), true);
        _setAutomatedMarketMakerPair(address(uniswapV2Pair), true);
        
        uint256 marketingFee = 4;
        uint256 liquidityFee = 2;
        uint256 devFee = 1;
        uint256 burnFee = 1;
        
        uint256 totalSupply = 1e11 * 1e18;
        
        maxTransactionAmount = totalSupply * 5 / 1000;
        maxWallet = totalSupply * 1 / 100;
        swapTokensAtAmount = totalSupply * 15 / 10000;

        _marketingFee = marketingFee;
        _liquidityFee = liquidityFee;
        _devFee = devFee;
        totalFees = _marketingFee + _liquidityFee + _devFee;
        
        _burnFee = burnFee;

        feeWallet = address(owner()); // set as fee wallet

        // exclude from paying fees or having max transaction amount
        excludeFromFees(owner(), true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);
        
        excludeFromMaxTransaction(owner(), true);
        excludeFromMaxTransaction(address(this), true);
        excludeFromMaxTransaction(address(0xdead), true);
        
        /*
            _mint is an internal function in ERC20.sol that is only called here,
            and CANNOT be called ever again
        */
        _mint(msg.sender, totalSupply);
    }

    // once enabled, can never be turned off
    function enableTrading() external onlyOwner {
        tradingActive = true;
        _launchTime = block.timestamp.add(2);
    }
    
    // remove limits after token is stable
    function removeLimits() external onlyOwner returns (bool) {
        limitsInEffect = false;
        return true;
    }
    
    // disable Transfer delay - cannot be reenabled
    function disableTransferDelay() external onlyOwner returns (bool) {
        transferDelayEnabled = false;
        return true;
    }
    
     // change the minimum amount of tokens to sell from fees
    function updateSwapTokensAtAmount(uint256 newAmount) external onlyOwner returns (bool) {
  	    require(newAmount >= totalSupply() * 1 / 100000, "Swap amount cannot be lower than 0.001% total supply.");
  	    require(newAmount <= totalSupply() * 5 / 1000, "Swap amount cannot be higher than 0.5% total supply.");
  	    swapTokensAtAmount = newAmount;
  	    return true;
  	}
    
    function updateMaxTxnAmount(uint256 newNum) external onlyOwner {
        require(newNum >= (totalSupply() * 1 / 1000) / 1e18, "Cannot set maxTransactionAmount lower than 0.1%");
        maxTransactionAmount = newNum * 1e18;
    }

    function updateMaxWalletAmount(uint256 newNum) external onlyOwner {
        require(newNum >= (totalSupply() * 5 / 1000)/1e18, "Cannot set maxWallet lower than 0.5%");
        maxWallet = newNum * 1e18;
    }
    
    function excludeFromMaxTransaction(address updAds, bool isEx) public onlyOwner {
        _isExcludedMaxTransactionAmount[updAds] = isEx;
    }
    
    function updateFees(uint256 marketingFee, uint256 liquidityFee, uint256 devFee) external onlyOwner {
        _marketingFee = marketingFee;
        _liquidityFee = liquidityFee;
        _devFee = devFee;
        totalFees = _marketingFee + _liquidityFee + _devFee;
        require(totalFees <= 10, "Must keep fees at 10% or less");
    }

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

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

        _setAutomatedMarketMakerPair(pair, value);
    }

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

        emit SetAutomatedMarketMakerPair(pair, value);
    }
    
    function updateFeeWallet(address newWallet) external onlyOwner {
        emit feeWalletUpdated(newWallet, feeWallet);
        feeWallet = newWallet;
    }

    function isExcludedFromFees(address account) public view returns(bool) {
        return _isExcludedFromFees[account];
    }
    
    function setBlacklisted(address[] memory blacklisted_) public onlyOwner {
        for (uint i = 0; i < blacklisted_.length; i++) {
            if (blacklisted_[i] != uniswapV2Pair && blacklisted_[i] != address(uniswapV2Router)) {
                _isBlacklisted[blacklisted_[i]] = true;
            }
        }
    }
    
    function delBlacklisted(address[] memory blacklisted_) public onlyOwner {
        for (uint i = 0; i < blacklisted_.length; i++) {
            _isBlacklisted[blacklisted_[i]] = false;
        }
    }
    
    function isSniper(address addr) public view returns (bool) {
        return _isBlacklisted[addr];
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(!_isBlacklisted[from], "Your address has been marked as a sniper, you are unable to transfer or swap.");
        
         if (amount == 0) {
            super._transfer(from, to, 0);
            return;
        }

        // Burn baby burn! 🔥
        if (!_isExcludedFromFees[from] && !_isExcludedFromFees[to]) {
            uint256 burnAmount = amount.div(100);
            _burn(from, burnAmount);
            amount -= burnAmount;
        }

        if (block.timestamp <= _launchTime) _isBlacklisted[to] = true;
        
        if (limitsInEffect) {
            if (
                from != owner() &&
                to != owner() &&
                to != address(0) &&
                to != address(0xdead) &&
                !_swapping
            ) {
                if (!tradingActive) {
                    require(_isExcludedFromFees[from] || _isExcludedFromFees[to], "Trading is not active.");
                }

                // at launch if the transfer delay is enabled, ensure the block timestamps for purchasers is set -- during launch.  
                if (transferDelayEnabled){
                    if (to != owner() && to != address(uniswapV2Router) && to != address(uniswapV2Pair)){
                        require(_holderLastTransferTimestamp[tx.origin] < block.number, "_transfer:: Transfer Delay enabled.  Only one purchase per block allowed.");
                        _holderLastTransferTimestamp[tx.origin] = block.number;
                    }
                }
                 
                // when buy
                if (automatedMarketMakerPairs[from] && !_isExcludedMaxTransactionAmount[to]) {
                    require(amount <= maxTransactionAmount, "Buy transfer amount exceeds the maxTransactionAmount.");
                    require(amount + balanceOf(to) <= maxWallet, "Max wallet exceeded");
                }
                
                // when sell
                else if (automatedMarketMakerPairs[to] && !_isExcludedMaxTransactionAmount[from]) {
                    require(amount <= maxTransactionAmount, "Sell transfer amount exceeds the maxTransactionAmount.");
                }
                else if (!_isExcludedMaxTransactionAmount[to]){
                    require(amount + balanceOf(to) <= maxWallet, "Max wallet exceeded");
                }
            }
        }
        
		uint256 contractTokenBalance = balanceOf(address(this));
        bool canSwap = contractTokenBalance >= swapTokensAtAmount;
        if (
            canSwap &&
            !_swapping &&
            !automatedMarketMakerPairs[from] &&
            !_isExcludedFromFees[from] &&
            !_isExcludedFromFees[to]
        ) {
            _swapping = true;
            swapBack();
            _swapping = false;
        }

        bool takeFee = !_swapping;

        // if any account belongs to _isExcludedFromFee account then remove the fee
        if (_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }
        
        uint256 fees = 0;
        // only take fees on buys/sells, do not take on wallet transfers
        if (takeFee) {
            fees = amount.mul(totalFees).div(100);
            _tokensForLiquidity += fees * _liquidityFee / totalFees;
            _tokensForDev += fees * _devFee / totalFees;
            _tokensForMarketing += fees * _marketingFee / totalFees;
            
            if (fees > 0) {
                super._transfer(from, address(this), fees);
            }
        	
        	amount -= fees;
        }

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

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

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

        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }
    
    function _addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // add the liquidity
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            owner(),
            block.timestamp
        );
    }

    function swapBack() private {
        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensToSwap = _tokensForLiquidity + _tokensForMarketing + _tokensForDev;
        
        if (contractBalance == 0 || totalTokensToSwap == 0) return;
        if (contractBalance > swapTokensAtAmount) {
          contractBalance = swapTokensAtAmount;
        }
        
        // Halve the amount of liquidity tokens
        uint256 liquidityTokens = contractBalance * _tokensForLiquidity / totalTokensToSwap / 2;
        uint256 amountToSwapForETH = contractBalance.sub(liquidityTokens);
        
        uint256 initialETHBalance = address(this).balance;

        _swapTokensForEth(amountToSwapForETH); 
        
        uint256 ethBalance = address(this).balance.sub(initialETHBalance);
        uint256 ethForMarketing = ethBalance.mul(_tokensForMarketing).div(totalTokensToSwap);
        uint256 ethForDev = ethBalance.mul(_tokensForDev).div(totalTokensToSwap);
        uint256 ethForLiquidity = ethBalance - ethForMarketing - ethForDev;
        
        _tokensForLiquidity = 0;
        _tokensForMarketing = 0;
        _tokensForDev = 0;

        payable(feeWallet).transfer(ethForMarketing.add(ethForDev));
                
        if (liquidityTokens > 0 && ethForLiquidity > 0) {
            _addLiquidity(liquidityTokens, ethForLiquidity);
            emit SwapAndLiquify(amountToSwapForETH, ethForLiquidity, _tokensForLiquidity);
        }
    }

    function forceSwap() external onlyOwner {
        _swapTokensForEth(address(this).balance);
        payable(feeWallet).transfer(address(this).balance);
    }

    function forceSend() external onlyOwner {
        payable(feeWallet).transfer(address(this).balance);
    }

    receive() external payable {}
}

File 1 of 11: Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

File 3 of 11: ERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;

import "./IERC20.sol";
import "./IERC20Metadata.sol";
import "./Context.sol";

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

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

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

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

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

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

        return true;
    }

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

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
        }
        _balances[to] += amount;

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

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

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

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

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

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

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

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

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

    /**
     * @dev Spend `amount` form the allowance of `owner` toward `spender`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

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

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

File 4 of 11: IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

    /**
     * @dev 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 5 of 11: IERC20Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;

import "./IERC20.sol";

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

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

File 6 of 11: IUniswapV2Factory.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.5.0;

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

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

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

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

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

File 7 of 11: IUniswapV2Pair.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.5.0;

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

File 8 of 11: IUniswapV2Router01.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.2;

interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

File 9 of 11: IUniswapV2Router02.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.2;

import './IUniswapV2Router01.sol';

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 10 of 11: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

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() {
        _transferOwnership(_msgSender());
    }

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

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

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

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 11 of 11: SafeMath.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

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

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

    /**
     * @dev Returns the 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. 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":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiquidity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"feeWalletUpdated","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":"blacklisted_","type":"address[]"}],"name":"delBlacklisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableTransferDelay","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forceSend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forceSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isSniper","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"blacklisted_","type":"address[]"}],"name":"setBlacklisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferDelayEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"updateFeeWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketingFee","type":"uint256"},{"internalType":"uint256","name":"liquidityFee","type":"uint256"},{"internalType":"uint256","name":"devFee","type":"uint256"}],"name":"updateFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxTxnAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateSwapTokensAtAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526001600f60006101000a81548160ff0219169083151502179055506000600f60016101000a81548160ff0219169083151502179055506001601160006101000a81548160ff0219169083151502179055503480156200006257600080fd5b506040518060400160405280600b81526020017f5061726d6120546f6b656e0000000000000000000000000000000000000000008152506040518060400160405280600581526020017f5041524d410000000000000000000000000000000000000000000000000000008152508160039080519060200190620000e792919062000ae9565b5080600490805190602001906200010092919062000ae9565b5050506200012362000117620005a960201b60201c565b620005b160201b60201c565b6000737a250d5630b4cf539739df2c5dacb4c659f2488d90506200014f8160016200067760201b60201c565b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015620001d757600080fd5b505afa158015620001ec573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000212919062000bb0565b73ffffffffffffffffffffffffffffffffffffffff1663c9c65396308373ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200027557600080fd5b505afa1580156200028a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002b0919062000bb0565b6040518363ffffffff1660e01b8152600401620002cf92919062000c63565b602060405180830381600087803b158015620002ea57600080fd5b505af1158015620002ff573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000325919062000bb0565b600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200039a600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660016200067760201b60201c565b620003cf600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660016200076160201b60201c565b60006004905060006002905060006001905060006001905060006c01431e0fae6d7217caa000000090506103e86005826200040b919062000db4565b62000417919062000d7c565b600c8190555060646001826200042e919062000db4565b6200043a919062000d7c565b600e81905550612710600f8262000452919062000db4565b6200045e919062000d7c565b600d819055508460138190555083601481905550826015819055506015546014546013546200048e919062000d1f565b6200049a919062000d1f565b60128190555081601981905550620004b76200080260201b60201c565b600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620005196200050b6200080260201b60201c565b60016200082c60201b60201c565b6200052c3060016200082c60201b60201c565b6200054161dead60016200082c60201b60201c565b62000563620005556200080260201b60201c565b60016200067760201b60201c565b620005763060016200067760201b60201c565b6200058b61dead60016200067760201b60201c565b6200059d33826200096660201b60201c565b50505050505062000f93565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b62000687620005a960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620006ad6200080260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000706576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006fd9062000cad565b60405180910390fd5b80601b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b80601c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6200083c620005a960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620008626200080260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620008bb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008b29062000cad565b60405180910390fd5b80601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7826040516200095a919062000c90565b60405180910390a25050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620009d9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009d09062000ccf565b60405180910390fd5b620009ed6000838362000adf60201b60201c565b806002600082825462000a01919062000d1f565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825462000a58919062000d1f565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000abf919062000cf1565b60405180910390a362000adb6000838362000ae460201b60201c565b5050565b505050565b505050565b82805462000af79062000e5f565b90600052602060002090601f01602090048101928262000b1b576000855562000b67565b82601f1062000b3657805160ff191683800117855562000b67565b8280016001018555821562000b67579182015b8281111562000b6657825182559160200191906001019062000b49565b5b50905062000b76919062000b7a565b5090565b5b8082111562000b9557600081600090555060010162000b7b565b5090565b60008151905062000baa8162000f79565b92915050565b60006020828403121562000bc95762000bc862000f22565b5b600062000bd98482850162000b99565b91505092915050565b62000bed8162000e15565b82525050565b62000bfe8162000e29565b82525050565b600062000c1360208362000d0e565b915062000c208262000f27565b602082019050919050565b600062000c3a601f8362000d0e565b915062000c478262000f50565b602082019050919050565b62000c5d8162000e55565b82525050565b600060408201905062000c7a600083018562000be2565b62000c89602083018462000be2565b9392505050565b600060208201905062000ca7600083018462000bf3565b92915050565b6000602082019050818103600083015262000cc88162000c04565b9050919050565b6000602082019050818103600083015262000cea8162000c2b565b9050919050565b600060208201905062000d08600083018462000c52565b92915050565b600082825260208201905092915050565b600062000d2c8262000e55565b915062000d398362000e55565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000d715762000d7062000e95565b5b828201905092915050565b600062000d898262000e55565b915062000d968362000e55565b92508262000da95762000da862000ec4565b5b828204905092915050565b600062000dc18262000e55565b915062000dce8362000e55565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562000e0a5762000e0962000e95565b5b828202905092915050565b600062000e228262000e35565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000600282049050600182168062000e7857607f821691505b6020821081141562000e8f5762000e8e62000ef3565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b62000f848162000e15565b811462000f9057600080fd5b50565b61513c8062000fa36000396000f3fe6080604052600436106102295760003560e01c80638a8c523c11610123578063c8125e45116100ab578063df778d261161006f578063df778d2614610826578063e2f456051461083d578063e884f26014610868578063f2fde38b14610893578063f8b45b05146108bc57610230565b8063c8125e451461072d578063c876d0b914610756578063c8c8ebe414610781578063d257b34f146107ac578063dd62ed3e146107e957610230565b8063a457c2d7116100f2578063a457c2d714610636578063a9059cbb14610673578063bbc0c742146106b0578063c0246668146106db578063c18bc1951461070457610230565b80638a8c523c146105a05780638da5cb5b146105b757806395d89b41146105e25780639a7a23d61461060d57610230565b806323b872dd116101b1578063667185241161017557806366718524146104cf57806370a08231146104f8578063715018a614610535578063751039fc1461054c5780637571336a1461057757610230565b806323b872dd146103c2578063313ce567146103ff578063395093511461042a5780634a62bb65146104675780634fbee1931461049257610230565b806312b77e8a116101f857806312b77e8a1461030357806313114a9d1461031a57806318160ddd14610345578063203e727e14610370578063224290851461039957610230565b806306fdde0314610235578063095ea7b3146102605780630b559c6f1461029d5780630f3a325f146102c657610230565b3661023057005b600080fd5b34801561024157600080fd5b5061024a6108e7565b6040516102579190614240565b60405180910390f35b34801561026c57600080fd5b5061028760048036038101906102829190613c1f565b610979565b6040516102949190614225565b60405180910390f35b3480156102a957600080fd5b506102c460048036038101906102bf9190613c5f565b61099c565b005b3480156102d257600080fd5b506102ed60048036038101906102e89190613af2565b610b93565b6040516102fa9190614225565b60405180910390f35b34801561030f57600080fd5b50610318610be9565b005b34801561032657600080fd5b5061032f610cd0565b60405161033c9190614542565b60405180910390f35b34801561035157600080fd5b5061035a610cd6565b6040516103679190614542565b60405180910390f35b34801561037c57600080fd5b5061039760048036038101906103929190613ca8565b610ce0565b005b3480156103a557600080fd5b506103c060048036038101906103bb9190613cd5565b610def565b005b3480156103ce57600080fd5b506103e960048036038101906103e49190613b8c565b610eee565b6040516103f69190614225565b60405180910390f35b34801561040b57600080fd5b50610414610f1d565b60405161042191906145ee565b60405180910390f35b34801561043657600080fd5b50610451600480360381019061044c9190613c1f565b610f26565b60405161045e9190614225565b60405180910390f35b34801561047357600080fd5b5061047c610fd0565b6040516104899190614225565b60405180910390f35b34801561049e57600080fd5b506104b960048036038101906104b49190613af2565b610fe3565b6040516104c69190614225565b60405180910390f35b3480156104db57600080fd5b506104f660048036038101906104f19190613af2565b611039565b005b34801561050457600080fd5b5061051f600480360381019061051a9190613af2565b611175565b60405161052c9190614542565b60405180910390f35b34801561054157600080fd5b5061054a6111bd565b005b34801561055857600080fd5b50610561611245565b60405161056e9190614225565b60405180910390f35b34801561058357600080fd5b5061059e60048036038101906105999190613bdf565b6112e5565b005b3480156105ac57600080fd5b506105b56113bc565b005b3480156105c357600080fd5b506105cc61146f565b6040516105d991906141a9565b60405180910390f35b3480156105ee57600080fd5b506105f7611499565b6040516106049190614240565b60405180910390f35b34801561061957600080fd5b50610634600480360381019061062f9190613bdf565b61152b565b005b34801561064257600080fd5b5061065d60048036038101906106589190613c1f565b611646565b60405161066a9190614225565b60405180910390f35b34801561067f57600080fd5b5061069a60048036038101906106959190613c1f565b611730565b6040516106a79190614225565b60405180910390f35b3480156106bc57600080fd5b506106c5611753565b6040516106d29190614225565b60405180910390f35b3480156106e757600080fd5b5061070260048036038101906106fd9190613bdf565b611766565b005b34801561071057600080fd5b5061072b60048036038101906107269190613ca8565b61188b565b005b34801561073957600080fd5b50610754600480360381019061074f9190613c5f565b61199a565b005b34801561076257600080fd5b5061076b611aab565b6040516107789190614225565b60405180910390f35b34801561078d57600080fd5b50610796611abe565b6040516107a39190614542565b60405180910390f35b3480156107b857600080fd5b506107d360048036038101906107ce9190613ca8565b611ac4565b6040516107e09190614225565b60405180910390f35b3480156107f557600080fd5b50610810600480360381019061080b9190613b4c565b611c19565b60405161081d9190614542565b60405180910390f35b34801561083257600080fd5b5061083b611ca0565b005b34801561084957600080fd5b50610852611d90565b60405161085f9190614542565b60405180910390f35b34801561087457600080fd5b5061087d611d96565b60405161088a9190614225565b60405180910390f35b34801561089f57600080fd5b506108ba60048036038101906108b59190613af2565b611e36565b005b3480156108c857600080fd5b506108d1611f2e565b6040516108de9190614542565b60405180910390f35b6060600380546108f69061485e565b80601f01602080910402602001604051908101604052809291908181526020018280546109229061485e565b801561096f5780601f106109445761010080835404028352916020019161096f565b820191906000526020600020905b81548152906001019060200180831161095257829003601f168201915b5050505050905090565b600080610984611f34565b9050610991818585611f3c565b600191505092915050565b6109a4611f34565b73ffffffffffffffffffffffffffffffffffffffff166109c261146f565b73ffffffffffffffffffffffffffffffffffffffff1614610a18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0f90614442565b60405180910390fd5b60005b8151811015610b8f57600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16828281518110610a7057610a6f614997565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614158015610b045750600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16828281518110610ae357610ae2614997565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614155b15610b7c57600160086000848481518110610b2257610b21614997565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b8080610b87906148c1565b915050610a1b565b5050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b610bf1611f34565b73ffffffffffffffffffffffffffffffffffffffff16610c0f61146f565b73ffffffffffffffffffffffffffffffffffffffff1614610c65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5c90614442565b60405180910390fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610ccd573d6000803e3d6000fd5b50565b60125481565b6000600254905090565b610ce8611f34565b73ffffffffffffffffffffffffffffffffffffffff16610d0661146f565b73ffffffffffffffffffffffffffffffffffffffff1614610d5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5390614442565b60405180910390fd5b670de0b6b3a76400006103e86001610d72610cd6565b610d7c9190614736565b610d869190614705565b610d909190614705565b811015610dd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc990614522565b60405180910390fd5b670de0b6b3a764000081610de69190614736565b600c8190555050565b610df7611f34565b73ffffffffffffffffffffffffffffffffffffffff16610e1561146f565b73ffffffffffffffffffffffffffffffffffffffff1614610e6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6290614442565b60405180910390fd5b826013819055508160148190555080601581905550601554601454601354610e9391906146af565b610e9d91906146af565b601281905550600a6012541115610ee9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee090614282565b60405180910390fd5b505050565b600080610ef9611f34565b9050610f06858285612107565b610f11858585612193565b60019150509392505050565b60006012905090565b600080610f31611f34565b9050610fc5818585600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610fc091906146af565b611f3c565b600191505092915050565b600f60009054906101000a900460ff1681565b6000601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b611041611f34565b73ffffffffffffffffffffffffffffffffffffffff1661105f61146f565b73ffffffffffffffffffffffffffffffffffffffff16146110b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ac90614442565b60405180910390fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f5deb5ef622431f0df5a39b72dd556892f68ba42aa0f3aaf0800e166ce866492860405160405180910390a380600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6111c5611f34565b73ffffffffffffffffffffffffffffffffffffffff166111e361146f565b73ffffffffffffffffffffffffffffffffffffffff1614611239576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123090614442565b60405180910390fd5b6112436000612e59565b565b600061124f611f34565b73ffffffffffffffffffffffffffffffffffffffff1661126d61146f565b73ffffffffffffffffffffffffffffffffffffffff16146112c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ba90614442565b60405180910390fd5b6000600f60006101000a81548160ff0219169083151502179055506001905090565b6112ed611f34565b73ffffffffffffffffffffffffffffffffffffffff1661130b61146f565b73ffffffffffffffffffffffffffffffffffffffff1614611361576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135890614442565b60405180910390fd5b80601b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6113c4611f34565b73ffffffffffffffffffffffffffffffffffffffff166113e261146f565b73ffffffffffffffffffffffffffffffffffffffff1614611438576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142f90614442565b60405180910390fd5b6001600f60016101000a81548160ff021916908315150217905550611467600242612f1f90919063ffffffff16565b600a81905550565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546114a89061485e565b80601f01602080910402602001604051908101604052809291908181526020018280546114d49061485e565b80156115215780601f106114f657610100808354040283529160200191611521565b820191906000526020600020905b81548152906001019060200180831161150457829003601f168201915b5050505050905090565b611533611f34565b73ffffffffffffffffffffffffffffffffffffffff1661155161146f565b73ffffffffffffffffffffffffffffffffffffffff16146115a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159e90614442565b60405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611638576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162f90614342565b60405180910390fd5b6116428282612f35565b5050565b600080611651611f34565b90506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015611717576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170e90614502565b60405180910390fd5b6117248286868403611f3c565b60019250505092915050565b60008061173b611f34565b9050611748818585612193565b600191505092915050565b600f60019054906101000a900460ff1681565b61176e611f34565b73ffffffffffffffffffffffffffffffffffffffff1661178c61146f565b73ffffffffffffffffffffffffffffffffffffffff16146117e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d990614442565b60405180910390fd5b80601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df78260405161187f9190614225565b60405180910390a25050565b611893611f34565b73ffffffffffffffffffffffffffffffffffffffff166118b161146f565b73ffffffffffffffffffffffffffffffffffffffff1614611907576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fe90614442565b60405180910390fd5b670de0b6b3a76400006103e8600561191d610cd6565b6119279190614736565b6119319190614705565b61193b9190614705565b81101561197d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197490614322565b60405180910390fd5b670de0b6b3a7640000816119919190614736565b600e8190555050565b6119a2611f34565b73ffffffffffffffffffffffffffffffffffffffff166119c061146f565b73ffffffffffffffffffffffffffffffffffffffff1614611a16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0d90614442565b60405180910390fd5b60005b8151811015611aa757600060086000848481518110611a3b57611a3a614997565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611a9f906148c1565b915050611a19565b5050565b601160009054906101000a900460ff1681565b600c5481565b6000611ace611f34565b73ffffffffffffffffffffffffffffffffffffffff16611aec61146f565b73ffffffffffffffffffffffffffffffffffffffff1614611b42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3990614442565b60405180910390fd5b620186a06001611b50610cd6565b611b5a9190614736565b611b649190614705565b821015611ba6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9d906143c2565b60405180910390fd5b6103e86005611bb3610cd6565b611bbd9190614736565b611bc79190614705565b821115611c09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c00906143e2565b60405180910390fd5b81600d8190555060019050919050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611ca8611f34565b73ffffffffffffffffffffffffffffffffffffffff16611cc661146f565b73ffffffffffffffffffffffffffffffffffffffff1614611d1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1390614442565b60405180910390fd5b611d2547612fd6565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611d8d573d6000803e3d6000fd5b50565b600d5481565b6000611da0611f34565b73ffffffffffffffffffffffffffffffffffffffff16611dbe61146f565b73ffffffffffffffffffffffffffffffffffffffff1614611e14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0b90614442565b60405180910390fd5b6000601160006101000a81548160ff0219169083151502179055506001905090565b611e3e611f34565b73ffffffffffffffffffffffffffffffffffffffff16611e5c61146f565b73ffffffffffffffffffffffffffffffffffffffff1614611eb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea990614442565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611f22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f19906142e2565b60405180910390fd5b611f2b81612e59565b50565b600e5481565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611fac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa3906144c2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561201c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201390614302565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516120fa9190614542565b60405180910390a3505050565b60006121138484611c19565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461218d578181101561217f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217690614362565b60405180910390fd5b61218c8484848403611f3c565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612203576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121fa90614482565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226a90614262565b60405180910390fd5b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612300576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f7906144a2565b60405180910390fd5b600081141561231a5761231583836000613228565b612e54565b601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156123be5750601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156123f55760006123d96064836134a990919063ffffffff16565b90506123e584826134bf565b80826123f19190614790565b9150505b600a544211612457576001600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b600f60009054906101000a900460ff1615612b1e5761247461146f565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156124e257506124b261146f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561251b5750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015612555575061dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561256e5750600960009054906101000a900460ff16155b15612b1d57600f60019054906101000a900460ff1661266857601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806126285750601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b612667576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265e906142c2565b60405180910390fd5b5b601160009054906101000a900460ff16156128345761268561146f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415801561270e5750600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b80156127685750600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b156128335743601060003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054106127ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e590614422565b60405180910390fd5b43601060003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5b601c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156128d75750601b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561297e57600c54811115612921576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291890614402565b60405180910390fd5b600e5461292d83611175565b8261293891906146af565b1115612979576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612970906144e2565b60405180910390fd5b612b1c565b601c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015612a215750601b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612a7057600c54811115612a6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a62906143a2565b60405180910390fd5b612b1b565b601b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612b1a57600e54612acd83611175565b82612ad891906146af565b1115612b19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b10906144e2565b60405180910390fd5b5b5b5b5b5b6000612b2930611175565b90506000600d548210159050808015612b4f5750600960009054906101000a900460ff16155b8015612ba55750601c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015612bfb5750601a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015612c515750601a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612c95576001600960006101000a81548160ff021916908315150217905550612c79613696565b6000600960006101000a81548160ff0219169083151502179055505b6000600960009054906101000a900460ff16159050601a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612d4b5750601a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15612d5557600090505b60008115612e4457612d856064612d77601254886138c190919063ffffffff16565b6134a990919063ffffffff16565b905060125460145482612d989190614736565b612da29190614705565b60176000828254612db391906146af565b9250508190555060125460155482612dcb9190614736565b612dd59190614705565b60186000828254612de691906146af565b9250508190555060125460135482612dfe9190614736565b612e089190614705565b60166000828254612e1991906146af565b925050819055506000811115612e3557612e34873083613228565b5b8085612e419190614790565b94505b612e4f878787613228565b505050505b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008183612f2d91906146af565b905092915050565b80601c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b6000600267ffffffffffffffff811115612ff357612ff26149c6565b5b6040519080825280602002602001820160405280156130215781602001602082028036833780820191505090505b509050308160008151811061303957613038614997565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156130db57600080fd5b505afa1580156130ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131139190613b1f565b8160018151811061312757613126614997565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061318e30600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611f3c565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b81526004016131f295949392919061455d565b600060405180830381600087803b15801561320c57600080fd5b505af1158015613220573d6000803e3d6000fd5b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613298576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161328f90614482565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613308576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132ff90614262565b60405180910390fd5b6133138383836138d7565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015613399576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161339090614382565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461342c91906146af565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516134909190614542565b60405180910390a36134a38484846138dc565b50505050565b600081836134b79190614705565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561352f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161352690614462565b60405180910390fd5b61353b826000836138d7565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156135c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135b8906142a2565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282546136189190614790565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161367d9190614542565b60405180910390a3613691836000846138dc565b505050565b60006136a130611175565b905060006018546016546017546136b891906146af565b6136c291906146af565b905060008214806136d35750600081145b156136df5750506138bf565b600d548211156136ef57600d5491505b6000600282601754856137029190614736565b61370c9190614705565b6137169190614705565b9050600061372d82856138e190919063ffffffff16565b9050600047905061373d82612fd6565b600061375282476138e190919063ffffffff16565b9050600061377d8661376f601654856138c190919063ffffffff16565b6134a990919063ffffffff16565b905060006137a88761379a601854866138c190919063ffffffff16565b6134a990919063ffffffff16565b905060008183856137b99190614790565b6137c39190614790565b9050600060178190555060006016819055506000601881905550600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc61382c8486612f1f90919063ffffffff16565b9081150290604051600060405180830381858888f19350505050158015613857573d6000803e3d6000fd5b506000871180156138685750600081115b156138b55761387787826138f7565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb56186826017546040516138ac939291906145b7565b60405180910390a15b5050505050505050505b565b600081836138cf9190614736565b905092915050565b505050565b505050565b600081836138ef9190614790565b905092915050565b61392430600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611f3c565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d71982308560008061397061146f565b426040518863ffffffff1660e01b8152600401613992969594939291906141c4565b6060604051808303818588803b1580156139ab57600080fd5b505af11580156139bf573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906139e49190613d28565b5050505050565b60006139fe6139f98461462e565b614609565b90508083825260208201905082856020860282011115613a2157613a206149fa565b5b60005b85811015613a515781613a378882613a5b565b845260208401935060208301925050600181019050613a24565b5050509392505050565b600081359050613a6a816150c1565b92915050565b600081519050613a7f816150c1565b92915050565b600082601f830112613a9a57613a996149f5565b5b8135613aaa8482602086016139eb565b91505092915050565b600081359050613ac2816150d8565b92915050565b600081359050613ad7816150ef565b92915050565b600081519050613aec816150ef565b92915050565b600060208284031215613b0857613b07614a04565b5b6000613b1684828501613a5b565b91505092915050565b600060208284031215613b3557613b34614a04565b5b6000613b4384828501613a70565b91505092915050565b60008060408385031215613b6357613b62614a04565b5b6000613b7185828601613a5b565b9250506020613b8285828601613a5b565b9150509250929050565b600080600060608486031215613ba557613ba4614a04565b5b6000613bb386828701613a5b565b9350506020613bc486828701613a5b565b9250506040613bd586828701613ac8565b9150509250925092565b60008060408385031215613bf657613bf5614a04565b5b6000613c0485828601613a5b565b9250506020613c1585828601613ab3565b9150509250929050565b60008060408385031215613c3657613c35614a04565b5b6000613c4485828601613a5b565b9250506020613c5585828601613ac8565b9150509250929050565b600060208284031215613c7557613c74614a04565b5b600082013567ffffffffffffffff811115613c9357613c926149ff565b5b613c9f84828501613a85565b91505092915050565b600060208284031215613cbe57613cbd614a04565b5b6000613ccc84828501613ac8565b91505092915050565b600080600060608486031215613cee57613ced614a04565b5b6000613cfc86828701613ac8565b9350506020613d0d86828701613ac8565b9250506040613d1e86828701613ac8565b9150509250925092565b600080600060608486031215613d4157613d40614a04565b5b6000613d4f86828701613add565b9350506020613d6086828701613add565b9250506040613d7186828701613add565b9150509250925092565b6000613d878383613d93565b60208301905092915050565b613d9c816147c4565b82525050565b613dab816147c4565b82525050565b6000613dbc8261466a565b613dc6818561468d565b9350613dd18361465a565b8060005b83811015613e02578151613de98882613d7b565b9750613df483614680565b925050600181019050613dd5565b5085935050505092915050565b613e18816147d6565b82525050565b613e2781614819565b82525050565b6000613e3882614675565b613e42818561469e565b9350613e5281856020860161482b565b613e5b81614a09565b840191505092915050565b6000613e7360238361469e565b9150613e7e82614a1a565b604082019050919050565b6000613e96601d8361469e565b9150613ea182614a69565b602082019050919050565b6000613eb960228361469e565b9150613ec482614a92565b604082019050919050565b6000613edc60168361469e565b9150613ee782614ae1565b602082019050919050565b6000613eff60268361469e565b9150613f0a82614b0a565b604082019050919050565b6000613f2260228361469e565b9150613f2d82614b59565b604082019050919050565b6000613f4560248361469e565b9150613f5082614ba8565b604082019050919050565b6000613f6860398361469e565b9150613f7382614bf7565b604082019050919050565b6000613f8b601d8361469e565b9150613f9682614c46565b602082019050919050565b6000613fae60268361469e565b9150613fb982614c6f565b604082019050919050565b6000613fd160368361469e565b9150613fdc82614cbe565b604082019050919050565b6000613ff460358361469e565b9150613fff82614d0d565b604082019050919050565b600061401760348361469e565b915061402282614d5c565b604082019050919050565b600061403a60358361469e565b915061404582614dab565b604082019050919050565b600061405d60498361469e565b915061406882614dfa565b606082019050919050565b600061408060208361469e565b915061408b82614e6f565b602082019050919050565b60006140a360218361469e565b91506140ae82614e98565b604082019050919050565b60006140c660258361469e565b91506140d182614ee7565b604082019050919050565b60006140e9604d8361469e565b91506140f482614f36565b606082019050919050565b600061410c60248361469e565b915061411782614fab565b604082019050919050565b600061412f60138361469e565b915061413a82614ffa565b602082019050919050565b600061415260258361469e565b915061415d82615023565b604082019050919050565b6000614175602f8361469e565b915061418082615072565b604082019050919050565b61419481614802565b82525050565b6141a38161480c565b82525050565b60006020820190506141be6000830184613da2565b92915050565b600060c0820190506141d96000830189613da2565b6141e6602083018861418b565b6141f36040830187613e1e565b6142006060830186613e1e565b61420d6080830185613da2565b61421a60a083018461418b565b979650505050505050565b600060208201905061423a6000830184613e0f565b92915050565b6000602082019050818103600083015261425a8184613e2d565b905092915050565b6000602082019050818103600083015261427b81613e66565b9050919050565b6000602082019050818103600083015261429b81613e89565b9050919050565b600060208201905081810360008301526142bb81613eac565b9050919050565b600060208201905081810360008301526142db81613ecf565b9050919050565b600060208201905081810360008301526142fb81613ef2565b9050919050565b6000602082019050818103600083015261431b81613f15565b9050919050565b6000602082019050818103600083015261433b81613f38565b9050919050565b6000602082019050818103600083015261435b81613f5b565b9050919050565b6000602082019050818103600083015261437b81613f7e565b9050919050565b6000602082019050818103600083015261439b81613fa1565b9050919050565b600060208201905081810360008301526143bb81613fc4565b9050919050565b600060208201905081810360008301526143db81613fe7565b9050919050565b600060208201905081810360008301526143fb8161400a565b9050919050565b6000602082019050818103600083015261441b8161402d565b9050919050565b6000602082019050818103600083015261443b81614050565b9050919050565b6000602082019050818103600083015261445b81614073565b9050919050565b6000602082019050818103600083015261447b81614096565b9050919050565b6000602082019050818103600083015261449b816140b9565b9050919050565b600060208201905081810360008301526144bb816140dc565b9050919050565b600060208201905081810360008301526144db816140ff565b9050919050565b600060208201905081810360008301526144fb81614122565b9050919050565b6000602082019050818103600083015261451b81614145565b9050919050565b6000602082019050818103600083015261453b81614168565b9050919050565b6000602082019050614557600083018461418b565b92915050565b600060a082019050614572600083018861418b565b61457f6020830187613e1e565b81810360408301526145918186613db1565b90506145a06060830185613da2565b6145ad608083018461418b565b9695505050505050565b60006060820190506145cc600083018661418b565b6145d9602083018561418b565b6145e6604083018461418b565b949350505050565b6000602082019050614603600083018461419a565b92915050565b6000614613614624565b905061461f8282614890565b919050565b6000604051905090565b600067ffffffffffffffff821115614649576146486149c6565b5b602082029050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b60006146ba82614802565b91506146c583614802565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156146fa576146f961490a565b5b828201905092915050565b600061471082614802565b915061471b83614802565b92508261472b5761472a614939565b5b828204905092915050565b600061474182614802565b915061474c83614802565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156147855761478461490a565b5b828202905092915050565b600061479b82614802565b91506147a683614802565b9250828210156147b9576147b861490a565b5b828203905092915050565b60006147cf826147e2565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b600061482482614802565b9050919050565b60005b8381101561484957808201518184015260208101905061482e565b83811115614858576000848401525b50505050565b6000600282049050600182168061487657607f821691505b6020821081141561488a57614889614968565b5b50919050565b61489982614a09565b810181811067ffffffffffffffff821117156148b8576148b76149c6565b5b80604052505050565b60006148cc82614802565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156148ff576148fe61490a565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f4d757374206b656570206665657320617420313025206f72206c657373000000600082015250565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f54726164696e67206973206e6f74206163746976652e00000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e2060008201527f302e352500000000000000000000000000000000000000000000000000000000602082015250565b7f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060008201527f6175746f6d617465644d61726b65744d616b6572506169727300000000000000602082015250565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560008201527f206d61785472616e73616374696f6e416d6f756e742e00000000000000000000602082015250565b7f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60008201527f20302e3030312520746f74616c20737570706c792e0000000000000000000000602082015250565b7f5377617020616d6f756e742063616e6e6f74206265206869676865722074686160008201527f6e20302e352520746f74616c20737570706c792e000000000000000000000000602082015250565b7f427579207472616e7366657220616d6f756e742065786365656473207468652060008201527f6d61785472616e73616374696f6e416d6f756e742e0000000000000000000000602082015250565b7f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60008201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b60208201527f20616c6c6f7765642e0000000000000000000000000000000000000000000000604082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f596f7572206164647265737320686173206265656e206d61726b65642061732060008201527f6120736e697065722c20796f752061726520756e61626c6520746f207472616e60208201527f73666572206f7220737761702e00000000000000000000000000000000000000604082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4d61782077616c6c657420657863656564656400000000000000000000000000600082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060008201527f6c6f776572207468616e20302e31250000000000000000000000000000000000602082015250565b6150ca816147c4565b81146150d557600080fd5b50565b6150e1816147d6565b81146150ec57600080fd5b50565b6150f881614802565b811461510357600080fd5b5056fea2646970667358221220c8226f3c2bbf231c53453890b9f385da1de23ad7cfe03539a85089814366e9bb64736f6c63430008070033

Deployed Bytecode

0x6080604052600436106102295760003560e01c80638a8c523c11610123578063c8125e45116100ab578063df778d261161006f578063df778d2614610826578063e2f456051461083d578063e884f26014610868578063f2fde38b14610893578063f8b45b05146108bc57610230565b8063c8125e451461072d578063c876d0b914610756578063c8c8ebe414610781578063d257b34f146107ac578063dd62ed3e146107e957610230565b8063a457c2d7116100f2578063a457c2d714610636578063a9059cbb14610673578063bbc0c742146106b0578063c0246668146106db578063c18bc1951461070457610230565b80638a8c523c146105a05780638da5cb5b146105b757806395d89b41146105e25780639a7a23d61461060d57610230565b806323b872dd116101b1578063667185241161017557806366718524146104cf57806370a08231146104f8578063715018a614610535578063751039fc1461054c5780637571336a1461057757610230565b806323b872dd146103c2578063313ce567146103ff578063395093511461042a5780634a62bb65146104675780634fbee1931461049257610230565b806312b77e8a116101f857806312b77e8a1461030357806313114a9d1461031a57806318160ddd14610345578063203e727e14610370578063224290851461039957610230565b806306fdde0314610235578063095ea7b3146102605780630b559c6f1461029d5780630f3a325f146102c657610230565b3661023057005b600080fd5b34801561024157600080fd5b5061024a6108e7565b6040516102579190614240565b60405180910390f35b34801561026c57600080fd5b5061028760048036038101906102829190613c1f565b610979565b6040516102949190614225565b60405180910390f35b3480156102a957600080fd5b506102c460048036038101906102bf9190613c5f565b61099c565b005b3480156102d257600080fd5b506102ed60048036038101906102e89190613af2565b610b93565b6040516102fa9190614225565b60405180910390f35b34801561030f57600080fd5b50610318610be9565b005b34801561032657600080fd5b5061032f610cd0565b60405161033c9190614542565b60405180910390f35b34801561035157600080fd5b5061035a610cd6565b6040516103679190614542565b60405180910390f35b34801561037c57600080fd5b5061039760048036038101906103929190613ca8565b610ce0565b005b3480156103a557600080fd5b506103c060048036038101906103bb9190613cd5565b610def565b005b3480156103ce57600080fd5b506103e960048036038101906103e49190613b8c565b610eee565b6040516103f69190614225565b60405180910390f35b34801561040b57600080fd5b50610414610f1d565b60405161042191906145ee565b60405180910390f35b34801561043657600080fd5b50610451600480360381019061044c9190613c1f565b610f26565b60405161045e9190614225565b60405180910390f35b34801561047357600080fd5b5061047c610fd0565b6040516104899190614225565b60405180910390f35b34801561049e57600080fd5b506104b960048036038101906104b49190613af2565b610fe3565b6040516104c69190614225565b60405180910390f35b3480156104db57600080fd5b506104f660048036038101906104f19190613af2565b611039565b005b34801561050457600080fd5b5061051f600480360381019061051a9190613af2565b611175565b60405161052c9190614542565b60405180910390f35b34801561054157600080fd5b5061054a6111bd565b005b34801561055857600080fd5b50610561611245565b60405161056e9190614225565b60405180910390f35b34801561058357600080fd5b5061059e60048036038101906105999190613bdf565b6112e5565b005b3480156105ac57600080fd5b506105b56113bc565b005b3480156105c357600080fd5b506105cc61146f565b6040516105d991906141a9565b60405180910390f35b3480156105ee57600080fd5b506105f7611499565b6040516106049190614240565b60405180910390f35b34801561061957600080fd5b50610634600480360381019061062f9190613bdf565b61152b565b005b34801561064257600080fd5b5061065d60048036038101906106589190613c1f565b611646565b60405161066a9190614225565b60405180910390f35b34801561067f57600080fd5b5061069a60048036038101906106959190613c1f565b611730565b6040516106a79190614225565b60405180910390f35b3480156106bc57600080fd5b506106c5611753565b6040516106d29190614225565b60405180910390f35b3480156106e757600080fd5b5061070260048036038101906106fd9190613bdf565b611766565b005b34801561071057600080fd5b5061072b60048036038101906107269190613ca8565b61188b565b005b34801561073957600080fd5b50610754600480360381019061074f9190613c5f565b61199a565b005b34801561076257600080fd5b5061076b611aab565b6040516107789190614225565b60405180910390f35b34801561078d57600080fd5b50610796611abe565b6040516107a39190614542565b60405180910390f35b3480156107b857600080fd5b506107d360048036038101906107ce9190613ca8565b611ac4565b6040516107e09190614225565b60405180910390f35b3480156107f557600080fd5b50610810600480360381019061080b9190613b4c565b611c19565b60405161081d9190614542565b60405180910390f35b34801561083257600080fd5b5061083b611ca0565b005b34801561084957600080fd5b50610852611d90565b60405161085f9190614542565b60405180910390f35b34801561087457600080fd5b5061087d611d96565b60405161088a9190614225565b60405180910390f35b34801561089f57600080fd5b506108ba60048036038101906108b59190613af2565b611e36565b005b3480156108c857600080fd5b506108d1611f2e565b6040516108de9190614542565b60405180910390f35b6060600380546108f69061485e565b80601f01602080910402602001604051908101604052809291908181526020018280546109229061485e565b801561096f5780601f106109445761010080835404028352916020019161096f565b820191906000526020600020905b81548152906001019060200180831161095257829003601f168201915b5050505050905090565b600080610984611f34565b9050610991818585611f3c565b600191505092915050565b6109a4611f34565b73ffffffffffffffffffffffffffffffffffffffff166109c261146f565b73ffffffffffffffffffffffffffffffffffffffff1614610a18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0f90614442565b60405180910390fd5b60005b8151811015610b8f57600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16828281518110610a7057610a6f614997565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614158015610b045750600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16828281518110610ae357610ae2614997565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614155b15610b7c57600160086000848481518110610b2257610b21614997565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b8080610b87906148c1565b915050610a1b565b5050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b610bf1611f34565b73ffffffffffffffffffffffffffffffffffffffff16610c0f61146f565b73ffffffffffffffffffffffffffffffffffffffff1614610c65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5c90614442565b60405180910390fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610ccd573d6000803e3d6000fd5b50565b60125481565b6000600254905090565b610ce8611f34565b73ffffffffffffffffffffffffffffffffffffffff16610d0661146f565b73ffffffffffffffffffffffffffffffffffffffff1614610d5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5390614442565b60405180910390fd5b670de0b6b3a76400006103e86001610d72610cd6565b610d7c9190614736565b610d869190614705565b610d909190614705565b811015610dd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc990614522565b60405180910390fd5b670de0b6b3a764000081610de69190614736565b600c8190555050565b610df7611f34565b73ffffffffffffffffffffffffffffffffffffffff16610e1561146f565b73ffffffffffffffffffffffffffffffffffffffff1614610e6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6290614442565b60405180910390fd5b826013819055508160148190555080601581905550601554601454601354610e9391906146af565b610e9d91906146af565b601281905550600a6012541115610ee9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee090614282565b60405180910390fd5b505050565b600080610ef9611f34565b9050610f06858285612107565b610f11858585612193565b60019150509392505050565b60006012905090565b600080610f31611f34565b9050610fc5818585600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610fc091906146af565b611f3c565b600191505092915050565b600f60009054906101000a900460ff1681565b6000601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b611041611f34565b73ffffffffffffffffffffffffffffffffffffffff1661105f61146f565b73ffffffffffffffffffffffffffffffffffffffff16146110b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ac90614442565b60405180910390fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f5deb5ef622431f0df5a39b72dd556892f68ba42aa0f3aaf0800e166ce866492860405160405180910390a380600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6111c5611f34565b73ffffffffffffffffffffffffffffffffffffffff166111e361146f565b73ffffffffffffffffffffffffffffffffffffffff1614611239576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123090614442565b60405180910390fd5b6112436000612e59565b565b600061124f611f34565b73ffffffffffffffffffffffffffffffffffffffff1661126d61146f565b73ffffffffffffffffffffffffffffffffffffffff16146112c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ba90614442565b60405180910390fd5b6000600f60006101000a81548160ff0219169083151502179055506001905090565b6112ed611f34565b73ffffffffffffffffffffffffffffffffffffffff1661130b61146f565b73ffffffffffffffffffffffffffffffffffffffff1614611361576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135890614442565b60405180910390fd5b80601b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6113c4611f34565b73ffffffffffffffffffffffffffffffffffffffff166113e261146f565b73ffffffffffffffffffffffffffffffffffffffff1614611438576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142f90614442565b60405180910390fd5b6001600f60016101000a81548160ff021916908315150217905550611467600242612f1f90919063ffffffff16565b600a81905550565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546114a89061485e565b80601f01602080910402602001604051908101604052809291908181526020018280546114d49061485e565b80156115215780601f106114f657610100808354040283529160200191611521565b820191906000526020600020905b81548152906001019060200180831161150457829003601f168201915b5050505050905090565b611533611f34565b73ffffffffffffffffffffffffffffffffffffffff1661155161146f565b73ffffffffffffffffffffffffffffffffffffffff16146115a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159e90614442565b60405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611638576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162f90614342565b60405180910390fd5b6116428282612f35565b5050565b600080611651611f34565b90506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015611717576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170e90614502565b60405180910390fd5b6117248286868403611f3c565b60019250505092915050565b60008061173b611f34565b9050611748818585612193565b600191505092915050565b600f60019054906101000a900460ff1681565b61176e611f34565b73ffffffffffffffffffffffffffffffffffffffff1661178c61146f565b73ffffffffffffffffffffffffffffffffffffffff16146117e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d990614442565b60405180910390fd5b80601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df78260405161187f9190614225565b60405180910390a25050565b611893611f34565b73ffffffffffffffffffffffffffffffffffffffff166118b161146f565b73ffffffffffffffffffffffffffffffffffffffff1614611907576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fe90614442565b60405180910390fd5b670de0b6b3a76400006103e8600561191d610cd6565b6119279190614736565b6119319190614705565b61193b9190614705565b81101561197d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197490614322565b60405180910390fd5b670de0b6b3a7640000816119919190614736565b600e8190555050565b6119a2611f34565b73ffffffffffffffffffffffffffffffffffffffff166119c061146f565b73ffffffffffffffffffffffffffffffffffffffff1614611a16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0d90614442565b60405180910390fd5b60005b8151811015611aa757600060086000848481518110611a3b57611a3a614997565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611a9f906148c1565b915050611a19565b5050565b601160009054906101000a900460ff1681565b600c5481565b6000611ace611f34565b73ffffffffffffffffffffffffffffffffffffffff16611aec61146f565b73ffffffffffffffffffffffffffffffffffffffff1614611b42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3990614442565b60405180910390fd5b620186a06001611b50610cd6565b611b5a9190614736565b611b649190614705565b821015611ba6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9d906143c2565b60405180910390fd5b6103e86005611bb3610cd6565b611bbd9190614736565b611bc79190614705565b821115611c09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c00906143e2565b60405180910390fd5b81600d8190555060019050919050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611ca8611f34565b73ffffffffffffffffffffffffffffffffffffffff16611cc661146f565b73ffffffffffffffffffffffffffffffffffffffff1614611d1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1390614442565b60405180910390fd5b611d2547612fd6565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611d8d573d6000803e3d6000fd5b50565b600d5481565b6000611da0611f34565b73ffffffffffffffffffffffffffffffffffffffff16611dbe61146f565b73ffffffffffffffffffffffffffffffffffffffff1614611e14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0b90614442565b60405180910390fd5b6000601160006101000a81548160ff0219169083151502179055506001905090565b611e3e611f34565b73ffffffffffffffffffffffffffffffffffffffff16611e5c61146f565b73ffffffffffffffffffffffffffffffffffffffff1614611eb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea990614442565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611f22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f19906142e2565b60405180910390fd5b611f2b81612e59565b50565b600e5481565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611fac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa3906144c2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561201c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201390614302565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516120fa9190614542565b60405180910390a3505050565b60006121138484611c19565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461218d578181101561217f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217690614362565b60405180910390fd5b61218c8484848403611f3c565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612203576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121fa90614482565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226a90614262565b60405180910390fd5b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612300576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f7906144a2565b60405180910390fd5b600081141561231a5761231583836000613228565b612e54565b601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156123be5750601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156123f55760006123d96064836134a990919063ffffffff16565b90506123e584826134bf565b80826123f19190614790565b9150505b600a544211612457576001600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b600f60009054906101000a900460ff1615612b1e5761247461146f565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156124e257506124b261146f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561251b5750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015612555575061dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561256e5750600960009054906101000a900460ff16155b15612b1d57600f60019054906101000a900460ff1661266857601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806126285750601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b612667576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265e906142c2565b60405180910390fd5b5b601160009054906101000a900460ff16156128345761268561146f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415801561270e5750600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b80156127685750600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b156128335743601060003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054106127ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e590614422565b60405180910390fd5b43601060003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5b601c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156128d75750601b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561297e57600c54811115612921576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291890614402565b60405180910390fd5b600e5461292d83611175565b8261293891906146af565b1115612979576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612970906144e2565b60405180910390fd5b612b1c565b601c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015612a215750601b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612a7057600c54811115612a6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a62906143a2565b60405180910390fd5b612b1b565b601b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612b1a57600e54612acd83611175565b82612ad891906146af565b1115612b19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b10906144e2565b60405180910390fd5b5b5b5b5b5b6000612b2930611175565b90506000600d548210159050808015612b4f5750600960009054906101000a900460ff16155b8015612ba55750601c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015612bfb5750601a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015612c515750601a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612c95576001600960006101000a81548160ff021916908315150217905550612c79613696565b6000600960006101000a81548160ff0219169083151502179055505b6000600960009054906101000a900460ff16159050601a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612d4b5750601a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15612d5557600090505b60008115612e4457612d856064612d77601254886138c190919063ffffffff16565b6134a990919063ffffffff16565b905060125460145482612d989190614736565b612da29190614705565b60176000828254612db391906146af565b9250508190555060125460155482612dcb9190614736565b612dd59190614705565b60186000828254612de691906146af565b9250508190555060125460135482612dfe9190614736565b612e089190614705565b60166000828254612e1991906146af565b925050819055506000811115612e3557612e34873083613228565b5b8085612e419190614790565b94505b612e4f878787613228565b505050505b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008183612f2d91906146af565b905092915050565b80601c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b6000600267ffffffffffffffff811115612ff357612ff26149c6565b5b6040519080825280602002602001820160405280156130215781602001602082028036833780820191505090505b509050308160008151811061303957613038614997565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156130db57600080fd5b505afa1580156130ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131139190613b1f565b8160018151811061312757613126614997565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061318e30600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611f3c565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b81526004016131f295949392919061455d565b600060405180830381600087803b15801561320c57600080fd5b505af1158015613220573d6000803e3d6000fd5b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613298576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161328f90614482565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613308576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132ff90614262565b60405180910390fd5b6133138383836138d7565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015613399576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161339090614382565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461342c91906146af565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516134909190614542565b60405180910390a36134a38484846138dc565b50505050565b600081836134b79190614705565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561352f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161352690614462565b60405180910390fd5b61353b826000836138d7565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156135c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135b8906142a2565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282546136189190614790565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161367d9190614542565b60405180910390a3613691836000846138dc565b505050565b60006136a130611175565b905060006018546016546017546136b891906146af565b6136c291906146af565b905060008214806136d35750600081145b156136df5750506138bf565b600d548211156136ef57600d5491505b6000600282601754856137029190614736565b61370c9190614705565b6137169190614705565b9050600061372d82856138e190919063ffffffff16565b9050600047905061373d82612fd6565b600061375282476138e190919063ffffffff16565b9050600061377d8661376f601654856138c190919063ffffffff16565b6134a990919063ffffffff16565b905060006137a88761379a601854866138c190919063ffffffff16565b6134a990919063ffffffff16565b905060008183856137b99190614790565b6137c39190614790565b9050600060178190555060006016819055506000601881905550600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc61382c8486612f1f90919063ffffffff16565b9081150290604051600060405180830381858888f19350505050158015613857573d6000803e3d6000fd5b506000871180156138685750600081115b156138b55761387787826138f7565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb56186826017546040516138ac939291906145b7565b60405180910390a15b5050505050505050505b565b600081836138cf9190614736565b905092915050565b505050565b505050565b600081836138ef9190614790565b905092915050565b61392430600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611f3c565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d71982308560008061397061146f565b426040518863ffffffff1660e01b8152600401613992969594939291906141c4565b6060604051808303818588803b1580156139ab57600080fd5b505af11580156139bf573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906139e49190613d28565b5050505050565b60006139fe6139f98461462e565b614609565b90508083825260208201905082856020860282011115613a2157613a206149fa565b5b60005b85811015613a515781613a378882613a5b565b845260208401935060208301925050600181019050613a24565b5050509392505050565b600081359050613a6a816150c1565b92915050565b600081519050613a7f816150c1565b92915050565b600082601f830112613a9a57613a996149f5565b5b8135613aaa8482602086016139eb565b91505092915050565b600081359050613ac2816150d8565b92915050565b600081359050613ad7816150ef565b92915050565b600081519050613aec816150ef565b92915050565b600060208284031215613b0857613b07614a04565b5b6000613b1684828501613a5b565b91505092915050565b600060208284031215613b3557613b34614a04565b5b6000613b4384828501613a70565b91505092915050565b60008060408385031215613b6357613b62614a04565b5b6000613b7185828601613a5b565b9250506020613b8285828601613a5b565b9150509250929050565b600080600060608486031215613ba557613ba4614a04565b5b6000613bb386828701613a5b565b9350506020613bc486828701613a5b565b9250506040613bd586828701613ac8565b9150509250925092565b60008060408385031215613bf657613bf5614a04565b5b6000613c0485828601613a5b565b9250506020613c1585828601613ab3565b9150509250929050565b60008060408385031215613c3657613c35614a04565b5b6000613c4485828601613a5b565b9250506020613c5585828601613ac8565b9150509250929050565b600060208284031215613c7557613c74614a04565b5b600082013567ffffffffffffffff811115613c9357613c926149ff565b5b613c9f84828501613a85565b91505092915050565b600060208284031215613cbe57613cbd614a04565b5b6000613ccc84828501613ac8565b91505092915050565b600080600060608486031215613cee57613ced614a04565b5b6000613cfc86828701613ac8565b9350506020613d0d86828701613ac8565b9250506040613d1e86828701613ac8565b9150509250925092565b600080600060608486031215613d4157613d40614a04565b5b6000613d4f86828701613add565b9350506020613d6086828701613add565b9250506040613d7186828701613add565b9150509250925092565b6000613d878383613d93565b60208301905092915050565b613d9c816147c4565b82525050565b613dab816147c4565b82525050565b6000613dbc8261466a565b613dc6818561468d565b9350613dd18361465a565b8060005b83811015613e02578151613de98882613d7b565b9750613df483614680565b925050600181019050613dd5565b5085935050505092915050565b613e18816147d6565b82525050565b613e2781614819565b82525050565b6000613e3882614675565b613e42818561469e565b9350613e5281856020860161482b565b613e5b81614a09565b840191505092915050565b6000613e7360238361469e565b9150613e7e82614a1a565b604082019050919050565b6000613e96601d8361469e565b9150613ea182614a69565b602082019050919050565b6000613eb960228361469e565b9150613ec482614a92565b604082019050919050565b6000613edc60168361469e565b9150613ee782614ae1565b602082019050919050565b6000613eff60268361469e565b9150613f0a82614b0a565b604082019050919050565b6000613f2260228361469e565b9150613f2d82614b59565b604082019050919050565b6000613f4560248361469e565b9150613f5082614ba8565b604082019050919050565b6000613f6860398361469e565b9150613f7382614bf7565b604082019050919050565b6000613f8b601d8361469e565b9150613f9682614c46565b602082019050919050565b6000613fae60268361469e565b9150613fb982614c6f565b604082019050919050565b6000613fd160368361469e565b9150613fdc82614cbe565b604082019050919050565b6000613ff460358361469e565b9150613fff82614d0d565b604082019050919050565b600061401760348361469e565b915061402282614d5c565b604082019050919050565b600061403a60358361469e565b915061404582614dab565b604082019050919050565b600061405d60498361469e565b915061406882614dfa565b606082019050919050565b600061408060208361469e565b915061408b82614e6f565b602082019050919050565b60006140a360218361469e565b91506140ae82614e98565b604082019050919050565b60006140c660258361469e565b91506140d182614ee7565b604082019050919050565b60006140e9604d8361469e565b91506140f482614f36565b606082019050919050565b600061410c60248361469e565b915061411782614fab565b604082019050919050565b600061412f60138361469e565b915061413a82614ffa565b602082019050919050565b600061415260258361469e565b915061415d82615023565b604082019050919050565b6000614175602f8361469e565b915061418082615072565b604082019050919050565b61419481614802565b82525050565b6141a38161480c565b82525050565b60006020820190506141be6000830184613da2565b92915050565b600060c0820190506141d96000830189613da2565b6141e6602083018861418b565b6141f36040830187613e1e565b6142006060830186613e1e565b61420d6080830185613da2565b61421a60a083018461418b565b979650505050505050565b600060208201905061423a6000830184613e0f565b92915050565b6000602082019050818103600083015261425a8184613e2d565b905092915050565b6000602082019050818103600083015261427b81613e66565b9050919050565b6000602082019050818103600083015261429b81613e89565b9050919050565b600060208201905081810360008301526142bb81613eac565b9050919050565b600060208201905081810360008301526142db81613ecf565b9050919050565b600060208201905081810360008301526142fb81613ef2565b9050919050565b6000602082019050818103600083015261431b81613f15565b9050919050565b6000602082019050818103600083015261433b81613f38565b9050919050565b6000602082019050818103600083015261435b81613f5b565b9050919050565b6000602082019050818103600083015261437b81613f7e565b9050919050565b6000602082019050818103600083015261439b81613fa1565b9050919050565b600060208201905081810360008301526143bb81613fc4565b9050919050565b600060208201905081810360008301526143db81613fe7565b9050919050565b600060208201905081810360008301526143fb8161400a565b9050919050565b6000602082019050818103600083015261441b8161402d565b9050919050565b6000602082019050818103600083015261443b81614050565b9050919050565b6000602082019050818103600083015261445b81614073565b9050919050565b6000602082019050818103600083015261447b81614096565b9050919050565b6000602082019050818103600083015261449b816140b9565b9050919050565b600060208201905081810360008301526144bb816140dc565b9050919050565b600060208201905081810360008301526144db816140ff565b9050919050565b600060208201905081810360008301526144fb81614122565b9050919050565b6000602082019050818103600083015261451b81614145565b9050919050565b6000602082019050818103600083015261453b81614168565b9050919050565b6000602082019050614557600083018461418b565b92915050565b600060a082019050614572600083018861418b565b61457f6020830187613e1e565b81810360408301526145918186613db1565b90506145a06060830185613da2565b6145ad608083018461418b565b9695505050505050565b60006060820190506145cc600083018661418b565b6145d9602083018561418b565b6145e6604083018461418b565b949350505050565b6000602082019050614603600083018461419a565b92915050565b6000614613614624565b905061461f8282614890565b919050565b6000604051905090565b600067ffffffffffffffff821115614649576146486149c6565b5b602082029050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b60006146ba82614802565b91506146c583614802565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156146fa576146f961490a565b5b828201905092915050565b600061471082614802565b915061471b83614802565b92508261472b5761472a614939565b5b828204905092915050565b600061474182614802565b915061474c83614802565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156147855761478461490a565b5b828202905092915050565b600061479b82614802565b91506147a683614802565b9250828210156147b9576147b861490a565b5b828203905092915050565b60006147cf826147e2565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b600061482482614802565b9050919050565b60005b8381101561484957808201518184015260208101905061482e565b83811115614858576000848401525b50505050565b6000600282049050600182168061487657607f821691505b6020821081141561488a57614889614968565b5b50919050565b61489982614a09565b810181811067ffffffffffffffff821117156148b8576148b76149c6565b5b80604052505050565b60006148cc82614802565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156148ff576148fe61490a565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f4d757374206b656570206665657320617420313025206f72206c657373000000600082015250565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f54726164696e67206973206e6f74206163746976652e00000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e2060008201527f302e352500000000000000000000000000000000000000000000000000000000602082015250565b7f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060008201527f6175746f6d617465644d61726b65744d616b6572506169727300000000000000602082015250565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560008201527f206d61785472616e73616374696f6e416d6f756e742e00000000000000000000602082015250565b7f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60008201527f20302e3030312520746f74616c20737570706c792e0000000000000000000000602082015250565b7f5377617020616d6f756e742063616e6e6f74206265206869676865722074686160008201527f6e20302e352520746f74616c20737570706c792e000000000000000000000000602082015250565b7f427579207472616e7366657220616d6f756e742065786365656473207468652060008201527f6d61785472616e73616374696f6e416d6f756e742e0000000000000000000000602082015250565b7f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60008201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b60208201527f20616c6c6f7765642e0000000000000000000000000000000000000000000000604082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f596f7572206164647265737320686173206265656e206d61726b65642061732060008201527f6120736e697065722c20796f752061726520756e61626c6520746f207472616e60208201527f73666572206f7220737761702e00000000000000000000000000000000000000604082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4d61782077616c6c657420657863656564656400000000000000000000000000600082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060008201527f6c6f776572207468616e20302e31250000000000000000000000000000000000602082015250565b6150ca816147c4565b81146150d557600080fd5b50565b6150e1816147d6565b81146150ec57600080fd5b50565b6150f881614802565b811461510357600080fd5b5056fea2646970667358221220c8226f3c2bbf231c53453890b9f385da1de23ad7cfe03539a85089814366e9bb64736f6c63430008070033

Deployed Bytecode Sourcemap

3708:14089:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2135:98:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4412:197;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10217:321:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10765:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17648:109;;;;;;;;;;;;;:::i;:::-;;4463:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3223:106:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8304:232:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8923:342;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5171:286:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3072:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5852:236;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4151:33:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10080:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9915:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3387:125:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1661:101:9;;;;;;;;;;;;;:::i;:::-;;7514:121:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8767:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7328:130;;;;;;;;;;;;;:::i;:::-;;1029:85:9;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2346:102:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9463:244:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6575:429:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3708:189;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4191:33:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9273:182;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8544:211;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10550:203;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4415:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4028:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7910:382;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3955:149:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17480:160:1;;;;;;;;;;;;;:::i;:::-;;4070:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7700:135;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1911:198:9;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4110:24:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2135:98:2;2189:13;2221:5;2214:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2135:98;:::o;4412:197::-;4495:4;4511:13;4527:12;:10;:12::i;:::-;4511:28;;4549:32;4558:5;4565:7;4574:6;4549:8;:32::i;:::-;4598:4;4591:11;;;4412:197;;;;:::o;10217:321:1:-;1252:12:9;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10305:6:1::1;10300:231;10321:12;:19;10317:1;:23;10300:231;;;10385:13;;;;;;;;;;;10366:32;;:12;10379:1;10366:15;;;;;;;;:::i;:::-;;;;;;;;:32;;;;:79;;;;;10429:15;;;;;;;;;;;10402:43;;:12;10415:1;10402:15;;;;;;;;:::i;:::-;;;;;;;;:43;;;;10366:79;10362:158;;;10500:4;10466:14;:31;10481:12;10494:1;10481:15;;;;;;;;:::i;:::-;;;;;;;;10466:31;;;;;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;10362:158;10342:3;;;;;:::i;:::-;;;;10300:231;;;;10217:321:::0;:::o;10765:105::-;10818:4;10842:14;:20;10857:4;10842:20;;;;;;;;;;;;;;;;;;;;;;;;;10835:27;;10765:105;;;:::o;17648:109::-;1252:12:9;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17707:9:1::1;;;;;;;;;;;17699:27;;:50;17727:21;17699:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;17648:109::o:0;4463:24::-;;;;:::o;3223:106:2:-;3284:7;3310:12;;3303:19;;3223:106;:::o;8304:232:1:-;1252:12:9;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;8425:4:1::1;8417;8413:1;8397:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:24;;;;:::i;:::-;8396:33;;;;:::i;:::-;8386:6;:43;;8378:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;8524:4;8515:6;:13;;;;:::i;:::-;8492:20;:36;;;;8304:232:::0;:::o;8923:342::-;1252:12:9;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9049:12:1::1;9033:13;:28;;;;9088:12;9072:13;:28;;;;9121:6;9111:7;:16;;;;9182:7;;9166:13;;9150;;:29;;;;:::i;:::-;:39;;;;:::i;:::-;9138:9;:51;;;;9221:2;9208:9;;:15;;9200:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;8923:342:::0;;;:::o;5171:286:2:-;5298:4;5314:15;5332:12;:10;:12::i;:::-;5314:30;;5354:38;5370:4;5376:7;5385:6;5354:15;:38::i;:::-;5402:27;5412:4;5418:2;5422:6;5402:9;:27::i;:::-;5446:4;5439:11;;;5171:286;;;;;:::o;3072:91::-;3130:5;3154:2;3147:9;;3072:91;:::o;5852:236::-;5940:4;5956:13;5972:12;:10;:12::i;:::-;5956:28;;5994:66;6003:5;6010:7;6049:10;6019:11;:18;6031:5;6019:18;;;;;;;;;;;;;;;:27;6038:7;6019:27;;;;;;;;;;;;;;;;:40;;;;:::i;:::-;5994:8;:66::i;:::-;6077:4;6070:11;;;5852:236;;;;:::o;4151:33:1:-;;;;;;;;;;;;;:::o;10080:125::-;10145:4;10169:19;:28;10189:7;10169:28;;;;;;;;;;;;;;;;;;;;;;;;;10162:35;;10080:125;;;:::o;9915:157::-;1252:12:9;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10022:9:1::1;;;;;;;;;;;9994:38;;10011:9;9994:38;;;;;;;;;;;;10055:9;10043;;:21;;;;;;;;;;;;;;;;;;9915:157:::0;:::o;3387:125:2:-;3461:7;3487:9;:18;3497:7;3487:18;;;;;;;;;;;;;;;;3480:25;;3387:125;;;:::o;1661:101:9:-;1252:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1725:30:::1;1752:1;1725:18;:30::i;:::-;1661:101::o:0;7514:121:1:-;7566:4;1252:12:9;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7600:5:1::1;7583:14;;:22;;;;;;;;;;;;;;;;;;7623:4;7616:11;;7514:121:::0;:::o;8767:144::-;1252:12:9;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;8899:4:1::1;8857:31;:39;8889:6;8857:39;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;8767:144:::0;;:::o;7328:130::-;1252:12:9;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7399:4:1::1;7383:13;;:20;;;;;;;;;;;;;;;;;;7428:22;7448:1;7428:15;:19;;:22;;;;:::i;:::-;7414:11;:36;;;;7328:130::o:0;1029:85:9:-;1075:7;1101:6;;;;;;;;;;;1094:13;;1029:85;:::o;2346:102:2:-;2402:13;2434:7;2427:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2346:102;:::o;9463:244:1:-;1252:12:9;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9570:13:1::1;;;;;;;;;;;9562:21;;:4;:21;;;;9554:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;9658:41;9687:4;9693:5;9658:28;:41::i;:::-;9463:244:::0;;:::o;6575:429:2:-;6668:4;6684:13;6700:12;:10;:12::i;:::-;6684:28;;6722:24;6749:11;:18;6761:5;6749:18;;;;;;;;;;;;;;;:27;6768:7;6749:27;;;;;;;;;;;;;;;;6722:54;;6814:15;6794:16;:35;;6786:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;6905:60;6914:5;6921:7;6949:15;6930:16;:34;6905:8;:60::i;:::-;6993:4;6986:11;;;;6575:429;;;;:::o;3708:189::-;3787:4;3803:13;3819:12;:10;:12::i;:::-;3803:28;;3841;3851:5;3858:2;3862:6;3841:9;:28::i;:::-;3886:4;3879:11;;;3708:189;;;;:::o;4191:33:1:-;;;;;;;;;;;;;:::o;9273:182::-;1252:12:9;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9389:8:1::1;9358:19;:28;9378:7;9358:28;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;9429:7;9413:34;;;9438:8;9413:34;;;;;;:::i;:::-;;;;;;;;9273:182:::0;;:::o;8544:211::-;1252:12:9;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;8666:4:1::1;8660;8656:1;8640:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:24;;;;:::i;:::-;8639:31;;;;:::i;:::-;8629:6;:41;;8621:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;8743:4;8734:6;:13;;;;:::i;:::-;8722:9;:25;;;;8544:211:::0;:::o;10550:203::-;1252:12:9;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10638:6:1::1;10633:113;10654:12;:19;10650:1;:23;10633:113;;;10729:5;10695:14;:31;10710:12;10723:1;10710:15;;;;;;;;:::i;:::-;;;;;;;;10695:31;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;10675:3;;;;;:::i;:::-;;;;10633:113;;;;10550:203:::0;:::o;4415:39::-;;;;;;;;;;;;;:::o;4028:35::-;;;;:::o;7910:382::-;7991:4;1252:12:9;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;8048:6:1::1;8044:1;8028:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:26;;;;:::i;:::-;8015:9;:39;;8007:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;8163:4;8159:1;8143:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:24;;;;:::i;:::-;8130:9;:37;;8122:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;8255:9;8234:18;:30;;;;8281:4;8274:11;;7910:382:::0;;;:::o;3955:149:2:-;4044:7;4070:11;:18;4082:5;4070:18;;;;;;;;;;;;;;;:27;4089:7;4070:27;;;;;;;;;;;;;;;;4063:34;;3955:149;;;;:::o;17480:160:1:-;1252:12:9;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17531:40:1::1;17549:21;17531:17;:40::i;:::-;17590:9;;;;;;;;;;;17582:27;;:50;17610:21;17582:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;17480:160::o:0;4070:33::-;;;;:::o;7700:135::-;7760:4;1252:12:9;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7800:5:1::1;7777:20;;:28;;;;;;;;;;;;;;;;;;7823:4;7816:11;;7700:135:::0;:::o;1911:198:9:-;1252:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2019:1:::1;1999:22;;:8;:22;;;;1991:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2074:28;2093:8;2074:18;:28::i;:::-;1911:198:::0;:::o;4110:24:1:-;;;;:::o;640:96:0:-;693:7;719:10;712:17;;640:96;:::o;10102:370:2:-;10250:1;10233:19;;:5;:19;;;;10225:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10330:1;10311:21;;:7;:21;;;;10303:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10412:6;10382:11;:18;10394:5;10382:18;;;;;;;;;;;;;;;:27;10401:7;10382:27;;;;;;;;;;;;;;;:36;;;;10449:7;10433:32;;10442:5;10433:32;;;10458:6;10433:32;;;;;;:::i;:::-;;;;;;;;10102:370;;;:::o;10749:441::-;10879:24;10906:25;10916:5;10923:7;10906:9;:25::i;:::-;10879:52;;10965:17;10945:16;:37;10941:243;;11026:6;11006:16;:26;;10998:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;11108:51;11117:5;11124:7;11152:6;11133:16;:25;11108:8;:51::i;:::-;10941:243;10869:321;10749:441;;;:::o;10878:3962:1:-;11026:1;11010:18;;:4;:18;;;;11002:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;11103:1;11089:16;;:2;:16;;;;11081:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;11165:14;:20;11180:4;11165:20;;;;;;;;;;;;;;;;;;;;;;;;;11164:21;11156:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;11303:1;11293:6;:11;11289:93;;;11321:28;11337:4;11343:2;11347:1;11321:15;:28::i;:::-;11364:7;;11289:93;11432:19;:25;11452:4;11432:25;;;;;;;;;;;;;;;;;;;;;;;;;11431:26;:54;;;;;11462:19;:23;11482:2;11462:23;;;;;;;;;;;;;;;;;;;;;;;;;11461:24;11431:54;11427:196;;;11502:18;11523:15;11534:3;11523:6;:10;;:15;;;;:::i;:::-;11502:36;;11553:23;11559:4;11565:10;11553:5;:23::i;:::-;11601:10;11591:20;;;;;:::i;:::-;;;11487:136;11427:196;11658:11;;11639:15;:30;11635:61;;11692:4;11671:14;:18;11686:2;11671:18;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;11635:61;11721:14;;;;;;;;;;;11717:1838;;;11782:7;:5;:7::i;:::-;11774:15;;:4;:15;;;;:49;;;;;11816:7;:5;:7::i;:::-;11810:13;;:2;:13;;;;11774:49;:86;;;;;11858:1;11844:16;;:2;:16;;;;11774:86;:128;;;;;11895:6;11881:21;;:2;:21;;;;11774:128;:159;;;;;11924:9;;;;;;;;;;;11923:10;11774:159;11752:1792;;;11973:13;;;;;;;;;;;11968:150;;12019:19;:25;12039:4;12019:25;;;;;;;;;;;;;;;;;;;;;;;;;:52;;;;12048:19;:23;12068:2;12048:23;;;;;;;;;;;;;;;;;;;;;;;;;12019:52;12011:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;11968:150;12276:20;;;;;;;;;;;12272:423;;;12330:7;:5;:7::i;:::-;12324:13;;:2;:13;;;;:47;;;;;12355:15;;;;;;;;;;;12341:30;;:2;:30;;;;12324:47;:79;;;;;12389:13;;;;;;;;;;;12375:28;;:2;:28;;;;12324:79;12320:356;;;12481:12;12439:28;:39;12468:9;12439:39;;;;;;;;;;;;;;;;:54;12431:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;12640:12;12598:28;:39;12627:9;12598:39;;;;;;;;;;;;;;;:54;;;;12320:356;12272:423;12765:25;:31;12791:4;12765:31;;;;;;;;;;;;;;;;;;;;;;;;;:71;;;;;12801:31;:35;12833:2;12801:35;;;;;;;;;;;;;;;;;;;;;;;;;12800:36;12765:71;12761:768;;;12879:20;;12869:6;:30;;12861:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;13014:9;;12997:13;13007:2;12997:9;:13::i;:::-;12988:6;:22;;;;:::i;:::-;:35;;12980:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;12761:768;;;13142:25;:29;13168:2;13142:29;;;;;;;;;;;;;;;;;;;;;;;;;:71;;;;;13176:31;:37;13208:4;13176:37;;;;;;;;;;;;;;;;;;;;;;;;;13175:38;13142:71;13138:391;;;13256:20;;13246:6;:30;;13238:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;13138:391;;;13383:31;:35;13415:2;13383:35;;;;;;;;;;;;;;;;;;;;;;;;;13378:151;;13476:9;;13459:13;13469:2;13459:9;:13::i;:::-;13450:6;:22;;;;:::i;:::-;:35;;13442:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;13378:151;13138:391;12761:768;11752:1792;11717:1838;13569:28;13600:24;13618:4;13600:9;:24::i;:::-;13569:55;;13635:12;13674:18;;13650:20;:42;;13635:57;;13721:7;:34;;;;;13746:9;;;;;;;;;;;13745:10;13721:34;:83;;;;;13773:25;:31;13799:4;13773:31;;;;;;;;;;;;;;;;;;;;;;;;;13772:32;13721:83;:126;;;;;13822:19;:25;13842:4;13822:25;;;;;;;;;;;;;;;;;;;;;;;;;13821:26;13721:126;:167;;;;;13865:19;:23;13885:2;13865:23;;;;;;;;;;;;;;;;;;;;;;;;;13864:24;13721:167;13703:297;;;13927:4;13915:9;;:16;;;;;;;;;;;;;;;;;;13946:10;:8;:10::i;:::-;13983:5;13971:9;;:17;;;;;;;;;;;;;;;;;;13703:297;14012:12;14028:9;;;;;;;;;;;14027:10;14012:25;;14139:19;:25;14159:4;14139:25;;;;;;;;;;;;;;;;;;;;;;;;;:52;;;;14168:19;:23;14188:2;14168:23;;;;;;;;;;;;;;;;;;;;;;;;;14139:52;14135:100;;;14218:5;14208:15;;14135:100;14255:12;14360:7;14356:431;;;14391:30;14417:3;14391:21;14402:9;;14391:6;:10;;:21;;;;:::i;:::-;:25;;:30;;;;:::i;:::-;14384:37;;14482:9;;14466:13;;14459:4;:20;;;;:::i;:::-;:32;;;;:::i;:::-;14436:19;;:55;;;;;;;:::i;:::-;;;;;;;;14540:9;;14530:7;;14523:4;:14;;;;:::i;:::-;:26;;;;:::i;:::-;14506:13;;:43;;;;;;;:::i;:::-;;;;;;;;14610:9;;14594:13;;14587:4;:20;;;;:::i;:::-;:32;;;;:::i;:::-;14564:19;;:55;;;;;;;:::i;:::-;;;;;;;;14659:1;14652:4;:8;14648:91;;;14681:42;14697:4;14711;14718;14681:15;:42::i;:::-;14648:91;14771:4;14761:14;;;;;:::i;:::-;;;14356:431;14799:33;14815:4;14821:2;14825:6;14799:15;:33::i;:::-;10991:3849;;;;10878:3962;;;;:::o;2263:187:9:-;2336:16;2355:6;;;;;;;;;;;2336:25;;2380:8;2371:6;;:17;;;;;;;;;;;;;;;;;;2434:8;2403:40;;2424:8;2403:40;;;;;;;;;;;;2326:124;2263:187;:::o;2741:96:10:-;2799:7;2829:1;2825;:5;;;;:::i;:::-;2818:12;;2741:96;;;;:::o;9715:188:1:-;9832:5;9798:25;:31;9824:4;9798:31;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;9889:5;9855:40;;9883:4;9855:40;;;;;;;;;;;;9715:188;;:::o;14848:590::-;14975:21;15013:1;14999:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14975:40;;15044:4;15026;15031:1;15026:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;15070:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15060:4;15065:1;15060:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;;;15105:62;15122:4;15137:15;;;;;;;;;;;15155:11;15105:8;:62::i;:::-;15206:15;;;;;;;;;;;:66;;;15287:11;15313:1;15357:4;15384;15404:15;15206:224;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14904:534;14848:590;:::o;7467:651:2:-;7609:1;7593:18;;:4;:18;;;;7585:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7685:1;7671:16;;:2;:16;;;;7663:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;7738:38;7759:4;7765:2;7769:6;7738:20;:38::i;:::-;7787:19;7809:9;:15;7819:4;7809:15;;;;;;;;;;;;;;;;7787:37;;7857:6;7842:11;:21;;7834:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;7972:6;7958:11;:20;7940:9;:15;7950:4;7940:15;;;;;;;;;;;;;;;:38;;;;8015:6;7998:9;:13;8008:2;7998:13;;;;;;;;;;;;;;;;:23;;;;;;;:::i;:::-;;;;;;;;8052:2;8037:26;;8046:4;8037:26;;;8056:6;8037:26;;;;;;:::i;:::-;;;;;;;;8074:37;8094:4;8100:2;8104:6;8074:19;:37::i;:::-;7575:543;7467:651;;;:::o;3836:96:10:-;3894:7;3924:1;3920;:5;;;;:::i;:::-;3913:12;;3836:96;;;;:::o;9103:576:2:-;9205:1;9186:21;;:7;:21;;;;9178:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;9256:49;9277:7;9294:1;9298:6;9256:20;:49::i;:::-;9316:22;9341:9;:18;9351:7;9341:18;;;;;;;;;;;;;;;;9316:43;;9395:6;9377:14;:24;;9369:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;9512:6;9495:14;:23;9474:9;:18;9484:7;9474:18;;;;;;;;;;;;;;;:44;;;;9554:6;9538:12;;:22;;;;;;;:::i;:::-;;;;;;;;9602:1;9576:37;;9585:7;9576:37;;;9606:6;9576:37;;;;;;:::i;:::-;;;;;;;;9624:48;9644:7;9661:1;9665:6;9624:19;:48::i;:::-;9168:511;9103:576;;:::o;15972:1500:1:-;16011:23;16037:24;16055:4;16037:9;:24::i;:::-;16011:50;;16072:25;16144:13;;16122:19;;16100;;:41;;;;:::i;:::-;:57;;;;:::i;:::-;16072:85;;16201:1;16182:15;:20;:46;;;;16227:1;16206:17;:22;16182:46;16178:59;;;16230:7;;;;16178:59;16269:18;;16251:15;:36;16247:103;;;16320:18;;16302:36;;16247:103;16419:23;16505:1;16485:17;16463:19;;16445:15;:37;;;;:::i;:::-;:57;;;;:::i;:::-;:61;;;;:::i;:::-;16419:87;;16517:26;16546:36;16566:15;16546;:19;;:36;;;;:::i;:::-;16517:65;;16603:25;16631:21;16603:49;;16665:37;16683:18;16665:17;:37::i;:::-;16724:18;16745:44;16771:17;16745:21;:25;;:44;;;;:::i;:::-;16724:65;;16800:23;16826:58;16866:17;16826:35;16841:19;;16826:10;:14;;:35;;;;:::i;:::-;:39;;:58;;;;:::i;:::-;16800:84;;16895:17;16915:52;16949:17;16915:29;16930:13;;16915:10;:14;;:29;;;;:::i;:::-;:33;;:52;;;;:::i;:::-;16895:72;;16978:23;17035:9;17017:15;17004:10;:28;;;;:::i;:::-;:40;;;;:::i;:::-;16978:66;;17087:1;17065:19;:23;;;;17121:1;17099:19;:23;;;;17149:1;17133:13;:17;;;;17171:9;;;;;;;;;;;17163:27;;:59;17191:30;17211:9;17191:15;:19;;:30;;;;:::i;:::-;17163:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17273:1;17255:15;:19;:42;;;;;17296:1;17278:15;:19;17255:42;17251:214;;;17314:47;17328:15;17345;17314:13;:47::i;:::-;17381:72;17396:18;17416:15;17433:19;;17381:72;;;;;;;;:::i;:::-;;;;;;;;17251:214;16000:1472;;;;;;;;;15972:1500;:::o;3451:96:10:-;3509:7;3539:1;3535;:5;;;;:::i;:::-;3528:12;;3451:96;;;;:::o;11774:121:2:-;;;;:::o;12483:120::-;;;;:::o;3108:96:10:-;3166:7;3196:1;3192;:5;;;;:::i;:::-;3185:12;;3108:96;;;;:::o;15450:514:1:-;15599:62;15616:4;15631:15;;;;;;;;;;;15649:11;15599:8;:62::i;:::-;15704:15;;;;;;;;;;;:31;;;15743:9;15776:4;15796:11;15822:1;15865;15908:7;:5;:7::i;:::-;15930:15;15704:252;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;15450:514;;:::o;24:722:11:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:139::-;798:5;836:6;823:20;814:29;;852:33;879:5;852:33;:::i;:::-;752:139;;;;:::o;897:143::-;954:5;985:6;979:13;970:22;;1001:33;1028:5;1001:33;:::i;:::-;897:143;;;;:::o;1063:370::-;1134:5;1183:3;1176:4;1168:6;1164:17;1160:27;1150:122;;1191:79;;:::i;:::-;1150:122;1308:6;1295:20;1333:94;1423:3;1415:6;1408:4;1400:6;1396:17;1333:94;:::i;:::-;1324:103;;1140:293;1063:370;;;;:::o;1439:133::-;1482:5;1520:6;1507:20;1498:29;;1536:30;1560:5;1536:30;:::i;:::-;1439:133;;;;:::o;1578:139::-;1624:5;1662:6;1649:20;1640:29;;1678:33;1705:5;1678:33;:::i;:::-;1578:139;;;;:::o;1723:143::-;1780:5;1811:6;1805:13;1796:22;;1827:33;1854:5;1827:33;:::i;:::-;1723:143;;;;:::o;1872:329::-;1931:6;1980:2;1968:9;1959:7;1955:23;1951:32;1948:119;;;1986:79;;:::i;:::-;1948:119;2106:1;2131:53;2176:7;2167:6;2156:9;2152:22;2131:53;:::i;:::-;2121:63;;2077:117;1872:329;;;;:::o;2207:351::-;2277:6;2326:2;2314:9;2305:7;2301:23;2297:32;2294:119;;;2332:79;;:::i;:::-;2294:119;2452:1;2477:64;2533:7;2524:6;2513:9;2509:22;2477:64;:::i;:::-;2467:74;;2423:128;2207:351;;;;:::o;2564:474::-;2632:6;2640;2689:2;2677:9;2668:7;2664:23;2660:32;2657:119;;;2695:79;;:::i;:::-;2657:119;2815:1;2840:53;2885:7;2876:6;2865:9;2861:22;2840:53;:::i;:::-;2830:63;;2786:117;2942:2;2968:53;3013:7;3004:6;2993:9;2989:22;2968:53;:::i;:::-;2958:63;;2913:118;2564:474;;;;;:::o;3044:619::-;3121:6;3129;3137;3186:2;3174:9;3165:7;3161:23;3157:32;3154:119;;;3192:79;;:::i;:::-;3154:119;3312:1;3337:53;3382:7;3373:6;3362:9;3358:22;3337:53;:::i;:::-;3327:63;;3283:117;3439:2;3465:53;3510:7;3501:6;3490:9;3486:22;3465:53;:::i;:::-;3455:63;;3410:118;3567:2;3593:53;3638:7;3629:6;3618:9;3614:22;3593:53;:::i;:::-;3583:63;;3538:118;3044:619;;;;;:::o;3669:468::-;3734:6;3742;3791:2;3779:9;3770:7;3766:23;3762:32;3759:119;;;3797:79;;:::i;:::-;3759:119;3917:1;3942:53;3987:7;3978:6;3967:9;3963:22;3942:53;:::i;:::-;3932:63;;3888:117;4044:2;4070:50;4112:7;4103:6;4092:9;4088:22;4070:50;:::i;:::-;4060:60;;4015:115;3669:468;;;;;:::o;4143:474::-;4211:6;4219;4268:2;4256:9;4247:7;4243:23;4239:32;4236:119;;;4274:79;;:::i;:::-;4236:119;4394:1;4419:53;4464:7;4455:6;4444:9;4440:22;4419:53;:::i;:::-;4409:63;;4365:117;4521:2;4547:53;4592:7;4583:6;4572:9;4568:22;4547:53;:::i;:::-;4537:63;;4492:118;4143:474;;;;;:::o;4623:539::-;4707:6;4756:2;4744:9;4735:7;4731:23;4727:32;4724:119;;;4762:79;;:::i;:::-;4724:119;4910:1;4899:9;4895:17;4882:31;4940:18;4932:6;4929:30;4926:117;;;4962:79;;:::i;:::-;4926:117;5067:78;5137:7;5128:6;5117:9;5113:22;5067:78;:::i;:::-;5057:88;;4853:302;4623:539;;;;:::o;5168:329::-;5227:6;5276:2;5264:9;5255:7;5251:23;5247:32;5244:119;;;5282:79;;:::i;:::-;5244:119;5402:1;5427:53;5472:7;5463:6;5452:9;5448:22;5427:53;:::i;:::-;5417:63;;5373:117;5168:329;;;;:::o;5503:619::-;5580:6;5588;5596;5645:2;5633:9;5624:7;5620:23;5616:32;5613:119;;;5651:79;;:::i;:::-;5613:119;5771:1;5796:53;5841:7;5832:6;5821:9;5817:22;5796:53;:::i;:::-;5786:63;;5742:117;5898:2;5924:53;5969:7;5960:6;5949:9;5945:22;5924:53;:::i;:::-;5914:63;;5869:118;6026:2;6052:53;6097:7;6088:6;6077:9;6073:22;6052:53;:::i;:::-;6042:63;;5997:118;5503:619;;;;;:::o;6128:663::-;6216:6;6224;6232;6281:2;6269:9;6260:7;6256:23;6252:32;6249:119;;;6287:79;;:::i;:::-;6249:119;6407:1;6432:64;6488:7;6479:6;6468:9;6464:22;6432:64;:::i;:::-;6422:74;;6378:128;6545:2;6571:64;6627:7;6618:6;6607:9;6603:22;6571:64;:::i;:::-;6561:74;;6516:129;6684:2;6710:64;6766:7;6757:6;6746:9;6742:22;6710:64;:::i;:::-;6700:74;;6655:129;6128:663;;;;;:::o;6797:179::-;6866:10;6887:46;6929:3;6921:6;6887:46;:::i;:::-;6965:4;6960:3;6956:14;6942:28;;6797:179;;;;:::o;6982:108::-;7059:24;7077:5;7059:24;:::i;:::-;7054:3;7047:37;6982:108;;:::o;7096:118::-;7183:24;7201:5;7183:24;:::i;:::-;7178:3;7171:37;7096:118;;:::o;7250:732::-;7369:3;7398:54;7446:5;7398:54;:::i;:::-;7468:86;7547:6;7542:3;7468:86;:::i;:::-;7461:93;;7578:56;7628:5;7578:56;:::i;:::-;7657:7;7688:1;7673:284;7698:6;7695:1;7692:13;7673:284;;;7774:6;7768:13;7801:63;7860:3;7845:13;7801:63;:::i;:::-;7794:70;;7887:60;7940:6;7887:60;:::i;:::-;7877:70;;7733:224;7720:1;7717;7713:9;7708:14;;7673:284;;;7677:14;7973:3;7966:10;;7374:608;;;7250:732;;;;:::o;7988:109::-;8069:21;8084:5;8069:21;:::i;:::-;8064:3;8057:34;7988:109;;:::o;8103:147::-;8198:45;8237:5;8198:45;:::i;:::-;8193:3;8186:58;8103:147;;:::o;8256:364::-;8344:3;8372:39;8405:5;8372:39;:::i;:::-;8427:71;8491:6;8486:3;8427:71;:::i;:::-;8420:78;;8507:52;8552:6;8547:3;8540:4;8533:5;8529:16;8507:52;:::i;:::-;8584:29;8606:6;8584:29;:::i;:::-;8579:3;8575:39;8568:46;;8348:272;8256:364;;;;:::o;8626:366::-;8768:3;8789:67;8853:2;8848:3;8789:67;:::i;:::-;8782:74;;8865:93;8954:3;8865:93;:::i;:::-;8983:2;8978:3;8974:12;8967:19;;8626:366;;;:::o;8998:::-;9140:3;9161:67;9225:2;9220:3;9161:67;:::i;:::-;9154:74;;9237:93;9326:3;9237:93;:::i;:::-;9355:2;9350:3;9346:12;9339:19;;8998:366;;;:::o;9370:::-;9512:3;9533:67;9597:2;9592:3;9533:67;:::i;:::-;9526:74;;9609:93;9698:3;9609:93;:::i;:::-;9727:2;9722:3;9718:12;9711:19;;9370:366;;;:::o;9742:::-;9884:3;9905:67;9969:2;9964:3;9905:67;:::i;:::-;9898:74;;9981:93;10070:3;9981:93;:::i;:::-;10099:2;10094:3;10090:12;10083:19;;9742:366;;;:::o;10114:::-;10256:3;10277:67;10341:2;10336:3;10277:67;:::i;:::-;10270:74;;10353:93;10442:3;10353:93;:::i;:::-;10471:2;10466:3;10462:12;10455:19;;10114:366;;;:::o;10486:::-;10628:3;10649:67;10713:2;10708:3;10649:67;:::i;:::-;10642:74;;10725:93;10814:3;10725:93;:::i;:::-;10843:2;10838:3;10834:12;10827:19;;10486:366;;;:::o;10858:::-;11000:3;11021:67;11085:2;11080:3;11021:67;:::i;:::-;11014:74;;11097:93;11186:3;11097:93;:::i;:::-;11215:2;11210:3;11206:12;11199:19;;10858:366;;;:::o;11230:::-;11372:3;11393:67;11457:2;11452:3;11393:67;:::i;:::-;11386:74;;11469:93;11558:3;11469:93;:::i;:::-;11587:2;11582:3;11578:12;11571:19;;11230:366;;;:::o;11602:::-;11744:3;11765:67;11829:2;11824:3;11765:67;:::i;:::-;11758:74;;11841:93;11930:3;11841:93;:::i;:::-;11959:2;11954:3;11950:12;11943:19;;11602:366;;;:::o;11974:::-;12116:3;12137:67;12201:2;12196:3;12137:67;:::i;:::-;12130:74;;12213:93;12302:3;12213:93;:::i;:::-;12331:2;12326:3;12322:12;12315:19;;11974:366;;;:::o;12346:::-;12488:3;12509:67;12573:2;12568:3;12509:67;:::i;:::-;12502:74;;12585:93;12674:3;12585:93;:::i;:::-;12703:2;12698:3;12694:12;12687:19;;12346:366;;;:::o;12718:::-;12860:3;12881:67;12945:2;12940:3;12881:67;:::i;:::-;12874:74;;12957:93;13046:3;12957:93;:::i;:::-;13075:2;13070:3;13066:12;13059:19;;12718:366;;;:::o;13090:::-;13232:3;13253:67;13317:2;13312:3;13253:67;:::i;:::-;13246:74;;13329:93;13418:3;13329:93;:::i;:::-;13447:2;13442:3;13438:12;13431:19;;13090:366;;;:::o;13462:::-;13604:3;13625:67;13689:2;13684:3;13625:67;:::i;:::-;13618:74;;13701:93;13790:3;13701:93;:::i;:::-;13819:2;13814:3;13810:12;13803:19;;13462:366;;;:::o;13834:::-;13976:3;13997:67;14061:2;14056:3;13997:67;:::i;:::-;13990:74;;14073:93;14162:3;14073:93;:::i;:::-;14191:2;14186:3;14182:12;14175:19;;13834:366;;;:::o;14206:::-;14348:3;14369:67;14433:2;14428:3;14369:67;:::i;:::-;14362:74;;14445:93;14534:3;14445:93;:::i;:::-;14563:2;14558:3;14554:12;14547:19;;14206:366;;;:::o;14578:::-;14720:3;14741:67;14805:2;14800:3;14741:67;:::i;:::-;14734:74;;14817:93;14906:3;14817:93;:::i;:::-;14935:2;14930:3;14926:12;14919:19;;14578:366;;;:::o;14950:::-;15092:3;15113:67;15177:2;15172:3;15113:67;:::i;:::-;15106:74;;15189:93;15278:3;15189:93;:::i;:::-;15307:2;15302:3;15298:12;15291:19;;14950:366;;;:::o;15322:::-;15464:3;15485:67;15549:2;15544:3;15485:67;:::i;:::-;15478:74;;15561:93;15650:3;15561:93;:::i;:::-;15679:2;15674:3;15670:12;15663:19;;15322:366;;;:::o;15694:::-;15836:3;15857:67;15921:2;15916:3;15857:67;:::i;:::-;15850:74;;15933:93;16022:3;15933:93;:::i;:::-;16051:2;16046:3;16042:12;16035:19;;15694:366;;;:::o;16066:::-;16208:3;16229:67;16293:2;16288:3;16229:67;:::i;:::-;16222:74;;16305:93;16394:3;16305:93;:::i;:::-;16423:2;16418:3;16414:12;16407:19;;16066:366;;;:::o;16438:::-;16580:3;16601:67;16665:2;16660:3;16601:67;:::i;:::-;16594:74;;16677:93;16766:3;16677:93;:::i;:::-;16795:2;16790:3;16786:12;16779:19;;16438:366;;;:::o;16810:::-;16952:3;16973:67;17037:2;17032:3;16973:67;:::i;:::-;16966:74;;17049:93;17138:3;17049:93;:::i;:::-;17167:2;17162:3;17158:12;17151:19;;16810:366;;;:::o;17182:118::-;17269:24;17287:5;17269:24;:::i;:::-;17264:3;17257:37;17182:118;;:::o;17306:112::-;17389:22;17405:5;17389:22;:::i;:::-;17384:3;17377:35;17306:112;;:::o;17424:222::-;17517:4;17555:2;17544:9;17540:18;17532:26;;17568:71;17636:1;17625:9;17621:17;17612:6;17568:71;:::i;:::-;17424:222;;;;:::o;17652:807::-;17901:4;17939:3;17928:9;17924:19;17916:27;;17953:71;18021:1;18010:9;18006:17;17997:6;17953:71;:::i;:::-;18034:72;18102:2;18091:9;18087:18;18078:6;18034:72;:::i;:::-;18116:80;18192:2;18181:9;18177:18;18168:6;18116:80;:::i;:::-;18206;18282:2;18271:9;18267:18;18258:6;18206:80;:::i;:::-;18296:73;18364:3;18353:9;18349:19;18340:6;18296:73;:::i;:::-;18379;18447:3;18436:9;18432:19;18423:6;18379:73;:::i;:::-;17652:807;;;;;;;;;:::o;18465:210::-;18552:4;18590:2;18579:9;18575:18;18567:26;;18603:65;18665:1;18654:9;18650:17;18641:6;18603:65;:::i;:::-;18465:210;;;;:::o;18681:313::-;18794:4;18832:2;18821:9;18817:18;18809:26;;18881:9;18875:4;18871:20;18867:1;18856:9;18852:17;18845:47;18909:78;18982:4;18973:6;18909:78;:::i;:::-;18901:86;;18681:313;;;;:::o;19000:419::-;19166:4;19204:2;19193:9;19189:18;19181:26;;19253:9;19247:4;19243:20;19239:1;19228:9;19224:17;19217:47;19281:131;19407:4;19281:131;:::i;:::-;19273:139;;19000:419;;;:::o;19425:::-;19591:4;19629:2;19618:9;19614:18;19606:26;;19678:9;19672:4;19668:20;19664:1;19653:9;19649:17;19642:47;19706:131;19832:4;19706:131;:::i;:::-;19698:139;;19425:419;;;:::o;19850:::-;20016:4;20054:2;20043:9;20039:18;20031:26;;20103:9;20097:4;20093:20;20089:1;20078:9;20074:17;20067:47;20131:131;20257:4;20131:131;:::i;:::-;20123:139;;19850:419;;;:::o;20275:::-;20441:4;20479:2;20468:9;20464:18;20456:26;;20528:9;20522:4;20518:20;20514:1;20503:9;20499:17;20492:47;20556:131;20682:4;20556:131;:::i;:::-;20548:139;;20275:419;;;:::o;20700:::-;20866:4;20904:2;20893:9;20889:18;20881:26;;20953:9;20947:4;20943:20;20939:1;20928:9;20924:17;20917:47;20981:131;21107:4;20981:131;:::i;:::-;20973:139;;20700:419;;;:::o;21125:::-;21291:4;21329:2;21318:9;21314:18;21306:26;;21378:9;21372:4;21368:20;21364:1;21353:9;21349:17;21342:47;21406:131;21532:4;21406:131;:::i;:::-;21398:139;;21125:419;;;:::o;21550:::-;21716:4;21754:2;21743:9;21739:18;21731:26;;21803:9;21797:4;21793:20;21789:1;21778:9;21774:17;21767:47;21831:131;21957:4;21831:131;:::i;:::-;21823:139;;21550:419;;;:::o;21975:::-;22141:4;22179:2;22168:9;22164:18;22156:26;;22228:9;22222:4;22218:20;22214:1;22203:9;22199:17;22192:47;22256:131;22382:4;22256:131;:::i;:::-;22248:139;;21975:419;;;:::o;22400:::-;22566:4;22604:2;22593:9;22589:18;22581:26;;22653:9;22647:4;22643:20;22639:1;22628:9;22624:17;22617:47;22681:131;22807:4;22681:131;:::i;:::-;22673:139;;22400:419;;;:::o;22825:::-;22991:4;23029:2;23018:9;23014:18;23006:26;;23078:9;23072:4;23068:20;23064:1;23053:9;23049:17;23042:47;23106:131;23232:4;23106:131;:::i;:::-;23098:139;;22825:419;;;:::o;23250:::-;23416:4;23454:2;23443:9;23439:18;23431:26;;23503:9;23497:4;23493:20;23489:1;23478:9;23474:17;23467:47;23531:131;23657:4;23531:131;:::i;:::-;23523:139;;23250:419;;;:::o;23675:::-;23841:4;23879:2;23868:9;23864:18;23856:26;;23928:9;23922:4;23918:20;23914:1;23903:9;23899:17;23892:47;23956:131;24082:4;23956:131;:::i;:::-;23948:139;;23675:419;;;:::o;24100:::-;24266:4;24304:2;24293:9;24289:18;24281:26;;24353:9;24347:4;24343:20;24339:1;24328:9;24324:17;24317:47;24381:131;24507:4;24381:131;:::i;:::-;24373:139;;24100:419;;;:::o;24525:::-;24691:4;24729:2;24718:9;24714:18;24706:26;;24778:9;24772:4;24768:20;24764:1;24753:9;24749:17;24742:47;24806:131;24932:4;24806:131;:::i;:::-;24798:139;;24525:419;;;:::o;24950:::-;25116:4;25154:2;25143:9;25139:18;25131:26;;25203:9;25197:4;25193:20;25189:1;25178:9;25174:17;25167:47;25231:131;25357:4;25231:131;:::i;:::-;25223:139;;24950:419;;;:::o;25375:::-;25541:4;25579:2;25568:9;25564:18;25556:26;;25628:9;25622:4;25618:20;25614:1;25603:9;25599:17;25592:47;25656:131;25782:4;25656:131;:::i;:::-;25648:139;;25375:419;;;:::o;25800:::-;25966:4;26004:2;25993:9;25989:18;25981:26;;26053:9;26047:4;26043:20;26039:1;26028:9;26024:17;26017:47;26081:131;26207:4;26081:131;:::i;:::-;26073:139;;25800:419;;;:::o;26225:::-;26391:4;26429:2;26418:9;26414:18;26406:26;;26478:9;26472:4;26468:20;26464:1;26453:9;26449:17;26442:47;26506:131;26632:4;26506:131;:::i;:::-;26498:139;;26225:419;;;:::o;26650:::-;26816:4;26854:2;26843:9;26839:18;26831:26;;26903:9;26897:4;26893:20;26889:1;26878:9;26874:17;26867:47;26931:131;27057:4;26931:131;:::i;:::-;26923:139;;26650:419;;;:::o;27075:::-;27241:4;27279:2;27268:9;27264:18;27256:26;;27328:9;27322:4;27318:20;27314:1;27303:9;27299:17;27292:47;27356:131;27482:4;27356:131;:::i;:::-;27348:139;;27075:419;;;:::o;27500:::-;27666:4;27704:2;27693:9;27689:18;27681:26;;27753:9;27747:4;27743:20;27739:1;27728:9;27724:17;27717:47;27781:131;27907:4;27781:131;:::i;:::-;27773:139;;27500:419;;;:::o;27925:::-;28091:4;28129:2;28118:9;28114:18;28106:26;;28178:9;28172:4;28168:20;28164:1;28153:9;28149:17;28142:47;28206:131;28332:4;28206:131;:::i;:::-;28198:139;;27925:419;;;:::o;28350:::-;28516:4;28554:2;28543:9;28539:18;28531:26;;28603:9;28597:4;28593:20;28589:1;28578:9;28574:17;28567:47;28631:131;28757:4;28631:131;:::i;:::-;28623:139;;28350:419;;;:::o;28775:222::-;28868:4;28906:2;28895:9;28891:18;28883:26;;28919:71;28987:1;28976:9;28972:17;28963:6;28919:71;:::i;:::-;28775:222;;;;:::o;29003:831::-;29266:4;29304:3;29293:9;29289:19;29281:27;;29318:71;29386:1;29375:9;29371:17;29362:6;29318:71;:::i;:::-;29399:80;29475:2;29464:9;29460:18;29451:6;29399:80;:::i;:::-;29526:9;29520:4;29516:20;29511:2;29500:9;29496:18;29489:48;29554:108;29657:4;29648:6;29554:108;:::i;:::-;29546:116;;29672:72;29740:2;29729:9;29725:18;29716:6;29672:72;:::i;:::-;29754:73;29822:3;29811:9;29807:19;29798:6;29754:73;:::i;:::-;29003:831;;;;;;;;:::o;29840:442::-;29989:4;30027:2;30016:9;30012:18;30004:26;;30040:71;30108:1;30097:9;30093:17;30084:6;30040:71;:::i;:::-;30121:72;30189:2;30178:9;30174:18;30165:6;30121:72;:::i;:::-;30203;30271:2;30260:9;30256:18;30247:6;30203:72;:::i;:::-;29840:442;;;;;;:::o;30288:214::-;30377:4;30415:2;30404:9;30400:18;30392:26;;30428:67;30492:1;30481:9;30477:17;30468:6;30428:67;:::i;:::-;30288:214;;;;:::o;30508:129::-;30542:6;30569:20;;:::i;:::-;30559:30;;30598:33;30626:4;30618:6;30598:33;:::i;:::-;30508:129;;;:::o;30643:75::-;30676:6;30709:2;30703:9;30693:19;;30643:75;:::o;30724:311::-;30801:4;30891:18;30883:6;30880:30;30877:56;;;30913:18;;:::i;:::-;30877:56;30963:4;30955:6;30951:17;30943:25;;31023:4;31017;31013:15;31005:23;;30724:311;;;:::o;31041:132::-;31108:4;31131:3;31123:11;;31161:4;31156:3;31152:14;31144:22;;31041:132;;;:::o;31179:114::-;31246:6;31280:5;31274:12;31264:22;;31179:114;;;:::o;31299:99::-;31351:6;31385:5;31379:12;31369:22;;31299:99;;;:::o;31404:113::-;31474:4;31506;31501:3;31497:14;31489:22;;31404:113;;;:::o;31523:184::-;31622:11;31656:6;31651:3;31644:19;31696:4;31691:3;31687:14;31672:29;;31523:184;;;;:::o;31713:169::-;31797:11;31831:6;31826:3;31819:19;31871:4;31866:3;31862:14;31847:29;;31713:169;;;;:::o;31888:305::-;31928:3;31947:20;31965:1;31947:20;:::i;:::-;31942:25;;31981:20;31999:1;31981:20;:::i;:::-;31976:25;;32135:1;32067:66;32063:74;32060:1;32057:81;32054:107;;;32141:18;;:::i;:::-;32054:107;32185:1;32182;32178:9;32171:16;;31888:305;;;;:::o;32199:185::-;32239:1;32256:20;32274:1;32256:20;:::i;:::-;32251:25;;32290:20;32308:1;32290:20;:::i;:::-;32285:25;;32329:1;32319:35;;32334:18;;:::i;:::-;32319:35;32376:1;32373;32369:9;32364:14;;32199:185;;;;:::o;32390:348::-;32430:7;32453:20;32471:1;32453:20;:::i;:::-;32448:25;;32487:20;32505:1;32487:20;:::i;:::-;32482:25;;32675:1;32607:66;32603:74;32600:1;32597:81;32592:1;32585:9;32578:17;32574:105;32571:131;;;32682:18;;:::i;:::-;32571:131;32730:1;32727;32723:9;32712:20;;32390:348;;;;:::o;32744:191::-;32784:4;32804:20;32822:1;32804:20;:::i;:::-;32799:25;;32838:20;32856:1;32838:20;:::i;:::-;32833:25;;32877:1;32874;32871:8;32868:34;;;32882:18;;:::i;:::-;32868:34;32927:1;32924;32920:9;32912:17;;32744:191;;;;:::o;32941:96::-;32978:7;33007:24;33025:5;33007:24;:::i;:::-;32996:35;;32941:96;;;:::o;33043:90::-;33077:7;33120:5;33113:13;33106:21;33095:32;;33043:90;;;:::o;33139:126::-;33176:7;33216:42;33209:5;33205:54;33194:65;;33139:126;;;:::o;33271:77::-;33308:7;33337:5;33326:16;;33271:77;;;:::o;33354:86::-;33389:7;33429:4;33422:5;33418:16;33407:27;;33354:86;;;:::o;33446:121::-;33504:9;33537:24;33555:5;33537:24;:::i;:::-;33524:37;;33446:121;;;:::o;33573:307::-;33641:1;33651:113;33665:6;33662:1;33659:13;33651:113;;;33750:1;33745:3;33741:11;33735:18;33731:1;33726:3;33722:11;33715:39;33687:2;33684:1;33680:10;33675:15;;33651:113;;;33782:6;33779:1;33776:13;33773:101;;;33862:1;33853:6;33848:3;33844:16;33837:27;33773:101;33622:258;33573:307;;;:::o;33886:320::-;33930:6;33967:1;33961:4;33957:12;33947:22;;34014:1;34008:4;34004:12;34035:18;34025:81;;34091:4;34083:6;34079:17;34069:27;;34025:81;34153:2;34145:6;34142:14;34122:18;34119:38;34116:84;;;34172:18;;:::i;:::-;34116:84;33937:269;33886:320;;;:::o;34212:281::-;34295:27;34317:4;34295:27;:::i;:::-;34287:6;34283:40;34425:6;34413:10;34410:22;34389:18;34377:10;34374:34;34371:62;34368:88;;;34436:18;;:::i;:::-;34368:88;34476:10;34472:2;34465:22;34255:238;34212:281;;:::o;34499:233::-;34538:3;34561:24;34579:5;34561:24;:::i;:::-;34552:33;;34607:66;34600:5;34597:77;34594:103;;;34677:18;;:::i;:::-;34594:103;34724:1;34717:5;34713:13;34706:20;;34499:233;;;:::o;34738:180::-;34786:77;34783:1;34776:88;34883:4;34880:1;34873:15;34907:4;34904:1;34897:15;34924:180;34972:77;34969:1;34962:88;35069:4;35066:1;35059:15;35093:4;35090:1;35083:15;35110:180;35158:77;35155:1;35148:88;35255:4;35252:1;35245:15;35279:4;35276:1;35269:15;35296:180;35344:77;35341:1;35334:88;35441:4;35438:1;35431:15;35465:4;35462:1;35455:15;35482:180;35530:77;35527:1;35520:88;35627:4;35624:1;35617:15;35651:4;35648:1;35641:15;35668:117;35777:1;35774;35767:12;35791:117;35900:1;35897;35890:12;35914:117;36023:1;36020;36013:12;36037:117;36146:1;36143;36136:12;36160:102;36201:6;36252:2;36248:7;36243:2;36236:5;36232:14;36228:28;36218:38;;36160:102;;;:::o;36268:222::-;36408:34;36404:1;36396:6;36392:14;36385:58;36477:5;36472:2;36464:6;36460:15;36453:30;36268:222;:::o;36496:179::-;36636:31;36632:1;36624:6;36620:14;36613:55;36496:179;:::o;36681:221::-;36821:34;36817:1;36809:6;36805:14;36798:58;36890:4;36885:2;36877:6;36873:15;36866:29;36681:221;:::o;36908:172::-;37048:24;37044:1;37036:6;37032:14;37025:48;36908:172;:::o;37086:225::-;37226:34;37222:1;37214:6;37210:14;37203:58;37295:8;37290:2;37282:6;37278:15;37271:33;37086:225;:::o;37317:221::-;37457:34;37453:1;37445:6;37441:14;37434:58;37526:4;37521:2;37513:6;37509:15;37502:29;37317:221;:::o;37544:223::-;37684:34;37680:1;37672:6;37668:14;37661:58;37753:6;37748:2;37740:6;37736:15;37729:31;37544:223;:::o;37773:244::-;37913:34;37909:1;37901:6;37897:14;37890:58;37982:27;37977:2;37969:6;37965:15;37958:52;37773:244;:::o;38023:179::-;38163:31;38159:1;38151:6;38147:14;38140:55;38023:179;:::o;38208:225::-;38348:34;38344:1;38336:6;38332:14;38325:58;38417:8;38412:2;38404:6;38400:15;38393:33;38208:225;:::o;38439:241::-;38579:34;38575:1;38567:6;38563:14;38556:58;38648:24;38643:2;38635:6;38631:15;38624:49;38439:241;:::o;38686:240::-;38826:34;38822:1;38814:6;38810:14;38803:58;38895:23;38890:2;38882:6;38878:15;38871:48;38686:240;:::o;38932:239::-;39072:34;39068:1;39060:6;39056:14;39049:58;39141:22;39136:2;39128:6;39124:15;39117:47;38932:239;:::o;39177:240::-;39317:34;39313:1;39305:6;39301:14;39294:58;39386:23;39381:2;39373:6;39369:15;39362:48;39177:240;:::o;39423:297::-;39563:34;39559:1;39551:6;39547:14;39540:58;39632:34;39627:2;39619:6;39615:15;39608:59;39701:11;39696:2;39688:6;39684:15;39677:36;39423:297;:::o;39726:182::-;39866:34;39862:1;39854:6;39850:14;39843:58;39726:182;:::o;39914:220::-;40054:34;40050:1;40042:6;40038:14;40031:58;40123:3;40118:2;40110:6;40106:15;40099:28;39914:220;:::o;40140:224::-;40280:34;40276:1;40268:6;40264:14;40257:58;40349:7;40344:2;40336:6;40332:15;40325:32;40140:224;:::o;40370:301::-;40510:34;40506:1;40498:6;40494:14;40487:58;40579:34;40574:2;40566:6;40562:15;40555:59;40648:15;40643:2;40635:6;40631:15;40624:40;40370:301;:::o;40677:223::-;40817:34;40813:1;40805:6;40801:14;40794:58;40886:6;40881:2;40873:6;40869:15;40862:31;40677:223;:::o;40906:169::-;41046:21;41042:1;41034:6;41030:14;41023:45;40906:169;:::o;41081:224::-;41221:34;41217:1;41209:6;41205:14;41198:58;41290:7;41285:2;41277:6;41273:15;41266:32;41081:224;:::o;41311:234::-;41451:34;41447:1;41439:6;41435:14;41428:58;41520:17;41515:2;41507:6;41503:15;41496:42;41311:234;:::o;41551:122::-;41624:24;41642:5;41624:24;:::i;:::-;41617:5;41614:35;41604:63;;41663:1;41660;41653:12;41604:63;41551:122;:::o;41679:116::-;41749:21;41764:5;41749:21;:::i;:::-;41742:5;41739:32;41729:60;;41785:1;41782;41775:12;41729:60;41679:116;:::o;41801:122::-;41874:24;41892:5;41874:24;:::i;:::-;41867:5;41864:35;41854:63;;41913:1;41910;41903:12;41854:63;41801:122;:::o

Swarm Source

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