Token lavidaenrose

 

Overview ERC-20

Price
$0.00 @ 0.000000 MATIC
Fully Diluted Market Cap
Total Supply:
330,000,000,000 daen

Holders:
44 addresses

Transfers:
-

Contract:
0xec9aF77BD582326F3Af98De61F4EAe3D90edE5be0xec9aF77BD582326F3Af98De61F4EAe3D90edE5be

Decimals:
9

Social Profiles:
Not Available, Update ?

 
Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

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

Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0x3528f069ecbab027f0ad0b434a896c9c281d97a5

Contract Name:
DxCustomDividendToken

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 5 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-01-19
*/

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

interface IERC20 {

    function totalSupply() external view returns (uint256);

    function balanceOf(address account) external view returns (uint256);

    function transfer(address recipient, uint256 amount) external returns (bool);

    function allowance(address owner, address spender) external view returns (uint256);

    function approve(address spender, uint256 amount) external returns (bool);

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}


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

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

interface IERC20Metadata is IERC20 {
    function name() external view returns (string memory);

    function symbol() external view returns (string memory);

    function decimals() external view returns (uint8);
}

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;
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }
    function name() public view virtual override returns (string memory) {
        return _name;
    }

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

    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

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

    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

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

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

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

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
    unchecked {
        _approve(sender, _msgSender(), currentAllowance - amount);
    }

        return true;
    }

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

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
    unchecked {
        _approve(_msgSender(), spender, currentAllowance - subtractedValue);
    }

        return true;
    }

    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
    unchecked {
        _balances[sender] = senderBalance - amount;
    }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

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

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

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

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

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

    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);

    function addLiquidityAVAX(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);

}

interface IUniswapV2Router02 is IUniswapV2Router01 {

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    
}

interface IUniswapV2Factory {

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

}


library IterableMapping {
    struct Map {
        address[] keys;
        mapping(address => uint) values;
        mapping(address => uint) indexOf;
        mapping(address => bool) inserted;
    }

    function get(Map storage map, address key) public view returns (uint) {
        return map.values[key];
    }

    function getIndexOfKey(Map storage map, address key) public view returns (int) {
        if (!map.inserted[key]) {
            return - 1;
        }
        return int(map.indexOf[key]);
    }

    function getKeyAtIndex(Map storage map, uint index) public view returns (address) {
        return map.keys[index];
    }


    function size(Map storage map) public view returns (uint) {
        return map.keys.length;
    }

    function set(Map storage map, address key, uint val) public {
        if (map.inserted[key]) {
            map.values[key] = val;
        } else {
            map.inserted[key] = true;
            map.values[key] = val;
            map.indexOf[key] = map.keys.length;
            map.keys.push(key);
        }
    }

    function remove(Map storage map, address key) public {
        if (!map.inserted[key]) {
            return;
        }

        delete map.inserted[key];
        delete map.values[key];

        uint index = map.indexOf[key];
        uint lastIndex = map.keys.length - 1;
        address lastKey = map.keys[lastIndex];

        map.indexOf[lastKey] = index;
        delete map.indexOf[key];

        map.keys[index] = lastKey;
        map.keys.pop();
    }
}

abstract contract Ownable is Context {
    address private _owner;

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

    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    function owner() public view virtual returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

interface IDividendPayingTokenOptional {

    function withdrawableDividendOf(address _owner) external view returns (uint256);

    function withdrawnDividendOf(address _owner) external view returns (uint256);

    function accumulativeDividendOf(address _owner) external view returns (uint256);
}

interface IDividendPayingToken {
    function dividendOf(address _owner) external view returns (uint256);

    function distributeDividends() external payable;

    function withdrawDividend() external;

    event DividendsDistributed(
        address indexed from,
        uint256 weiAmount
    );
    event DividendWithdrawn(
        address indexed to,
        uint256 weiAmount
    );
}

library SafeMathInt {

    function toUint256Safe(int256 a) internal pure returns (uint256) {
        require(a >= 0);
        return uint256(a);
    }
}

library SafeMathUint {
    function toInt256Safe(uint256 a) internal pure returns (int256) {
        int256 b = int256(a);
        require(b >= 0);
        return b;
    }
}

contract DividendPayingToken is ERC20, IDividendPayingToken, IDividendPayingTokenOptional {
    using SafeMathUint for uint256;
    using SafeMathInt for int256;
    uint256 constant internal magnitude = 2 ** 128;
    uint256 internal magnifiedDividendPerShare;
    uint256 internal lastAmount;
    address public immutable rewardToken;
    uint8 public decimalUpdate;
    mapping(address => int256) internal magnifiedDividendCorrections;
    mapping(address => uint256) internal withdrawnDividends;
    uint256 public totalDividendsDistributed;

    constructor(address _rewardToken, string memory _name, string memory _symbol, uint8 _decimals) ERC20(_name, _symbol) {
        decimalUpdate = _decimals;
        rewardToken = _rewardToken;
    }

    receive() external payable {
    }

    function decimals() public view virtual override returns (uint8) {
        return decimalUpdate;
    }

    function distributeDividends() public override payable {
        require(totalSupply() > 0);
        if (msg.value > 0) {
            magnifiedDividendPerShare = (magnifiedDividendPerShare + (msg.value * magnitude)) / totalSupply();
            emit DividendsDistributed(msg.sender, msg.value);

            totalDividendsDistributed = totalDividendsDistributed + msg.value;
        }
    }

    function distributeRewardDividends(uint256 amount) public {
        require(totalSupply() > 0);

        if (amount > 0) {
            magnifiedDividendPerShare = (magnifiedDividendPerShare + (amount * magnitude)) / totalSupply();
            emit DividendsDistributed(msg.sender, amount);

            totalDividendsDistributed = totalDividendsDistributed + amount;
        }
    }

    function withdrawDividend() public virtual override {
        _withdrawDividendOfUser(payable(msg.sender));
    }

    function _withdrawDividendOfUser(address payable user) internal returns (uint256) {
        uint256 _withdrawableDividend = withdrawableDividendOf(user);
        if (_withdrawableDividend > 0) {
            withdrawnDividends[user] = withdrawnDividends[user] + _withdrawableDividend;
            emit DividendWithdrawn(user, _withdrawableDividend);
            bool success = IERC20(rewardToken).transfer(user, _withdrawableDividend);

            if (!success) {
                withdrawnDividends[user] = withdrawnDividends[user] - _withdrawableDividend;
                return 0;
            }
            return _withdrawableDividend;
        }
        return 0;
    }

    function dividendOf(address _owner) public view override returns (uint256) {
        return withdrawableDividendOf(_owner);
    }

    function withdrawableDividendOf(address _owner) public view override returns (uint256) {
        return accumulativeDividendOf(_owner) - withdrawnDividends[_owner];
    }

    function withdrawnDividendOf(address _owner) public view override returns (uint256) {
        return withdrawnDividends[_owner];
    }

    function accumulativeDividendOf(address _owner) public view override returns (uint256) {
        return magnifiedDividendPerShare * ((balanceOf(_owner) + magnifiedDividendCorrections[_owner].toUint256Safe()) / magnitude);
    }

    function _transfer(address from, address to, uint256 value) internal virtual override {
        require(false);

        int256 _magCorrection = (magnifiedDividendPerShare * value).toInt256Safe();
        magnifiedDividendCorrections[from] = magnifiedDividendCorrections[from] + _magCorrection;
        magnifiedDividendCorrections[to] = magnifiedDividendCorrections[to] - _magCorrection;
    }

    function _mint(address account, uint256 value) internal override {
        super._mint(account, value);

        magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account] - (magnifiedDividendPerShare * value).toInt256Safe();
    }

    function _burn(address account, uint256 value) internal override {
        super._burn(account, value);

        magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account] + (magnifiedDividendPerShare * value).toInt256Safe();
    }

    function _setBalance(address account, uint256 newBalance) internal {
        uint256 currentBalance = balanceOf(account);
        if (newBalance > currentBalance) {
            uint256 mintAmount = newBalance - currentBalance;
            _mint(account, mintAmount);
        } else if (newBalance < currentBalance) {
            uint256 burnAmount = currentBalance - newBalance;
            _burn(account, burnAmount);
        }
    }
}

contract DxCustomDividendToken is ERC20, Ownable {

    IUniswapV2Router02 public immutable uniswapV2Router;
    address public immutable uniswapV2Pair;

    address public rewardToken;
    uint8 public decimalNew;
    address public router;
    address public basePair;

    bool public mintedByDxsale = true;
    address dead = 0x000000000000000000000000000000000000dEaD;

    bool private swapping;

    DividendTracker public dividendTracker;

    uint256 public swapTokensAtAmount;
    uint256 public minimumTokenBalanceForDividends;

    uint256 public tokenRewardsFee;
    uint256 public liquidityFee;
    uint256 public totalFees;

    uint256 public gasForProcessing = 500000;

    address public presaleAddress;

    mapping(address => bool) public _isExcludedFromFees;

    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);

    event GasForProcessingUpdated(uint256 indexed newValue, uint256 indexed oldValue);

    event SendDividends(
        uint256 tokensSwapped,
        uint256 amount
    );

    event ProcessedDividendTracker(
        uint256 iterations,
        uint256 claims,
        uint256 lastProcessedIndex,
        bool indexed automatic,
        uint256 gas,
        address indexed processor
    );

    function setLiquidityFee(uint256 _newFee) external onlyOwner {
        require(_newFee >= 0 && _newFee <= 10, "Fee out of range!");
        liquidityFee = _newFee;
        totalFees = _newFee + tokenRewardsFee;
    }

    function setRewardFee(uint256 _newFee) external onlyOwner {
        require(_newFee >= 0 && _newFee <= 15, "Fee out of range!");
        tokenRewardsFee = _newFee;
        totalFees = _newFee + liquidityFee;
    }

    constructor(address _rewardToken, string memory name_, string memory symbol_, uint8 decimals_, uint256 _totalSupply, uint8 _tokenRewardsFee, uint8 _liquidityFee, address _router, address _basePair) ERC20(name_, symbol_) {

        tokenRewardsFee = _tokenRewardsFee;
        liquidityFee = _liquidityFee;
        totalFees = _tokenRewardsFee + _liquidityFee;

        rewardToken = _rewardToken;
        decimalNew = decimals_;

        swapTokensAtAmount = _totalSupply /10000;
        minimumTokenBalanceForDividends = _totalSupply /100000;

        dividendTracker = new DividendTracker(rewardToken, minimumTokenBalanceForDividends, decimalNew);

        router = _router;
        basePair = _basePair;  
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(router);

        address _uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), basePair);

        uniswapV2Router = _uniswapV2Router;
        uniswapV2Pair = _uniswapV2Pair;

        // exclude from receiving dividends
        dividendTracker.excludeFromDividends(address(dividendTracker));
        dividendTracker.excludeFromDividends(_uniswapV2Pair);
        dividendTracker.excludeFromDividends(address(this));
        dividendTracker.excludeFromDividends(dead);
        dividendTracker.excludeFromDividends(address(_uniswapV2Router));

        //excludeFromFees
        _isExcludedFromFees[owner()] = true;
        _isExcludedFromFees[address(this)] = true;

        _mint(tx.origin, _totalSupply);

    }

    receive() external payable {

    }

    function getWrapAddr() public view returns (address){

        return basePair;

    }

    function decimals() public view virtual override returns (uint8) {
        return decimalNew;
    }

    function excludeFromFees(address account) public onlyOwner {
        require(!_isExcludedFromFees[account], "Account is already excluded");
        _isExcludedFromFees[account] = true;
    }
    
    function includeInFees(address account) public onlyOwner {
        require(_isExcludedFromFees[account], "Account is already included");
        _isExcludedFromFees[account] = false;
    }

    function excludeAccountFromDividends(address account) public onlyOwner {
        dividendTracker.excludeFromDividends(account);
    }

    function updateClaimWait(uint256 claimWait) external onlyOwner {
        dividendTracker.updateClaimWait(claimWait);
    }

    function getClaimWait() external view returns (uint256) {
        return dividendTracker.claimWait();
    }

    function getTotalDividendsDistributed() external view returns (uint256) {
        return dividendTracker.totalDividendsDistributed();
    }

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

    function withdrawableDividendOf(address account) public view returns (uint256) {
        return dividendTracker.withdrawableDividendOf(account);
    }

    function dividendTokenBalanceOf(address account) public view returns (uint256) {
        return dividendTracker.balanceOf(account);
    }

    function getAccountDividendsInfo(address account)
    external view returns (
        address,
        int256,
        int256,
        uint256,
        uint256,
        uint256,
        uint256,
        uint256) {
        return dividendTracker.getAccount(account);
    }

    function getAccountDividendsInfoAtIndex(uint256 index)
    external view returns (
        address,
        int256,
        int256,
        uint256,
        uint256,
        uint256,
        uint256,
        uint256) {
        return dividendTracker.getAccountAtIndex(index);
    }

    function processDividendTracker(uint256 gas) external {
        (uint256 iterations, uint256 claims, uint256 lastProcessedIndex) = dividendTracker.process(gas);
        emit ProcessedDividendTracker(iterations, claims, lastProcessedIndex, false, gas, tx.origin);
    }

    function claim() external {
        dividendTracker.processAccount(payable(msg.sender), false);
    }

    function getLastProcessedIndex() external view returns (uint256) {
        return dividendTracker.getLastProcessedIndex();
    }

    function getNumberOfDividendTokenHolders() external view returns (uint256) {
        return dividendTracker.getNumberOfTokenHolders();
    }

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

        if (amount == 0) {
            super._transfer(from, to, 0);
            return;
        }
        uint256 contractTokenBalance = balanceOf(address(this));
        bool canSwap = contractTokenBalance >= swapTokensAtAmount;

        if (canSwap && !swapping && to == uniswapV2Pair) {
            swapping = true;
            uint256 swapTokens = (contractTokenBalance * liquidityFee) / totalFees;

            swapAndLiquify(swapTokens);
            swapAndSendDividends(swapTokensAtAmount);
            swapping = false;
        }

        bool takeFee = !swapping;

        if (_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }

        if (takeFee) {
            uint256 fees = (amount * totalFees) / 100;

            amount = amount - fees;

            super._transfer(from, address(this), fees);
        }

        super._transfer(from, to, amount);

        try dividendTracker.setBalance(payable(from), balanceOf(from)) {} catch {}
        try dividendTracker.setBalance(payable(to), balanceOf(to)) {} catch {}

        if (!swapping) {
            uint256 gas = gasForProcessing;

            try dividendTracker.process(gas) returns (uint256 iterations, uint256 claims, uint256 lastProcessedIndex) {
                emit ProcessedDividendTracker(iterations, claims, lastProcessedIndex, true, gas, tx.origin);
            }
            catch {

            }
        }
    }

    function swapAndLiquify(uint256 tokens) private {
        uint256 half = tokens / 2;
        uint256 otherHalf = tokens - half;
        uint256 initialBalance = address(this).balance;
        swapTokensForEth(half);
        uint256 newBalance = address(this).balance - initialBalance;
        addLiquidity(otherHalf, newBalance);
    }

    function swapTokensForEth(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = getWrapAddr();
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }


    function swapTokensForReward(uint256 tokenAmount, address recipient) private {
        address[] memory path = new address[](3);
        path[0] = address(this);
        path[1] = getWrapAddr();
        path[2] = rewardToken;

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

        uniswapV2Router.swapExactTokensForTokensSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            recipient,
            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

        try uniswapV2Router.addLiquidityETH{value : ETHAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            dead,
            block.timestamp
        ) {

        }

        catch (bytes memory) {
            try uniswapV2Router.addLiquidityAVAX{value : ETHAmount}(
                address(this),
                tokenAmount,
                0, // slippage is unavoidable
                0, // slippage is unavoidable
                dead,
                block.timestamp
            ) {

            }
            catch (bytes memory) {

                uniswapV2Router.addLiquidityETH{value : ETHAmount}(
                    address(this),
                    tokenAmount,
                    0, // slippage is unavoidable
                    0, // slippage is unavoidable
                    dead,
                    block.timestamp
                );
            }
        }

    }

    function swapAndSendDividends(uint256 tokens) private {
        swapTokensForReward(tokens, address(this));
        uint256 dividends = IERC20(rewardToken).balanceOf(address(this));
        bool success = IERC20(rewardToken).transfer(address(dividendTracker), dividends);

        if (success) {
            dividendTracker.distributeRewardDividends(dividends);
            emit SendDividends(tokens, dividends);
        }
    }

}

contract DividendTracker is DividendPayingToken, Ownable {
    using SafeMathInt for int256;
    using IterableMapping for IterableMapping.Map;

    IterableMapping.Map private tokenHoldersMap;
    uint256 public lastProcessedIndex;

    mapping(address => bool) public excludedFromDividends;

    mapping(address => uint256) public lastClaimTimes;

    uint256 public claimWait;
    uint256 public immutable minimumTokenBalanceForDividends;

    event ExcludeFromDividends(address indexed account);
    event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue);

    event Claim(address indexed account, uint256 amount, bool indexed automatic);


    constructor(address tokenReward, uint256 _minimumTokenBalanceForDividends, uint8 _decimals) DividendPayingToken(tokenReward, "Dividend_Tracker", "Dividend_Tracker", _decimals) {
        claimWait = 36000;
        minimumTokenBalanceForDividends = _minimumTokenBalanceForDividends;
    }

    function _transfer(address, address, uint256) internal pure override {
        require(false, "Dividend_Tracker: No transfers allowed");
    }

    function withdrawDividend() public pure override {
        require(false, "Dividend_Tracker: withdrawDividend disabled. Use the 'claim' function on the main ERC20 token contract.");
    }

    function excludeFromDividends(address account) external onlyOwner {
        require(!excludedFromDividends[account]);
        excludedFromDividends[account] = true;

        _setBalance(account, 0);
        tokenHoldersMap.remove(account);

        emit ExcludeFromDividends(account);
    }

    function updateClaimWait(uint256 newClaimWait) external onlyOwner {
        require(newClaimWait >= 3600 && newClaimWait <= 86400, "Dividend_Tracker: claimWait must be updated to between 1 and 24 hours");
        require(newClaimWait != claimWait, "Dividend_Tracker: Cannot update claimWait to same value");
        emit ClaimWaitUpdated(newClaimWait, claimWait);
        claimWait = newClaimWait;
    }

    function getLastProcessedIndex() external view returns (uint256) {
        return lastProcessedIndex;
    }

    function getNumberOfTokenHolders() external view returns (uint256) {
        return tokenHoldersMap.keys.length;
    }


    function getAccount(address _account)
    public view returns (
        address account,
        int256 index,
        int256 iterationsUntilProcessed,
        uint256 withdrawableDividends,
        uint256 totalDividends,
        uint256 lastClaimTime,
        uint256 nextClaimTime,
        uint256 secondsUntilAutoClaimAvailable) {
        account = _account;

        index = tokenHoldersMap.getIndexOfKey(account);

        iterationsUntilProcessed = - 1;

        if (index >= 0) {
            if (uint256(index) > lastProcessedIndex) {
                iterationsUntilProcessed = index - (int256(lastProcessedIndex));
            }
            else {
                uint256 processesUntilEndOfArray = tokenHoldersMap.keys.length > lastProcessedIndex ?
                tokenHoldersMap.keys.length - lastProcessedIndex :
                0;


                iterationsUntilProcessed = index + (int256(processesUntilEndOfArray));
            }
        }


        withdrawableDividends = withdrawableDividendOf(account);
        totalDividends = accumulativeDividendOf(account);

        lastClaimTime = lastClaimTimes[account];

        nextClaimTime = lastClaimTime > 0 ?
        lastClaimTime + claimWait :
        0;

        secondsUntilAutoClaimAvailable = nextClaimTime > block.timestamp ?
        nextClaimTime - block.timestamp :
        0;
    }

    function getAccountAtIndex(uint256 index)
    public view returns (
        address,
        int256,
        int256,
        uint256,
        uint256,
        uint256,
        uint256,
        uint256) {
        if (index >= tokenHoldersMap.size()) {
            return (0x0000000000000000000000000000000000000000, - 1, - 1, 0, 0, 0, 0, 0);
        }

        address account = tokenHoldersMap.getKeyAtIndex(index);

        return getAccount(account);
    }

    function canAutoClaim(uint256 lastClaimTime) private view returns (bool) {
        if (lastClaimTime > block.timestamp) {
            return false;
        }

        return (block.timestamp - lastClaimTime) >= claimWait;
    }

    function setBalance(address payable account, uint256 newBalance) external onlyOwner {
        if (excludedFromDividends[account]) {
            return;
        }

        if (newBalance >= minimumTokenBalanceForDividends) {
            _setBalance(account, newBalance);
            tokenHoldersMap.set(account, newBalance);
        }
        else {
            _setBalance(account, 0);
            tokenHoldersMap.remove(account);
        }

        processAccount(account, true);
    }

    function process(uint256 gas) public returns (uint256, uint256, uint256) {
        uint256 numberOfTokenHolders = tokenHoldersMap.keys.length;

        if (numberOfTokenHolders == 0) {
            return (0, 0, lastProcessedIndex);
        }

        uint256 _lastProcessedIndex = lastProcessedIndex;

        uint256 gasUsed = 0;

        uint256 gasLeft = gasleft();

        uint256 iterations = 0;
        uint256 claims = 0;

        while (gasUsed < gas && iterations < numberOfTokenHolders) {
            _lastProcessedIndex++;

            if (_lastProcessedIndex >= tokenHoldersMap.keys.length) {
                _lastProcessedIndex = 0;
            }

            address account = tokenHoldersMap.keys[_lastProcessedIndex];

            if (canAutoClaim(lastClaimTimes[account])) {
                if (processAccount(payable(account), true)) {
                    claims++;
                }
            }

            iterations++;

            uint256 newGasLeft = gasleft();

            if (gasLeft > newGasLeft) {
                gasUsed = gasUsed + gasLeft - newGasLeft;
            }

            gasLeft = newGasLeft;
        }

        lastProcessedIndex = _lastProcessedIndex;

        return (iterations, claims, lastProcessedIndex);
    }

    function processAccount(address payable account, bool automatic) public onlyOwner returns (bool) {
        uint256 amount = _withdrawDividendOfUser(account);

        if (amount > 0) {
            lastClaimTimes[account] = block.timestamp;
            emit Claim(account, amount, automatic);
            return true;
        }

        return false;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_rewardToken","type":"address"},{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"uint8","name":"decimals_","type":"uint8"},{"internalType":"uint256","name":"_totalSupply","type":"uint256"},{"internalType":"uint8","name":"_tokenRewardsFee","type":"uint8"},{"internalType":"uint8","name":"_liquidityFee","type":"uint8"},{"internalType":"address","name":"_router","type":"address"},{"internalType":"address","name":"_basePair","type":"address"}],"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":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"GasForProcessingUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"iterations","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"claims","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastProcessedIndex","type":"uint256"},{"indexed":true,"internalType":"bool","name":"automatic","type":"bool"},{"indexed":false,"internalType":"uint256","name":"gas","type":"uint256"},{"indexed":true,"internalType":"address","name":"processor","type":"address"}],"name":"ProcessedDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SendDividends","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"basePair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimalNew","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"dividendTokenBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendTracker","outputs":[{"internalType":"contract DividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeAccountFromDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gasForProcessing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAccountDividendsInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getAccountDividendsInfoAtIndex","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getClaimWait","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastProcessedIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfDividendTokenHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalDividendsDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWrapAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumTokenBalanceForDividends","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintedByDxsale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"processDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newFee","type":"uint256"}],"name":"setLiquidityFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newFee","type":"uint256"}],"name":"setRewardFee","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":"tokenRewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"claimWait","type":"uint256"}],"name":"updateClaimWait","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawableDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c06040526008805460ff60a01b1916600160a01b179055600980546001600160a01b03191661dead1790556207a1206010553480156200003f57600080fd5b50604051620053c5380380620053c5833981016040819052620000629162000852565b8751889088906200007b90600390602085019062000693565b5080516200009190600490602084019062000693565b5050506000620000a66200059860201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35060ff808516600d558316600e556200010d838562000966565b60ff908116600f5560068054918816600160a01b026001600160a81b03199092166001600160a01b038c16179190911790556200014d612710866200098e565b600b556200015f620186a0866200098e565b600c8190556006546040516001600160a01b0382169291600160a01b900460ff16906200018c9062000722565b6001600160a01b039093168352602083019190915260ff166040820152606001604051809103906000f080158015620001c9573d6000803e3d6000fd5b50600a80546001600160a01b03199081166001600160a01b0393841617909155600780548216858416908117909155600880549092169284169290921790556040805163c45a015560e01b81529051600091839163c45a015591600480820192602092909190829003018186803b1580156200024457600080fd5b505afa15801562000259573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200027f91906200082d565b6008546040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c6539690604401602060405180830381600087803b158015620002cc57600080fd5b505af1158015620002e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200030791906200082d565b6001600160601b0319606084811b821660805282901b1660a052600a5460405163031e79db60e41b81529192506001600160a01b0316906331e79db0906200035490839060040162000937565b600060405180830381600087803b1580156200036f57600080fd5b505af115801562000384573d6000803e3d6000fd5b5050600a5460405163031e79db60e41b81526001600160a01b0390911692506331e79db09150620003ba90849060040162000937565b600060405180830381600087803b158015620003d557600080fd5b505af1158015620003ea573d6000803e3d6000fd5b5050600a5460405163031e79db60e41b81526001600160a01b0390911692506331e79db091506200042090309060040162000937565b600060405180830381600087803b1580156200043b57600080fd5b505af115801562000450573d6000803e3d6000fd5b5050600a5460095460405163031e79db60e41b81526001600160a01b0392831694506331e79db093506200048b929091169060040162000937565b600060405180830381600087803b158015620004a657600080fd5b505af1158015620004bb573d6000803e3d6000fd5b5050600a5460405163031e79db60e41b81526001600160a01b0390911692506331e79db09150620004f190859060040162000937565b600060405180830381600087803b1580156200050c57600080fd5b505af115801562000521573d6000803e3d6000fd5b505050506001601260006200053b6200059c60201b60201c565b6001600160a01b0316815260208082019290925260409081016000908120805494151560ff199586161790553081526012909252902080549091166001179055620005873288620005ab565b505050505050505050505062000a1a565b3390565b6005546001600160a01b031690565b6001600160a01b038216620006065760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b80600260008282546200061a91906200094b565b90915550506001600160a01b03821660009081526020819052604081208054839290620006499084906200094b565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b828054620006a190620009b1565b90600052602060002090601f016020900481019282620006c5576000855562000710565b82601f10620006e057805160ff191683800117855562000710565b8280016001018555821562000710579182015b8281111562000710578251825591602001919060010190620006f3565b506200071e92915062000730565b5090565b61231d80620030a883390190565b5b808211156200071e576000815560010162000731565b80516001600160a01b03811681146200075f57600080fd5b919050565b600082601f8301126200077657600080fd5b81516001600160401b038082111562000793576200079362000a04565b604051601f8301601f19908116603f01168101908282118183101715620007be57620007be62000a04565b81604052838152602092508683858801011115620007db57600080fd5b600091505b83821015620007ff5785820183015181830184015290820190620007e0565b83821115620008115760008385830101525b9695505050505050565b805160ff811681146200075f57600080fd5b6000602082840312156200084057600080fd5b6200084b8262000747565b9392505050565b60008060008060008060008060006101208a8c0312156200087257600080fd5b6200087d8a62000747565b60208b01519099506001600160401b03808211156200089b57600080fd5b620008a98d838e0162000764565b995060408c0151915080821115620008c057600080fd5b50620008cf8c828d0162000764565b975050620008e060608b016200081b565b955060808a01519450620008f760a08b016200081b565b93506200090760c08b016200081b565b92506200091760e08b0162000747565b9150620009286101008b0162000747565b90509295985092959850929598565b6001600160a01b0391909116815260200190565b60008219821115620009615762000961620009ee565b500190565b600060ff821660ff84168060ff03821115620009865762000986620009ee565b019392505050565b600082620009ac57634e487b7160e01b600052601260045260246000fd5b500490565b600181811c90821680620009c657607f821691505b60208210811415620009e857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b60805160601c60a05160601c61262362000a856000396000818161045e01526115890152600081816102f101528181611c2e01528181611c6a01528181611cdc01528181611d1b01528181611df701528181611ed301528181612032015261206e01526126236000f3fe6080604052600436106102275760003560e01c806306fdde0314610233578063095ea7b31461025e578063122fe6851461028e57806313114a9d146102bb5780631694505e146102df57806316a2f82a1461031357806318160ddd146103355780631b9464f21461034a57806323b872dd1461036a5780632c1f52161461038a57806330bb4cff146103aa578063313ce567146103bf578063357bf15c146103ec578063395093511461040c57806341a2ac701461042c57806349bd5a5e1461044c5780634e71d92d146104805780634fbee1931461049557806355924646146104ce5780635930919b146104ef57806364b0f6531461050f5780636843cd84146105245780636f151e6114610544578063700bb1911461056557806370a0823114610585578063715018a6146105a55780638da5cb5b146105ba57806395d89b41146105cf57806398118cb4146105e45780639b33d9d1146105fa5780639c1b8af51461060f578063a26579ad14610625578063a457c2d71461063a578063a8b9d2401461065a578063a9059cbb1461067a578063ad56c13c1461069a578063be10b614146106ff578063dd62ed3e14610715578063e0bf7fd11461075b578063e2f456051461078b578063e57f14e1146107a1578063e708a0f9146107c1578063e7841ec0146107d7578063e98030c7146107ec578063f27fd2541461080c578063f2fde38b1461082c578063f7c618c11461084c578063f887ea401461086c57600080fd5b3661022e57005b600080fd5b34801561023f57600080fd5b5061024861088c565b60405161025591906122f8565b60405180910390f35b34801561026a57600080fd5b5061027e6102793660046121e2565b61091e565b6040519015158152602001610255565b34801561029a57600080fd5b506011546102ae906001600160a01b031681565b6040516102559190612290565b3480156102c757600080fd5b506102d1600f5481565b604051908152602001610255565b3480156102eb57600080fd5b506102ae7f000000000000000000000000000000000000000000000000000000000000000081565b34801561031f57600080fd5b5061033361032e3660046120da565b610934565b005b34801561034157600080fd5b506002546102d1565b34801561035657600080fd5b506103336103653660046120da565b6109f3565b34801561037657600080fd5b5061027e610385366004612137565b610a87565b34801561039657600080fd5b50600a546102ae906001600160a01b031681565b3480156103b657600080fd5b506102d1610b31565b3480156103cb57600080fd5b50600654600160a01b900460ff165b60405160ff9091168152602001610255565b3480156103f857600080fd5b50610333610407366004612230565b610bb3565b34801561041857600080fd5b5061027e6104273660046121e2565b610c1b565b34801561043857600080fd5b50610333610447366004612230565b610c57565b34801561045857600080fd5b506102ae7f000000000000000000000000000000000000000000000000000000000000000081565b34801561048c57600080fd5b50610333610cb9565b3480156104a157600080fd5b5061027e6104b03660046120da565b6001600160a01b031660009081526012602052604090205460ff1690565b3480156104da57600080fd5b5060085461027e90600160a01b900460ff1681565b3480156104fb57600080fd5b506008546102ae906001600160a01b031681565b34801561051b57600080fd5b506102d1610d40565b34801561053057600080fd5b506102d161053f3660046120da565b610d85565b34801561055057600080fd5b506006546103da90600160a01b900460ff1681565b34801561057157600080fd5b50610333610580366004612230565b610e0c565b34801561059157600080fd5b506102d16105a03660046120da565b610ed7565b3480156105b157600080fd5b50610333610ef2565b3480156105c657600080fd5b506102ae610f59565b3480156105db57600080fd5b50610248610f68565b3480156105f057600080fd5b506102d1600e5481565b34801561060657600080fd5b506102ae610f77565b34801561061b57600080fd5b506102d160105481565b34801561063157600080fd5b506102d1610f86565b34801561064657600080fd5b5061027e6106553660046121e2565b610fcb565b34801561066657600080fd5b506102d16106753660046120da565b611064565b34801561068657600080fd5b5061027e6106953660046121e2565b611095565b3480156106a657600080fd5b506106ba6106b53660046120da565b6110a2565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e082015261010001610255565b34801561070b57600080fd5b506102d1600c5481565b34801561072157600080fd5b506102d16107303660046120fe565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561076757600080fd5b5061027e6107763660046120da565b60126020526000908152604090205460ff1681565b34801561079757600080fd5b506102d1600b5481565b3480156107ad57600080fd5b506103336107bc3660046120da565b61114f565b3480156107cd57600080fd5b506102d1600d5481565b3480156107e357600080fd5b506102d1611209565b3480156107f857600080fd5b50610333610807366004612230565b61124e565b34801561081857600080fd5b506106ba610827366004612230565b6112ae565b34801561083857600080fd5b506103336108473660046120da565b6112f0565b34801561085857600080fd5b506006546102ae906001600160a01b031681565b34801561087857600080fd5b506007546102ae906001600160a01b031681565b60606003805461089b90612531565b80601f01602080910402602001604051908101604052809291908181526020018280546108c790612531565b80156109145780601f106108e957610100808354040283529160200191610914565b820191906000526020600020905b8154815290600101906020018083116108f757829003601f168201915b5050505050905090565b600061092b3384846113ce565b50600192915050565b3361093d610f59565b6001600160a01b03161461096c5760405162461bcd60e51b8152600401610963906123bb565b60405180910390fd5b6001600160a01b03811660009081526012602052604090205460ff166109d25760405162461bcd60e51b815260206004820152601b60248201527a1058d8dbdd5b9d081a5cc8185b1c9958591e481a5b98db1d591959602a1b6044820152606401610963565b6001600160a01b03166000908152601260205260409020805460ff19169055565b336109fc610f59565b6001600160a01b031614610a225760405162461bcd60e51b8152600401610963906123bb565b600a5460405163031e79db60e41b81526001600160a01b03909116906331e79db090610a52908490600401612290565b600060405180830381600087803b158015610a6c57600080fd5b505af1158015610a80573d6000803e3d6000fd5b5050505050565b6000610a948484846114f2565b6001600160a01b038416600090815260016020908152604080832033845290915290205482811015610b195760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610963565b610b2685338584036113ce565b506001949350505050565b600a54604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae916004808301926020929190829003018186803b158015610b7657600080fd5b505afa158015610b8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bae9190612249565b905090565b33610bbc610f59565b6001600160a01b031614610be25760405162461bcd60e51b8152600401610963906123bb565b600a811115610c035760405162461bcd60e51b815260040161096390612390565b600e819055600d54610c1590826124c1565b600f5550565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161092b918590610c529086906124c1565b6113ce565b33610c60610f59565b6001600160a01b031614610c865760405162461bcd60e51b8152600401610963906123bb565b600f811115610ca75760405162461bcd60e51b815260040161096390612390565b600d819055600e54610c1590826124c1565b600a5460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b3790604401602060405180830381600087803b158015610d0557600080fd5b505af1158015610d19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d3d919061220e565b50565b600a54604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde916004808301926020929190829003018186803b158015610b7657600080fd5b600a546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610db6908590600401612290565b60206040518083038186803b158015610dce57600080fd5b505afa158015610de2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e069190612249565b92915050565b600a546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c47990602401606060405180830381600087803b158015610e5a57600080fd5b505af1158015610e6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e929190612262565b925092509250326001600160a01b0316600015156000805160206125ae83398151915285858589604051610ec994939291906124a6565b60405180910390a350505050565b6001600160a01b031660009081526020819052604090205490565b33610efb610f59565b6001600160a01b031614610f215760405162461bcd60e51b8152600401610963906123bb565b6005546040516000916001600160a01b0316906000805160206125ce833981519152908390a3600580546001600160a01b0319169055565b6005546001600160a01b031690565b60606004805461089b90612531565b6008546001600160a01b031690565b600a5460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec916004808301926020929190829003018186803b158015610b7657600080fd5b3360009081526001602090815260408083206001600160a01b03861684529091528120548281101561104d5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610963565b61105a33858584036113ce565b5060019392505050565b600a546040516302a2e74960e61b81526000916001600160a01b03169063a8b9d24090610db6908590600401612290565b600061092b3384846114f2565b600a5460405163fbcbc0f160e01b815260009182918291829182918291829182916001600160a01b039091169063fbcbc0f1906110e3908c90600401612290565b6101006040518083038186803b1580156110fc57600080fd5b505afa158015611110573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111349190612178565b97509750975097509750975097509750919395975091939597565b33611158610f59565b6001600160a01b03161461117e5760405162461bcd60e51b8152600401610963906123bb565b6001600160a01b03811660009081526012602052604090205460ff16156111e55760405162461bcd60e51b815260206004820152601b60248201527a1058d8dbdd5b9d081a5cc8185b1c9958591e48195e18db1d591959602a1b6044820152606401610963565b6001600160a01b03166000908152601260205260409020805460ff19166001179055565b600a546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec0916004808301926020929190829003018186803b158015610b7657600080fd5b33611257610f59565b6001600160a01b03161461127d5760405162461bcd60e51b8152600401610963906123bb565b600a5460405163e98030c760e01b8152600481018390526001600160a01b039091169063e98030c790602401610a52565b600a54604051635183d6fd60e01b81526004810183905260009182918291829182918291829182916001600160a01b0390911690635183d6fd906024016110e3565b336112f9610f59565b6001600160a01b03161461131f5760405162461bcd60e51b8152600401610963906123bb565b6001600160a01b0381166113845760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610963565b6005546040516001600160a01b038084169216906000805160206125ce83398151915290600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383166114305760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610963565b6001600160a01b0382166114915760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610963565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166115185760405162461bcd60e51b8152600401610963906123f0565b6001600160a01b03821661153e5760405162461bcd60e51b81526004016109639061234d565b806115545761154f83836000611854565b505050565b600061155f30610ed7565b600b54909150811080159081906115805750600954600160a01b900460ff16155b80156115bd57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b0316145b15611618576009805460ff60a01b1916600160a01b179055600f54600e54600091906115e990856124fb565b6115f391906124d9565b90506115fe8161199b565b611609600b546119da565b506009805460ff60a01b191690555b6009546001600160a01b03861660009081526012602052604090205460ff600160a01b90920482161591168061166657506001600160a01b03851660009081526012602052604090205460ff165b1561166f575060005b80156116ac5760006064600f548661168791906124fb565b61169191906124d9565b905061169d818661251a565b94506116aa873083611854565b505b6116b7868686611854565b600a546001600160a01b031663e30443bc876116d281610ed7565b6040518363ffffffff1660e01b81526004016116ef9291906122a4565b600060405180830381600087803b15801561170957600080fd5b505af192505050801561171a575060015b50600a546001600160a01b031663e30443bc8661173681610ed7565b6040518363ffffffff1660e01b81526004016117539291906122a4565b600060405180830381600087803b15801561176d57600080fd5b505af192505050801561177e575060015b50600954600160a01b900460ff1661184c57601054600a546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c47990602401606060405180830381600087803b1580156117dc57600080fd5b505af192505050801561180c575060408051601f3d908101601f1916820190925261180991810190612262565b60015b6118155761184a565b60405132906001906000805160206125ae8339815191529061183e908790879087908b906124a6565b60405180910390a35050505b505b505050505050565b6001600160a01b03831661187a5760405162461bcd60e51b8152600401610963906123f0565b6001600160a01b0382166118a05760405162461bcd60e51b81526004016109639061234d565b6001600160a01b038316600090815260208190526040902054818110156119185760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610963565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061194f9084906124c1565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610ec991815260200190565b60006119a86002836124d9565b905060006119b6828461251a565b9050476119c283611b98565b60006119ce824761251a565b9050610a808382611cd6565b6119e48130611f69565b6006546040516370a0823160e01b81526000916001600160a01b0316906370a0823190611a15903090600401612290565b60206040518083038186803b158015611a2d57600080fd5b505afa158015611a41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a659190612249565b600654600a5460405163a9059cbb60e01b81529293506000926001600160a01b039283169263a9059cbb92611aa19291169086906004016122a4565b602060405180830381600087803b158015611abb57600080fd5b505af1158015611acf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611af3919061220e565b9050801561154f57600a54604051632287d53b60e11b8152600481018490526001600160a01b039091169063450faa7690602401600060405180830381600087803b158015611b4157600080fd5b505af1158015611b55573d6000803e3d6000fd5b505060408051868152602081018690527f80195cc573b02cc48460cbca6e6e4cc85ddb91959d946e1c3025ea3d87942dc3935001905060405180910390a1505050565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110611bcd57611bcd612582565b60200260200101906001600160a01b031690816001600160a01b031681525050611bf5610f77565b81600181518110611c0857611c08612582565b60200260200101906001600160a01b031690816001600160a01b031681525050611c53307f0000000000000000000000000000000000000000000000000000000000000000846113ce565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac94790611ca8908590600090869030904290600401612435565b600060405180830381600087803b158015611cc257600080fd5b505af115801561184c573d6000803e3d6000fd5b611d01307f0000000000000000000000000000000000000000000000000000000000000000846113ce565b60095460405163f305d71960e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263f305d719928592611d5f9230928992600092839291169042906004016122bd565b6060604051808303818588803b158015611d7857600080fd5b505af193505050508015611da9575060408051601f3d908101601f19168201909252611da691810190612262565b60015b610a80573d808015611dd7576040519150601f19603f3d011682016040523d82523d6000602084013e611ddc565b606091505b50600954604051637c8d9fb960e11b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263f91b3f72928692611e3b9230928a92600092839291169042906004016122bd565b6060604051808303818588803b158015611e5457600080fd5b505af193505050508015611e85575060408051601f3d908101601f19168201909252611e8291810190612262565b60015b61184c573d808015611eb3576040519150601f19603f3d011682016040523d82523d6000602084013e611eb8565b606091505b5060095460405163f305d71960e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263f305d719928792611f179230928b92600092839291169042906004016122bd565b6060604051808303818588803b158015611f3057600080fd5b505af1158015611f44573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061184a9190612262565b60408051600380825260808201909252600091602082016060803683370190505090503081600081518110611fa057611fa0612582565b60200260200101906001600160a01b031690816001600160a01b031681525050611fc8610f77565b81600181518110611fdb57611fdb612582565b6001600160a01b03928316602091820292909201015260065482519116908290600290811061200c5761200c612582565b60200260200101906001600160a01b031690816001600160a01b031681525050612057307f0000000000000000000000000000000000000000000000000000000000000000856113ce565b604051635c11d79560e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690635c11d795906120ac908690600090869088904290600401612435565b600060405180830381600087803b1580156120c657600080fd5b505af115801561184a573d6000803e3d6000fd5b6000602082840312156120ec57600080fd5b81356120f781612598565b9392505050565b6000806040838503121561211157600080fd5b823561211c81612598565b9150602083013561212c81612598565b809150509250929050565b60008060006060848603121561214c57600080fd5b833561215781612598565b9250602084013561216781612598565b929592945050506040919091013590565b600080600080600080600080610100898b03121561219557600080fd5b88516121a081612598565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b600080604083850312156121f557600080fd5b823561220081612598565b946020939093013593505050565b60006020828403121561222057600080fd5b815180151581146120f757600080fd5b60006020828403121561224257600080fd5b5035919050565b60006020828403121561225b57600080fd5b5051919050565b60008060006060848603121561227757600080fd5b8351925060208401519150604084015190509250925092565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b600060208083528351808285015260005b8181101561232557858101830151858201604001528201612309565b81811115612337576000604083870101525b50601f01601f1916929092016040019392505050565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b602080825260119082015270466565206f7574206f662072616e67652160781b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156124855784516001600160a01b031683529383019391830191600101612460565b50506001600160a01b03969096166060850152505050608001529392505050565b93845260208401929092526040830152606082015260800190565b600082198211156124d4576124d461256c565b500190565b6000826124f657634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156125155761251561256c565b500290565b60008282101561252c5761252c61256c565b500390565b600181811c9082168061254557607f821691505b6020821081141561256657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0381168114610d3d57600080fdfec864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a988be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0a26469706673582212207ae70850c0b33debf2756c1a566799e88fcd6fb5096e6446938b99f75872e63464736f6c6343000807003360c06040523480156200001157600080fd5b506040516200231d3803806200231d8339810160408190526200003491620001d4565b60408051808201825260108082526f2234bb34b232b7322faa3930b1b5b2b960811b60208084018281528551808701909652928552840152815186939185918491849162000085916003916200012e565b5080516200009b9060049060208401906200012e565b50506007805460ff191660ff939093169290921790915550505060601b6001600160601b0319166080526000620000cf3390565b600b80546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35050618ca060135560a0525062000269565b8280546200013c906200022c565b90600052602060002090601f016020900481019282620001605760008555620001ab565b82601f106200017b57805160ff1916838001178555620001ab565b82800160010185558215620001ab579182015b82811115620001ab5782518255916020019190600101906200018e565b50620001b9929150620001bd565b5090565b5b80821115620001b95760008155600101620001be565b600080600060608486031215620001ea57600080fd5b83516001600160a01b03811681146200020257600080fd5b60208501516040860151919450925060ff811681146200022157600080fd5b809150509250925092565b600181811c908216806200024157607f821691505b602082108114156200026357634e487b7160e01b600052602260045260246000fd5b50919050565b60805160601c60a05161207d620002a06000396000818161059c0152610fc201526000818161068b0152611867015261207d6000f3fe6080604052600436106101b95760003560e01c806303c83302146101c557806306fdde03146101cf578063095ea7b3146101fa57806309bbedde1461022a57806318160ddd14610249578063226cfa3d1461025e57806323b872dd1461028b57806327ce0147146102ab5780633009a609146102cb578063313ce567146102e157806331e79db0146103075780633950935114610327578063450faa76146103475780634e7b827f146103675780635183d6fd146103975780636a474002146103fc5780636f2789ec1461041157806370a0823114610427578063715018a61461044757806385a6b3ae1461045c5780638da5cb5b1461047257806391b89fba1461049f57806395d89b41146104bf578063a457c2d7146104d4578063a8b9d240146104f4578063a9059cbb14610514578063aafd847a14610534578063bc4c4b371461056a578063be10b6141461058a578063dd62ed3e146105be578063e30443bc14610604578063e7841ec014610624578063e98030c714610639578063f2fde38b14610659578063f7c618c114610679578063f949b2d6146106ad578063fbcbc0f1146106c7578063ffb2c479146106e757600080fd5b366101c057005b600080fd5b6101cd610722565b005b3480156101db57600080fd5b506101e461079f565b6040516101f19190611db1565b60405180910390f35b34801561020657600080fd5b5061021a610215366004611cc7565b610831565b60405190151581526020016101f1565b34801561023657600080fd5b50600c545b6040519081526020016101f1565b34801561025557600080fd5b5060025461023b565b34801561026a57600080fd5b5061023b610279366004611c4d565b60126020526000908152604090205481565b34801561029757600080fd5b5061021a6102a6366004611d21565b610848565b3480156102b757600080fd5b5061023b6102c6366004611c4d565b6108f7565b3480156102d757600080fd5b5061023b60105481565b3480156102ed57600080fd5b5060075460ff165b60405160ff90911681526020016101f1565b34801561031357600080fd5b506101cd610322366004611c4d565b610949565b34801561033357600080fd5b5061021a610342366004611cc7565b610a6d565b34801561035357600080fd5b506101cd610362366004611d98565b610aa9565b34801561037357600080fd5b5061021a610382366004611c4d565b60116020526000908152604090205460ff1681565b3480156103a357600080fd5b506103b76103b2366004611d98565b610b27565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e0820152610100016101f1565b34801561040857600080fd5b506101cd610c99565b34801561041d57600080fd5b5061023b60135481565b34801561043357600080fd5b5061023b610442366004611c4d565b610d3d565b34801561045357600080fd5b506101cd610d58565b34801561046857600080fd5b5061023b600a5481565b34801561047e57600080fd5b50610487610dbf565b6040516001600160a01b0390911681526020016101f1565b3480156104ab57600080fd5b5061023b6104ba366004611c4d565b610dce565b3480156104cb57600080fd5b506101e4610dd9565b3480156104e057600080fd5b5061021a6104ef366004611cc7565b610de8565b34801561050057600080fd5b5061023b61050f366004611c4d565b610e81565b34801561052057600080fd5b5061021a61052f366004611cc7565b610ead565b34801561054057600080fd5b5061023b61054f366004611c4d565b6001600160a01b031660009081526009602052604090205490565b34801561057657600080fd5b5061021a610585366004611c8e565b610eba565b34801561059657600080fd5b5061023b7f000000000000000000000000000000000000000000000000000000000000000081565b3480156105ca57600080fd5b5061023b6105d9366004611cf3565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561061057600080fd5b506101cd61061f366004611cc7565b610f6c565b34801561063057600080fd5b5060105461023b565b34801561064557600080fd5b506101cd610654366004611d98565b6110f6565b34801561066557600080fd5b506101cd610674366004611c4d565b61125f565b34801561068557600080fd5b506104877f000000000000000000000000000000000000000000000000000000000000000081565b3480156106b957600080fd5b506007546102f59060ff1681565b3480156106d357600080fd5b506103b76106e2366004611c4d565b61133d565b3480156106f357600080fd5b50610707610702366004611d98565b6114ac565b604080519384526020840192909252908201526060016101f1565b600061072d60025490565b1161073757600080fd5b341561079d5760025461074e600160801b34611ecd565b60055461075b9190611e93565b6107659190611eab565b60055560405134815233906000805160206120288339815191529060200160405180910390a234600a546107999190611e93565b600a555b565b6060600380546107ae90611f42565b80601f01602080910402602001604051908101604052809291908181526020018280546107da90611f42565b80156108275780601f106107fc57610100808354040283529160200191610827565b820191906000526020600020905b81548152906001019060200180831161080a57829003601f168201915b5050505050905090565b600061083e3384846115c8565b5060015b92915050565b60006108558484846116ec565b6001600160a01b0384166000908152600160209081526040808320338452909152902054828110156108df5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b6108ec85338584036115c8565b506001949350505050565b6001600160a01b038116600090815260086020526040812054600160801b9061091f90611743565b61092884610d3d565b6109329190611e93565b61093c9190611eab565b6005546108429190611ecd565b33610952610dbf565b6001600160a01b0316146109785760405162461bcd60e51b81526004016108d690611e06565b6001600160a01b03811660009081526011602052604090205460ff161561099e57600080fd5b6001600160a01b0381166000908152601160205260408120805460ff191660011790556109cc908290611756565b60405163131836e760e21b815273773a2e2e9856f807dbbab89b997a5a84645a5c9b90634c60db9c90610a0690600c908590600401611e3b565b60006040518083038186803b158015610a1e57600080fd5b505af4158015610a32573d6000803e3d6000fd5b50506040516001600160a01b03841692507fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b259150600090a250565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161083e918590610aa4908690611e93565b6115c8565b6000610ab460025490565b11610abe57600080fd5b8015610b2457600254610ad5600160801b83611ecd565b600554610ae29190611e93565b610aec9190611eab565b60055560405181815233906000805160206120288339815191529060200160405180910390a280600a54610b209190611e93565b600a555b50565b600080600080600080600080600c73773a2e2e9856f807dbbab89b997a5a84645a5c9b63deb3d89690916040518263ffffffff1660e01b8152600401610b6f91815260200190565b60206040518083038186803b158015610b8757600080fd5b505af4158015610b9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bbf9190611d7f565b8910610be4575060009650600019955085945086935083925082915081905080610c8e565b6040516368d54f3f60e11b8152600c6004820152602481018a905260009073773a2e2e9856f807dbbab89b997a5a84645a5c9b9063d1aa9e7e9060440160206040518083038186803b158015610c3957600080fd5b505af4158015610c4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c719190611c71565b9050610c7c8161133d565b98509850985098509850985098509850505b919395975091939597565b60405162461bcd60e51b815260206004820152606760248201527f4469766964656e645f547261636b65723a20776974686472617744697669646560448201527f6e642064697361626c65642e20557365207468652027636c61696d272066756e60648201527f6374696f6e206f6e20746865206d61696e20455243323020746f6b656e20636f608482015266373a3930b1ba1760c91b60a482015260c4016108d6565b6001600160a01b031660009081526020819052604090205490565b33610d61610dbf565b6001600160a01b031614610d875760405162461bcd60e51b81526004016108d690611e06565b600b546040516000916001600160a01b031690600080516020611fe8833981519152908390a3600b80546001600160a01b0319169055565b600b546001600160a01b031690565b600061084282610e81565b6060600480546107ae90611f42565b3360009081526001602090815260408083206001600160a01b038616845290915281205482811015610e6a5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016108d6565b610e7733858584036115c8565b5060019392505050565b6001600160a01b038116600090815260096020526040812054610ea3836108f7565b6108429190611f2b565b600061083e3384846116ec565b600033610ec5610dbf565b6001600160a01b031614610eeb5760405162461bcd60e51b81526004016108d690611e06565b6000610ef6846117af565b90508015610f62576001600160a01b038416600081815260126020526040908190204290555184151591907fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf09290610f509085815260200190565b60405180910390a36001915050610842565b5060009392505050565b33610f75610dbf565b6001600160a01b031614610f9b5760405162461bcd60e51b81526004016108d690611e06565b6001600160a01b03821660009081526011602052604090205460ff1615610fc0575050565b7f0000000000000000000000000000000000000000000000000000000000000000811061106f57610ff18282611756565b604051632f0ad01760e21b8152600c60048201526001600160a01b03831660248201526044810182905273773a2e2e9856f807dbbab89b997a5a84645a5c9b9063bc2b405c9060640160006040518083038186803b15801561105257600080fd5b505af4158015611066573d6000803e3d6000fd5b505050506110e5565b61107a826000611756565b60405163131836e760e21b815273773a2e2e9856f807dbbab89b997a5a84645a5c9b90634c60db9c906110b490600c908690600401611e3b565b60006040518083038186803b1580156110cc57600080fd5b505af41580156110e0573d6000803e3d6000fd5b505050505b6110f0826001610eba565b505b5050565b336110ff610dbf565b6001600160a01b0316146111255760405162461bcd60e51b81526004016108d690611e06565b610e10811015801561113a5750620151808111155b6111ba5760405162461bcd60e51b815260206004820152604560248201527f4469766964656e645f547261636b65723a20636c61696d57616974206d75737460448201527f206265207570646174656420746f206265747765656e203120616e6420323420606482015264686f75727360d81b608482015260a4016108d6565b60135481141561122c5760405162461bcd60e51b815260206004820152603760248201527f4469766964656e645f547261636b65723a2043616e6e6f742075706461746520604482015276636c61696d5761697420746f2073616d652076616c756560481b60648201526084016108d6565b60135460405182907f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f90600090a3601355565b33611268610dbf565b6001600160a01b03161461128e5760405162461bcd60e51b81526004016108d690611e06565b6001600160a01b0381166112f35760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108d6565b600b546040516001600160a01b03808416921690600080516020611fe883398151915290600090a3600b80546001600160a01b0319166001600160a01b0392909216919091179055565b600080600080600080600080889750600c73773a2e2e9856f807dbbab89b997a5a84645a5c9b6317e142d190918a6040518363ffffffff1660e01b8152600401611388929190611e3b565b60206040518083038186803b1580156113a057600080fd5b505af41580156113b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d89190611d7f565b965060001995506000871261143a57601054871115611405576010546113fe9088611eec565b955061143a565b601054600c546000911061141a57600061142a565b601054600c5461142a9190611f2b565b90506114368189611e52565b9650505b61144388610e81565b945061144e886108f7565b6001600160a01b038916600090815260126020526040902054909450925082611478576000611485565b6013546114859084611e93565b915042821161149557600061149f565b61149f4283611f2b565b9050919395975091939597565b600c5460009081908190806114cc575050601054600092508291506115c1565b6010546000805a90506000805b89841080156114e757508582105b156115b057846114f681611f7d565b600c549096508610905061150957600094505b6000600c600001868154811061152157611521611fae565b60009182526020808320909101546001600160a01b0316808352601290915260409091205490915061155290611945565b1561157557611562816001610eba565b15611575578161157181611f7d565b9250505b8261157f81611f7d565b93505060005a9050808511156115a7578061159a8688611e93565b6115a49190611f2b565b95505b93506114d99050565b601085905590975095509193505050505b9193909250565b6001600160a01b03831661162a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016108d6565b6001600160a01b03821661168b5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016108d6565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60405162461bcd60e51b815260206004820152602660248201527f4469766964656e645f547261636b65723a204e6f207472616e736665727320616044820152651b1b1bddd95960d21b60648201526084016108d6565b60008082121561175257600080fd5b5090565b600061176183610d3d565b9050808211156117895760006117778284611f2b565b9050611783848261196c565b506110f0565b808210156110f057600061179d8383611f2b565b90506117a984826119cf565b50505050565b6000806117bb83610e81565b9050801561193c576001600160a01b0383166000908152600960205260409020546117e7908290611e93565b6001600160a01b038416600081815260096020526040908190209290925590517fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d906118369084815260200190565b60405180910390a260405163a9059cbb60e01b81526001600160a01b038481166004830152602482018390526000917f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb90604401602060405180830381600087803b1580156118ad57600080fd5b505af11580156118c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e59190611d62565b905080611935576001600160a01b038416600090815260096020526040902054611910908390611f2b565b6001600160a01b03909416600090815260096020526040812094909455509192915050565b5092915050565b50600092915050565b60004282111561195757506000919050565b6013546119648342611f2b565b101592915050565b6119768282611a0d565b61198c816005546119879190611ecd565b611aee565b6001600160a01b0383166000908152600860205260409020546119af9190611eec565b6001600160a01b0390921660009081526008602052604090209190915550565b6119d98282611afe565b6119ea816005546119879190611ecd565b6001600160a01b0383166000908152600860205260409020546119af9190611e52565b6001600160a01b038216611a635760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016108d6565b611a6f600083836110f0565b8060026000828254611a819190611e93565b90915550506001600160a01b03821660009081526020819052604081208054839290611aae908490611e93565b90915550506040518181526001600160a01b038316906000906000805160206120088339815191529060200160405180910390a36110f2600083836110f0565b6000818181121561084257600080fd5b6001600160a01b038216611b5e5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016108d6565b611b6a826000836110f0565b6001600160a01b03821660009081526020819052604090205481811015611bde5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016108d6565b6001600160a01b0383166000908152602081905260408120838303905560028054849290611c0d908490611f2b565b90915550506040518281526000906001600160a01b038516906000805160206120088339815191529060200160405180910390a36110f0836000846110f0565b600060208284031215611c5f57600080fd5b8135611c6a81611fc4565b9392505050565b600060208284031215611c8357600080fd5b8151611c6a81611fc4565b60008060408385031215611ca157600080fd5b8235611cac81611fc4565b91506020830135611cbc81611fd9565b809150509250929050565b60008060408385031215611cda57600080fd5b8235611ce581611fc4565b946020939093013593505050565b60008060408385031215611d0657600080fd5b8235611d1181611fc4565b91506020830135611cbc81611fc4565b600080600060608486031215611d3657600080fd5b8335611d4181611fc4565b92506020840135611d5181611fc4565b929592945050506040919091013590565b600060208284031215611d7457600080fd5b8151611c6a81611fd9565b600060208284031215611d9157600080fd5b5051919050565b600060208284031215611daa57600080fd5b5035919050565b600060208083528351808285015260005b81811015611dde57858101830151858201604001528201611dc2565b81811115611df0576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b9182526001600160a01b0316602082015260400190565b600080821280156001600160ff1b0384900385131615611e7457611e74611f98565b600160ff1b8390038412811615611e8d57611e8d611f98565b50500190565b60008219821115611ea657611ea6611f98565b500190565b600082611ec857634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615611ee757611ee7611f98565b500290565b60008083128015600160ff1b850184121615611f0a57611f0a611f98565b6001600160ff1b0384018313811615611f2557611f25611f98565b50500390565b600082821015611f3d57611f3d611f98565b500390565b600181811c90821680611f5657607f821691505b60208210811415611f7757634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611f9157611f91611f98565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0381168114610b2457600080fd5b8015158114610b2457600080fdfe8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d78454116511a2646970667358221220e619727683e87e09491b1ab38c6aea0f7bf18d3597b1e5c6b12e21b7b87907e164736f6c63430008070033000000000000000000000000c2132d05d31c914a87c6611c10748aeb04b58e8f00000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000035df0d37e3086f0000000000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000005000000000000000000000000a5e0829caced8ffdd4de3c43696c57f7d7a678ff0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf1270000000000000000000000000000000000000000000000000000000000000000d44697620506f6c7920546573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034450540000000000000000000000000000000000000000000000000000000000

Library Used


Deployed ByteCode Sourcemap

15778:11079:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1673:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2587:169;;;;;;;;;;-1:-1:-1;2587:169:0;;;;;:::i;:::-;;:::i;:::-;;;5663:14:1;;5656:22;5638:41;;5626:2;5611:18;2587:169:0;5498:187:1;16495:29:0;;;;;;;;;;-1:-1:-1;16495:29:0;;;;-1:-1:-1;;;;;16495:29:0;;;;;;;;;;:::i;16413:24::-;;;;;;;;;;;;;;;;;;;11578:25:1;;;11566:2;11551:18;16413:24:0;11432:177:1;15836:51:0;;;;;;;;;;;;;;;19574:191;;;;;;;;;;-1:-1:-1;19574:191:0;;;;;:::i;:::-;;:::i;:::-;;1994:108;;;;;;;;;;-1:-1:-1;2082:12:0;;1994:108;;19773:135;;;;;;;;;;-1:-1:-1;19773:135:0;;;;;:::i;:::-;;:::i;2764:480::-;;;;;;;;;;-1:-1:-1;2764:480:0;;;;;:::i;:::-;;:::i;16200:38::-;;;;;;;;;;-1:-1:-1;16200:38:0;;;;-1:-1:-1;;;;;16200:38:0;;;20165:141;;;;;;;;;;;;;:::i;19260:101::-;;;;;;;;;;-1:-1:-1;19343:10:0;;-1:-1:-1;;;19343:10:0;;;;19260:101;;;13420:4:1;13408:17;;;13390:36;;13378:2;13363:18;19260:101:0;13248:184:1;17087:220:0;;;;;;;;;;-1:-1:-1;17087:220:0;;;;;:::i;:::-;;:::i;3252:215::-;;;;;;;;;;-1:-1:-1;3252:215:0;;;;;:::i;:::-;;:::i;17315:217::-;;;;;;;;;;-1:-1:-1;17315:217:0;;;;;:::i;:::-;;:::i;15894:38::-;;;;;;;;;;;;;;;21624:103;;;;;;;;;;;;;:::i;20314:126::-;;;;;;;;;;-1:-1:-1;20314:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;20404:28:0;20380:4;20404:28;;;:19;:28;;;;;;;;;20314:126;16064:33;;;;;;;;;;-1:-1:-1;16064:33:0;;;;-1:-1:-1;;;16064:33:0;;;;;;16032:23;;;;;;;;;;-1:-1:-1;16032:23:0;;;;-1:-1:-1;;;;;16032:23:0;;;21873:142;;;;;;;;;;;;;:::i;20608:139::-;;;;;;;;;;-1:-1:-1;20608:139:0;;;;;:::i;:::-;;:::i;15974:23::-;;;;;;;;;;-1:-1:-1;15974:23:0;;;;-1:-1:-1;;;15974:23:0;;;;;;21345:271;;;;;;;;;;-1:-1:-1;21345:271:0;;;;;:::i;:::-;;:::i;2110:127::-;;;;;;;;;;-1:-1:-1;2110:127:0;;;;;:::i;:::-;;:::i;9680:148::-;;;;;;;;;;;;;:::i;9457:87::-;;;;;;;;;;;;;:::i;1781:104::-;;;;;;;;;;;;;:::i;16379:27::-;;;;;;;;;;;;;;;;19162:90;;;;;;;;;;;;;:::i;16446:40::-;;;;;;;;;;;;;;;;20048:109;;;;;;;;;;;;;:::i;3475:401::-;;;;;;;;;;-1:-1:-1;3475:401:0;;;;;:::i;:::-;;:::i;20448:152::-;;;;;;;;;;-1:-1:-1;20448:152:0;;;;;:::i;:::-;;:::i;2245:175::-;;;;;;;;;;-1:-1:-1;2245:175:0;;;;;:::i;:::-;;:::i;20755:282::-;;;;;;;;;;-1:-1:-1;20755:282:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;4258:32:1;;;4240:51;;4322:2;4307:18;;4300:34;;;;4350:18;;;4343:34;;;;4408:2;4393:18;;4386:34;;;;4451:3;4436:19;;4429:35;4278:3;4480:19;;4473:35;4539:3;4524:19;;4517:35;4583:3;4568:19;;4561:35;4227:3;4212:19;20755:282:0;3901:701:1;16287:46:0;;;;;;;;;;;;;;;;2428:151;;;;;;;;;;-1:-1:-1;2428:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;2544:18:0;;;2517:7;2544:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;2428:151;16533:51;;;;;;;;;;-1:-1:-1;16533:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;16247:33;;;;;;;;;;;;;;;;19369:193;;;;;;;;;;-1:-1:-1;19369:193:0;;;;;:::i;:::-;;:::i;16342:30::-;;;;;;;;;;;;;;;;21735:130;;;;;;;;;;;;;:::i;19916:124::-;;;;;;;;;;-1:-1:-1;19916:124:0;;;;;:::i;:::-;;:::i;21045:292::-;;;;;;;;;;-1:-1:-1;21045:292:0;;;;;:::i;:::-;;:::i;9836:244::-;;;;;;;;;;-1:-1:-1;9836:244:0;;;;;:::i;:::-;;:::i;15941:26::-;;;;;;;;;;-1:-1:-1;15941:26:0;;;;-1:-1:-1;;;;;15941:26:0;;;16004:21;;;;;;;;;;-1:-1:-1;16004:21:0;;;;-1:-1:-1;;;;;16004:21:0;;;1673:100;1727:13;1760:5;1753:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1673:100;:::o;2587:169::-;2670:4;2687:39;906:10;2710:7;2719:6;2687:8;:39::i;:::-;-1:-1:-1;2744:4:0;2587:169;;;;:::o;19574:191::-;906:10;9592:7;:5;:7::i;:::-;-1:-1:-1;;;;;9592:23:0;;9584:68;;;;-1:-1:-1;;;9584:68:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;19650:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;::::1;;19642:68;;;::::0;-1:-1:-1;;;19642:68:0;;9291:2:1;19642:68:0::1;::::0;::::1;9273:21:1::0;9330:2;9310:18;;;9303:30;-1:-1:-1;;;9349:18:1;;;9342:57;9416:18;;19642:68:0::1;9089:351:1::0;19642:68:0::1;-1:-1:-1::0;;;;;19721:28:0::1;19752:5;19721:28:::0;;;:19:::1;:28;::::0;;;;:36;;-1:-1:-1;;19721:36:0::1;::::0;;19574:191::o;19773:135::-;906:10;9592:7;:5;:7::i;:::-;-1:-1:-1;;;;;9592:23:0;;9584:68;;;;-1:-1:-1;;;9584:68:0;;;;;;;:::i;:::-;19855:15:::1;::::0;:45:::1;::::0;-1:-1:-1;;;19855:45:0;;-1:-1:-1;;;;;19855:15:0;;::::1;::::0;:36:::1;::::0;:45:::1;::::0;19892:7;;19855:45:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;19773:135:::0;:::o;2764:480::-;2904:4;2921:36;2931:6;2939:9;2950:6;2921:9;:36::i;:::-;-1:-1:-1;;;;;2997:19:0;;2970:24;2997:19;;;:11;:19;;;;;;;;906:10;2997:33;;;;;;;;3049:26;;;;3041:79;;;;-1:-1:-1;;;3041:79:0;;9647:2:1;3041:79:0;;;9629:21:1;9686:2;9666:18;;;9659:30;9725:34;9705:18;;;9698:62;-1:-1:-1;;;9776:18:1;;;9769:38;9824:19;;3041:79:0;9445:404:1;3041:79:0;3148:57;3157:6;906:10;3198:6;3179:16;:25;3148:8;:57::i;:::-;-1:-1:-1;3232:4:0;;2764:480;-1:-1:-1;;;;2764:480:0:o;20165:141::-;20255:15;;:43;;;-1:-1:-1;;;20255:43:0;;;;20228:7;;-1:-1:-1;;;;;20255:15:0;;:41;;:43;;;;;;;;;;;;;;:15;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20248:50;;20165:141;:::o;17087:220::-;906:10;9592:7;:5;:7::i;:::-;-1:-1:-1;;;;;9592:23:0;;9584:68;;;;-1:-1:-1;;;9584:68:0;;;;;;;:::i;:::-;17194:2:::1;17183:7;:13;;17159:59;;;;-1:-1:-1::0;;;17159:59:0::1;;;;;;;:::i;:::-;17229:12;:22:::0;;;17284:15:::1;::::0;17274:25:::1;::::0;17244:7;17274:25:::1;:::i;:::-;17262:9;:37:::0;-1:-1:-1;17087:220:0:o;3252:215::-;906:10;3340:4;3389:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;3389:34:0;;;;;;;;;;3340:4;;3357:80;;3380:7;;3389:47;;3426:10;;3389:47;:::i;:::-;3357:8;:80::i;17315:217::-;906:10;9592:7;:5;:7::i;:::-;-1:-1:-1;;;;;9592:23:0;;9584:68;;;;-1:-1:-1;;;9584:68:0;;;;;;;:::i;:::-;17419:2:::1;17408:7;:13;;17384:59;;;;-1:-1:-1::0;;;17384:59:0::1;;;;;;;:::i;:::-;17454:15;:25:::0;;;17512:12:::1;::::0;17502:22:::1;::::0;17472:7;17502:22:::1;:::i;21624:103::-:0;21661:15;;:58;;-1:-1:-1;;;21661:58:0;;21700:10;21661:58;;;3485:51:1;21661:15:0;3552:18:1;;;3545:50;-1:-1:-1;;;;;21661:15:0;;;;:30;;3458:18:1;;21661:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;21624:103::o;21873:142::-;21966:15;;:41;;;-1:-1:-1;;;21966:41:0;;;;21939:7;;-1:-1:-1;;;;;21966:15:0;;:39;;:41;;;;;;;;;;;;;;:15;:41;;;;;;;;;;20608:139;20705:15;;:34;;-1:-1:-1;;;20705:34:0;;20678:7;;-1:-1:-1;;;;;20705:15:0;;:25;;:34;;20731:7;;20705:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20698:41;20608:139;-1:-1:-1;;20608:139:0:o;21345:271::-;21477:15;;:28;;-1:-1:-1;;;;;;21477:28:0;;;;;11578:25:1;;;21411:18:0;;;;;;-1:-1:-1;;;;;21477:15:0;;:23;;11551:18:1;;21477:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21410:95;;;;;;21598:9;-1:-1:-1;;;;;21521:87:0;21586:5;21521:87;;-1:-1:-1;;;;;;;;;;;21546:10:0;21558:6;21566:18;21593:3;21521:87;;;;;;;;;:::i;:::-;;;;;;;;21399:217;;;21345:271;:::o;2110:127::-;-1:-1:-1;;;;;2211:18:0;2184:7;2211:18;;;;;;;;;;;;2110:127::o;9680:148::-;906:10;9592:7;:5;:7::i;:::-;-1:-1:-1;;;;;9592:23:0;;9584:68;;;;-1:-1:-1;;;9584:68:0;;;;;;;:::i;:::-;9771:6:::1;::::0;9750:40:::1;::::0;9787:1:::1;::::0;-1:-1:-1;;;;;9771:6:0::1;::::0;-1:-1:-1;;;;;;;;;;;9750:40:0;9787:1;;9750:40:::1;9801:6;:19:::0;;-1:-1:-1;;;;;;9801:19:0::1;::::0;;9680:148::o;9457:87::-;9530:6;;-1:-1:-1;;;;;9530:6:0;;9457:87::o;1781:104::-;1837:13;1870:7;1863:14;;;;;:::i;19162:90::-;19234:8;;-1:-1:-1;;;;;19234:8:0;;19162:90::o;20048:109::-;20122:15;;:27;;;-1:-1:-1;;;20122:27:0;;;;20095:7;;-1:-1:-1;;;;;20122:15:0;;:25;;:27;;;;;;;;;;;;;;:15;:27;;;;;;;;;;3475:401;906:10;3568:4;3612:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;3612:34:0;;;;;;;;;;3665:35;;;;3657:85;;;;-1:-1:-1;;;3657:85:0;;11228:2:1;3657:85:0;;;11210:21:1;11267:2;11247:18;;;11240:30;11306:34;11286:18;;;11279:62;-1:-1:-1;;;11357:18:1;;;11350:35;11402:19;;3657:85:0;11026:401:1;3657:85:0;3770:67;906:10;3793:7;3821:15;3802:16;:34;3770:8;:67::i;:::-;-1:-1:-1;3864:4:0;;3475:401;-1:-1:-1;;;3475:401:0:o;20448:152::-;20545:15;;:47;;-1:-1:-1;;;20545:47:0;;20518:7;;-1:-1:-1;;;;;20545:15:0;;:38;;:47;;20584:7;;20545:47;;;:::i;2245:175::-;2331:4;2348:42;906:10;2372:9;2383:6;2348:9;:42::i;20755:282::-;20994:15;;:35;;-1:-1:-1;;;20994:35:0;;20843:7;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20994:15:0;;;;:26;;:35;;21021:7;;20994:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20987:42;;;;;;;;;;;;;;;;20755:282;;;;;;;;;:::o;19369:193::-;906:10;9592:7;:5;:7::i;:::-;-1:-1:-1;;;;;9592:23:0;;9584:68;;;;-1:-1:-1;;;9584:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19448:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;::::1;;19447:29;19439:69;;;::::0;-1:-1:-1;;;19439:69:0;;8528:2:1;19439:69:0::1;::::0;::::1;8510:21:1::0;8567:2;8547:18;;;8540:30;-1:-1:-1;;;8586:18:1;;;8579:57;8653:18;;19439:69:0::1;8326:351:1::0;19439:69:0::1;-1:-1:-1::0;;;;;19519:28:0::1;;::::0;;;:19:::1;:28;::::0;;;;:35;;-1:-1:-1;;19519:35:0::1;19550:4;19519:35;::::0;;19369:193::o;21735:130::-;21818:15;;:39;;;-1:-1:-1;;;21818:39:0;;;;21791:7;;-1:-1:-1;;;;;21818:15:0;;:37;;:39;;;;;;;;;;;;;;:15;:39;;;;;;;;;;19916:124;906:10;9592:7;:5;:7::i;:::-;-1:-1:-1;;;;;9592:23:0;;9584:68;;;;-1:-1:-1;;;9584:68:0;;;;;;;:::i;:::-;19990:15:::1;::::0;:42:::1;::::0;-1:-1:-1;;;19990:42:0;;::::1;::::0;::::1;11578:25:1::0;;;-1:-1:-1;;;;;19990:15:0;;::::1;::::0;:31:::1;::::0;11551:18:1;;19990:42:0::1;11432:177:1::0;21045:292:0;21289:15;;:40;;-1:-1:-1;;;21289:40:0;;;;;11578:25:1;;;21138:7:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21289:15:0;;;;:33;;11551:18:1;;21289:40:0;11432:177:1;9836:244:0;906:10;9592:7;:5;:7::i;:::-;-1:-1:-1;;;;;9592:23:0;;9584:68;;;;-1:-1:-1;;;9584:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;9925:22:0;::::1;9917:73;;;::::0;-1:-1:-1;;;9917:73:0;;7718:2:1;9917:73:0::1;::::0;::::1;7700:21:1::0;7757:2;7737:18;;;7730:30;7796:34;7776:18;;;7769:62;-1:-1:-1;;;7847:18:1;;;7840:36;7893:19;;9917:73:0::1;7516:402:1::0;9917:73:0::1;10027:6;::::0;10006:38:::1;::::0;-1:-1:-1;;;;;10006:38:0;;::::1;::::0;10027:6:::1;::::0;-1:-1:-1;;;;;;;;;;;10006:38:0;10027:6:::1;::::0;10006:38:::1;10055:6;:17:::0;;-1:-1:-1;;;;;;10055:17:0::1;-1:-1:-1::0;;;;;10055:17:0;;;::::1;::::0;;;::::1;::::0;;9836:244::o;5607:380::-;-1:-1:-1;;;;;5743:19:0;;5735:68;;;;-1:-1:-1;;;5735:68:0;;10823:2:1;5735:68:0;;;10805:21:1;10862:2;10842:18;;;10835:30;10901:34;10881:18;;;10874:62;-1:-1:-1;;;10952:18:1;;;10945:34;10996:19;;5735:68:0;10621:400:1;5735:68:0;-1:-1:-1;;;;;5822:21:0;;5814:68;;;;-1:-1:-1;;;5814:68:0;;8125:2:1;5814:68:0;;;8107:21:1;8164:2;8144:18;;;8137:30;8203:34;8183:18;;;8176:62;-1:-1:-1;;;8254:18:1;;;8247:32;8296:19;;5814:68:0;7923:398:1;5814:68:0;-1:-1:-1;;;;;5895:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;5947:32;;11578:25:1;;;5947:32:0;;11551:18:1;5947:32:0;;;;;;;5607:380;;;:::o;22023:1753::-;-1:-1:-1;;;;;22155:18:0;;22147:68;;;;-1:-1:-1;;;22147:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22234:16:0;;22226:64;;;;-1:-1:-1;;;22226:64:0;;;;;;;:::i;:::-;22307:11;22303:93;;22335:28;22351:4;22357:2;22361:1;22335:15;:28::i;:::-;22023:1753;;;:::o;22303:93::-;22406:28;22437:24;22455:4;22437:9;:24::i;:::-;22511:18;;22406:55;;-1:-1:-1;22487:42:0;;;;;;;22546:20;;-1:-1:-1;22558:8:0;;-1:-1:-1;;;22558:8:0;;;;22557:9;22546:20;:43;;;;;22576:13;-1:-1:-1;;;;;22570:19:0;:2;-1:-1:-1;;;;;22570:19:0;;22546:43;22542:305;;;22606:8;:15;;-1:-1:-1;;;;22606:15:0;-1:-1:-1;;;22606:15:0;;;22697:9;;22681:12;;22606:15;;22697:9;22658:35;;:20;:35;:::i;:::-;22657:49;;;;:::i;:::-;22636:70;;22723:26;22738:10;22723:14;:26::i;:::-;22764:40;22785:18;;22764:20;:40::i;:::-;-1:-1:-1;22819:8:0;:16;;-1:-1:-1;;;;22819:16:0;;;22542:305;22875:8;;-1:-1:-1;;;;;22900:25:0;;22859:12;22900:25;;;:19;:25;;;;;;22875:8;-1:-1:-1;;;22875:8:0;;;;;22874:9;;22900:25;;:52;;-1:-1:-1;;;;;;22929:23:0;;;;;;:19;:23;;;;;;;;22900:52;22896:100;;;-1:-1:-1;22979:5:0;22896:100;23012:7;23008:179;;;23036:12;23074:3;23061:9;;23052:6;:18;;;;:::i;:::-;23051:26;;;;:::i;:::-;23036:41;-1:-1:-1;23103:13:0;23036:41;23103:6;:13;:::i;:::-;23094:22;;23133:42;23149:4;23163;23170;23133:15;:42::i;:::-;23021:166;23008:179;23199:33;23215:4;23221:2;23225:6;23199:15;:33::i;:::-;23249:15;;-1:-1:-1;;;;;23249:15:0;:26;23284:4;23291:15;23284:4;23291:9;:15::i;:::-;23249:58;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23245:74;23333:15;;-1:-1:-1;;;;;23333:15:0;:26;23368:2;23373:13;23368:2;23373:9;:13::i;:::-;23333:54;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23329:70;23416:8;;-1:-1:-1;;;23416:8:0;;;;23411:358;;23455:16;;23492:15;;:28;;-1:-1:-1;;;;;;23492:28:0;;;;;11578:25:1;;;-1:-1:-1;;;;;23492:15:0;;;;:23;;11551:18:1;;23492:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23492:28:0;;;;;;;;-1:-1:-1;;23492:28:0;;;;;;;;;;;;:::i;:::-;;;23488:270;;;;;23618:86;;23694:9;;23683:4;;-1:-1:-1;;;;;;;;;;;23618:86:0;;;23643:10;;23655:6;;23663:18;;23689:3;;23618:86;:::i;:::-;;;;;;;;23521:199;;;23488:270;23426:343;23411:358;22136:1640;;;22023:1753;;;:::o;3884:721::-;-1:-1:-1;;;;;4024:20:0;;4016:70;;;;-1:-1:-1;;;4016:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;4105:23:0;;4097:71;;;;-1:-1:-1;;;4097:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;4265:17:0;;4241:21;4265:17;;;;;;;;;;;4301:23;;;;4293:74;;;;-1:-1:-1;;;4293:74:0;;8884:2:1;4293:74:0;;;8866:21:1;8923:2;8903:18;;;8896:30;8962:34;8942:18;;;8935:62;-1:-1:-1;;;9013:18:1;;;9006:36;9059:19;;4293:74:0;8682:402:1;4293:74:0;-1:-1:-1;;;;;4395:17:0;;;:9;:17;;;;;;;;;;;4415:22;;;4395:42;;4455:20;;;;;;;;:30;;4431:6;;4395:9;4455:30;;4431:6;;4455:30;:::i;:::-;;;;;;;;4520:9;-1:-1:-1;;;;;4503:35:0;4512:6;-1:-1:-1;;;;;4503:35:0;;4531:6;4503:35;;;;11578:25:1;;11566:2;11551:18;;11432:177;23784:342:0;23843:12;23858:10;23867:1;23858:6;:10;:::i;:::-;23843:25;-1:-1:-1;23879:17:0;23899:13;23843:25;23899:6;:13;:::i;:::-;23879:33;-1:-1:-1;23948:21:0;23980:22;23997:4;23980:16;:22::i;:::-;24013:18;24034:38;24058:14;24034:21;:38;:::i;:::-;24013:59;;24083:35;24096:9;24107:10;24083:12;:35::i;26415:437::-;26480:42;26500:6;26516:4;26480:19;:42::i;:::-;26560:11;;26553:44;;-1:-1:-1;;;26553:44:0;;26533:17;;-1:-1:-1;;;;;26560:11:0;;26553:29;;:44;;26591:4;;26553:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26630:11;;26660:15;;26623:65;;-1:-1:-1;;;26623:65:0;;26533:64;;-1:-1:-1;26608:12:0;;-1:-1:-1;;;;;26630:11:0;;;;26623:28;;:65;;26660:15;;;26533:64;;26623:65;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26608:80;;26705:7;26701:144;;;26729:15;;:52;;-1:-1:-1;;;26729:52:0;;;;;11578:25:1;;;-1:-1:-1;;;;;26729:15:0;;;;:41;;11551:18:1;;26729:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;26801:32:0;;;12773:25:1;;;12829:2;12814:18;;12807:34;;;26801:32:0;;-1:-1:-1;12746:18:1;;-1:-1:-1;26801:32:0;;;;;;;26469:383;;26415:437;:::o;24134:462::-;24224:16;;;24238:1;24224:16;;;;;;;;24200:21;;24224:16;;;;;;;;;;-1:-1:-1;24224:16:0;24200:40;;24269:4;24251;24256:1;24251:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;24251:23:0;;;-1:-1:-1;;;;;24251:23:0;;;;;24295:13;:11;:13::i;:::-;24285:4;24290:1;24285:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;24285:23:0;;;-1:-1:-1;;;;;24285:23:0;;;;;24319:62;24336:4;24351:15;24369:11;24319:8;:62::i;:::-;24392:196;;-1:-1:-1;;;24392:196:0;;-1:-1:-1;;;;;24392:15:0;:66;;;;:196;;24473:11;;24499:1;;24515:4;;24542;;24562:15;;24392:196;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25135:1272;25283:62;25300:4;25315:15;25333:11;25283:8;:62::i;:::-;25599:4;;25394:250;;-1:-1:-1;;;25394:250:0;;-1:-1:-1;;;;;25394:15:0;:31;;;;;25434:9;;25394:250;;25467:4;;25487:11;;25513:1;;;;25599:4;;;25618:15;;25394:250;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25394:250:0;;;;;;;;-1:-1:-1;;25394:250:0;;;;;;;;;;;;:::i;:::-;;;25390:1008;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25937:4:0;;25711:279;;-1:-1:-1;;;25711:279:0;;-1:-1:-1;;;;;25711:15:0;:32;;;;;25752:9;;25711:279;;25789:4;;25813:11;;25843:1;;;;25937:4;;;25960:15;;25711:279;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25711:279:0;;;;;;;;-1:-1:-1;;25711:279:0;;;;;;;;;;;;:::i;:::-;;;25707:680;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26310:4:0;;26065:306;;-1:-1:-1;;;26065:306:0;;-1:-1:-1;;;;;26065:15:0;:31;;;;;26105:9;;26065:306;;26146:4;;26174:11;;26208:1;;;;26310:4;;;26337:15;;26065:306;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;24606:521::-;24718:16;;;24732:1;24718:16;;;;;;;;;24694:21;;24718:16;;;;;;;;;;-1:-1:-1;24718:16:0;24694:40;;24763:4;24745;24750:1;24745:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;24745:23:0;;;-1:-1:-1;;;;;24745:23:0;;;;;24789:13;:11;:13::i;:::-;24779:4;24784:1;24779:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;24779:23:0;;;:7;;;;;;;;;:23;24823:11;;24813:7;;24823:11;;;24813:4;;24818:1;;24813:7;;;;;;:::i;:::-;;;;;;:21;-1:-1:-1;;;;;24813:21:0;;;-1:-1:-1;;;;;24813:21:0;;;;;24847:62;24864:4;24879:15;24897:11;24847:8;:62::i;:::-;24922:195;;-1:-1:-1;;;24922:195:0;;-1:-1:-1;;;;;24922:15:0;:69;;;;:195;;25006:11;;25032:1;;25048:4;;25067:9;;25091:15;;24922:195;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:247:1;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;181:9;168:23;200:31;225:5;200:31;:::i;:::-;250:5;14:247;-1:-1:-1;;;14:247:1:o;266:388::-;334:6;342;395:2;383:9;374:7;370:23;366:32;363:52;;;411:1;408;401:12;363:52;450:9;437:23;469:31;494:5;469:31;:::i;:::-;519:5;-1:-1:-1;576:2:1;561:18;;548:32;589:33;548:32;589:33;:::i;:::-;641:7;631:17;;;266:388;;;;;:::o;659:456::-;736:6;744;752;805:2;793:9;784:7;780:23;776:32;773:52;;;821:1;818;811:12;773:52;860:9;847:23;879:31;904:5;879:31;:::i;:::-;929:5;-1:-1:-1;986:2:1;971:18;;958:32;999:33;958:32;999:33;:::i;:::-;659:456;;1051:7;;-1:-1:-1;;;1105:2:1;1090:18;;;;1077:32;;659:456::o;1120:681::-;1251:6;1259;1267;1275;1283;1291;1299;1307;1360:3;1348:9;1339:7;1335:23;1331:33;1328:53;;;1377:1;1374;1367:12;1328:53;1409:9;1403:16;1428:31;1453:5;1428:31;:::i;:::-;1478:5;1468:15;;;1523:2;1512:9;1508:18;1502:25;1492:35;;1567:2;1556:9;1552:18;1546:25;1536:35;;1611:2;1600:9;1596:18;1590:25;1580:35;;1655:3;1644:9;1640:19;1634:26;1624:36;;1700:3;1689:9;1685:19;1679:26;1669:36;;1745:3;1734:9;1730:19;1724:26;1714:36;;1790:3;1779:9;1775:19;1769:26;1759:36;;1120:681;;;;;;;;;;;:::o;1806:315::-;1874:6;1882;1935:2;1923:9;1914:7;1910:23;1906:32;1903:52;;;1951:1;1948;1941:12;1903:52;1990:9;1977:23;2009:31;2034:5;2009:31;:::i;:::-;2059:5;2111:2;2096:18;;;;2083:32;;-1:-1:-1;;;1806:315:1:o;2126:277::-;2193:6;2246:2;2234:9;2225:7;2221:23;2217:32;2214:52;;;2262:1;2259;2252:12;2214:52;2294:9;2288:16;2347:5;2340:13;2333:21;2326:5;2323:32;2313:60;;2369:1;2366;2359:12;2408:180;2467:6;2520:2;2508:9;2499:7;2495:23;2491:32;2488:52;;;2536:1;2533;2526:12;2488:52;-1:-1:-1;2559:23:1;;2408:180;-1:-1:-1;2408:180:1:o;2593:184::-;2663:6;2716:2;2704:9;2695:7;2691:23;2687:32;2684:52;;;2732:1;2729;2722:12;2684:52;-1:-1:-1;2755:16:1;;2593:184;-1:-1:-1;2593:184:1:o;2782:306::-;2870:6;2878;2886;2939:2;2927:9;2918:7;2914:23;2910:32;2907:52;;;2955:1;2952;2945:12;2907:52;2984:9;2978:16;2968:26;;3034:2;3023:9;3019:18;3013:25;3003:35;;3078:2;3067:9;3063:18;3057:25;3047:35;;2782:306;;;;;:::o;3093:203::-;-1:-1:-1;;;;;3257:32:1;;;;3239:51;;3227:2;3212:18;;3093:203::o;3606:290::-;-1:-1:-1;;;;;3814:32:1;;;;3796:51;;3878:2;3863:18;;3856:34;3784:2;3769:18;;3606:290::o;4886:607::-;-1:-1:-1;;;;;5245:15:1;;;5227:34;;5292:2;5277:18;;5270:34;;;;5335:2;5320:18;;5313:34;;;;5378:2;5363:18;;5356:34;;;;5427:15;;;5421:3;5406:19;;5399:44;5207:3;5459:19;;5452:35;;;;5176:3;5161:19;;4886:607::o;6164:597::-;6276:4;6305:2;6334;6323:9;6316:21;6366:6;6360:13;6409:6;6404:2;6393:9;6389:18;6382:34;6434:1;6444:140;6458:6;6455:1;6452:13;6444:140;;;6553:14;;;6549:23;;6543:30;6519:17;;;6538:2;6515:26;6508:66;6473:10;;6444:140;;;6602:6;6599:1;6596:13;6593:91;;;6672:1;6667:2;6658:6;6647:9;6643:22;6639:31;6632:42;6593:91;-1:-1:-1;6745:2:1;6724:15;-1:-1:-1;;6720:29:1;6705:45;;;;6752:2;6701:54;;6164:597;-1:-1:-1;;;6164:597:1:o;6766:399::-;6968:2;6950:21;;;7007:2;6987:18;;;6980:30;7046:34;7041:2;7026:18;;7019:62;-1:-1:-1;;;7112:2:1;7097:18;;7090:33;7155:3;7140:19;;6766:399::o;7170:341::-;7372:2;7354:21;;;7411:2;7391:18;;;7384:30;-1:-1:-1;;;7445:2:1;7430:18;;7423:47;7502:2;7487:18;;7170:341::o;9854:356::-;10056:2;10038:21;;;10075:18;;;10068:30;10134:34;10129:2;10114:18;;10107:62;10201:2;10186:18;;9854:356::o;10215:401::-;10417:2;10399:21;;;10456:2;10436:18;;;10429:30;10495:34;10490:2;10475:18;;10468:62;-1:-1:-1;;;10561:2:1;10546:18;;10539:35;10606:3;10591:19;;10215:401::o;11614:980::-;11876:4;11924:3;11913:9;11909:19;11955:6;11944:9;11937:25;11981:2;12019:6;12014:2;12003:9;11999:18;11992:34;12062:3;12057:2;12046:9;12042:18;12035:31;12086:6;12121;12115:13;12152:6;12144;12137:22;12190:3;12179:9;12175:19;12168:26;;12229:2;12221:6;12217:15;12203:29;;12250:1;12260:195;12274:6;12271:1;12268:13;12260:195;;;12339:13;;-1:-1:-1;;;;;12335:39:1;12323:52;;12430:15;;;;12395:12;;;;12371:1;12289:9;12260:195;;;-1:-1:-1;;;;;;;12511:32:1;;;;12506:2;12491:18;;12484:60;-1:-1:-1;;;12575:3:1;12560:19;12553:35;12472:3;11614:980;-1:-1:-1;;;11614:980:1:o;12852:391::-;13083:25;;;13139:2;13124:18;;13117:34;;;;13182:2;13167:18;;13160:34;13225:2;13210:18;;13203:34;13070:3;13055:19;;12852:391::o;13437:128::-;13477:3;13508:1;13504:6;13501:1;13498:13;13495:39;;;13514:18;;:::i;:::-;-1:-1:-1;13550:9:1;;13437:128::o;13570:217::-;13610:1;13636;13626:132;;13680:10;13675:3;13671:20;13668:1;13661:31;13715:4;13712:1;13705:15;13743:4;13740:1;13733:15;13626:132;-1:-1:-1;13772:9:1;;13570:217::o;13792:168::-;13832:7;13898:1;13894;13890:6;13886:14;13883:1;13880:21;13875:1;13868:9;13861:17;13857:45;13854:71;;;13905:18;;:::i;:::-;-1:-1:-1;13945:9:1;;13792:168::o;13965:125::-;14005:4;14033:1;14030;14027:8;14024:34;;;14038:18;;:::i;:::-;-1:-1:-1;14075:9:1;;13965:125::o;14095:380::-;14174:1;14170:12;;;;14217;;;14238:61;;14292:4;14284:6;14280:17;14270:27;;14238:61;14345:2;14337:6;14334:14;14314:18;14311:38;14308:161;;;14391:10;14386:3;14382:20;14379:1;14372:31;14426:4;14423:1;14416:15;14454:4;14451:1;14444:15;14308:161;;14095:380;;;:::o;14480:127::-;14541:10;14536:3;14532:20;14529:1;14522:31;14572:4;14569:1;14562:15;14596:4;14593:1;14586:15;14612:127;14673:10;14668:3;14664:20;14661:1;14654:31;14704:4;14701:1;14694:15;14728:4;14725:1;14718:15;14876:131;-1:-1:-1;;;;;14951:31:1;;14941:42;;14931:70;;14997:1;14994;14987:12

Swarm Source

ipfs://e619727683e87e09491b1ab38c6aea0f7bf18d3597b1e5c6b12e21b7b87907e1
Loading