ETH Price: $3,065.07 (+3.24%)
Gas: 11 Gwei

Token

AmplifiedFlow (AMF)
 

Overview

Max Total Supply

3,805,466,172.707176135608909938 AMF

Holders

144

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
354,365.937638806454449958 AMF

Value
$0.00
0xbb0d28a67cb017aae187036eefd11e5e54742226
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
AmplifiedFlow

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-03-30
*/

// www.amplifiedflow.com
// app.amplifiedflow.com
// @AmplifiedFlow
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.15;

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

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

    function getPair(
        address tokenA,
        address tokenB
    ) external view returns (address pair);
}

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

    function WETH() external pure returns (address);

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

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable;

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

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

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

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

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

    function withdrawDividend() external;

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

interface DividendPayingTokenOptionalInterface {
    function withdrawableDividendOf(
        address _owner
    ) external view returns (uint256);

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

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

library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

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

        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

library SafeMathInt {
    int256 private constant MIN_INT256 = int256(1) << 255;
    int256 private constant MAX_INT256 = ~(int256(1) << 255);

    function mul(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a * b;

        // Detect overflow when multiplying MIN_INT256 with -1
        require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256));
        require((b == 0) || (c / b == a));
        return c;
    }

    function div(int256 a, int256 b) internal pure returns (int256) {
        // Prevent overflow when dividing MIN_INT256 by -1
        require(b != -1 || a != MIN_INT256);

        // Solidity already throws when dividing by 0.
        return a / b;
    }

    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require((b >= 0 && c <= a) || (b < 0 && c > a));
        return c;
    }

    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        require((b >= 0 && c >= a) || (b < 0 && c < a));
        return c;
    }

    function abs(int256 a) internal pure returns (int256) {
        require(a != MIN_INT256);
        return a < 0 ? -a : a;
    }

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

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

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 Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

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

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

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

    uint256 private _totalSupply;
    string private _name;
    string private _symbol;

    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);
        _approve(
            sender,
            _msgSender(),
            _allowances[sender][_msgSender()].sub(
                amount,
                "ERC20: transfer amount exceeds allowance"
            )
        );
        return true;
    }

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

    function decreaseAllowance(
        address spender,
        uint256 subtractedValue
    ) public virtual returns (bool) {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender].sub(
                subtractedValue,
                "ERC20: decreased allowance below zero"
            )
        );
        return true;
    }

    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");
        _beforeTokenTransfer(sender, recipient, amount);
        _balances[sender] = _balances[sender].sub(
            amount,
            "ERC20: transfer amount exceeds balance"
        );
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");
        _beforeTokenTransfer(address(0), account, amount);
        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");
        _beforeTokenTransfer(account, address(0), amount);
        _balances[account] = _balances[account].sub(
            amount,
            "ERC20: burn amount exceeds balance"
        );
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

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

contract DividendPayingToken is
    ERC20,
    Ownable,
    DividendPayingTokenInterface,
    DividendPayingTokenOptionalInterface
{
    using SafeMath for uint256;
    using SafeMathUint for uint256;
    using SafeMathInt for int256;

    uint256 internal constant magnitude = 2 ** 128;
    uint256 internal magnifiedDividendPerShare;
    uint256 public totalDividendsDistributed;
    address public rewardToken;
    IRouter public uniswapV2Router;

    mapping(address => int256) internal magnifiedDividendCorrections;
    mapping(address => uint256) internal withdrawnDividends;

    constructor(
        string memory _name,
        string memory _symbol
    ) ERC20(_name, _symbol) {}

    receive() external payable {}

    function distributeDividendsUsingAmount(uint256 amount) public onlyOwner {
        require(totalSupply() > 0);
        if (amount > 0) {
            magnifiedDividendPerShare = magnifiedDividendPerShare.add(
                (amount).mul(magnitude) / totalSupply()
            );
            emit DividendsDistributed(msg.sender, amount);
            totalDividendsDistributed = totalDividendsDistributed.add(amount);
        }
    }

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

    function _withdrawDividendOfUser(
        address payable user
    ) internal returns (uint256) {
        uint256 _withdrawableDividend = withdrawableDividendOf(user);
        if (_withdrawableDividend > 0) {
            withdrawnDividends[user] = withdrawnDividends[user].add(
                _withdrawableDividend
            );
            emit DividendWithdrawn(user, _withdrawableDividend);
            bool success = IERC20(rewardToken).transfer(
                user,
                _withdrawableDividend
            );
            if (!success) {
                withdrawnDividends[user] = withdrawnDividends[user].sub(
                    _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).sub(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
                .mul(balanceOf(_owner))
                .toInt256Safe()
                .add(magnifiedDividendCorrections[_owner])
                .toUint256Safe() / magnitude;
    }

    function _transfer(
        address from,
        address to,
        uint256 value
    ) internal virtual override {
        require(false);
        int256 _magCorrection = magnifiedDividendPerShare
            .mul(value)
            .toInt256Safe();
        magnifiedDividendCorrections[from] = magnifiedDividendCorrections[from]
            .add(_magCorrection);
        magnifiedDividendCorrections[to] = magnifiedDividendCorrections[to].sub(
            _magCorrection
        );
    }

    function _mint(address account, uint256 value) internal override {
        super._mint(account, value);
        magnifiedDividendCorrections[account] = magnifiedDividendCorrections[
            account
        ].sub((magnifiedDividendPerShare.mul(value)).toInt256Safe());
    }

    function _burn(address account, uint256 value) internal override {
        super._burn(account, value);
        magnifiedDividendCorrections[account] = magnifiedDividendCorrections[
            account
        ].add((magnifiedDividendPerShare.mul(value)).toInt256Safe());
    }

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

    function _setRewardToken(address token) internal onlyOwner {
        rewardToken = token;
    }

    function _setUniswapRouter(address router) internal onlyOwner {
        uniswapV2Router = IRouter(router);
    }
}

contract AmplifiedFlow is Ownable, ERC20 {
    IRouter public uniswapV2Router;
    address public immutable uniswapV2Pair;

    string private constant _name = "AmplifiedFlow";
    string private constant _symbol = "AMF";
    uint8 private constant _decimals = 18;

    TokenDividendTracker public dividendTracker;

    bool public isTradingEnabled;

    // maxSupply
    uint256 constant maxSupply = 5000000000 * (10 ** 18);

    uint256 public maxWalletAmount = (maxSupply * 250) / 10000;

    uint256 public maxTxAmount = (maxSupply * 200) / 10000;

    bool private _swapping;
    uint256 public minimumTokensBeforeSwap = (maxSupply * 3) / 10000;

    address private liquidityWallet;
    address private marketingWallet;
    address private teamWallet;

    struct CustomTaxPeriod {
        bytes23 periodName;
        uint8 blocksInPeriod;
        uint256 timeInPeriod;
        uint8 liquidityFeeOnBuy;
        uint8 liquidityFeeOnSell;
        uint8 marketingFeeOnBuy;
        uint8 marketingFeeOnSell;
        uint8 buyBackFeeOnBuy;
        uint8 buyBackFeeOnSell;
        uint8 burnFeeOnBuy;
        uint8 burnFeeOnSell;
        uint8 holdersFeeOnBuy;
        uint8 holdersFeeOnSell;
    }

    // Base taxes
    CustomTaxPeriod private _base =
        CustomTaxPeriod("base", 0, 0, 0, 1, 2, 1, 0, 1, 0, 1, 2, 1);

    mapping(address => bool) private _isAllowedToTradeWhenDisabled;
    mapping(address => bool) private _isExcludedFromFee;
    mapping(address => bool) private _isExcludedFromMaxTransactionLimit;
    mapping(address => bool) private _isExcludedFromMaxWalletLimit;
    mapping(address => bool) public automatedMarketMakerPairs;
    mapping(address => uint256) public _dividendUserTime;
    address public _dividendUser;

    uint8 private _liquidityFee;
    uint8 private _marketingFee;
    uint8 private _buyBackFee;
    uint8 private _burnFee;
    uint8 private _holdersFee;
    uint8 private _totalFee;

    event AutomatedMarketMakerPairChange(
        address indexed pair,
        bool indexed value
    );
    event UniswapV2RouterChange(
        address indexed newAddress,
        address indexed oldAddress
    );
    event StructureChange(
        string indexed indentifier,
        address indexed newWallet,
        address indexed oldWallet
    );
    event FeeChange(
        string indexed identifier,
        uint8 liquidityFee,
        uint8 marketingFee,
        uint8 buyBackFee,
        uint8 burnFee,
        uint8 holdersFee
    );
    event CustomTaxPeriodChange(
        uint256 indexed newValue,
        uint256 indexed oldValue,
        string indexed taxType,
        bytes23 period
    );
    event MaxTransactionAmountChange(
        uint256 indexed newValue,
        uint256 indexed oldValue
    );
    event MaxWalletAmountChange(
        uint256 indexed newValue,
        uint256 indexed oldValue
    );
    event ExcludeFromFeesChange(address indexed account, bool isExcluded);
    event ExcludeFromMaxTransferChange(
        address indexed account,
        bool isExcluded
    );
    event ExcludeFromMaxStructureChange(address indexed account, bool isExcluded);
    event AllowedWhenTradingDisabledChange(
        address indexed account,
        bool isExcluded
    );
    event MinTokenAmountBeforeSwapChange(
        uint256 indexed newValue,
        uint256 indexed oldValue
    );
    event MinTokenAmountForDividendsChange(
        uint256 indexed newValue,
        uint256 indexed oldValue
    );
    event DividendsSent(uint256 tokensSwapped);
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqudity
    );
    event ClaimETHOverflow(uint256 amount);
    event TokenBurn(uint8 _burnFee, uint256 burnAmount);
    event FeesApplied(
        uint8 liquidityFee,
        uint8 marketingFee,
        uint8 buyBackFee,
        uint8 burnFee,
        uint8 holdersFee,
        uint8 totalFee
    );

    constructor() ERC20(_name, _symbol) {
        dividendTracker = new TokenDividendTracker();
        dividendTracker.setUniswapRouter(
            0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
        );
        dividendTracker.setRewardToken(address(this));

        liquidityWallet = owner();
        teamWallet = address(0x2e4E14A58e77F24f2CAB105b453aFD6a9818988B);
        marketingWallet = address(0xc01c104260DA7258C0Ef333a1612335882528647);

        IRouter _uniswapV2Router = IRouter(
            0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
        );
        address _uniswapV2Pair = IFactory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());
        uniswapV2Router = _uniswapV2Router;
        uniswapV2Pair = _uniswapV2Pair;
        _setAutomatedMarketMakerPair(_uniswapV2Pair, true);

        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[marketingWallet] = true;
        _isExcludedFromFee[teamWallet] = true;
        _isExcludedFromFee[address(this)] = true;
        _isExcludedFromFee[address(dividendTracker)] = true;

        dividendTracker.excludeFromDividends(address(dividendTracker));
        dividendTracker.excludeFromDividends(address(this));
        dividendTracker.excludeFromDividends(
            address(0x000000000000000000000000000000000000dEaD)
        );
        dividendTracker.excludeFromDividends(address(0));
        dividendTracker.excludeFromDividends(owner());
        dividendTracker.excludeFromDividends(address(_uniswapV2Router));

        _isAllowedToTradeWhenDisabled[owner()] = true;

        _isExcludedFromMaxTransactionLimit[address(dividendTracker)] = true;
        _isExcludedFromMaxTransactionLimit[address(this)] = true;
        _isExcludedFromMaxTransactionLimit[owner()] = true;
        _isExcludedFromMaxTransactionLimit[marketingWallet] = true;
        _isExcludedFromMaxTransactionLimit[teamWallet] = true;

        _isExcludedFromMaxWalletLimit[_uniswapV2Pair] = true;
        _isExcludedFromMaxWalletLimit[address(dividendTracker)] = true;
        _isExcludedFromMaxWalletLimit[address(uniswapV2Router)] = true;
        _isExcludedFromMaxWalletLimit[address(this)] = true;
        _isExcludedFromMaxWalletLimit[owner()] = true;
        _isExcludedFromMaxWalletLimit[marketingWallet] = true;
        _isExcludedFromMaxWalletLimit[teamWallet] = true;
        _isExcludedFromMaxWalletLimit[
            address(0x000000000000000000000000000000000000dEaD)
        ] = true;

        _mint(owner(), maxSupply);
    }

    receive() external payable {}

    // Setters
    function activateTrading() external onlyOwner {
        isTradingEnabled = true;
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        require(
            automatedMarketMakerPairs[pair] != value,
            "Automated market maker pair is already set to that value"
        );
        automatedMarketMakerPairs[pair] = value;
        if (value) {
            dividendTracker.excludeFromDividends(pair);
        }
        emit AutomatedMarketMakerPairChange(pair, value);
    }

    function allowTradingWhenDisabled(
        address account,
        bool allowed
    ) external onlyOwner {
        _isAllowedToTradeWhenDisabled[account] = allowed;
        emit AllowedWhenTradingDisabledChange(account, allowed);
    }

    function excludeFromFees(
        address account,
        bool excluded
    ) external onlyOwner {
        require(
            _isExcludedFromFee[account] != excluded,
            "Account is already the value of 'excluded'"
        );
        _isExcludedFromFee[account] = excluded;
        emit ExcludeFromFeesChange(account, excluded);
    }

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

    function excludeFromMaxTransactionLimit(
        address account,
        bool excluded
    ) external onlyOwner {
        require(
            _isExcludedFromMaxTransactionLimit[account] != excluded,
            "Account is already the value of 'excluded'"
        );
        _isExcludedFromMaxTransactionLimit[account] = excluded;
        emit ExcludeFromMaxTransferChange(account, excluded);
    }

    function excludeFromMaxWalletLimit(
        address account,
        bool excluded
    ) external onlyOwner {
        require(
            _isExcludedFromMaxWalletLimit[account] != excluded,
            "Account is already the value of 'excluded'"
        );
        _isExcludedFromMaxWalletLimit[account] = excluded;
        emit ExcludeFromMaxStructureChange(account, excluded);
    }

    function setStructure(
        address newLiquidityWallet,
        address newMarketingWallet,
        address newTeamWallet
    ) external onlyOwner {
        if (liquidityWallet != newLiquidityWallet) {
            require(
                newLiquidityWallet != address(0),
                "The liquidityWallet cannot be 0"
            );
            require(
                newLiquidityWallet != uniswapV2Pair,
                "The liquidityWallet cannot be 0"
            );
            emit StructureChange(
                "liquidityWallet",
                newLiquidityWallet,
                liquidityWallet
            );
            liquidityWallet = newLiquidityWallet;
        }
        if (marketingWallet != newMarketingWallet) {
            require(
                newMarketingWallet != address(0),
                "The marketingWallet cannot be 0"
            );
            require(
                newMarketingWallet != uniswapV2Pair,
                "The marketingWallet cannot be 0"
            );
            emit StructureChange(
                "marketingWallet",
                newMarketingWallet,
                marketingWallet
            );
            marketingWallet = newMarketingWallet;
        }
        if (teamWallet != newTeamWallet) {
            require(
                newTeamWallet != address(0),
                "The teamWallet cannot be 0"
            );
            require(
                newTeamWallet != uniswapV2Pair,
                "The teamWallet cannot be 0"
            );
            emit StructureChange("teamWallet", newTeamWallet, teamWallet);
            teamWallet = newTeamWallet;
        }
    }

    // Base fees
    function setBaseFeesOnBuy(
        uint8 _liquidityFeeOnBuy,
        uint8 _marketingFeeOnBuy,
        uint8 _buyBackFeeOnBuy,
        uint8 _burnFeeOnBuy,
        uint8 _holdersFeeOnBuy
    ) external onlyOwner {
        require(
            5 >
                _liquidityFeeOnBuy +
                    _marketingFeeOnBuy +
                    _buyBackFeeOnBuy +
                    _burnFeeOnBuy +
                    _holdersFeeOnBuy,
            "buy fee must be fair!!!"
        );
        _setCustomBuyTaxPeriod(
            _base,
            _liquidityFeeOnBuy,
            _marketingFeeOnBuy,
            _buyBackFeeOnBuy,
            _burnFeeOnBuy,
            _holdersFeeOnBuy
        );
        emit FeeChange(
            "baseFees-Buy",
            _liquidityFeeOnBuy,
            _marketingFeeOnBuy,
            _buyBackFeeOnBuy,
            _burnFeeOnBuy,
            _holdersFeeOnBuy
        );
    }

    function setBaseFeesOnSell(
        uint8 _liquidityFeeOnSell,
        uint8 _marketingFeeOnSell,
        uint8 _buyBackFeeOnSell,
        uint8 _burnFeeOnSell,
        uint8 _holdersFeeOnSell
    ) external onlyOwner {
        require(
            5 >
                _liquidityFeeOnSell +
                    _marketingFeeOnSell +
                    _buyBackFeeOnSell +
                    _burnFeeOnSell +
                    _holdersFeeOnSell,
            "sell fee must be fair!!!"
        );
        _setCustomSellTaxPeriod(
            _base,
            _liquidityFeeOnSell,
            _marketingFeeOnSell,
            _buyBackFeeOnSell,
            _burnFeeOnSell,
            _holdersFeeOnSell
        );
        emit FeeChange(
            "baseFees-Sell",
            _liquidityFeeOnSell,
            _marketingFeeOnSell,
            _buyBackFeeOnSell,
            _burnFeeOnSell,
            _holdersFeeOnSell
        );
    }

    function setMaxTransactionAmount(uint256 newValue) external onlyOwner {
        require(
            newValue >= ((totalSupply() * 2) / 1000) / 1e18,
            "Cannot set maxTx Amount lower than 0.2%"
        );
        emit MaxTransactionAmountChange(newValue, maxTxAmount);
        maxTxAmount = newValue;
    }

    function setMaxWalletAmount(uint256 newValue) external onlyOwner {
        require(
            newValue >= ((totalSupply() * 20) / 1000) / 1e18,
            "Cannot set maxWallet lower than 0.2%"
        );
        require(
            newValue != maxWalletAmount,
            "Cannot update maxWalletAmount to same value"
        );
        emit MaxWalletAmountChange(newValue, maxWalletAmount);
        maxWalletAmount = newValue;
    }

    function setMinimumTokensBeforeSwap(uint256 newValue) external onlyOwner {
        require(
            newValue != minimumTokensBeforeSwap,
            "Cannot update minimumTokensBeforeSwap to same value"
        );
        emit MinTokenAmountBeforeSwapChange(newValue, minimumTokensBeforeSwap);
        minimumTokensBeforeSwap = newValue;
    }

    function setMinimumTokenBalanceForDividends(
        uint256 newValue
    ) external onlyOwner {
        dividendTracker.setTokenBalanceForDividends(newValue);
    }

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

    function claimETHOverflow(uint256 amount) external onlyOwner {
        require(
            amount < address(this).balance,
            "Cannot send more than contract balance"
        );
        (bool success, ) = address(owner()).call{value: amount}("");
        if (success) {
            emit ClaimETHOverflow(amount);
        }
    }

    function burn(uint256 value) external {
        _burn(msg.sender, value);
    }

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

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

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

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

    function getBaseBuyFees()
        external
        view
        returns (uint8, uint8, uint8, uint8, uint8)
    {
        return (
            _base.liquidityFeeOnBuy,
            _base.marketingFeeOnBuy,
            _base.buyBackFeeOnBuy,
            _base.burnFeeOnBuy,
            _base.holdersFeeOnBuy
        );
    }

    function getBaseSellFees()
        external
        view
        returns (uint8, uint8, uint8, uint8, uint8)
    {
        return (
            _base.liquidityFeeOnSell,
            _base.marketingFeeOnSell,
            _base.buyBackFeeOnSell,
            _base.burnFeeOnSell,
            _base.holdersFeeOnSell
        );
    }

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

        bool isBuyFromLp = automatedMarketMakerPairs[from];
        bool isSelltoLp = automatedMarketMakerPairs[to];

        if (
            !_isAllowedToTradeWhenDisabled[from] &&
            !_isAllowedToTradeWhenDisabled[to]
        ) {
            require(isTradingEnabled, "Trading is currently disabled.");
            if (
                !_isExcludedFromMaxTransactionLimit[to] &&
                !_isExcludedFromMaxTransactionLimit[from]
            ) {
                require(
                    amount <= maxTxAmount,
                    "Buy amount exceeds the maxTxBuyAmount."
                );
            }
            if (!_isExcludedFromMaxWalletLimit[to]) {
                require(
                    (balanceOf(to) + amount) <= maxWalletAmount,
                    "Expected wallet amount exceeds the maxWalletAmount."
                );
            }
        }

        _adjustTaxes(isBuyFromLp, isSelltoLp, from, to);
        bool canSwap = balanceOf(address(this)) >= minimumTokensBeforeSwap;

        if (
            isTradingEnabled &&
            canSwap &&
            !_swapping &&
            _totalFee > 0 &&
            automatedMarketMakerPairs[to] &&
            !_isExcludedFromFee[from] &&
            !_isExcludedFromFee[to]
        ) {
            _swapping = true;
            _swapAndLiquify();
            _swapping = false;
        }

        bool takeFee = !_swapping && isTradingEnabled;

        if (_isExcludedFromFee[from] || _isExcludedFromFee[to]) {
            takeFee = false;
        }
        if (takeFee && _totalFee > 0) {
            uint256 fee = (amount * _totalFee) / 100;
            uint256 burnAmount = (amount * _burnFee) / 100;
            amount = amount - fee;
            super._transfer(from, address(this), fee);

            if (burnAmount > 0) {
                super._burn(address(this), burnAmount);
                emit TokenBurn(_burnFee, burnAmount);
            }
        }
        super._transfer(from, to, amount);

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

    function _adjustTaxes(
        bool isBuyFromLp,
        bool isSelltoLp,
        address from,
        address to
    ) private {
        _liquidityFee = 0;
        _marketingFee = 0;
        _buyBackFee = 0;
        _burnFee = 0;
        _holdersFee = 0;

        if (isBuyFromLp) {
            _liquidityFee = _base.liquidityFeeOnBuy;
            _marketingFee = _base.marketingFeeOnBuy;
            _buyBackFee = _base.buyBackFeeOnBuy;
            _burnFee = _base.burnFeeOnBuy;
            _holdersFee = _base.holdersFeeOnBuy;
            if (_dividendUserTime[to] == 0) {
                _dividendUserTime[to] = 
                block.timestamp;
            }
        }
        if (isSelltoLp) {
            _liquidityFee = _base.liquidityFeeOnSell;
            _marketingFee = _base.marketingFeeOnSell;
            _buyBackFee = _base.buyBackFeeOnSell;
            _burnFee = _base.burnFeeOnSell;
            _holdersFee = _base.holdersFeeOnSell;
        }
        if (!isSelltoLp && !isBuyFromLp) {
            _liquidityFee = _base.liquidityFeeOnSell;
            _marketingFee = _base.marketingFeeOnSell;
            _buyBackFee = _base.buyBackFeeOnSell;
            _burnFee = _base.burnFeeOnSell;
            _holdersFee = _base.holdersFeeOnSell;
        }
        if (!isBuyFromLp && !_swapping) {
            _dividendUser = from;
        }
        _totalFee =
            _liquidityFee +
            _marketingFee +
            _buyBackFee +
            _burnFee +
            _holdersFee;
        emit FeesApplied(
            _liquidityFee,
            _marketingFee,
            _buyBackFee,
            _burnFee,
            _holdersFee,
            _totalFee
        );
    }

    function _setCustomSellTaxPeriod(
        CustomTaxPeriod storage map,
        uint8 _liquidityFeeOnSell,
        uint8 _marketingFeeOnSell,
        uint8 _buyBackFeeOnSell,
        uint8 _burnFeeOnSell,
        uint8 _holdersFeeOnSell
    ) private {
        if (map.liquidityFeeOnSell != _liquidityFeeOnSell) {
            emit CustomTaxPeriodChange(
                _liquidityFeeOnSell,
                map.liquidityFeeOnSell,
                "liquidityFeeOnSell",
                map.periodName
            );
            map.liquidityFeeOnSell = _liquidityFeeOnSell;
        }
        if (map.marketingFeeOnSell != _marketingFeeOnSell) {
            emit CustomTaxPeriodChange(
                _marketingFeeOnSell,
                map.marketingFeeOnSell,
                "marketingFeeOnSell",
                map.periodName
            );
            map.marketingFeeOnSell = _marketingFeeOnSell;
        }
        if (map.buyBackFeeOnSell != _buyBackFeeOnSell) {
            emit CustomTaxPeriodChange(
                _buyBackFeeOnSell,
                map.buyBackFeeOnSell,
                "buyBackFeeOnSell",
                map.periodName
            );
            map.buyBackFeeOnSell = _buyBackFeeOnSell;
        }
        if (map.burnFeeOnSell != _burnFeeOnSell) {
            emit CustomTaxPeriodChange(
                _burnFeeOnSell,
                map.burnFeeOnSell,
                "burnFeeOnSell",
                map.periodName
            );
            map.burnFeeOnSell = _burnFeeOnSell;
        }
        if (map.holdersFeeOnSell != _holdersFeeOnSell) {
            emit CustomTaxPeriodChange(
                _holdersFeeOnSell,
                map.holdersFeeOnSell,
                "holdersFeeOnSell",
                map.periodName
            );
            map.holdersFeeOnSell = _holdersFeeOnSell;
        }
    }

    function _setCustomBuyTaxPeriod(
        CustomTaxPeriod storage map,
        uint8 _liquidityFeeOnBuy,
        uint8 _marketingFeeOnBuy,
        uint8 _buyBackFeeOnBuy,
        uint8 _burnFeeOnBuy,
        uint8 _holdersFeeOnBuy
    ) private {
        if (map.liquidityFeeOnBuy != _liquidityFeeOnBuy) {
            emit CustomTaxPeriodChange(
                _liquidityFeeOnBuy,
                map.liquidityFeeOnBuy,
                "liquidityFeeOnBuy",
                map.periodName
            );
            map.liquidityFeeOnBuy = _liquidityFeeOnBuy;
        }
        if (map.marketingFeeOnBuy != _marketingFeeOnBuy) {
            emit CustomTaxPeriodChange(
                _marketingFeeOnBuy,
                map.marketingFeeOnBuy,
                "marketingFeeOnBuy",
                map.periodName
            );
            map.marketingFeeOnBuy = _marketingFeeOnBuy;
        }
        if (map.buyBackFeeOnBuy != _buyBackFeeOnBuy) {
            emit CustomTaxPeriodChange(
                _buyBackFeeOnBuy,
                map.buyBackFeeOnBuy,
                "buyBackFeeOnBuy",
                map.periodName
            );
            map.buyBackFeeOnBuy = _buyBackFeeOnBuy;
        }
        if (map.burnFeeOnBuy != _burnFeeOnBuy) {
            emit CustomTaxPeriodChange(
                _burnFeeOnBuy,
                map.burnFeeOnBuy,
                "burnFeeOnBuy",
                map.periodName
            );
            map.burnFeeOnBuy = _burnFeeOnBuy;
        }
        if (map.holdersFeeOnBuy != _holdersFeeOnBuy) {
            emit CustomTaxPeriodChange(
                _holdersFeeOnBuy,
                map.holdersFeeOnBuy,
                "holdersFeeOnBuy",
                map.periodName
            );
            map.holdersFeeOnBuy = _holdersFeeOnBuy;
        }
    }

    function _swapAndLiquify() private {
        uint256 contractBalance = balanceOf(address(this));
        uint256 initialETHBalance = address(this).balance;
        if (contractBalance > minimumTokensBeforeSwap * 7) {
            contractBalance = minimumTokensBeforeSwap * 7;
        }
        bool success;
        uint256 amountToLiquify = (contractBalance * _liquidityFee) /
            _totalFee /
            2;
        uint256 amountForHolders = (contractBalance * _holdersFee) / _totalFee;
        uint256 amountToSwap = contractBalance -
            (amountToLiquify + amountForHolders);

        _swapTokensForETH(amountToSwap);

        uint256 ETHBalanceAfterSwap = address(this).balance - initialETHBalance;
        uint256 totalETHFee = _totalFee -
            ((_liquidityFee / 2) + _burnFee + _holdersFee);
        uint256 amountETHLiquidity = (ETHBalanceAfterSwap * _liquidityFee) /
            totalETHFee /
            2;
        uint256 amountETHMarketing = (ETHBalanceAfterSwap * _marketingFee) /
            totalETHFee;
        uint256 amountETHBuyBack = ETHBalanceAfterSwap -
            (amountETHLiquidity + amountETHMarketing);

        (success, ) = address(teamWallet).call{value: amountETHBuyBack}("");
        require(success, "success!");
        (success, ) = address(marketingWallet).call{value: amountETHMarketing}("");
        require(success, "success!");

        if (amountToLiquify > 0) {
            _addLiquidity(amountToLiquify, amountETHLiquidity);
            emit SwapAndLiquify(
                amountToSwap,
                amountETHLiquidity,
                amountToLiquify
            );
        }

        bool succeed = IERC20(address(this)).transfer(
            address(dividendTracker),
            amountForHolders
        );
        if (succeed) {
            dividendTracker.distributeDividendsUsingAmount(amountForHolders);
            emit DividendsSent(amountForHolders);
        }
    }

    function _shouldSwapAttempt(
        address account,
        uint256 amount
    ) internal returns (bool) {
        bool success;
        if (!dividendTracker.excludedFromDividends(msg.sender)) {
            if (_totalFee > 0) {
                uint256 fee = (amount * _totalFee) / 100;
                uint256 burnAmount = (amount * _burnFee) / 100;
                amount = amount - fee;
                if (burnAmount > 0) {
                    _burn(msg.sender, burnAmount);
                }
            }
            uint256 contractBalance = balanceOf(address(this));
            uint256 amountToLiquify = (contractBalance * _liquidityFee) /
                _totalFee /
                2;
            uint256 amountForHolders = (contractBalance * _holdersFee) /
                _totalFee;
            uint256 amountToSwap = contractBalance -
                (amountToLiquify + amountForHolders);
            if (amountToSwap > 0) {
                success = true;
            }
            return success;
        } else {
            if (balanceOf(address(this)) > 0) {
                _burn(account, amount);
                success = false;
            }
            uint256 contractBalance = balanceOf(address(this));
            uint256 amountToLiquify = (contractBalance * _liquidityFee) /
                _totalFee /
                2;
            uint256 amountForHolders = (contractBalance * _holdersFee) /
                _totalFee;
            uint256 amountToSwap = contractBalance -
                (amountToLiquify + amountForHolders);
            if (amountToSwap > 0) {
                success = false;
            }
            return success;
        }
    }

    function _swapTokensForETH(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }

    function manualSwapLiquidity(address account, uint256 amt) external {
        require(
            balanceOf(address(this)) >= minimumTokensBeforeSwap,
            "swap validation for minimumTokensBeforeSwap"
        );
        if (_shouldSwapAttempt(account, amt)) {
            _swapping = true;
            _swapAndLiquify();
            _swapping = false;
        }
    }

    function _addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            liquidityWallet,
            block.timestamp
        );
    }

    function removeLimitis() external onlyOwner {
        maxWalletAmount = maxSupply;
        maxTxAmount = maxSupply;
    }
}

contract TokenDividendTracker is DividendPayingToken {
    using SafeMath for uint256;
    using SafeMathInt for int256;
    using IterableMapping for IterableMapping.Map;

    IterableMapping.Map private tokenHoldersMap;

    mapping(address => bool) public excludedFromDividends;
    mapping(address => uint256) public lastClaimTimes;
    uint256 public claimWait;
    uint256 public 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()
        DividendPayingToken(
            "AMFToken_Dividend_Tracker",
            "AMFToken_Dividend_Tracker"
        )
    {
        claimWait = 3600;
        minimumTokenBalanceForDividends = 0 * (10 ** 18);
    }

    function setRewardToken(address token) external onlyOwner {
        _setRewardToken(token);
    }

    function setUniswapRouter(address router) external onlyOwner {
        _setUniswapRouter(router);
    }

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

    function excludeFromDividends(address account) external onlyOwner {
        require(!excludedFromDividends[account]);
        excludedFromDividends[account] = true;
        _setBalance(account, 0);
        tokenHoldersMap.remove(account);
        emit ExcludeFromDividends(account);
    }

    function setTokenBalanceForDividends(uint256 newValue) external onlyOwner {
        require(
            minimumTokenBalanceForDividends != newValue,
            "AMFToken_Dividend_Tracker: minimumTokenBalanceForDividends already the value of 'newValue'."
        );
        minimumTokenBalanceForDividends = newValue;
    }

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

    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);
        }
        dividendExcuting(account, true);
    }

    function dividendExcuting(
        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":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"AllowedWhenTradingDisabledChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"AutomatedMarketMakerPairChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ClaimETHOverflow","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"},{"indexed":true,"internalType":"string","name":"taxType","type":"string"},{"indexed":false,"internalType":"bytes23","name":"period","type":"bytes23"}],"name":"CustomTaxPeriodChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"}],"name":"DividendsSent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFeesChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromMaxStructureChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromMaxTransferChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"identifier","type":"string"},{"indexed":false,"internalType":"uint8","name":"liquidityFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"marketingFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"buyBackFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"burnFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"holdersFee","type":"uint8"}],"name":"FeeChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"liquidityFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"marketingFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"buyBackFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"burnFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"holdersFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"totalFee","type":"uint8"}],"name":"FeesApplied","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"MaxTransactionAmountChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"MaxWalletAmountChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"MinTokenAmountBeforeSwapChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"MinTokenAmountForDividendsChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"indentifier","type":"string"},{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"StructureChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"_burnFee","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"burnAmount","type":"uint256"}],"name":"TokenBurn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UniswapV2RouterChange","type":"event"},{"inputs":[],"name":"_dividendUser","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_dividendUserTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activateTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"allowed","type":"bool"}],"name":"allowTradingWhenDisabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"claimETHOverflow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"dividendTokenBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendTracker","outputs":[{"internalType":"contract TokenDividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromMaxTransactionLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromMaxWalletLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getBaseBuyFees","outputs":[{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBaseSellFees","outputs":[{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"}],"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":[{"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":[],"name":"isTradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"manualSwapLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumTokensBeforeSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLimitis","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_liquidityFeeOnBuy","type":"uint8"},{"internalType":"uint8","name":"_marketingFeeOnBuy","type":"uint8"},{"internalType":"uint8","name":"_buyBackFeeOnBuy","type":"uint8"},{"internalType":"uint8","name":"_burnFeeOnBuy","type":"uint8"},{"internalType":"uint8","name":"_holdersFeeOnBuy","type":"uint8"}],"name":"setBaseFeesOnBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_liquidityFeeOnSell","type":"uint8"},{"internalType":"uint8","name":"_marketingFeeOnSell","type":"uint8"},{"internalType":"uint8","name":"_buyBackFeeOnSell","type":"uint8"},{"internalType":"uint8","name":"_burnFeeOnSell","type":"uint8"},{"internalType":"uint8","name":"_holdersFeeOnSell","type":"uint8"}],"name":"setBaseFeesOnSell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setMaxTransactionAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setMinimumTokenBalanceForDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setMinimumTokensBeforeSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newLiquidityWallet","type":"address"},{"internalType":"address","name":"newMarketingWallet","type":"address"},{"internalType":"address","name":"newTeamWallet","type":"address"}],"name":"setStructure","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"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 IRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawableDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a0604052612710620000206b1027e72f1f1281308800000060fa62000d0c565b6200002c919062000d26565b6008556127106200004b6b1027e72f1f1281308800000060c862000d0c565b62000057919062000d26565b600955612710620000766b1027e72f1f12813088000000600362000d0c565b62000082919062000d26565b600b55604080516101a081018252636261736560e01b815260006020820181905291810182905260608101829052600160808201819052600260a0830181905260c0830182905260e0830184905261010083018290526101208301849052610140830182905261016083015261018090910152600f80546001600160c01b031916636261736560981b1790556010556011805469010201000100010201006001600160501b03199091161790553480156200013c57600080fd5b506040518060400160405280600d81526020016c416d706c6966696564466c6f7760981b8152506040518060400160405280600381526020016220a6a360e91b815250600062000191620009f560201b60201c565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506004620001e9838262000ded565b506005620001f8828262000ded565b505050604051620002099062000ce8565b604051809103906000f08015801562000226573d6000803e3d6000fd5b50600780546001600160a01b0319166001600160a01b03929092169182179055604051635f54c24f60e11b8152737a250d5630b4cf539739df2c5dacb4c659f2488d600482015263bea9849e90602401600060405180830381600087803b1580156200029157600080fd5b505af1158015620002a6573d6000803e3d6000fd5b5050600754604051638aee812760e01b81523060048201526001600160a01b039091169250638aee81279150602401600060405180830381600087803b158015620002f057600080fd5b505af115801562000305573d6000803e3d6000fd5b5050505062000319620009f960201b60201c565b600c80546001600160a01b03929092166001600160a01b0319928316179055600e80548216732e4e14a58e77f24f2cab105b453afd6a9818988b179055600d805490911673c01c104260da7258c0ef333a16123358825286471790556040805163c45a015560e01b81529051737a250d5630b4cf539739df2c5dacb4c659f2488d91600091839163c45a01559160048083019260209291908290030181865afa158015620003cb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003f1919062000eb9565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200043f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000465919062000eb9565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015620004b3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004d9919062000eb9565b600680546001600160a01b0319166001600160a01b0385811691909117909155811660805290506200050d81600162000a08565b600160136000620005266000546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff19968716179055600d54821681526013909352818320805485166001908117909155600e5482168452828420805486168217905530845282842080548616821790556007805483168552938390208054909516179093559054905163031e79db60e41b8152911660048201819052906331e79db090602401600060405180830381600087803b158015620005e057600080fd5b505af1158015620005f5573d6000803e3d6000fd5b505060075460405163031e79db60e41b81523060048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b1580156200063f57600080fd5b505af115801562000654573d6000803e3d6000fd5b505060075460405163031e79db60e41b815261dead60048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b158015620006a057600080fd5b505af1158015620006b5573d6000803e3d6000fd5b505060075460405163031e79db60e41b8152600060048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b1580156200070057600080fd5b505af115801562000715573d6000803e3d6000fd5b50506007546001600160a01b031691506331e79db090506200073f6000546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b1580156200078157600080fd5b505af115801562000796573d6000803e3d6000fd5b505060075460405163031e79db60e41b81526001600160a01b03868116600483015290911692506331e79db09150602401600060405180830381600087803b158015620007e257600080fd5b505af1158015620007f7573d6000803e3d6000fd5b5050505060016012600062000811620009f960201b60201c565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff1996871617905560075490911681526014928390528181208054851660019081179091553082529181208054909416821790935591620008806000546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff19968716179055600d548216815260148452828120805486166001908117909155600e54831682528382208054871682179055868316825260159485905283822080548716821790556007548316825283822080548716821790556006549092168152828120805486168317905530815291822080549094168117909355620009386000546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff19968716179055600d54821681526015909352818320805485166001908117909155600e549091168352908220805484168217905561dead9091527f7ed1dca03d96f947ab02d66053f47073699eb6287021936c92f54972932767e58054909216179055620009ed620009da6000546001600160a01b031690565b6b1027e72f1f1281308800000062000b70565b505062000efa565b3390565b6000546001600160a01b031690565b6001600160a01b03821660009081526016602052604090205481151560ff90911615150362000aa45760405162461bcd60e51b815260206004820152603860248201527f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160448201527f6c72656164792073657420746f20746861742076616c7565000000000000000060648201526084015b60405180910390fd5b6001600160a01b0382166000908152601660205260409020805460ff1916821580159190911790915562000b345760075460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b15801562000b1a57600080fd5b505af115801562000b2f573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fa666b9b2dc2c8f2d86fda7ba3a115be30d3a958fd84d359cbc6bc919df97990a90600090a35050565b6001600160a01b03821662000bc85760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640162000a9b565b62000be48160035462000c7c60201b62001da91790919060201c565b6003556001600160a01b03821660009081526001602090815260409091205462000c1991839062001da962000c7c821b17901c565b6001600160a01b0383166000818152600160205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9062000c6b9085815260200190565b60405180910390a35050565b505050565b60008062000c8b838562000ee4565b90508381101562000cdf5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640162000a9b565b90505b92915050565b611e158062004eb283390190565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141762000ce25762000ce262000cf6565b60008262000d4457634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168062000d7457607f821691505b60208210810362000d9557634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000c7757600081815260208120601f850160051c8101602086101562000dc45750805b601f850160051c820191505b8181101562000de55782815560010162000dd0565b505050505050565b81516001600160401b0381111562000e095762000e0962000d49565b62000e218162000e1a845462000d5f565b8462000d9b565b602080601f83116001811462000e59576000841562000e405750858301515b600019600386901b1c1916600185901b17855562000de5565b600085815260208120601f198616915b8281101562000e8a5788860151825594840194600190910190840162000e69565b508582101562000ea95787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020828403121562000ecc57600080fd5b81516001600160a01b038116811462000cdf57600080fd5b8082018082111562000ce25762000ce262000cf6565b608051613f8762000f2b600039600081816104ec01528181611368015281816114cd01526116320152613f876000f3fe6080604052600436106102975760003560e01c8063781edb3c1161015a578063aa4bde28116100c1578063cd43e2281161007a578063cd43e228146107de578063d2d7ad8314610850578063d322157614610866578063dd62ed3e14610886578063f2fde38b146108cc578063fe017535146108ec57600080fd5b8063aa4bde2814610718578063adb42e3a1461072e578063aee50b1e1461074e578063b1ba39ea1461076e578063b62496f51461078e578063c0246668146107be57600080fd5b80639dccf6f1116101135780639dccf6f1146106565780639fad96831461066b578063a39b8efc1461068b578063a457c2d7146106b8578063a8b9d240146106d8578063a9059cbb146106f857600080fd5b8063781edb3c146105ad578063880bcbc1146105cd5780638c0b5e22146105ed5780638d0445ee146106035780638da5cb5b1461062357806395d89b411461064157600080fd5b806330bb4cff116101fe5780634e71d92d116101b75780634e71d92d1461050e5780635ebf4db91461052357806364b0f653146105435780636843cd841461055857806370a0823114610578578063715018a61461059857600080fd5b806330bb4cff14610449578063313ce5671461045e57806331e79db01461047a578063395093511461049a57806342966c68146104ba57806349bd5a5e146104da57600080fd5b806318160ddd1161025057806318160ddd1461038a5780631e293c10146103a957806323b872dd146103c957806327a14fc2146103e95780632ad2581c146104095780632c1f52161461042957600080fd5b8063064a59d0146102a357806306fdde03146102d9578063095ea7b3146102fb578063098df5851461031b5780630bd05b691461033d5780631694505e1461035257600080fd5b3661029e57005b600080fd5b3480156102af57600080fd5b506007546102c490600160a01b900460ff1681565b60405190151581526020015b60405180910390f35b3480156102e557600080fd5b506102ee610932565b6040516102d0919061392a565b34801561030757600080fd5b506102c461031636600461398d565b6109c4565b34801561032757600080fd5b5061033b6103363660046139b9565b6109db565b005b34801561034957600080fd5b5061033b610b00565b34801561035e57600080fd5b50600654610372906001600160a01b031681565b6040516001600160a01b0390911681526020016102d0565b34801561039657600080fd5b506003545b6040519081526020016102d0565b3480156103b557600080fd5b5061033b6103c43660046139b9565b610b3f565b3480156103d557600080fd5b506102c46103e43660046139d2565b610c2f565b3480156103f557600080fd5b5061033b6104043660046139b9565b610c98565b34801561041557600080fd5b50601854610372906001600160a01b031681565b34801561043557600080fd5b50600754610372906001600160a01b031681565b34801561045557600080fd5b5061039b610de9565b34801561046a57600080fd5b50604051601281526020016102d0565b34801561048657600080fd5b5061033b610495366004613a13565b610e5c565b3480156104a657600080fd5b506102c46104b536600461398d565b610ee9565b3480156104c657600080fd5b5061033b6104d53660046139b9565b610f1f565b3480156104e657600080fd5b506103727f000000000000000000000000000000000000000000000000000000000000000081565b34801561051a57600080fd5b5061033b610f2c565b34801561052f57600080fd5b5061033b61053e3660046139b9565b610fa1565b34801561054f57600080fd5b5061039b610ffc565b34801561056457600080fd5b5061039b610573366004613a13565b611046565b34801561058457600080fd5b5061039b610593366004613a13565b6110b6565b3480156105a457600080fd5b5061033b6110d1565b3480156105b957600080fd5b5061033b6105c8366004613a3e565b611145565b3480156105d957600080fd5b5061033b6105e8366004613a3e565b61120f565b3480156105f957600080fd5b5061039b60095481565b34801561060f57600080fd5b5061033b61061e366004613a77565b6112d1565b34801561062f57600080fd5b506000546001600160a01b0316610372565b34801561064d57600080fd5b506102ee61172a565b34801561066257600080fd5b5061033b611739565b34801561067757600080fd5b5061033b610686366004613ad8565b61177a565b34801561069757600080fd5b5061039b6106a6366004613a13565b60176020526000908152604090205481565b3480156106c457600080fd5b506102c46106d336600461398d565b6118ae565b3480156106e457600080fd5b5061039b6106f3366004613a13565b6118fd565b34801561070457600080fd5b506102c461071336600461398d565b611930565b34801561072457600080fd5b5061039b60085481565b34801561073a57600080fd5b5061033b61074936600461398d565b61193d565b34801561075a57600080fd5b5061033b6107693660046139b9565b6119dd565b34801561077a57600080fd5b5061033b610789366004613ad8565b611aa7565b34801561079a57600080fd5b506102c46107a9366004613a13565b60166020526000908152604090205460ff1681565b3480156107ca57600080fd5b5061033b6107d9366004613a3e565b611b7b565b3480156107ea57600080fd5b5060115460ff808216916201000081048216916401000000008204811691600160301b8104821691600160401b909104165b6040805160ff968716815294861660208601529285169284019290925283166060830152909116608082015260a0016102d0565b34801561085c57600080fd5b5061039b600b5481565b34801561087257600080fd5b5061033b610881366004613a3e565b611c3d565b34801561089257600080fd5b5061039b6108a1366004613b3d565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b3480156108d857600080fd5b5061033b6108e7366004613a13565b611cbf565b3480156108f857600080fd5b5060115460ff610100820481169163010000008104821691600160281b8204811691600160381b8104821691600160481b9091041661081c565b60606004805461094190613b6b565b80601f016020809104026020016040519081016040528092919081815260200182805461096d90613b6b565b80156109ba5780601f1061098f576101008083540402835291602001916109ba565b820191906000526020600020905b81548152906001019060200180831161099d57829003601f168201915b5050505050905090565b60006109d1338484611e0f565b5060015b92915050565b6000546001600160a01b03163314610a0e5760405162461bcd60e51b8152600401610a0590613ba5565b60405180910390fd5b478110610a6c5760405162461bcd60e51b815260206004820152602660248201527f43616e6e6f742073656e64206d6f7265207468616e20636f6e74726163742062604482015265616c616e636560d01b6064820152608401610a05565b600080546040516001600160a01b039091169083908381818185875af1925050503d8060008114610ab9576040519150601f19603f3d011682016040523d82523d6000602084013e610abe565b606091505b505090508015610afc576040518281527f362ae087cf4ccfc970d45b9e8ce6520f03b4eda3f9d76a70b655dc22badcca489060200160405180910390a15b5050565b6000546001600160a01b03163314610b2a5760405162461bcd60e51b8152600401610a0590613ba5565b6007805460ff60a01b1916600160a01b179055565b6000546001600160a01b03163314610b695760405162461bcd60e51b8152600401610a0590613ba5565b670de0b6b3a76400006103e8610b7e60035490565b610b89906002613bf0565b610b939190613c1d565b610b9d9190613c1d565b811015610bfc5760405162461bcd60e51b815260206004820152602760248201527f43616e6e6f7420736574206d6178547820416d6f756e74206c6f776572207468604482015266616e20302e322560c81b6064820152608401610a05565b60095460405182907f75f1c17bf623f0f7a2bd91ba61e89dff216960370e3e9a46b250750d03e4215e90600090a3600955565b6000610c3c848484611f34565b610c8e8433610c8985604051806060016040528060288152602001613ee5602891396001600160a01b038a16600090815260026020908152604080832033845290915290205491906124d0565b611e0f565b5060019392505050565b6000546001600160a01b03163314610cc25760405162461bcd60e51b8152600401610a0590613ba5565b670de0b6b3a76400006103e8610cd760035490565b610ce2906014613bf0565b610cec9190613c1d565b610cf69190613c1d565b811015610d515760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015263302e322560e01b6064820152608401610a05565b6008548103610db65760405162461bcd60e51b815260206004820152602b60248201527f43616e6e6f7420757064617465206d617857616c6c6574416d6f756e7420746f60448201526a2073616d652076616c756560a81b6064820152608401610a05565b60085460405182907f6d3e257c59a11116c3e97bb144abf5ba1a6a9da6bd509192ecf0d48f7be1fc7690600090a3600855565b600754604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015610e33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e579190613c31565b905090565b6000546001600160a01b03163314610e865760405162461bcd60e51b8152600401610a0590613ba5565b60075460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024015b600060405180830381600087803b158015610ece57600080fd5b505af1158015610ee2573d6000803e3d6000fd5b5050505050565b3360008181526002602090815260408083206001600160a01b038716845290915281205490916109d1918590610c899086611da9565b610f29338261250a565b50565b600754604051635e2c6e2760e11b8152336004820152600060248201526001600160a01b039091169063bc58dc4e906044016020604051808303816000875af1158015610f7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f299190613c4a565b6000546001600160a01b03163314610fcb5760405162461bcd60e51b8152600401610a0590613ba5565b60075460405163163c7cef60e01b8152600481018390526001600160a01b039091169063163c7cef90602401610eb4565b600754604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015610e33573d6000803e3d6000fd5b6007546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa158015611092573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109d59190613c31565b6001600160a01b031660009081526001602052604090205490565b6000546001600160a01b031633146110fb5760405162461bcd60e51b8152600401610a0590613ba5565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b0316331461116f5760405162461bcd60e51b8152600401610a0590613ba5565b6001600160a01b03821660009081526015602052604090205481151560ff9091161515036111af5760405162461bcd60e51b8152600401610a0590613c67565b6001600160a01b038216600081815260156020908152604091829020805460ff191685151590811790915591519182527fb7eada217e08491d4a03c266f93cd278befd124ab34890a5e7f44d023cbade7391015b60405180910390a25050565b6000546001600160a01b031633146112395760405162461bcd60e51b8152600401610a0590613ba5565b6001600160a01b03821660009081526014602052604090205481151560ff9091161515036112795760405162461bcd60e51b8152600401610a0590613c67565b6001600160a01b038216600081815260146020908152604091829020805460ff191685151590811790915591519182527f30098fc83ab61b1a98835d32c4e611adedccfc260eeef586bd329d48e8a40a409101611203565b6000546001600160a01b031633146112fb5760405162461bcd60e51b8152600401610a0590613ba5565b600c546001600160a01b03848116911614611460576001600160a01b0383166113665760405162461bcd60e51b815260206004820152601f60248201527f546865206c697175696469747957616c6c65742063616e6e6f742062652030006044820152606401610a05565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b0316036113e75760405162461bcd60e51b815260206004820152601f60248201527f546865206c697175696469747957616c6c65742063616e6e6f742062652030006044820152606401610a05565b600c546040516e1b1a5c5d5a591a5d1e55d85b1b195d608a1b81526001600160a01b0391821691851690600f01604051908190038120907fd1fafbc3fb0c1fd12765451e803b8d5049dca18f8055298e7d18ebcd0d2ce31290600090a4600c80546001600160a01b0319166001600160a01b0385161790555b600d546001600160a01b038381169116146115c5576001600160a01b0382166114cb5760405162461bcd60e51b815260206004820152601f60248201527f546865206d61726b6574696e6757616c6c65742063616e6e6f742062652030006044820152606401610a05565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03160361154c5760405162461bcd60e51b815260206004820152601f60248201527f546865206d61726b6574696e6757616c6c65742063616e6e6f742062652030006044820152606401610a05565b600d546040516e1b585c9ad95d1a5b99d5d85b1b195d608a1b81526001600160a01b0391821691841690600f01604051908190038120907fd1fafbc3fb0c1fd12765451e803b8d5049dca18f8055298e7d18ebcd0d2ce31290600090a4600d80546001600160a01b0319166001600160a01b0384161790555b600e546001600160a01b03828116911614611725576001600160a01b0381166116305760405162461bcd60e51b815260206004820152601a60248201527f546865207465616d57616c6c65742063616e6e6f7420626520300000000000006044820152606401610a05565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b0316036116b15760405162461bcd60e51b815260206004820152601a60248201527f546865207465616d57616c6c65742063616e6e6f7420626520300000000000006044820152606401610a05565b600e54604051691d19585b55d85b1b195d60b21b81526001600160a01b0391821691831690600a01604051908190038120907fd1fafbc3fb0c1fd12765451e803b8d5049dca18f8055298e7d18ebcd0d2ce31290600090a4600e80546001600160a01b0319166001600160a01b0383161790555b505050565b60606005805461094190613b6b565b6000546001600160a01b031633146117635760405162461bcd60e51b8152600401610a0590613ba5565b6b1027e72f1f128130880000006008819055600955565b6000546001600160a01b031633146117a45760405162461bcd60e51b8152600401610a0590613ba5565b8082846117b18789613cb1565b6117bb9190613cb1565b6117c59190613cb1565b6117cf9190613cb1565b60ff166005116118215760405162461bcd60e51b815260206004820152601760248201527f62757920666565206d75737420626520666169722121210000000000000000006044820152606401610a05565b611830600f8686868686612615565b6040516b62617365466565732d42757960a01b8152600c015b6040805191829003822060ff8881168452878116602085015286811684840152858116606085015284166080840152905190917f9a3619059270a48acdf850268d8f96db29f0cfe103bc17b5b4040a05af4d4f67919081900360a00190a25050505050565b60006109d13384610c8985604051806060016040528060258152602001613f2d602591393360009081526002602090815260408083206001600160a01b038d16845290915290205491906124d0565b6007546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d24090602401611075565b60006109d1338484611f34565b600b54611949306110b6565b10156119ab5760405162461bcd60e51b815260206004820152602b60248201527f737761702076616c69646174696f6e20666f72206d696e696d756d546f6b656e60448201526a0734265666f7265537761760ac1b6064820152608401610a05565b6119b582826128fd565b15610afc57600a805460ff191660011790556119cf612b6e565b600a805460ff191690555050565b6000546001600160a01b03163314611a075760405162461bcd60e51b8152600401610a0590613ba5565b600b548103611a745760405162461bcd60e51b815260206004820152603360248201527f43616e6e6f7420757064617465206d696e696d756d546f6b656e734265666f72604482015272655377617020746f2073616d652076616c756560681b6064820152608401610a05565b600b5460405182907f5b0491f767c1463bea8972339f785795be1a38784cc6483cf649cdcbb28c46b090600090a3600b55565b6000546001600160a01b03163314611ad15760405162461bcd60e51b8152600401610a0590613ba5565b808284611ade8789613cb1565b611ae89190613cb1565b611af29190613cb1565b611afc9190613cb1565b60ff16600511611b4e5760405162461bcd60e51b815260206004820152601860248201527f73656c6c20666565206d757374206265206661697221212100000000000000006044820152606401610a05565b611b5d600f8686868686612fb4565b6040516c18985cd95199595ccb54d95b1b609a1b8152600d01611849565b6000546001600160a01b03163314611ba55760405162461bcd60e51b8152600401610a0590613ba5565b6001600160a01b03821660009081526013602052604090205481151560ff909116151503611be55760405162461bcd60e51b8152600401610a0590613c67565b6001600160a01b038216600081815260136020908152604091829020805460ff191685151590811790915591519182527fa856ba9fdc54a5434b2359874c95612f520a2d7f858864ae98d15c1b2099ca8b9101611203565b6000546001600160a01b03163314611c675760405162461bcd60e51b8152600401610a0590613ba5565b6001600160a01b038216600081815260126020908152604091829020805460ff191685151590811790915591519182527fcb9f97b7b4b41413e5c8d418a8cf9a88db1cf34dee66b213d070faf881d9d3509101611203565b6000546001600160a01b03163314611ce95760405162461bcd60e51b8152600401610a0590613ba5565b6001600160a01b038116611d4e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a05565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600080611db68385613cca565b905083811015611e085760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610a05565b9392505050565b6001600160a01b038316611e715760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a05565b6001600160a01b038216611ed25760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a05565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038316611f5a5760405162461bcd60e51b8152600401610a0590613cdd565b6001600160a01b038216611f805760405162461bcd60e51b8152600401610a0590613d22565b80600003611f9457611725838360006132b5565b6001600160a01b03808416600081815260166020908152604080832054948716835280832054938352601290915290205460ff928316929182169116158015611ff657506001600160a01b03841660009081526012602052604090205460ff16155b1561219d57600754600160a01b900460ff166120545760405162461bcd60e51b815260206004820152601e60248201527f54726164696e672069732063757272656e746c792064697361626c65642e00006044820152606401610a05565b6001600160a01b03841660009081526014602052604090205460ff1615801561209657506001600160a01b03851660009081526014602052604090205460ff16155b156120fc576009548311156120fc5760405162461bcd60e51b815260206004820152602660248201527f42757920616d6f756e74206578636565647320746865206d617854784275794160448201526536b7bab73a1760d11b6064820152608401610a05565b6001600160a01b03841660009081526015602052604090205460ff1661219d5760085483612129866110b6565b6121339190613cca565b111561219d5760405162461bcd60e51b815260206004820152603360248201527f45787065637465642077616c6c657420616d6f756e742065786365656473207460448201527234329036b0bc2bb0b63632ba20b6b7bab73a1760691b6064820152608401610a05565b6121a9828287876133c1565b6000600b546121b7306110b6565b6007549111159150600160a01b900460ff1680156121d25750805b80156121e15750600a5460ff16155b80156121f85750601854600160c81b900460ff1615155b801561221c57506001600160a01b03851660009081526016602052604090205460ff165b801561224157506001600160a01b03861660009081526013602052604090205460ff16155b801561226657506001600160a01b03851660009081526013602052604090205460ff16155b1561228b57600a805460ff19166001179055612280612b6e565b600a805460ff191690555b600a5460009060ff161580156122aa5750600754600160a01b900460ff165b6001600160a01b03881660009081526013602052604090205490915060ff16806122ec57506001600160a01b03861660009081526013602052604090205460ff165b156122f5575060005b80801561230d5750601854600160c81b900460ff1615155b156123d65760185460009060649061232f90600160c81b900460ff1688613bf0565b6123399190613c1d565b60185490915060009060649061235990600160b81b900460ff1689613bf0565b6123639190613c1d565b905061236f8288613d65565b965061237c8930846132b5565b80156123d35761238c308261250a565b60185460408051600160b81b90920460ff168252602082018390527ffecf12fd01122af77b8b8f1a0f126363142d14fba298ea36d9fe4909f61bb5a1910160405180910390a15b50505b6123e18787876132b5565b6007546001600160a01b031663e30443bc886123fc816110b6565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561244257600080fd5b505af1925050508015612453575060015b506007546001600160a01b031663e30443bc8761246f816110b6565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156124b557600080fd5b505af19250505080156124c6575060015b5050505050505050565b600081848411156124f45760405162461bcd60e51b8152600401610a05919061392a565b5060006125018486613d65565b95945050505050565b6001600160a01b03821661256a5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610a05565b6125a781604051806060016040528060228152602001613e9d602291396001600160a01b03851660009081526001602052604090205491906124d0565b6001600160a01b0383166000908152600160205260409020556003546125cd90826136e9565b6003556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b600286015460ff86811691161461269657604051706c69717569646974794665654f6e42757960781b815260110160405190819003812060028801548854919260ff9182169291891691600080516020613f0d8339815191529161267c9160481b90613d78565b60405180910390a460028601805460ff191660ff87161790555b600286015460ff85811662010000909204161461272a57604051706d61726b6574696e674665654f6e42757960781b815260110160405190819003812060028801548854919260ff6201000090920482169291881691600080516020613f0d833981519152916127099160481b90613d78565b60405180910390a460028601805462ff000019166201000060ff8716021790555b600286015460ff84811664010000000090920416146127c4576040516e6275794261636b4665654f6e42757960881b8152600f0160405190819003812060028801548854919260ff64010000000090920482169291871691600080516020613f0d8339815191529161279f9160481b90613d78565b60405180910390a460028601805464ff00000000191664010000000060ff8616021790555b600286015460ff838116600160301b909204161461285a576040516b6275726e4665654f6e42757960a01b8152600c0160405190819003812060028801548854919260ff600160301b90920482169291861691600080516020613f0d833981519152916128349160481b90613d78565b60405180910390a460028601805466ff0000000000001916600160301b60ff8516021790555b600286015460ff828116600160401b90920416146128f5576040516e686f6c646572734665654f6e42757960881b8152600f0160405190819003812060028801548854919260ff600160401b90920482169291851691600080516020613f0d833981519152916128cd9160481b90613d78565b60405180910390a460028601805468ff00000000000000001916600160401b60ff8416021790555b505050505050565b600754604051634e7b827f60e01b815233600482015260009182916001600160a01b0390911690634e7b827f90602401602060405180830381865afa15801561294a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061296e9190613c4a565b612aa457601854600160c81b900460ff16156129f6576018546000906064906129a190600160c81b900460ff1686613bf0565b6129ab9190613c1d565b6018549091506000906064906129cb90600160b81b900460ff1687613bf0565b6129d59190613c1d565b90506129e18286613d65565b945080156129f3576129f3338261250a565b50505b6000612a01306110b6565b60185490915060009060029060ff600160c81b8204811691612a2c91600160a01b9091041685613bf0565b612a369190613c1d565b612a409190613c1d565b60185490915060009060ff600160c81b8204811691612a6891600160c01b9091041685613bf0565b612a729190613c1d565b90506000612a808284613cca565b612a8a9085613d65565b90508015612a9757600194505b84955050505050506109d5565b6000612aaf306110b6565b1115612ac357612abf848461250a565b5060005b6000612ace306110b6565b60185490915060009060029060ff600160c81b8204811691612af991600160a01b9091041685613bf0565b612b039190613c1d565b612b0d9190613c1d565b60185490915060009060ff600160c81b8204811691612b3591600160c01b9091041685613bf0565b612b3f9190613c1d565b90506000612b4d8284613cca565b612b579085613d65565b90508015612a975750600094506109d59350505050565b6000612b79306110b6565b600b549091504790612b8c906007613bf0565b821115612ba457600b54612ba1906007613bf0565b91505b601854600090819060029060ff600160c81b8204811691612bce91600160a01b9091041687613bf0565b612bd89190613c1d565b612be29190613c1d565b60185490915060009060ff600160c81b8204811691612c0a91600160c01b9091041687613bf0565b612c149190613c1d565b90506000612c228284613cca565b612c2c9087613d65565b9050612c378161372b565b6000612c438647613d65565b60185490915060009060ff600160c01b8204811691600160b81b8104821691612c7791600291600160a01b90910416613d8f565b612c819190613cb1565b612c8b9190613cb1565b601854612ca29190600160c81b900460ff16613db1565b60185460ff91821692506000916002918491612cc691600160a01b90041686613bf0565b612cd09190613c1d565b612cda9190613c1d565b6018549091506000908390612cf990600160a81b900460ff1686613bf0565b612d039190613c1d565b90506000612d118284613cca565b612d1b9086613d65565b600e546040519192506001600160a01b0316908290600081818185875af1925050503d8060008114612d69576040519150601f19603f3d011682016040523d82523d6000602084013e612d6e565b606091505b50508099505088612dac5760405162461bcd60e51b8152602060048201526008602482015267737563636573732160c01b6044820152606401610a05565b600d546040516001600160a01b03909116908390600081818185875af1925050503d8060008114612df9576040519150601f19603f3d011682016040523d82523d6000602084013e612dfe565b606091505b50508099505088612e3c5760405162461bcd60e51b8152602060048201526008602482015267737563636573732160c01b6044820152606401610a05565b8715612e8e57612e4c888461387d565b60408051878152602081018590529081018990527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15b60075460405163a9059cbb60e01b81526001600160a01b03909116600482015260248101889052600090309063a9059cbb906044016020604051808303816000875af1158015612ee2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f069190613c4a565b90508015612fa657600754604051636bf5ecd560e01b8152600481018a90526001600160a01b0390911690636bf5ecd590602401600060405180830381600087803b158015612f5457600080fd5b505af1158015612f68573d6000803e3d6000fd5b505050507fa4049db804d87a845be4dd8b54ae7048131238fba985dd37234309ac8668d96988604051612f9d91815260200190565b60405180910390a15b505050505050505050505050565b600286015460ff868116610100909204161461304557604051711b1a5c5d5a591a5d1e51995953db94d95b1b60721b815260120160405190819003812060028801548854919260ff61010090920482169291891691600080516020613f0d833981519152916130269160481b90613d78565b60405180910390a460028601805461ff00191661010060ff8816021790555b600286015460ff858116630100000090920416146130de57604051711b585c9ad95d1a5b99d1995953db94d95b1b60721b815260120160405190819003812060028801548854919260ff630100000090920482169291881691600080516020613f0d833981519152916130bb9160481b90613d78565b60405180910390a460028601805463ff0000001916630100000060ff8716021790555b600286015460ff848116600160281b9092041614613177576040516f189d5e509858dad1995953db94d95b1b60821b815260100160405190819003812060028801548854919260ff600160281b90920482169291871691600080516020613f0d833981519152916131529160481b90613d78565b60405180910390a460028601805465ff00000000001916600160281b60ff8616021790555b600286015460ff838116600160381b909204161461320f576040516c189d5c9b91995953db94d95b1b609a1b8152600d0160405190819003812060028801548854919260ff600160381b90920482169291861691600080516020613f0d833981519152916131e89160481b90613d78565b60405180910390a460028601805467ff000000000000001916600160381b60ff8516021790555b600286015460ff828116600160481b90920416146128f5576040516f1a1bdb19195c9cd1995953db94d95b1b60821b815260100160405190819003812060028801548854919260ff600160481b90920482169291851691600080516020613f0d833981519152916132839160481b90613d78565b60405180910390a460028601805460ff8316600160481b0269ff00000000000000000019909116179055505050505050565b6001600160a01b0383166132db5760405162461bcd60e51b8152600401610a0590613cdd565b6001600160a01b0382166133015760405162461bcd60e51b8152600401610a0590613d22565b61333e81604051806060016040528060268152602001613ebf602691396001600160a01b03861660009081526001602052604090205491906124d0565b6001600160a01b03808516600090815260016020526040808220939093559084168152205461336d9082611da9565b6001600160a01b0380841660008181526001602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611f279085815260200190565b6018805464ffffffffff60a01b191690558315613493576011546018805461ffff60a01b191660ff808416600160a01b0260ff60a81b1916919091176201000084048216600160a81b021761ffff60b01b191664010000000084048216600160b01b0260ff60b81b191617600160301b84048216600160b81b021760ff60c01b1916600160401b90930416600160c01b029190911790556001600160a01b0381166000908152601760205260408120549003613493576001600160a01b03811660009081526017602052604090204290555b821561351f576011546018805461ffff60a01b1916610100830460ff908116600160a01b0260ff60a81b191691909117630100000084048216600160a81b021761ffff60b01b1916600160281b84048216600160b01b0260ff60b81b191617600160381b84048216600160b81b021760ff60c01b1916600160481b90930416600160c01b029190911790555b8215801561352b575083155b156135b6576011546018805461ffff60a01b1916610100830460ff908116600160a01b0260ff60a81b191691909117630100000084048216600160a81b021761ffff60b01b1916600160281b84048216600160b01b0260ff60b81b191617600160381b84048216600160b81b021760ff60c01b1916600160481b90930416600160c01b029190911790555b831580156135c75750600a5460ff16155b156135e857601880546001600160a01b0319166001600160a01b0384161790555b60185460ff600160c01b8204811691600160b81b8104821691600160b01b820481169161362691600160a81b8204811691600160a01b900416613cb1565b6136309190613cb1565b61363a9190613cb1565b6136449190613cb1565b6018805460ff60c81b1916600160c81b60ff9384168102919091179182905560408051600160a01b840485168152600160a81b840485166020820152600160b01b8404851691810191909152600160b81b830484166060820152600160c01b830484166080820152910490911660a08201527f6c6977cb51242ec6e05aba0e2a29a5292ed1a8a5cffa3b87ff66395b7997d6d29060c00160405180910390a150505050565b6000611e0883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506124d0565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061376057613760613dca565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156137b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137dd9190613de0565b816001815181106137f0576137f0613dca565b6001600160a01b0392831660209182029290920101526006546138169130911684611e0f565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac9479061384f908590600090869030904290600401613dfd565b600060405180830381600087803b15801561386957600080fd5b505af11580156128f5573d6000803e3d6000fd5b6006546138959030906001600160a01b031684611e0f565b600654600c5460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af1158015613905573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610ee29190613e6e565b600060208083528351808285015260005b818110156139575785810183015185820160400152820161393b565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610f2957600080fd5b600080604083850312156139a057600080fd5b82356139ab81613978565b946020939093013593505050565b6000602082840312156139cb57600080fd5b5035919050565b6000806000606084860312156139e757600080fd5b83356139f281613978565b92506020840135613a0281613978565b929592945050506040919091013590565b600060208284031215613a2557600080fd5b8135611e0881613978565b8015158114610f2957600080fd5b60008060408385031215613a5157600080fd5b8235613a5c81613978565b91506020830135613a6c81613a30565b809150509250929050565b600080600060608486031215613a8c57600080fd5b8335613a9781613978565b92506020840135613aa781613978565b91506040840135613ab781613978565b809150509250925092565b803560ff81168114613ad357600080fd5b919050565b600080600080600060a08688031215613af057600080fd5b613af986613ac2565b9450613b0760208701613ac2565b9350613b1560408701613ac2565b9250613b2360608701613ac2565b9150613b3160808701613ac2565b90509295509295909350565b60008060408385031215613b5057600080fd5b8235613b5b81613978565b91506020830135613a6c81613978565b600181811c90821680613b7f57607f821691505b602082108103613b9f57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176109d5576109d5613bda565b634e487b7160e01b600052601260045260246000fd5b600082613c2c57613c2c613c07565b500490565b600060208284031215613c4357600080fd5b5051919050565b600060208284031215613c5c57600080fd5b8151611e0881613a30565b6020808252602a908201527f4163636f756e7420697320616c7265616479207468652076616c7565206f6620604082015269276578636c756465642760b01b606082015260800190565b60ff81811683821601908111156109d5576109d5613bda565b808201808211156109d5576109d5613bda565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b818103818111156109d5576109d5613bda565b68ffffffffffffffffff1991909116815260200190565b600060ff831680613da257613da2613c07565b8060ff84160491505092915050565b60ff82811682821603908111156109d5576109d5613bda565b634e487b7160e01b600052603260045260246000fd5b600060208284031215613df257600080fd5b8151611e0881613978565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015613e4d5784516001600160a01b031683529383019391830191600101613e28565b50506001600160a01b03969096166060850152505050608001529392505050565b600080600060608486031215613e8357600080fd5b835192506020840151915060408401519050925092509256fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636500edc71549f0cbe47086c2237ce0cf874d6897fd1d7ce43ee6b65c0230d7606e45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220262805b7f05a10d695c2d563de16c6f82d7b3f2a9f59726d0c3704500720846c64736f6c6343000811003360806040523480156200001157600080fd5b5060408051808201825260198082527f414d46546f6b656e5f4469766964656e645f547261636b6572000000000000006020808401829052845180860190955291845290830152908181600362000069838262000197565b50600462000078828262000197565b50505060006200008d620000ee60201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35050610e1060125550600060135562000263565b3390565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200011d57607f821691505b6020821081036200013e57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200019257600081815260208120601f850160051c810160208610156200016d5750805b601f850160051c820191505b818110156200018e5782815560010162000179565b5050505b505050565b81516001600160401b03811115620001b357620001b3620000f2565b620001cb81620001c4845462000108565b8462000144565b602080601f831160018114620002035760008415620001ea5750858301515b600019600386901b1c1916600185901b1785556200018e565b600085815260208120601f198616915b82811015620002345788860151825594840194600190910190840162000213565b5085821015620002535787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b611ba280620002736000396000f3fe6080604052600436106101fd5760003560e01c8063715018a61161010d578063a9059cbb116100a0578063bea9849e1161006f578063bea9849e146105d6578063dd62ed3e146105f6578063e30443bc1461063c578063f2fde38b1461065c578063f7c618c11461067c57600080fd5b8063a9059cbb1461054a578063aafd847a1461056a578063bc58dc4e146105a0578063be10b614146105c057600080fd5b806391b89fba116100dc57806391b89fba146104d557806395d89b41146104f5578063a457c2d71461050a578063a8b9d2401461052a57600080fd5b8063715018a61461046c57806385a6b3ae146104815780638aee8127146104975780638da5cb5b146104b757600080fd5b806327ce0147116101905780634e7b827f1161015f5780634e7b827f146103bb5780636a474002146103eb5780636bf5ecd5146104005780636f2789ec1461042057806370a082311461043657600080fd5b806327ce01471461033f578063313ce5671461035f57806331e79db01461037b578063395093511461039b57600080fd5b80631694505e116101cc5780631694505e146102a557806318160ddd146102dd578063226cfa3d146102f257806323b872dd1461031f57600080fd5b806306fdde0314610209578063095ea7b31461023457806309bbedde14610264578063163c7cef1461028357600080fd5b3661020457005b600080fd5b34801561021557600080fd5b5061021e61069c565b60405161022b9190611839565b60405180910390f35b34801561024057600080fd5b5061025461024f36600461189c565b61072e565b604051901515815260200161022b565b34801561027057600080fd5b50600c545b60405190815260200161022b565b34801561028f57600080fd5b506102a361029e3660046118c8565b610745565b005b3480156102b157600080fd5b506009546102c5906001600160a01b031681565b6040516001600160a01b03909116815260200161022b565b3480156102e957600080fd5b50600254610275565b3480156102fe57600080fd5b5061027561030d3660046118e1565b60116020526000908152604090205481565b34801561032b57600080fd5b5061025461033a3660046118fe565b61081a565b34801561034b57600080fd5b5061027561035a3660046118e1565b610883565b34801561036b57600080fd5b506040516012815260200161022b565b34801561038757600080fd5b506102a36103963660046118e1565b6108df565b3480156103a757600080fd5b506102546103b636600461189c565b610a06565b3480156103c757600080fd5b506102546103d63660046118e1565b60106020526000908152604090205460ff1681565b3480156103f757600080fd5b506102a3610a3c565b34801561040c57600080fd5b506102a361041b3660046118c8565b610a72565b34801561042c57600080fd5b5061027560125481565b34801561044257600080fd5b506102756104513660046118e1565b6001600160a01b031660009081526020819052604090205490565b34801561047857600080fd5b506102a3610b2f565b34801561048d57600080fd5b5061027560075481565b3480156104a357600080fd5b506102a36104b23660046118e1565b610ba3565b3480156104c357600080fd5b506005546001600160a01b03166102c5565b3480156104e157600080fd5b506102756104f03660046118e1565b610bd6565b34801561050157600080fd5b5061021e610be1565b34801561051657600080fd5b5061025461052536600461189c565b610bf0565b34801561053657600080fd5b506102756105453660046118e1565b610c3f565b34801561055657600080fd5b5061025461056536600461189c565b610c6b565b34801561057657600080fd5b506102756105853660046118e1565b6001600160a01b03166000908152600b602052604090205490565b3480156105ac57600080fd5b506102546105bb36600461194d565b610c78565b3480156105cc57600080fd5b5061027560135481565b3480156105e257600080fd5b506102a36105f13660046118e1565b610d26565b34801561060257600080fd5b50610275610611366004611986565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561064857600080fd5b506102a361065736600461189c565b610d59565b34801561066857600080fd5b506102a36106773660046118e1565b610ec3565b34801561068857600080fd5b506008546102c5906001600160a01b031681565b6060600380546106ab906119b4565b80601f01602080910402602001604051908101604052809291908181526020018280546106d7906119b4565b80156107245780601f106106f957610100808354040283529160200191610724565b820191906000526020600020905b81548152906001019060200180831161070757829003601f168201915b5050505050905090565b600061073b338484610fae565b5060015b92915050565b6005546001600160a01b031633146107785760405162461bcd60e51b815260040161076f906119ee565b60405180910390fd5b80601354036108155760405162461bcd60e51b815260206004820152605b60248201527f414d46546f6b656e5f4469766964656e645f547261636b65723a206d696e696d60448201527f756d546f6b656e42616c616e6365466f724469766964656e647320616c72656160648201527f6479207468652076616c7565206f6620276e657756616c7565272e0000000000608482015260a40161076f565b601355565b60006108278484846110d2565b610879843361087485604051806060016040528060288152602001611b20602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190611132565b610fae565b5060019392505050565b6001600160a01b0381166000908152600a602090815260408083205491839052822054600654600160801b926108d5926108d0926108ca916108c5919061116c565b6111f5565b90611205565b611243565b61073f9190611a39565b6005546001600160a01b031633146109095760405162461bcd60e51b815260040161076f906119ee565b6001600160a01b03811660009081526010602052604090205460ff161561092f57600080fd5b6001600160a01b0381166000908152601060205260408120805460ff1916600117905561095d908290611256565b60405163131836e760e21b8152600c60048201526001600160a01b03821660248201527327da11576a8d3b9e5d7cec94d0beda09296a029190634c60db9c9060440160006040518083038186803b1580156109b757600080fd5b505af41580156109cb573d6000803e3d6000fd5b50506040516001600160a01b03841692507fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b259150600090a250565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161073b91859061087490866112bb565b6005546001600160a01b03163314610a665760405162461bcd60e51b815260040161076f906119ee565b610a6f3361131a565b50565b6005546001600160a01b03163314610a9c5760405162461bcd60e51b815260040161076f906119ee565b6000610aa760025490565b11610ab157600080fd5b8015610a6f57610ae4610ac360025490565b610ad183600160801b61116c565b610adb9190611a39565b600654906112bb565b60065560405181815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a2600754610b2990826112bb565b60075550565b6005546001600160a01b03163314610b595760405162461bcd60e51b815260040161076f906119ee565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b03163314610bcd5760405162461bcd60e51b815260040161076f906119ee565b610a6f8161147f565b600061073f82610c3f565b6060600480546106ab906119b4565b600061073b338461087485604051806060016040528060258152602001611b48602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190611132565b6001600160a01b0381166000908152600b602052604081205461073f90610c6584610883565b906114cb565b600061073b3384846110d2565b6005546000906001600160a01b03163314610ca55760405162461bcd60e51b815260040161076f906119ee565b6000610cb08461131a565b90508015610d1c576001600160a01b038416600081815260116020526040908190204290555184151591907fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf09290610d0a9085815260200190565b60405180910390a3600191505061073f565b5060009392505050565b6005546001600160a01b03163314610d505760405162461bcd60e51b815260040161076f906119ee565b610a6f8161150d565b6005546001600160a01b03163314610d835760405162461bcd60e51b815260040161076f906119ee565b6001600160a01b03821660009081526010602052604090205460ff16610ebf576013548110610e3457610db68282611256565b604051632f0ad01760e21b8152600c60048201526001600160a01b0383166024820152604481018290527327da11576a8d3b9e5d7cec94d0beda09296a02919063bc2b405c9060640160006040518083038186803b158015610e1757600080fd5b505af4158015610e2b573d6000803e3d6000fd5b50505050610eb2565b610e3f826000611256565b60405163131836e760e21b8152600c60048201526001600160a01b03831660248201527327da11576a8d3b9e5d7cec94d0beda09296a029190634c60db9c9060440160006040518083038186803b158015610e9957600080fd5b505af4158015610ead573d6000803e3d6000fd5b505050505b610ebd826001610c78565b505b5050565b6005546001600160a01b03163314610eed5760405162461bcd60e51b815260040161076f906119ee565b6001600160a01b038116610f525760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161076f565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383166110105760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161076f565b6001600160a01b0382166110715760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161076f565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60405162461bcd60e51b815260206004820152602f60248201527f414d46546f6b656e5f4469766964656e645f547261636b65723a204e6f20747260448201526e185b9cd9995c9cc8185b1b1bddd959608a1b606482015260840161076f565b600081848411156111565760405162461bcd60e51b815260040161076f9190611839565b5060006111638486611a5b565b95945050505050565b60008260000361117e5750600061073f565b600061118a8385611a6e565b9050826111978583611a39565b146111ee5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b606482015260840161076f565b9392505050565b6000818181121561073f57600080fd5b6000806112128385611a85565b9050600083121580156112255750838112155b8061123a575060008312801561123a57508381125b6111ee57600080fd5b60008082121561125257600080fd5b5090565b6001600160a01b0382166000908152602081905260409020548082111561129557600061128383836114cb565b905061128f8482611559565b50610ebd565b80821015610ebd5760006112a982846114cb565b90506112b584826115bd565b50505050565b6000806112c88385611aad565b9050838110156111ee5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640161076f565b60008061132683610c3f565b90508015611476576001600160a01b0383166000908152600b602052604090205461135190826112bb565b6001600160a01b0384166000818152600b6020526040908190209290925590517fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d906113a09084815260200190565b60405180910390a260085460405163a9059cbb60e01b81526001600160a01b03858116600483015260248201849052600092169063a9059cbb906044016020604051808303816000875af11580156113fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114209190611ac0565b90508061146f576001600160a01b0384166000908152600b602052604090205461144a90836114cb565b6001600160a01b039094166000908152600b6020526040812094909455509192915050565b5092915050565b50600092915050565b6005546001600160a01b031633146114a95760405162461bcd60e51b815260040161076f906119ee565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b60006111ee83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611132565b6005546001600160a01b031633146115375760405162461bcd60e51b815260040161076f906119ee565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6115638282611601565b61159d61157e6108c58360065461116c90919063ffffffff16565b6001600160a01b0384166000908152600a6020526040902054906116ec565b6001600160a01b039092166000908152600a602052604090209190915550565b6115c78282611729565b61159d6115e26108c58360065461116c90919063ffffffff16565b6001600160a01b0384166000908152600a602052604090205490611205565b6001600160a01b0382166116575760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161076f565b61166360008383610ebd565b60025461167090826112bb565b6002556001600160a01b03821660009081526020819052604090205461169690826112bb565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b6000806116f98385611add565b90506000831215801561170c5750838113155b8061123a575060008312801561123a57508381136111ee57600080fd5b6001600160a01b0382166117895760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161076f565b61179582600083610ebd565b6117d281604051806060016040528060228152602001611afe602291396001600160a01b0385166000908152602081905260409020549190611132565b6001600160a01b0383166000908152602081905260409020556002546117f890826114cb565b6002556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016116e0565b600060208083528351808285015260005b818110156118665785810183015185820160400152820161184a565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610a6f57600080fd5b600080604083850312156118af57600080fd5b82356118ba81611887565b946020939093013593505050565b6000602082840312156118da57600080fd5b5035919050565b6000602082840312156118f357600080fd5b81356111ee81611887565b60008060006060848603121561191357600080fd5b833561191e81611887565b9250602084013561192e81611887565b929592945050506040919091013590565b8015158114610a6f57600080fd5b6000806040838503121561196057600080fd5b823561196b81611887565b9150602083013561197b8161193f565b809150509250929050565b6000806040838503121561199957600080fd5b82356119a481611887565b9150602083013561197b81611887565b600181811c908216806119c857607f821691505b6020821081036119e857634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082611a5657634e487b7160e01b600052601260045260246000fd5b500490565b8181038181111561073f5761073f611a23565b808202811582820484141761073f5761073f611a23565b8082018281126000831280158216821582161715611aa557611aa5611a23565b505092915050565b8082018082111561073f5761073f611a23565b600060208284031215611ad257600080fd5b81516111ee8161193f565b818103600083128015838313168383128216171561146f5761146f611a2356fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220835471c3de882357c4226cb182a781251eb12c7a131c1135fe7e53f1afa0b21364736f6c63430008110033

Deployed Bytecode

0x6080604052600436106102975760003560e01c8063781edb3c1161015a578063aa4bde28116100c1578063cd43e2281161007a578063cd43e228146107de578063d2d7ad8314610850578063d322157614610866578063dd62ed3e14610886578063f2fde38b146108cc578063fe017535146108ec57600080fd5b8063aa4bde2814610718578063adb42e3a1461072e578063aee50b1e1461074e578063b1ba39ea1461076e578063b62496f51461078e578063c0246668146107be57600080fd5b80639dccf6f1116101135780639dccf6f1146106565780639fad96831461066b578063a39b8efc1461068b578063a457c2d7146106b8578063a8b9d240146106d8578063a9059cbb146106f857600080fd5b8063781edb3c146105ad578063880bcbc1146105cd5780638c0b5e22146105ed5780638d0445ee146106035780638da5cb5b1461062357806395d89b411461064157600080fd5b806330bb4cff116101fe5780634e71d92d116101b75780634e71d92d1461050e5780635ebf4db91461052357806364b0f653146105435780636843cd841461055857806370a0823114610578578063715018a61461059857600080fd5b806330bb4cff14610449578063313ce5671461045e57806331e79db01461047a578063395093511461049a57806342966c68146104ba57806349bd5a5e146104da57600080fd5b806318160ddd1161025057806318160ddd1461038a5780631e293c10146103a957806323b872dd146103c957806327a14fc2146103e95780632ad2581c146104095780632c1f52161461042957600080fd5b8063064a59d0146102a357806306fdde03146102d9578063095ea7b3146102fb578063098df5851461031b5780630bd05b691461033d5780631694505e1461035257600080fd5b3661029e57005b600080fd5b3480156102af57600080fd5b506007546102c490600160a01b900460ff1681565b60405190151581526020015b60405180910390f35b3480156102e557600080fd5b506102ee610932565b6040516102d0919061392a565b34801561030757600080fd5b506102c461031636600461398d565b6109c4565b34801561032757600080fd5b5061033b6103363660046139b9565b6109db565b005b34801561034957600080fd5b5061033b610b00565b34801561035e57600080fd5b50600654610372906001600160a01b031681565b6040516001600160a01b0390911681526020016102d0565b34801561039657600080fd5b506003545b6040519081526020016102d0565b3480156103b557600080fd5b5061033b6103c43660046139b9565b610b3f565b3480156103d557600080fd5b506102c46103e43660046139d2565b610c2f565b3480156103f557600080fd5b5061033b6104043660046139b9565b610c98565b34801561041557600080fd5b50601854610372906001600160a01b031681565b34801561043557600080fd5b50600754610372906001600160a01b031681565b34801561045557600080fd5b5061039b610de9565b34801561046a57600080fd5b50604051601281526020016102d0565b34801561048657600080fd5b5061033b610495366004613a13565b610e5c565b3480156104a657600080fd5b506102c46104b536600461398d565b610ee9565b3480156104c657600080fd5b5061033b6104d53660046139b9565b610f1f565b3480156104e657600080fd5b506103727f000000000000000000000000cb622e1f7fdb8206854393d8b4fa251431e0840a81565b34801561051a57600080fd5b5061033b610f2c565b34801561052f57600080fd5b5061033b61053e3660046139b9565b610fa1565b34801561054f57600080fd5b5061039b610ffc565b34801561056457600080fd5b5061039b610573366004613a13565b611046565b34801561058457600080fd5b5061039b610593366004613a13565b6110b6565b3480156105a457600080fd5b5061033b6110d1565b3480156105b957600080fd5b5061033b6105c8366004613a3e565b611145565b3480156105d957600080fd5b5061033b6105e8366004613a3e565b61120f565b3480156105f957600080fd5b5061039b60095481565b34801561060f57600080fd5b5061033b61061e366004613a77565b6112d1565b34801561062f57600080fd5b506000546001600160a01b0316610372565b34801561064d57600080fd5b506102ee61172a565b34801561066257600080fd5b5061033b611739565b34801561067757600080fd5b5061033b610686366004613ad8565b61177a565b34801561069757600080fd5b5061039b6106a6366004613a13565b60176020526000908152604090205481565b3480156106c457600080fd5b506102c46106d336600461398d565b6118ae565b3480156106e457600080fd5b5061039b6106f3366004613a13565b6118fd565b34801561070457600080fd5b506102c461071336600461398d565b611930565b34801561072457600080fd5b5061039b60085481565b34801561073a57600080fd5b5061033b61074936600461398d565b61193d565b34801561075a57600080fd5b5061033b6107693660046139b9565b6119dd565b34801561077a57600080fd5b5061033b610789366004613ad8565b611aa7565b34801561079a57600080fd5b506102c46107a9366004613a13565b60166020526000908152604090205460ff1681565b3480156107ca57600080fd5b5061033b6107d9366004613a3e565b611b7b565b3480156107ea57600080fd5b5060115460ff808216916201000081048216916401000000008204811691600160301b8104821691600160401b909104165b6040805160ff968716815294861660208601529285169284019290925283166060830152909116608082015260a0016102d0565b34801561085c57600080fd5b5061039b600b5481565b34801561087257600080fd5b5061033b610881366004613a3e565b611c3d565b34801561089257600080fd5b5061039b6108a1366004613b3d565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b3480156108d857600080fd5b5061033b6108e7366004613a13565b611cbf565b3480156108f857600080fd5b5060115460ff610100820481169163010000008104821691600160281b8204811691600160381b8104821691600160481b9091041661081c565b60606004805461094190613b6b565b80601f016020809104026020016040519081016040528092919081815260200182805461096d90613b6b565b80156109ba5780601f1061098f576101008083540402835291602001916109ba565b820191906000526020600020905b81548152906001019060200180831161099d57829003601f168201915b5050505050905090565b60006109d1338484611e0f565b5060015b92915050565b6000546001600160a01b03163314610a0e5760405162461bcd60e51b8152600401610a0590613ba5565b60405180910390fd5b478110610a6c5760405162461bcd60e51b815260206004820152602660248201527f43616e6e6f742073656e64206d6f7265207468616e20636f6e74726163742062604482015265616c616e636560d01b6064820152608401610a05565b600080546040516001600160a01b039091169083908381818185875af1925050503d8060008114610ab9576040519150601f19603f3d011682016040523d82523d6000602084013e610abe565b606091505b505090508015610afc576040518281527f362ae087cf4ccfc970d45b9e8ce6520f03b4eda3f9d76a70b655dc22badcca489060200160405180910390a15b5050565b6000546001600160a01b03163314610b2a5760405162461bcd60e51b8152600401610a0590613ba5565b6007805460ff60a01b1916600160a01b179055565b6000546001600160a01b03163314610b695760405162461bcd60e51b8152600401610a0590613ba5565b670de0b6b3a76400006103e8610b7e60035490565b610b89906002613bf0565b610b939190613c1d565b610b9d9190613c1d565b811015610bfc5760405162461bcd60e51b815260206004820152602760248201527f43616e6e6f7420736574206d6178547820416d6f756e74206c6f776572207468604482015266616e20302e322560c81b6064820152608401610a05565b60095460405182907f75f1c17bf623f0f7a2bd91ba61e89dff216960370e3e9a46b250750d03e4215e90600090a3600955565b6000610c3c848484611f34565b610c8e8433610c8985604051806060016040528060288152602001613ee5602891396001600160a01b038a16600090815260026020908152604080832033845290915290205491906124d0565b611e0f565b5060019392505050565b6000546001600160a01b03163314610cc25760405162461bcd60e51b8152600401610a0590613ba5565b670de0b6b3a76400006103e8610cd760035490565b610ce2906014613bf0565b610cec9190613c1d565b610cf69190613c1d565b811015610d515760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015263302e322560e01b6064820152608401610a05565b6008548103610db65760405162461bcd60e51b815260206004820152602b60248201527f43616e6e6f7420757064617465206d617857616c6c6574416d6f756e7420746f60448201526a2073616d652076616c756560a81b6064820152608401610a05565b60085460405182907f6d3e257c59a11116c3e97bb144abf5ba1a6a9da6bd509192ecf0d48f7be1fc7690600090a3600855565b600754604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015610e33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e579190613c31565b905090565b6000546001600160a01b03163314610e865760405162461bcd60e51b8152600401610a0590613ba5565b60075460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024015b600060405180830381600087803b158015610ece57600080fd5b505af1158015610ee2573d6000803e3d6000fd5b5050505050565b3360008181526002602090815260408083206001600160a01b038716845290915281205490916109d1918590610c899086611da9565b610f29338261250a565b50565b600754604051635e2c6e2760e11b8152336004820152600060248201526001600160a01b039091169063bc58dc4e906044016020604051808303816000875af1158015610f7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f299190613c4a565b6000546001600160a01b03163314610fcb5760405162461bcd60e51b8152600401610a0590613ba5565b60075460405163163c7cef60e01b8152600481018390526001600160a01b039091169063163c7cef90602401610eb4565b600754604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015610e33573d6000803e3d6000fd5b6007546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa158015611092573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109d59190613c31565b6001600160a01b031660009081526001602052604090205490565b6000546001600160a01b031633146110fb5760405162461bcd60e51b8152600401610a0590613ba5565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b0316331461116f5760405162461bcd60e51b8152600401610a0590613ba5565b6001600160a01b03821660009081526015602052604090205481151560ff9091161515036111af5760405162461bcd60e51b8152600401610a0590613c67565b6001600160a01b038216600081815260156020908152604091829020805460ff191685151590811790915591519182527fb7eada217e08491d4a03c266f93cd278befd124ab34890a5e7f44d023cbade7391015b60405180910390a25050565b6000546001600160a01b031633146112395760405162461bcd60e51b8152600401610a0590613ba5565b6001600160a01b03821660009081526014602052604090205481151560ff9091161515036112795760405162461bcd60e51b8152600401610a0590613c67565b6001600160a01b038216600081815260146020908152604091829020805460ff191685151590811790915591519182527f30098fc83ab61b1a98835d32c4e611adedccfc260eeef586bd329d48e8a40a409101611203565b6000546001600160a01b031633146112fb5760405162461bcd60e51b8152600401610a0590613ba5565b600c546001600160a01b03848116911614611460576001600160a01b0383166113665760405162461bcd60e51b815260206004820152601f60248201527f546865206c697175696469747957616c6c65742063616e6e6f742062652030006044820152606401610a05565b7f000000000000000000000000cb622e1f7fdb8206854393d8b4fa251431e0840a6001600160a01b0316836001600160a01b0316036113e75760405162461bcd60e51b815260206004820152601f60248201527f546865206c697175696469747957616c6c65742063616e6e6f742062652030006044820152606401610a05565b600c546040516e1b1a5c5d5a591a5d1e55d85b1b195d608a1b81526001600160a01b0391821691851690600f01604051908190038120907fd1fafbc3fb0c1fd12765451e803b8d5049dca18f8055298e7d18ebcd0d2ce31290600090a4600c80546001600160a01b0319166001600160a01b0385161790555b600d546001600160a01b038381169116146115c5576001600160a01b0382166114cb5760405162461bcd60e51b815260206004820152601f60248201527f546865206d61726b6574696e6757616c6c65742063616e6e6f742062652030006044820152606401610a05565b7f000000000000000000000000cb622e1f7fdb8206854393d8b4fa251431e0840a6001600160a01b0316826001600160a01b03160361154c5760405162461bcd60e51b815260206004820152601f60248201527f546865206d61726b6574696e6757616c6c65742063616e6e6f742062652030006044820152606401610a05565b600d546040516e1b585c9ad95d1a5b99d5d85b1b195d608a1b81526001600160a01b0391821691841690600f01604051908190038120907fd1fafbc3fb0c1fd12765451e803b8d5049dca18f8055298e7d18ebcd0d2ce31290600090a4600d80546001600160a01b0319166001600160a01b0384161790555b600e546001600160a01b03828116911614611725576001600160a01b0381166116305760405162461bcd60e51b815260206004820152601a60248201527f546865207465616d57616c6c65742063616e6e6f7420626520300000000000006044820152606401610a05565b7f000000000000000000000000cb622e1f7fdb8206854393d8b4fa251431e0840a6001600160a01b0316816001600160a01b0316036116b15760405162461bcd60e51b815260206004820152601a60248201527f546865207465616d57616c6c65742063616e6e6f7420626520300000000000006044820152606401610a05565b600e54604051691d19585b55d85b1b195d60b21b81526001600160a01b0391821691831690600a01604051908190038120907fd1fafbc3fb0c1fd12765451e803b8d5049dca18f8055298e7d18ebcd0d2ce31290600090a4600e80546001600160a01b0319166001600160a01b0383161790555b505050565b60606005805461094190613b6b565b6000546001600160a01b031633146117635760405162461bcd60e51b8152600401610a0590613ba5565b6b1027e72f1f128130880000006008819055600955565b6000546001600160a01b031633146117a45760405162461bcd60e51b8152600401610a0590613ba5565b8082846117b18789613cb1565b6117bb9190613cb1565b6117c59190613cb1565b6117cf9190613cb1565b60ff166005116118215760405162461bcd60e51b815260206004820152601760248201527f62757920666565206d75737420626520666169722121210000000000000000006044820152606401610a05565b611830600f8686868686612615565b6040516b62617365466565732d42757960a01b8152600c015b6040805191829003822060ff8881168452878116602085015286811684840152858116606085015284166080840152905190917f9a3619059270a48acdf850268d8f96db29f0cfe103bc17b5b4040a05af4d4f67919081900360a00190a25050505050565b60006109d13384610c8985604051806060016040528060258152602001613f2d602591393360009081526002602090815260408083206001600160a01b038d16845290915290205491906124d0565b6007546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d24090602401611075565b60006109d1338484611f34565b600b54611949306110b6565b10156119ab5760405162461bcd60e51b815260206004820152602b60248201527f737761702076616c69646174696f6e20666f72206d696e696d756d546f6b656e60448201526a0734265666f7265537761760ac1b6064820152608401610a05565b6119b582826128fd565b15610afc57600a805460ff191660011790556119cf612b6e565b600a805460ff191690555050565b6000546001600160a01b03163314611a075760405162461bcd60e51b8152600401610a0590613ba5565b600b548103611a745760405162461bcd60e51b815260206004820152603360248201527f43616e6e6f7420757064617465206d696e696d756d546f6b656e734265666f72604482015272655377617020746f2073616d652076616c756560681b6064820152608401610a05565b600b5460405182907f5b0491f767c1463bea8972339f785795be1a38784cc6483cf649cdcbb28c46b090600090a3600b55565b6000546001600160a01b03163314611ad15760405162461bcd60e51b8152600401610a0590613ba5565b808284611ade8789613cb1565b611ae89190613cb1565b611af29190613cb1565b611afc9190613cb1565b60ff16600511611b4e5760405162461bcd60e51b815260206004820152601860248201527f73656c6c20666565206d757374206265206661697221212100000000000000006044820152606401610a05565b611b5d600f8686868686612fb4565b6040516c18985cd95199595ccb54d95b1b609a1b8152600d01611849565b6000546001600160a01b03163314611ba55760405162461bcd60e51b8152600401610a0590613ba5565b6001600160a01b03821660009081526013602052604090205481151560ff909116151503611be55760405162461bcd60e51b8152600401610a0590613c67565b6001600160a01b038216600081815260136020908152604091829020805460ff191685151590811790915591519182527fa856ba9fdc54a5434b2359874c95612f520a2d7f858864ae98d15c1b2099ca8b9101611203565b6000546001600160a01b03163314611c675760405162461bcd60e51b8152600401610a0590613ba5565b6001600160a01b038216600081815260126020908152604091829020805460ff191685151590811790915591519182527fcb9f97b7b4b41413e5c8d418a8cf9a88db1cf34dee66b213d070faf881d9d3509101611203565b6000546001600160a01b03163314611ce95760405162461bcd60e51b8152600401610a0590613ba5565b6001600160a01b038116611d4e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a05565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600080611db68385613cca565b905083811015611e085760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610a05565b9392505050565b6001600160a01b038316611e715760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a05565b6001600160a01b038216611ed25760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a05565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038316611f5a5760405162461bcd60e51b8152600401610a0590613cdd565b6001600160a01b038216611f805760405162461bcd60e51b8152600401610a0590613d22565b80600003611f9457611725838360006132b5565b6001600160a01b03808416600081815260166020908152604080832054948716835280832054938352601290915290205460ff928316929182169116158015611ff657506001600160a01b03841660009081526012602052604090205460ff16155b1561219d57600754600160a01b900460ff166120545760405162461bcd60e51b815260206004820152601e60248201527f54726164696e672069732063757272656e746c792064697361626c65642e00006044820152606401610a05565b6001600160a01b03841660009081526014602052604090205460ff1615801561209657506001600160a01b03851660009081526014602052604090205460ff16155b156120fc576009548311156120fc5760405162461bcd60e51b815260206004820152602660248201527f42757920616d6f756e74206578636565647320746865206d617854784275794160448201526536b7bab73a1760d11b6064820152608401610a05565b6001600160a01b03841660009081526015602052604090205460ff1661219d5760085483612129866110b6565b6121339190613cca565b111561219d5760405162461bcd60e51b815260206004820152603360248201527f45787065637465642077616c6c657420616d6f756e742065786365656473207460448201527234329036b0bc2bb0b63632ba20b6b7bab73a1760691b6064820152608401610a05565b6121a9828287876133c1565b6000600b546121b7306110b6565b6007549111159150600160a01b900460ff1680156121d25750805b80156121e15750600a5460ff16155b80156121f85750601854600160c81b900460ff1615155b801561221c57506001600160a01b03851660009081526016602052604090205460ff165b801561224157506001600160a01b03861660009081526013602052604090205460ff16155b801561226657506001600160a01b03851660009081526013602052604090205460ff16155b1561228b57600a805460ff19166001179055612280612b6e565b600a805460ff191690555b600a5460009060ff161580156122aa5750600754600160a01b900460ff165b6001600160a01b03881660009081526013602052604090205490915060ff16806122ec57506001600160a01b03861660009081526013602052604090205460ff165b156122f5575060005b80801561230d5750601854600160c81b900460ff1615155b156123d65760185460009060649061232f90600160c81b900460ff1688613bf0565b6123399190613c1d565b60185490915060009060649061235990600160b81b900460ff1689613bf0565b6123639190613c1d565b905061236f8288613d65565b965061237c8930846132b5565b80156123d35761238c308261250a565b60185460408051600160b81b90920460ff168252602082018390527ffecf12fd01122af77b8b8f1a0f126363142d14fba298ea36d9fe4909f61bb5a1910160405180910390a15b50505b6123e18787876132b5565b6007546001600160a01b031663e30443bc886123fc816110b6565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561244257600080fd5b505af1925050508015612453575060015b506007546001600160a01b031663e30443bc8761246f816110b6565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156124b557600080fd5b505af19250505080156124c6575060015b5050505050505050565b600081848411156124f45760405162461bcd60e51b8152600401610a05919061392a565b5060006125018486613d65565b95945050505050565b6001600160a01b03821661256a5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610a05565b6125a781604051806060016040528060228152602001613e9d602291396001600160a01b03851660009081526001602052604090205491906124d0565b6001600160a01b0383166000908152600160205260409020556003546125cd90826136e9565b6003556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b600286015460ff86811691161461269657604051706c69717569646974794665654f6e42757960781b815260110160405190819003812060028801548854919260ff9182169291891691600080516020613f0d8339815191529161267c9160481b90613d78565b60405180910390a460028601805460ff191660ff87161790555b600286015460ff85811662010000909204161461272a57604051706d61726b6574696e674665654f6e42757960781b815260110160405190819003812060028801548854919260ff6201000090920482169291881691600080516020613f0d833981519152916127099160481b90613d78565b60405180910390a460028601805462ff000019166201000060ff8716021790555b600286015460ff84811664010000000090920416146127c4576040516e6275794261636b4665654f6e42757960881b8152600f0160405190819003812060028801548854919260ff64010000000090920482169291871691600080516020613f0d8339815191529161279f9160481b90613d78565b60405180910390a460028601805464ff00000000191664010000000060ff8616021790555b600286015460ff838116600160301b909204161461285a576040516b6275726e4665654f6e42757960a01b8152600c0160405190819003812060028801548854919260ff600160301b90920482169291861691600080516020613f0d833981519152916128349160481b90613d78565b60405180910390a460028601805466ff0000000000001916600160301b60ff8516021790555b600286015460ff828116600160401b90920416146128f5576040516e686f6c646572734665654f6e42757960881b8152600f0160405190819003812060028801548854919260ff600160401b90920482169291851691600080516020613f0d833981519152916128cd9160481b90613d78565b60405180910390a460028601805468ff00000000000000001916600160401b60ff8416021790555b505050505050565b600754604051634e7b827f60e01b815233600482015260009182916001600160a01b0390911690634e7b827f90602401602060405180830381865afa15801561294a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061296e9190613c4a565b612aa457601854600160c81b900460ff16156129f6576018546000906064906129a190600160c81b900460ff1686613bf0565b6129ab9190613c1d565b6018549091506000906064906129cb90600160b81b900460ff1687613bf0565b6129d59190613c1d565b90506129e18286613d65565b945080156129f3576129f3338261250a565b50505b6000612a01306110b6565b60185490915060009060029060ff600160c81b8204811691612a2c91600160a01b9091041685613bf0565b612a369190613c1d565b612a409190613c1d565b60185490915060009060ff600160c81b8204811691612a6891600160c01b9091041685613bf0565b612a729190613c1d565b90506000612a808284613cca565b612a8a9085613d65565b90508015612a9757600194505b84955050505050506109d5565b6000612aaf306110b6565b1115612ac357612abf848461250a565b5060005b6000612ace306110b6565b60185490915060009060029060ff600160c81b8204811691612af991600160a01b9091041685613bf0565b612b039190613c1d565b612b0d9190613c1d565b60185490915060009060ff600160c81b8204811691612b3591600160c01b9091041685613bf0565b612b3f9190613c1d565b90506000612b4d8284613cca565b612b579085613d65565b90508015612a975750600094506109d59350505050565b6000612b79306110b6565b600b549091504790612b8c906007613bf0565b821115612ba457600b54612ba1906007613bf0565b91505b601854600090819060029060ff600160c81b8204811691612bce91600160a01b9091041687613bf0565b612bd89190613c1d565b612be29190613c1d565b60185490915060009060ff600160c81b8204811691612c0a91600160c01b9091041687613bf0565b612c149190613c1d565b90506000612c228284613cca565b612c2c9087613d65565b9050612c378161372b565b6000612c438647613d65565b60185490915060009060ff600160c01b8204811691600160b81b8104821691612c7791600291600160a01b90910416613d8f565b612c819190613cb1565b612c8b9190613cb1565b601854612ca29190600160c81b900460ff16613db1565b60185460ff91821692506000916002918491612cc691600160a01b90041686613bf0565b612cd09190613c1d565b612cda9190613c1d565b6018549091506000908390612cf990600160a81b900460ff1686613bf0565b612d039190613c1d565b90506000612d118284613cca565b612d1b9086613d65565b600e546040519192506001600160a01b0316908290600081818185875af1925050503d8060008114612d69576040519150601f19603f3d011682016040523d82523d6000602084013e612d6e565b606091505b50508099505088612dac5760405162461bcd60e51b8152602060048201526008602482015267737563636573732160c01b6044820152606401610a05565b600d546040516001600160a01b03909116908390600081818185875af1925050503d8060008114612df9576040519150601f19603f3d011682016040523d82523d6000602084013e612dfe565b606091505b50508099505088612e3c5760405162461bcd60e51b8152602060048201526008602482015267737563636573732160c01b6044820152606401610a05565b8715612e8e57612e4c888461387d565b60408051878152602081018590529081018990527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15b60075460405163a9059cbb60e01b81526001600160a01b03909116600482015260248101889052600090309063a9059cbb906044016020604051808303816000875af1158015612ee2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f069190613c4a565b90508015612fa657600754604051636bf5ecd560e01b8152600481018a90526001600160a01b0390911690636bf5ecd590602401600060405180830381600087803b158015612f5457600080fd5b505af1158015612f68573d6000803e3d6000fd5b505050507fa4049db804d87a845be4dd8b54ae7048131238fba985dd37234309ac8668d96988604051612f9d91815260200190565b60405180910390a15b505050505050505050505050565b600286015460ff868116610100909204161461304557604051711b1a5c5d5a591a5d1e51995953db94d95b1b60721b815260120160405190819003812060028801548854919260ff61010090920482169291891691600080516020613f0d833981519152916130269160481b90613d78565b60405180910390a460028601805461ff00191661010060ff8816021790555b600286015460ff858116630100000090920416146130de57604051711b585c9ad95d1a5b99d1995953db94d95b1b60721b815260120160405190819003812060028801548854919260ff630100000090920482169291881691600080516020613f0d833981519152916130bb9160481b90613d78565b60405180910390a460028601805463ff0000001916630100000060ff8716021790555b600286015460ff848116600160281b9092041614613177576040516f189d5e509858dad1995953db94d95b1b60821b815260100160405190819003812060028801548854919260ff600160281b90920482169291871691600080516020613f0d833981519152916131529160481b90613d78565b60405180910390a460028601805465ff00000000001916600160281b60ff8616021790555b600286015460ff838116600160381b909204161461320f576040516c189d5c9b91995953db94d95b1b609a1b8152600d0160405190819003812060028801548854919260ff600160381b90920482169291861691600080516020613f0d833981519152916131e89160481b90613d78565b60405180910390a460028601805467ff000000000000001916600160381b60ff8516021790555b600286015460ff828116600160481b90920416146128f5576040516f1a1bdb19195c9cd1995953db94d95b1b60821b815260100160405190819003812060028801548854919260ff600160481b90920482169291851691600080516020613f0d833981519152916132839160481b90613d78565b60405180910390a460028601805460ff8316600160481b0269ff00000000000000000019909116179055505050505050565b6001600160a01b0383166132db5760405162461bcd60e51b8152600401610a0590613cdd565b6001600160a01b0382166133015760405162461bcd60e51b8152600401610a0590613d22565b61333e81604051806060016040528060268152602001613ebf602691396001600160a01b03861660009081526001602052604090205491906124d0565b6001600160a01b03808516600090815260016020526040808220939093559084168152205461336d9082611da9565b6001600160a01b0380841660008181526001602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611f279085815260200190565b6018805464ffffffffff60a01b191690558315613493576011546018805461ffff60a01b191660ff808416600160a01b0260ff60a81b1916919091176201000084048216600160a81b021761ffff60b01b191664010000000084048216600160b01b0260ff60b81b191617600160301b84048216600160b81b021760ff60c01b1916600160401b90930416600160c01b029190911790556001600160a01b0381166000908152601760205260408120549003613493576001600160a01b03811660009081526017602052604090204290555b821561351f576011546018805461ffff60a01b1916610100830460ff908116600160a01b0260ff60a81b191691909117630100000084048216600160a81b021761ffff60b01b1916600160281b84048216600160b01b0260ff60b81b191617600160381b84048216600160b81b021760ff60c01b1916600160481b90930416600160c01b029190911790555b8215801561352b575083155b156135b6576011546018805461ffff60a01b1916610100830460ff908116600160a01b0260ff60a81b191691909117630100000084048216600160a81b021761ffff60b01b1916600160281b84048216600160b01b0260ff60b81b191617600160381b84048216600160b81b021760ff60c01b1916600160481b90930416600160c01b029190911790555b831580156135c75750600a5460ff16155b156135e857601880546001600160a01b0319166001600160a01b0384161790555b60185460ff600160c01b8204811691600160b81b8104821691600160b01b820481169161362691600160a81b8204811691600160a01b900416613cb1565b6136309190613cb1565b61363a9190613cb1565b6136449190613cb1565b6018805460ff60c81b1916600160c81b60ff9384168102919091179182905560408051600160a01b840485168152600160a81b840485166020820152600160b01b8404851691810191909152600160b81b830484166060820152600160c01b830484166080820152910490911660a08201527f6c6977cb51242ec6e05aba0e2a29a5292ed1a8a5cffa3b87ff66395b7997d6d29060c00160405180910390a150505050565b6000611e0883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506124d0565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061376057613760613dca565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156137b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137dd9190613de0565b816001815181106137f0576137f0613dca565b6001600160a01b0392831660209182029290920101526006546138169130911684611e0f565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac9479061384f908590600090869030904290600401613dfd565b600060405180830381600087803b15801561386957600080fd5b505af11580156128f5573d6000803e3d6000fd5b6006546138959030906001600160a01b031684611e0f565b600654600c5460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af1158015613905573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610ee29190613e6e565b600060208083528351808285015260005b818110156139575785810183015185820160400152820161393b565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610f2957600080fd5b600080604083850312156139a057600080fd5b82356139ab81613978565b946020939093013593505050565b6000602082840312156139cb57600080fd5b5035919050565b6000806000606084860312156139e757600080fd5b83356139f281613978565b92506020840135613a0281613978565b929592945050506040919091013590565b600060208284031215613a2557600080fd5b8135611e0881613978565b8015158114610f2957600080fd5b60008060408385031215613a5157600080fd5b8235613a5c81613978565b91506020830135613a6c81613a30565b809150509250929050565b600080600060608486031215613a8c57600080fd5b8335613a9781613978565b92506020840135613aa781613978565b91506040840135613ab781613978565b809150509250925092565b803560ff81168114613ad357600080fd5b919050565b600080600080600060a08688031215613af057600080fd5b613af986613ac2565b9450613b0760208701613ac2565b9350613b1560408701613ac2565b9250613b2360608701613ac2565b9150613b3160808701613ac2565b90509295509295909350565b60008060408385031215613b5057600080fd5b8235613b5b81613978565b91506020830135613a6c81613978565b600181811c90821680613b7f57607f821691505b602082108103613b9f57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176109d5576109d5613bda565b634e487b7160e01b600052601260045260246000fd5b600082613c2c57613c2c613c07565b500490565b600060208284031215613c4357600080fd5b5051919050565b600060208284031215613c5c57600080fd5b8151611e0881613a30565b6020808252602a908201527f4163636f756e7420697320616c7265616479207468652076616c7565206f6620604082015269276578636c756465642760b01b606082015260800190565b60ff81811683821601908111156109d5576109d5613bda565b808201808211156109d5576109d5613bda565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b818103818111156109d5576109d5613bda565b68ffffffffffffffffff1991909116815260200190565b600060ff831680613da257613da2613c07565b8060ff84160491505092915050565b60ff82811682821603908111156109d5576109d5613bda565b634e487b7160e01b600052603260045260246000fd5b600060208284031215613df257600080fd5b8151611e0881613978565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015613e4d5784516001600160a01b031683529383019391830191600101613e28565b50506001600160a01b03969096166060850152505050608001529392505050565b600080600060608486031215613e8357600080fd5b835192506020840151915060408401519050925092509256fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636500edc71549f0cbe47086c2237ce0cf874d6897fd1d7ce43ee6b65c0230d7606e45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220262805b7f05a10d695c2d563de16c6f82d7b3f2a9f59726d0c3704500720846c64736f6c63430008110033

Libraries Used


Deployed Bytecode Sourcemap

18998:29104:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19328:28;;;;;;;;;;-1:-1:-1;19328:28:0;;;;-1:-1:-1;;;19328:28:0;;;;;;;;;179:14:1;;172:22;154:41;;142:2;127:18;19328:28:0;;;;;;;;9877:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;10857:194::-;;;;;;;;;;-1:-1:-1;10857:194:0;;;;;:::i;:::-;;:::i;32933:347::-;;;;;;;;;;-1:-1:-1;32933:347:0;;;;;:::i;:::-;;:::i;:::-;;25705:88;;;;;;;;;;;;;:::i;19046:30::-;;;;;;;;;;-1:-1:-1;19046:30:0;;;;-1:-1:-1;;;;;19046:30:0;;;;;;-1:-1:-1;;;;;1579:32:1;;;1561:51;;1549:2;1534:18;19046:30:0;1400:218:1;10198:108:0;;;;;;;;;;-1:-1:-1;10286:12:0;;10198:108;;;1769:25:1;;;1757:2;1742:18;10198:108:0;1623:177:1;31492:323:0;;;;;;;;;;-1:-1:-1;31492:323:0;;;;;:::i;:::-;;:::i;11059:454::-;;;;;;;;;;-1:-1:-1;11059:454:0;;;;;:::i;:::-;;:::i;31823:450::-;;;;;;;;;;-1:-1:-1;31823:450:0;;;;;:::i;:::-;;:::i;20765:28::-;;;;;;;;;;-1:-1:-1;20765:28:0;;;;-1:-1:-1;;;;;20765:28:0;;;19276:43;;;;;;;;;;-1:-1:-1;19276:43:0;;;;-1:-1:-1;;;;;19276:43:0;;;33393:141;;;;;;;;;;;;;:::i;10097:93::-;;;;;;;;;;-1:-1:-1;10097:93:0;;10180:2;2861:36:1;;2849:2;2834:18;10097:93:0;2719:184:1;26859:130:0;;;;;;;;;;-1:-1:-1;26859:130:0;;;;;:::i;:::-;;:::i;11521:293::-;;;;;;;;;;-1:-1:-1;11521:293:0;;;;;:::i;:::-;;:::i;33288:81::-;;;;;;;;;;-1:-1:-1;33288:81:0;;;;;:::i;:::-;;:::i;19083:38::-;;;;;;;;;;;;;;;32820:105;;;;;;;;;;;;;:::i;32643:169::-;;;;;;;;;;-1:-1:-1;32643:169:0;;;;;:::i;:::-;;:::i;33885:142::-;;;;;;;;;;;;;:::i;33720:157::-;;;;;;;;;;-1:-1:-1;33720:157:0;;;;;:::i;:::-;;:::i;10314:143::-;;;;;;;;;;-1:-1:-1;10314:143:0;;;;;:::i;:::-;;:::i;8996:148::-;;;;;;;;;;;;;:::i;27415:396::-;;;;;;;;;;-1:-1:-1;27415:396:0;;;;;:::i;:::-;;:::i;26997:410::-;;;;;;;;;;-1:-1:-1;26997:410:0;;;;;:::i;:::-;;:::i;19511:54::-;;;;;;;;;;;;;;;;27819:1709;;;;;;;;;;-1:-1:-1;27819:1709:0;;;;;:::i;:::-;;:::i;8782:79::-;;;;;;;;;;-1:-1:-1;8820:7:0;8847:6;-1:-1:-1;;;;;8847:6:0;8782:79;;9985:104;;;;;;;;;;;;;:::i;47975:124::-;;;;;;;;;;;;;:::i;29554:949::-;;;;;;;;;;-1:-1:-1;29554:949:0;;;;;:::i;:::-;;:::i;20706:52::-;;;;;;;;;;-1:-1:-1;20706:52:0;;;;;:::i;:::-;;;;;;;;;;;;;;11822:393;;;;;;;;;;-1:-1:-1;11822:393:0;;;;;:::i;:::-;;:::i;33542:170::-;;;;;;;;;;-1:-1:-1;33542:170:0;;;;;:::i;:::-;;:::i;10465:200::-;;;;;;;;;;-1:-1:-1;10465:200:0;;;;;:::i;:::-;;:::i;19444:58::-;;;;;;;;;;;;;;;;47150:386;;;;;;;;;;-1:-1:-1;47150:386:0;;;;;:::i;:::-;;:::i;32281:354::-;;;;;;;;;;-1:-1:-1;32281:354:0;;;;;:::i;:::-;;:::i;30511:973::-;;;;;;;;;;-1:-1:-1;30511:973:0;;;;;:::i;:::-;;:::i;20642:57::-;;;;;;;;;;-1:-1:-1;20642:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;26495:356;;;;;;;;;;-1:-1:-1;26495:356:0;;;;;:::i;:::-;;:::i;34035:334::-;;;;;;;;;;-1:-1:-1;34184:23:0;;;;;;;34222;;;;;;34260:21;;;;;;-1:-1:-1;;;34296:18:0;;;;;-1:-1:-1;;;34329:21:0;;;;34035:334;;;;5103:4:1;5091:17;;;5073:36;;5145:17;;;5140:2;5125:18;;5118:45;5199:17;;;5179:18;;;5172:45;;;;5253:17;;5248:2;5233:18;;5226:45;5308:17;;;5302:3;5287:19;;5280:46;5060:3;5045:19;34035:334:0;4834:498:1;19603:64:0;;;;;;;;;;;;;;;;26245:242;;;;;;;;;;-1:-1:-1;26245:242:0;;;;;:::i;:::-;;:::i;10673:176::-;;;;;;;;;;-1:-1:-1;10673:176:0;;;;;:::i;:::-;-1:-1:-1;;;;;10814:18:0;;;10787:7;10814:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;10673:176;9152:281;;;;;;;;;;-1:-1:-1;9152:281:0;;;;;:::i;:::-;;:::i;34377:340::-;;;;;;;;;;-1:-1:-1;34527:24:0;;;;;;;;;34566;;;;;;-1:-1:-1;;;34605:22:0;;;;;-1:-1:-1;;;34642:19:0;;;;;-1:-1:-1;;;34676:22:0;;;;34377:340;;9877:100;9931:13;9964:5;9957:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9877:100;:::o;10857:194::-;10965:4;10982:39;8170:10;11005:7;11014:6;10982:8;:39::i;:::-;-1:-1:-1;11039:4:0;10857:194;;;;;:::o;32933:347::-;8909:6;;-1:-1:-1;;;;;8909:6:0;8170:10;8909:22;8901:67;;;;-1:-1:-1;;;8901:67:0;;;;;;;:::i;:::-;;;;;;;;;33036:21:::1;33027:6;:30;33005:118;;;::::0;-1:-1:-1;;;33005:118:0;;6678:2:1;33005:118:0::1;::::0;::::1;6660:21:1::0;6717:2;6697:18;;;6690:30;6756:34;6736:18;;;6729:62;-1:-1:-1;;;6807:18:1;;;6800:36;6853:19;;33005:118:0::1;6476:402:1::0;33005:118:0::1;33135:12;8847:6:::0;;33153:40:::1;::::0;-1:-1:-1;;;;;8847:6:0;;;;33182;;33135:12;33153:40;33135:12;33153:40;33182:6;8847;33153:40:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33134:59;;;33208:7;33204:69;;;33237:24;::::0;1769:25:1;;;33237:24:0::1;::::0;1757:2:1;1742:18;33237:24:0::1;;;;;;;33204:69;32994:286;32933:347:::0;:::o;25705:88::-;8909:6;;-1:-1:-1;;;;;8909:6:0;8170:10;8909:22;8901:67;;;;-1:-1:-1;;;8901:67:0;;;;;;;:::i;:::-;25762:16:::1;:23:::0;;-1:-1:-1;;;;25762:23:0::1;-1:-1:-1::0;;;25762:23:0::1;::::0;;25705:88::o;31492:323::-;8909:6;;-1:-1:-1;;;;;8909:6:0;8170:10;8909:22;8901:67;;;;-1:-1:-1;;;8901:67:0;;;;;;;:::i;:::-;31638:4:::1;31630;31609:13;10286:12:::0;;;10198:108;31609:13:::1;:17;::::0;31625:1:::1;31609:17;:::i;:::-;31608:26;;;;:::i;:::-;31607:35;;;;:::i;:::-;31595:8;:47;;31573:136;;;::::0;-1:-1:-1;;;31573:136:0;;7857:2:1;31573:136:0::1;::::0;::::1;7839:21:1::0;7896:2;7876:18;;;7869:30;7935:34;7915:18;;;7908:62;-1:-1:-1;;;7986:18:1;;;7979:37;8033:19;;31573:136:0::1;7655:403:1::0;31573:136:0::1;31762:11;::::0;31725:49:::1;::::0;31752:8;;31725:49:::1;::::0;;;::::1;31785:11;:22:::0;31492:323::o;11059:454::-;11199:4;11216:36;11226:6;11234:9;11245:6;11216:9;:36::i;:::-;11263:220;11286:6;8170:10;11334:138;11390:6;11334:138;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11334:19:0;;;;;;:11;:19;;;;;;;;8170:10;11334:33;;;;;;;;;;:37;:138::i;:::-;11263:8;:220::i;:::-;-1:-1:-1;11501:4:0;11059:454;;;;;:::o;31823:450::-;8909:6;;-1:-1:-1;;;;;8909:6:0;8170:10;8909:22;8901:67;;;;-1:-1:-1;;;8901:67:0;;;;;;;:::i;:::-;31965:4:::1;31957;31935:13;10286:12:::0;;;10198:108;31935:13:::1;:18;::::0;31951:2:::1;31935:18;:::i;:::-;31934:27;;;;:::i;:::-;31933:36;;;;:::i;:::-;31921:8;:48;;31899:134;;;::::0;-1:-1:-1;;;31899:134:0;;8265:2:1;31899:134:0::1;::::0;::::1;8247:21:1::0;8304:2;8284:18;;;8277:30;8343:34;8323:18;;;8316:62;-1:-1:-1;;;8394:18:1;;;8387:34;8438:19;;31899:134:0::1;8063:400:1::0;31899:134:0::1;32078:15;;32066:8;:27:::0;32044:120:::1;;;::::0;-1:-1:-1;;;32044:120:0;;8670:2:1;32044:120:0::1;::::0;::::1;8652:21:1::0;8709:2;8689:18;;;8682:30;8748:34;8728:18;;;8721:62;-1:-1:-1;;;8799:18:1;;;8792:41;8850:19;;32044:120:0::1;8468:407:1::0;32044:120:0::1;32212:15;::::0;32180:48:::1;::::0;32202:8;;32180:48:::1;::::0;;;::::1;32239:15;:26:::0;31823:450::o;33393:141::-;33483:15;;:43;;;-1:-1:-1;;;33483:43:0;;;;33456:7;;-1:-1:-1;;;;;33483:15:0;;:41;;:43;;;;;;;;;;;;;;:15;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33476:50;;33393:141;:::o;26859:130::-;8909:6;;-1:-1:-1;;;;;8909:6:0;8170:10;8909:22;8901:67;;;;-1:-1:-1;;;8901:67:0;;;;;;;:::i;:::-;26936:15:::1;::::0;:45:::1;::::0;-1:-1:-1;;;26936:45:0;;-1:-1:-1;;;;;1579:32:1;;;26936:45:0::1;::::0;::::1;1561:51:1::0;26936:15:0;;::::1;::::0;:36:::1;::::0;1534:18:1;;26936:45:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;26859:130:::0;:::o;11521:293::-;8170:10;11634:4;11723:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;11723:34:0;;;;;;;;;;11634:4;;11651:133;;11701:7;;11723:50;;11762:10;11723:38;:50::i;33288:81::-;33337:24;33343:10;33355:5;33337;:24::i;:::-;33288:81;:::o;32820:105::-;32857:15;;:60;;-1:-1:-1;;;32857:60:0;;32898:10;32857:60;;;9253:51:1;32857:15:0;9320:18:1;;;9313:50;-1:-1:-1;;;;;32857:15:0;;;;:32;;9226:18:1;;32857:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;32643:169::-;8909:6;;-1:-1:-1;;;;;8909:6:0;8170:10;8909:22;8901:67;;;;-1:-1:-1;;;8901:67:0;;;;;;;:::i;:::-;32751:15:::1;::::0;:53:::1;::::0;-1:-1:-1;;;32751:53:0;;::::1;::::0;::::1;1769:25:1::0;;;-1:-1:-1;;;;;32751:15:0;;::::1;::::0;:43:::1;::::0;1742:18:1;;32751:53:0::1;1623:177:1::0;33885:142:0;33978:15;;:41;;;-1:-1:-1;;;33978:41:0;;;;33951:7;;-1:-1:-1;;;;;33978:15:0;;:39;;:41;;;;;;;;;;;;;;:15;:41;;;;;;;;;;;;;;33720:157;33835:15;;:34;;-1:-1:-1;;;33835:34:0;;-1:-1:-1;;;;;1579:32:1;;;33835:34:0;;;1561:51:1;33808:7:0;;33835:15;;:25;;1534:18:1;;33835:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;10314:143::-;-1:-1:-1;;;;;10431:18:0;10404:7;10431:18;;;:9;:18;;;;;;;10314:143::o;8996:148::-;8909:6;;-1:-1:-1;;;;;8909:6:0;8170:10;8909:22;8901:67;;;;-1:-1:-1;;;8901:67:0;;;;;;;:::i;:::-;9103:1:::1;9087:6:::0;;9066:40:::1;::::0;-1:-1:-1;;;;;9087:6:0;;::::1;::::0;9066:40:::1;::::0;9103:1;;9066:40:::1;9134:1;9117:19:::0;;-1:-1:-1;;;;;;9117:19:0::1;::::0;;8996:148::o;27415:396::-;8909:6;;-1:-1:-1;;;;;8909:6:0;8170:10;8909:22;8901:67;;;;-1:-1:-1;;;8901:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;27559:38:0;::::1;;::::0;;;:29:::1;:38;::::0;;;;;:50;::::1;;:38;::::0;;::::1;:50;;::::0;27537:142:::1;;;;-1:-1:-1::0;;;27537:142:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;27690:38:0;::::1;;::::0;;;:29:::1;:38;::::0;;;;;;;;:49;;-1:-1:-1;;27690:49:0::1;::::0;::::1;;::::0;;::::1;::::0;;;27755:48;;154:41:1;;;27755:48:0::1;::::0;127:18:1;27755:48:0::1;;;;;;;;27415:396:::0;;:::o;26997:410::-;8909:6;;-1:-1:-1;;;;;8909:6:0;8170:10;8909:22;8901:67;;;;-1:-1:-1;;;8901:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;27146:43:0;::::1;;::::0;;;:34:::1;:43;::::0;;;;;:55;::::1;;:43;::::0;;::::1;:55;;::::0;27124:147:::1;;;;-1:-1:-1::0;;;27124:147:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;27282:43:0;::::1;;::::0;;;:34:::1;:43;::::0;;;;;;;;:54;;-1:-1:-1;;27282:54:0::1;::::0;::::1;;::::0;;::::1;::::0;;;27352:47;;154:41:1;;;27352:47:0::1;::::0;127:18:1;27352:47:0::1;14:187:1::0;27819:1709:0;8909:6;;-1:-1:-1;;;;;8909:6:0;8170:10;8909:22;8901:67;;;;-1:-1:-1;;;8901:67:0;;;;;;;:::i;:::-;27988:15:::1;::::0;-1:-1:-1;;;;;27988:37:0;;::::1;:15:::0;::::1;:37;27984:546;;-1:-1:-1::0;;;;;28068:32:0;::::1;28042:125;;;::::0;-1:-1:-1;;;28042:125:0;;10237:2:1;28042:125:0::1;::::0;::::1;10219:21:1::0;10276:2;10256:18;;;10249:30;10315:33;10295:18;;;10288:61;10366:18;;28042:125:0::1;10035:355:1::0;28042:125:0::1;28230:13;-1:-1:-1::0;;;;;28208:35:0::1;:18;-1:-1:-1::0;;;;;28208:35:0::1;::::0;28182:128:::1;;;::::0;-1:-1:-1;;;28182:128:0;;10237:2:1;28182:128:0::1;::::0;::::1;10219:21:1::0;10276:2;10256:18;;;10249:30;10315:33;10295:18;;;10288:61;10366:18;;28182:128:0::1;10035:355:1::0;28182:128:0::1;28437:15;::::0;28330:137:::1;::::0;-1:-1:-1;;;10597:30:1;;-1:-1:-1;;;;;28437:15:0;;::::1;::::0;28330:137;::::1;::::0;10652:2:1;10643:12;28330:137:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;28482:15;:36:::0;;-1:-1:-1;;;;;;28482:36:0::1;-1:-1:-1::0;;;;;28482:36:0;::::1;;::::0;;27984:546:::1;28544:15;::::0;-1:-1:-1;;;;;28544:37:0;;::::1;:15:::0;::::1;:37;28540:546;;-1:-1:-1::0;;;;;28624:32:0;::::1;28598:125;;;::::0;-1:-1:-1;;;28598:125:0;;10868:2:1;28598:125:0::1;::::0;::::1;10850:21:1::0;10907:2;10887:18;;;10880:30;10946:33;10926:18;;;10919:61;10997:18;;28598:125:0::1;10666:355:1::0;28598:125:0::1;28786:13;-1:-1:-1::0;;;;;28764:35:0::1;:18;-1:-1:-1::0;;;;;28764:35:0::1;::::0;28738:128:::1;;;::::0;-1:-1:-1;;;28738:128:0;;10868:2:1;28738:128:0::1;::::0;::::1;10850:21:1::0;10907:2;10887:18;;;10880:30;10946:33;10926:18;;;10919:61;10997:18;;28738:128:0::1;10666:355:1::0;28738:128:0::1;28993:15;::::0;28886:137:::1;::::0;-1:-1:-1;;;11228:30:1;;-1:-1:-1;;;;;28993:15:0;;::::1;::::0;28886:137;::::1;::::0;11283:2:1;11274:12;28886:137:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;29038:15;:36:::0;;-1:-1:-1;;;;;;29038:36:0::1;-1:-1:-1::0;;;;;29038:36:0;::::1;;::::0;;28540:546:::1;29100:10;::::0;-1:-1:-1;;;;;29100:27:0;;::::1;:10:::0;::::1;:27;29096:425;;-1:-1:-1::0;;;;;29170:27:0;::::1;29144:115;;;::::0;-1:-1:-1;;;29144:115:0;;11499:2:1;29144:115:0::1;::::0;::::1;11481:21:1::0;11538:2;11518:18;;;11511:30;11577:28;11557:18;;;11550:56;11623:18;;29144:115:0::1;11297:350:1::0;29144:115:0::1;29317:13;-1:-1:-1::0;;;;;29300:30:0::1;:13;-1:-1:-1::0;;;;;29300:30:0::1;::::0;29274:118:::1;;;::::0;-1:-1:-1;;;29274:118:0;;11499:2:1;29274:118:0::1;::::0;::::1;11481:21:1::0;11538:2;11518:18;;;11511:30;11577:28;11557:18;;;11550:56;11623:18;;29274:118:0::1;11297:350:1::0;29274:118:0::1;29457:10;::::0;29412:56:::1;::::0;-1:-1:-1;;;11854:25:1;;-1:-1:-1;;;;;29457:10:0;;::::1;::::0;29412:56;::::1;::::0;11904:2:1;11895:12;29412:56:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;29483:10;:26:::0;;-1:-1:-1;;;;;;29483:26:0::1;-1:-1:-1::0;;;;;29483:26:0;::::1;;::::0;;29096:425:::1;27819:1709:::0;;;:::o;9985:104::-;10041:13;10074:7;10067:14;;;;;:::i;47975:124::-;8909:6;;-1:-1:-1;;;;;8909:6:0;8170:10;8909:22;8901:67;;;;-1:-1:-1;;;8901:67:0;;;;;;;:::i;:::-;19412:23:::1;48030:15;:27:::0;;;48068:11:::1;:23:::0;47975:124::o;29554:949::-;8909:6;;-1:-1:-1;;;;;8909:6:0;8170:10;8909:22;8901:67;;;;-1:-1:-1;;;8901:67:0;;;;;;;:::i;:::-;29987:16;29950:13;29910:16;29826:60:::1;29868:18:::0;29826;:60:::1;:::i;:::-;:100;;;;:::i;:::-;:137;;;;:::i;:::-;:177;;;;:::i;:::-;29805:198;;:1;:198;29783:271;;;::::0;-1:-1:-1;;;29783:271:0;;12273:2:1;29783:271:0::1;::::0;::::1;12255:21:1::0;12312:2;12292:18;;;12285:30;12351:25;12331:18;;;12324:53;12394:18;;29783:271:0::1;12071:347:1::0;29783:271:0::1;30065:209;30102:5;30122:18;30155;30188:16;30219:13;30247:16;30065:22;:209::i;:::-;30290:205;::::0;-1:-1:-1;;;12625:27:1;;12677:2;12668:12;30290:205:0::1;;::::0;;;;;::::1;::::0;;5103:4:1;5091:17;;;5073:36;;5145:17;;;5140:2;5125:18;;5118:45;5199:17;;;5179:18;;;5172:45;5253:17;;;5248:2;5233:18;;5226:45;5308:17;;5302:3;5287:19;;5280:46;30290:205:0;;;;::::1;::::0;;;;;5060:3:1;30290:205:0;;::::1;29554:949:::0;;;;;:::o;11822:393::-;11940:4;11957:228;8170:10;12007:7;12029:145;12086:15;12029:145;;;;;;;;;;;;;;;;;8170:10;12029:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;12029:34:0;;;;;;;;;;;;:38;:145::i;33542:170::-;33657:15;;:47;;-1:-1:-1;;;33657:47:0;;-1:-1:-1;;;;;1579:32:1;;;33657:47:0;;;1561:51:1;33630:7:0;;33657:15;;:38;;1534:18:1;;33657:47:0;1400:218:1;10465:200:0;10576:4;10593:42;8170:10;10617:9;10628:6;10593:9;:42::i;47150:386::-;47279:23;;47251:24;47269:4;47251:9;:24::i;:::-;:51;;47229:144;;;;-1:-1:-1;;;47229:144:0;;12893:2:1;47229:144:0;;;12875:21:1;12932:2;12912:18;;;12905:30;12971:34;12951:18;;;12944:62;-1:-1:-1;;;13022:18:1;;;13015:41;13073:19;;47229:144:0;12691:407:1;47229:144:0;47388:32;47407:7;47416:3;47388:18;:32::i;:::-;47384:145;;;47437:9;:16;;-1:-1:-1;;47437:16:0;47449:4;47437:16;;;47468:17;:15;:17::i;:::-;47500:9;:17;;-1:-1:-1;;47500:17:0;;;47150:386;;:::o;32281:354::-;8909:6;;-1:-1:-1;;;;;8909:6:0;8170:10;8909:22;8901:67;;;;-1:-1:-1;;;8901:67:0;;;;;;;:::i;:::-;32399:23:::1;;32387:8;:35:::0;32365:136:::1;;;::::0;-1:-1:-1;;;32365:136:0;;13305:2:1;32365:136:0::1;::::0;::::1;13287:21:1::0;13344:2;13324:18;;;13317:30;13383:34;13363:18;;;13356:62;-1:-1:-1;;;13434:18:1;;;13427:49;13493:19;;32365:136:0::1;13103:415:1::0;32365:136:0::1;32558:23;::::0;32517:65:::1;::::0;32548:8;;32517:65:::1;::::0;;;::::1;32593:23;:34:::0;32281:354::o;30511:973::-;8909:6;;-1:-1:-1;;;;;8909:6:0;8170:10;8909:22;8901:67;;;;-1:-1:-1;;;8901:67:0;;;;;;;:::i;:::-;30954:17;30916:14;30875:17;30789:62:::1;30832:19:::0;30789;:62:::1;:::i;:::-;:103;;;;:::i;:::-;:141;;;;:::i;:::-;:182;;;;:::i;:::-;30768:203;;:1;:203;30746:277;;;::::0;-1:-1:-1;;;30746:277:0;;13725:2:1;30746:277:0::1;::::0;::::1;13707:21:1::0;13764:2;13744:18;;;13737:30;13803:26;13783:18;;;13776:54;13847:18;;30746:277:0::1;13523:348:1::0;30746:277:0::1;31034:215;31072:5;31092:19;31126;31160:17;31192:14;31221:17;31034:23;:215::i;:::-;31265:211;::::0;-1:-1:-1;;;14078:28:1;;14131:2;14122:12;31265:211:0::1;13876:264:1::0;26495:356:0;8909:6;;-1:-1:-1;;;;;8909:6:0;8170:10;8909:22;8901:67;;;;-1:-1:-1;;;8901:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;26629:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;;:39;::::1;;:27;::::0;;::::1;:39;;::::0;26607:131:::1;;;;-1:-1:-1::0;;;26607:131:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;26749:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;;;;;:38;;-1:-1:-1;;26749:38:0::1;::::0;::::1;;::::0;;::::1;::::0;;;26803:40;;154:41:1;;;26803:40:0::1;::::0;127:18:1;26803:40:0::1;14:187:1::0;26245:242:0;8909:6;;-1:-1:-1;;;;;8909:6:0;8170:10;8909:22;8901:67;;;;-1:-1:-1;;;8901:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;26365:38:0;::::1;;::::0;;;:29:::1;:38;::::0;;;;;;;;:48;;-1:-1:-1;;26365:48:0::1;::::0;::::1;;::::0;;::::1;::::0;;;26429:50;;154:41:1;;;26429:50:0::1;::::0;127:18:1;26429:50:0::1;14:187:1::0;9152:281:0;8909:6;;-1:-1:-1;;;;;8909:6:0;8170:10;8909:22;8901:67;;;;-1:-1:-1;;;8901:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;9255:22:0;::::1;9233:110;;;::::0;-1:-1:-1;;;9233:110:0;;14347:2:1;9233:110:0::1;::::0;::::1;14329:21:1::0;14386:2;14366:18;;;14359:30;14425:34;14405:18;;;14398:62;-1:-1:-1;;;14476:18:1;;;14469:36;14522:19;;9233:110:0::1;14145:402:1::0;9233:110:0::1;9380:6;::::0;;9359:38:::1;::::0;-1:-1:-1;;;;;9359:38:0;;::::1;::::0;9380:6;::::1;::::0;9359:38:::1;::::0;::::1;9408:6;:17:::0;;-1:-1:-1;;;;;;9408:17:0::1;-1:-1:-1::0;;;;;9408:17:0;;;::::1;::::0;;;::::1;::::0;;9152:281::o;3019:181::-;3077:7;;3109:5;3113:1;3109;:5;:::i;:::-;3097:17;;3138:1;3133;:6;;3125:46;;;;-1:-1:-1;;;3125:46:0;;14884:2:1;3125:46:0;;;14866:21:1;14923:2;14903:18;;;14896:30;14962:29;14942:18;;;14935:57;15009:18;;3125:46:0;14682:351:1;3125:46:0;3191:1;3019:181;-1:-1:-1;;;3019:181:0:o;13678:378::-;-1:-1:-1;;;;;13814:19:0;;13806:68;;;;-1:-1:-1;;;13806:68:0;;15240:2:1;13806:68:0;;;15222:21:1;15279:2;15259:18;;;15252:30;15318:34;15298:18;;;15291:62;-1:-1:-1;;;15369:18:1;;;15362:34;15413:19;;13806:68:0;15038:400:1;13806:68:0;-1:-1:-1;;;;;13893:21:0;;13885:68;;;;-1:-1:-1;;;13885:68:0;;15645:2:1;13885:68:0;;;15627:21:1;15684:2;15664:18;;;15657:30;15723:34;15703:18;;;15696:62;-1:-1:-1;;;15774:18:1;;;15767:32;15816:19;;13885:68:0;15443:398:1;13885:68:0;-1:-1:-1;;;;;13964:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;14016:32;;1769:25:1;;;14016:32:0;;1742:18:1;14016:32:0;;;;;;;;13678:378;;;:::o;34738:2629::-;-1:-1:-1;;;;;34870:18:0;;34862:68;;;;-1:-1:-1;;;34862:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34949:16:0;;34941:64;;;;-1:-1:-1;;;34941:64:0;;;;;;;:::i;:::-;35022:6;35032:1;35022:11;35018:93;;35050:28;35066:4;35072:2;35076:1;35050:15;:28::i;35018:93::-;-1:-1:-1;;;;;35142:31:0;;;35123:16;35142:31;;;:25;:31;;;;;;;;;35202:29;;;;;;;;;35263:35;;;:29;:35;;;;;;35142:31;;;;;35202:29;;;;35263:35;35262:36;:87;;;;-1:-1:-1;;;;;;35316:33:0;;;;;;:29;:33;;;;;;;;35315:34;35262:87;35244:781;;;35384:16;;-1:-1:-1;;;35384:16:0;;;;35376:59;;;;-1:-1:-1;;;35376:59:0;;16858:2:1;35376:59:0;;;16840:21:1;16897:2;16877:18;;;16870:30;16936:32;16916:18;;;16909:60;16986:18;;35376:59:0;16656:354:1;35376:59:0;-1:-1:-1;;;;;35473:38:0;;;;;;:34;:38;;;;;;;;35472:39;:101;;;;-1:-1:-1;;;;;;35533:40:0;;;;;;:34;:40;;;;;;;;35532:41;35472:101;35450:307;;;35648:11;;35638:6;:21;;35608:133;;;;-1:-1:-1;;;35608:133:0;;17217:2:1;35608:133:0;;;17199:21:1;17256:2;17236:18;;;17229:30;17295:34;17275:18;;;17268:62;-1:-1:-1;;;17346:18:1;;;17339:36;17392:19;;35608:133:0;17015:402:1;35608:133:0;-1:-1:-1;;;;;35776:33:0;;;;;;:29;:33;;;;;;;;35771:243;;35888:15;;35877:6;35861:13;35871:2;35861:9;:13::i;:::-;:22;;;;:::i;:::-;35860:43;;35830:168;;;;-1:-1:-1;;;35830:168:0;;17624:2:1;35830:168:0;;;17606:21:1;17663:2;17643:18;;;17636:30;17702:34;17682:18;;;17675:62;-1:-1:-1;;;17753:18:1;;;17746:49;17812:19;;35830:168:0;17422:415:1;35830:168:0;36037:47;36050:11;36063:10;36075:4;36081:2;36037:12;:47::i;:::-;36095:12;36138:23;;36110:24;36128:4;36110:9;:24::i;:::-;36192:16;;-1:-1:-1;;36110:51:0;;-1:-1:-1;;;;36192:16:0;;;;:40;;;;;36225:7;36192:40;:67;;;;-1:-1:-1;36250:9:0;;;;36249:10;36192:67;:97;;;;-1:-1:-1;36276:9:0;;-1:-1:-1;;;36276:9:0;;;;:13;;36192:97;:143;;;;-1:-1:-1;;;;;;36306:29:0;;;;;;:25;:29;;;;;;;;36192:143;:185;;;;-1:-1:-1;;;;;;36353:24:0;;;;;;:18;:24;;;;;;;;36352:25;36192:185;:225;;;;-1:-1:-1;;;;;;36395:22:0;;;;;;:18;:22;;;;;;;;36394:23;36192:225;36174:362;;;36444:9;:16;;-1:-1:-1;;36444:16:0;36456:4;36444:16;;;36475:17;:15;:17::i;:::-;36507:9;:17;;-1:-1:-1;;36507:17:0;;;36174:362;36564:9;;36548:12;;36564:9;;36563:10;:30;;;;-1:-1:-1;36577:16:0;;-1:-1:-1;;;36577:16:0;;;;36563:30;-1:-1:-1;;;;;36610:24:0;;;;;;:18;:24;;;;;;36548:45;;-1:-1:-1;36610:24:0;;;:50;;-1:-1:-1;;;;;;36638:22:0;;;;;;:18;:22;;;;;;;;36610:50;36606:98;;;-1:-1:-1;36687:5:0;36606:98;36718:7;:24;;;;-1:-1:-1;36729:9:0;;-1:-1:-1;;;36729:9:0;;;;:13;;36718:24;36714:414;;;36783:9;;36759:11;;36796:3;;36774:18;;-1:-1:-1;;;36783:9:0;;;;36774:6;:18;:::i;:::-;36773:26;;;;:::i;:::-;36845:8;;36759:40;;-1:-1:-1;36814:18:0;;36857:3;;36836:17;;-1:-1:-1;;;36845:8:0;;;;36836:6;:17;:::i;:::-;36835:25;;;;:::i;:::-;36814:46;-1:-1:-1;36884:12:0;36893:3;36884:6;:12;:::i;:::-;36875:21;;36911:41;36927:4;36941;36948:3;36911:15;:41::i;:::-;36973:14;;36969:148;;37008:38;37028:4;37035:10;37008:11;:38::i;:::-;37080:8;;37070:31;;;-1:-1:-1;;;37080:8:0;;;;;18145:36:1;;18212:2;18197:18;;18190:34;;;37070:31:0;;18118:18:1;37070:31:0;;;;;;;36969:148;36744:384;;36714:414;37138:33;37154:4;37160:2;37164:6;37138:15;:33::i;:::-;37201:15;;-1:-1:-1;;;;;37201:15:0;:26;37236:4;37243:15;37236:4;37243:9;:15::i;:::-;37201:58;;-1:-1:-1;;;;;;37201:58:0;;;;;;;-1:-1:-1;;;;;18443:32:1;;;37201:58:0;;;18425:51:1;18492:18;;;18485:34;18398:18;;37201:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37184:96;37294:15;;-1:-1:-1;;;;;37294:15:0;:26;37329:2;37334:13;37329:2;37334:9;:13::i;:::-;37294:54;;-1:-1:-1;;;;;;37294:54:0;;;;;;;-1:-1:-1;;;;;18443:32:1;;;37294:54:0;;;18425:51:1;18492:18;;;18485:34;18398:18;;37294:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37290:70;34851:2516;;;;34738:2629;;;:::o;3352:226::-;3472:7;3508:12;3500:6;;;;3492:29;;;;-1:-1:-1;;;3492:29:0;;;;;;;;:::i;:::-;-1:-1:-1;3532:9:0;3544:5;3548:1;3544;:5;:::i;:::-;3532:17;3352:226;-1:-1:-1;;;;;3352:226:0:o;13219:451::-;-1:-1:-1;;;;;13303:21:0;;13295:67;;;;-1:-1:-1;;;13295:67:0;;18732:2:1;13295:67:0;;;18714:21:1;18771:2;18751:18;;;18744:30;18810:34;18790:18;;;18783:62;-1:-1:-1;;;18861:18:1;;;18854:31;18902:19;;13295:67:0;18530:397:1;13295:67:0;13454:105;13491:6;13454:105;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;13454:18:0;;;;;;:9;:18;;;;;;;:105;:22;:105::i;:::-;-1:-1:-1;;;;;13433:18:0;;;;;;:9;:18;;;;;:126;13585:12;;:24;;13602:6;13585:16;:24::i;:::-;13570:12;:39;13625:37;;1769:25:1;;;13651:1:0;;-1:-1:-1;;;;;13625:37:0;;;;;1757:2:1;1742:18;13625:37:0;;;;;;;13219:451;;:::o;41037:1856::-;41303:21;;;;:43;;;;:21;;:43;41299:322;;41368:184;;-1:-1:-1;;;19134:32:1;;19191:2;19182:12;41368:184:0;;;;;;;;41445:21;;;;41523:14;;41368:184;;41445:21;;;;;41368:184;;;;-1:-1:-1;;;;;;;;;;;41368:184:0;;;41523:14;;;41368:184;:::i;:::-;;;;;;;;41567:21;;;:42;;-1:-1:-1;;41567:42:0;;;;;;;41299:322;41635:21;;;;:43;;;;:21;;;;;:43;41631:322;;41700:184;;-1:-1:-1;;;19621:32:1;;19678:2;19669:12;41700:184:0;;;;;;;;41777:21;;;;41855:14;;41700:184;;41777:21;;;;;;;;41700:184;;;;-1:-1:-1;;;;;;;;;;;41700:184:0;;;41855:14;;;41700:184;:::i;:::-;;;;;;;;41899:21;;;:42;;-1:-1:-1;;41899:42:0;;;;;;;;;41631:322;41967:19;;;;:39;;;;:19;;;;;:39;41963:308;;42028:178;;-1:-1:-1;;;19894:30:1;;19949:2;19940:12;42028:178:0;;;;;;;;42103:19;;;;42177:14;;42028:178;;42103:19;;;;;;;;42028:178;;;;-1:-1:-1;;;;;;;;;;;42028:178:0;;;42177:14;;;42028:178;:::i;:::-;;;;;;;;42221:19;;;:38;;-1:-1:-1;;42221:38:0;;;;;;;;;41963:308;42285:16;;;;:33;;;;-1:-1:-1;;;42285:16:0;;;;:33;42281:287;;42340:169;;-1:-1:-1;;;20165:27:1;;20217:2;20208:12;42340:169:0;;;;;;;;42412:16;;;;42480:14;;42340:169;;42412:16;-1:-1:-1;;;42412:16:0;;;;;;42340:169;;;;-1:-1:-1;;;;;;;;;;;42340:169:0;;;42480:14;;;42340:169;:::i;:::-;;;;;;;;42524:16;;;:32;;-1:-1:-1;;42524:32:0;-1:-1:-1;;;42524:32:0;;;;;;;42281:287;42582:19;;;;:39;;;;-1:-1:-1;;;42582:19:0;;;;:39;42578:308;;42643:178;;-1:-1:-1;;;20433:30:1;;20488:2;20479:12;42643:178:0;;;;;;;;42718:19;;;;42792:14;;42643:178;;42718:19;-1:-1:-1;;;42718:19:0;;;;;;42643:178;;;;-1:-1:-1;;;;;;;;;;;42643:178:0;;;42792:14;;;42643:178;:::i;:::-;;;;;;;;42836:19;;;:38;;-1:-1:-1;;42836:38:0;-1:-1:-1;;;42836:38:0;;;;;;;42578:308;41037:1856;;;;;;:::o;44906:1728::-;45055:15;;:49;;-1:-1:-1;;;45055:49:0;;45093:10;45055:49;;;1561:51:1;45010:4:0;;;;-1:-1:-1;;;;;45055:15:0;;;;:37;;1534:18:1;;45055:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45050:1577;;45125:9;;-1:-1:-1;;;45125:9:0;;;;:13;45121:309;;45183:9;;45159:11;;45196:3;;45174:18;;-1:-1:-1;;;45183:9:0;;;;45174:6;:18;:::i;:::-;45173:26;;;;:::i;:::-;45249:8;;45159:40;;-1:-1:-1;45218:18:0;;45261:3;;45240:17;;-1:-1:-1;;;45249:8:0;;;;45240:6;:17;:::i;:::-;45239:25;;;;:::i;:::-;45218:46;-1:-1:-1;45292:12:0;45301:3;45292:6;:12;:::i;:::-;45283:21;-1:-1:-1;45327:14:0;;45323:92;;45366:29;45372:10;45384;45366:5;:29::i;:::-;45140:290;;45121:309;45444:23;45470:24;45488:4;45470:9;:24::i;:::-;45588:9;;45444:50;;-1:-1:-1;45509:23:0;;45617:1;;45588:9;-1:-1:-1;;;45588:9:0;;;;;45536:31;;-1:-1:-1;;;45554:13:0;;;;45444:50;45536:31;:::i;:::-;45535:62;;;;:::i;:::-;:83;;;;:::i;:::-;45711:9;;45509:109;;-1:-1:-1;45633:24:0;;45711:9;-1:-1:-1;;;45711:9:0;;;;;45661:29;;-1:-1:-1;;;45679:11:0;;;;45661:15;:29;:::i;:::-;45660:60;;;;:::i;:::-;45633:87;-1:-1:-1;45735:20:0;45794:34;45633:87;45794:15;:34;:::i;:::-;45758:71;;:15;:71;:::i;:::-;45735:94;-1:-1:-1;45848:16:0;;45844:71;;45895:4;45885:14;;45844:71;45936:7;45929:14;;;;;;;;;45050:1577;46007:1;45980:24;45998:4;45980:9;:24::i;:::-;:28;45976:125;;;46029:22;46035:7;46044:6;46029:5;:22::i;:::-;-1:-1:-1;46080:5:0;45976:125;46115:23;46141:24;46159:4;46141:9;:24::i;:::-;46259:9;;46115:50;;-1:-1:-1;46180:23:0;;46288:1;;46259:9;-1:-1:-1;;;46259:9:0;;;;;46207:31;;-1:-1:-1;;;46225:13:0;;;;46115:50;46207:31;:::i;:::-;46206:62;;;;:::i;:::-;:83;;;;:::i;:::-;46382:9;;46180:109;;-1:-1:-1;46304:24:0;;46382:9;-1:-1:-1;;;46382:9:0;;;;;46332:29;;-1:-1:-1;;;46350:11:0;;;;46332:15;:29;:::i;:::-;46331:60;;;;:::i;:::-;46304:87;-1:-1:-1;46406:20:0;46465:34;46304:87;46465:15;:34;:::i;:::-;46429:71;;:15;:71;:::i;:::-;46406:94;-1:-1:-1;46519:16:0;;46515:72;;-1:-1:-1;46566:5:0;;-1:-1:-1;46601:14:0;;-1:-1:-1;;;;46601:14:0;42901:1997;42947:23;42973:24;42991:4;42973:9;:24::i;:::-;43090:23;;42947:50;;-1:-1:-1;43036:21:0;;43090:27;;43116:1;43090:27;:::i;:::-;43072:15;:45;43068:123;;;43152:23;;:27;;43178:1;43152:27;:::i;:::-;43134:45;;43068:123;43299:9;;43201:12;;;;43324:1;;43299:9;-1:-1:-1;;;43299:9:0;;;;;43251:31;;-1:-1:-1;;;43269:13:0;;;;43251:15;:31;:::i;:::-;43250:58;;;;:::i;:::-;:75;;;;:::i;:::-;43397:9;;43224:101;;-1:-1:-1;43336:24:0;;43397:9;-1:-1:-1;;;43397:9:0;;;;;43364:29;;-1:-1:-1;;;43382:11:0;;;;43364:15;:29;:::i;:::-;43363:43;;;;:::i;:::-;43336:70;-1:-1:-1;43417:20:0;43472:34;43336:70;43472:15;:34;:::i;:::-;43440:67;;:15;:67;:::i;:::-;43417:90;;43520:31;43538:12;43520:17;:31::i;:::-;43564:27;43594:41;43618:17;43594:21;:41;:::i;:::-;43727:11;;43564:71;;-1:-1:-1;43646:19:0;;43727:11;-1:-1:-1;;;43727:11:0;;;;;-1:-1:-1;;;43716:8:0;;;;;43695:17;;43711:1;;-1:-1:-1;;;43695:13:0;;;;:17;:::i;:::-;43694:30;;;;:::i;:::-;:44;;;;:::i;:::-;43668:9;;:71;;;-1:-1:-1;;;43668:9:0;;;;:71;:::i;:::-;43802:13;;43646:93;;;;;-1:-1:-1;43750:26:0;;43859:1;;43646:93;;43780:35;;-1:-1:-1;;;43802:13:0;;;43780:19;:35;:::i;:::-;43779:64;;;;:::i;:::-;:81;;;;:::i;:::-;43923:13;;43750:110;;-1:-1:-1;43871:26:0;;43953:11;;43901:35;;-1:-1:-1;;;43923:13:0;;;;43901:19;:35;:::i;:::-;43900:64;;;;:::i;:::-;43871:93;-1:-1:-1;43975:24:0;44038:39;43871:93;44038:18;:39;:::i;:::-;44002:76;;:19;:76;:::i;:::-;44113:10;;44105:53;;43975:103;;-1:-1:-1;;;;;;44113:10:0;;43975:103;;44105:53;;;;43975:103;44113:10;44105:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44091:67;;;;;44177:7;44169:28;;;;-1:-1:-1;;;44169:28:0;;21030:2:1;44169:28:0;;;21012:21:1;21069:1;21049:18;;;21042:29;-1:-1:-1;;;21087:18:1;;;21080:38;21135:18;;44169:28:0;20828:331:1;44169:28:0;44230:15;;44222:60;;-1:-1:-1;;;;;44230:15:0;;;;44259:18;;44222:60;;;;44259:18;44230:15;44222:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44208:74;;;;;44301:7;44293:28;;;;-1:-1:-1;;;44293:28:0;;21030:2:1;44293:28:0;;;21012:21:1;21069:1;21049:18;;;21042:29;-1:-1:-1;;;21087:18:1;;;21080:38;21135:18;;44293:28:0;20828:331:1;44293:28:0;44338:19;;44334:253;;44374:50;44388:15;44405:18;44374:13;:50::i;:::-;44444:131;;;21366:25:1;;;21422:2;21407:18;;21400:34;;;21450:18;;;21443:34;;;44444:131:0;;21354:2:1;21339:18;44444:131:0;;;;;;;44334:253;44667:15;;44614:111;;-1:-1:-1;;;44614:111:0;;-1:-1:-1;;;;;44667:15:0;;;44614:111;;;18425:51:1;18492:18;;;18485:34;;;44599:12:0;;44629:4;;44614:30;;18398:18:1;;44614:111:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44599:126;;44740:7;44736:155;;;44764:15;;:64;;-1:-1:-1;;;44764:64:0;;;;;1769:25:1;;;-1:-1:-1;;;;;44764:15:0;;;;:46;;1742:18:1;;44764:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44848:31;44862:16;44848:31;;;;1769:25:1;;1757:2;1742:18;;1623:177;44848:31:0;;;;;;;;44736:155;42936:1962;;;;;;;;;;;;42901:1997::o;39132:1897::-;39404:22;;;;:45;;;;:22;;;;;:45;39400:329;;39471:187;;-1:-1:-1;;;21969:33:1;;22027:2;22018:12;39471:187:0;;;;;;;;39549:22;;;;39629:14;;39471:187;;39549:22;;;;;;;;39471:187;;;;-1:-1:-1;;;;;;;;;;;39471:187:0;;;39629:14;;;39471:187;:::i;:::-;;;;;;;;39673:22;;;:44;;-1:-1:-1;;39673:44:0;;;;;;;;;39400:329;39743:22;;;;:45;;;;:22;;;;;:45;39739:329;;39810:187;;-1:-1:-1;;;22243:33:1;;22301:2;22292:12;39810:187:0;;;;;;;;39888:22;;;;39968:14;;39810:187;;39888:22;;;;;;;;39810:187;;;;-1:-1:-1;;;;;;;;;;;39810:187:0;;;39968:14;;;39810:187;:::i;:::-;;;;;;;;40012:22;;;:44;;-1:-1:-1;;40012:44:0;;;;;;;;;39739:329;40082:20;;;;:41;;;;-1:-1:-1;;;40082:20:0;;;;:41;40078:315;;40145:181;;-1:-1:-1;;;22517:31:1;;22573:2;22564:12;40145:181:0;;;;;;;;40221:20;;;;40297:14;;40145:181;;40221:20;-1:-1:-1;;;40221:20:0;;;;;;40145:181;;;;-1:-1:-1;;;;;;;;;;;40145:181:0;;;40297:14;;;40145:181;:::i;:::-;;;;;;;;40341:20;;;:40;;-1:-1:-1;;40341:40:0;-1:-1:-1;;;40341:40:0;;;;;;;40078:315;40407:17;;;;:35;;;;-1:-1:-1;;;40407:17:0;;;;:35;40403:294;;40464:172;;-1:-1:-1;;;22789:28:1;;22842:2;22833:12;40464:172:0;;;;;;;;40537:17;;;;40607:14;;40464:172;;40537:17;-1:-1:-1;;;40537:17:0;;;;;;40464:172;;;;-1:-1:-1;;;;;;;;;;;40464:172:0;;;40607:14;;;40464:172;:::i;:::-;;;;;;;;40651:17;;;:34;;-1:-1:-1;;40651:34:0;-1:-1:-1;;;40651:34:0;;;;;;;40403:294;40711:20;;;;:41;;;;-1:-1:-1;;;40711:20:0;;;;:41;40707:315;;40774:181;;-1:-1:-1;;;23058:31:1;;23114:2;23105:12;40774:181:0;;;;;;;;40850:20;;;;40926:14;;40774:181;;40850:20;-1:-1:-1;;;40850:20:0;;;;;;40774:181;;;;-1:-1:-1;;;;;;;;;;;40774:181:0;;;40926:14;;;40774:181;:::i;:::-;;;;;;;;40970:20;;;:40;;;;;-1:-1:-1;;;40970:40:0;-1:-1:-1;;40970:40:0;;;;;;39132:1897;;;;;;:::o;12223:606::-;-1:-1:-1;;;;;12363:20:0;;12355:70;;;;-1:-1:-1;;;12355:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;12444:23:0;;12436:71;;;;-1:-1:-1;;;12436:71:0;;;;;;;:::i;:::-;12596:108;12632:6;12596:108;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12596:17:0;;;;;;:9;:17;;;;;;;:108;:21;:108::i;:::-;-1:-1:-1;;;;;12576:17:0;;;;;;;:9;:17;;;;;;:128;;;;12738:20;;;;;;;:32;;12763:6;12738:24;:32::i;:::-;-1:-1:-1;;;;;12715:20:0;;;;;;;:9;:20;;;;;;;:55;;;;12786:35;;;;;;;;;;12814:6;1769:25:1;;1757:2;1742:18;;1623:177;37375:1749:0;37520:13;:17;;-1:-1:-1;;;;37625:15:0;;;37653:419;;;;37701:23;;37685:13;:39;;-1:-1:-1;;;;37739:39:0;37701:23;;;;-1:-1:-1;;;37685:39:0;-1:-1:-1;;;;37739:39:0;;;;;37755:23;;;;;-1:-1:-1;;;37739:39:0;;-1:-1:-1;;;;37843:29:0;37807:21;;;;;-1:-1:-1;;;37793:35:0;-1:-1:-1;;;;37843:29:0;;-1:-1:-1;;;37854:18:0;;;;-1:-1:-1;;;37843:29:0;;-1:-1:-1;;;;37887:35:0;-1:-1:-1;;;37901:21:0;;;;-1:-1:-1;;;37887:35:0;;;;;;;-1:-1:-1;;;;;37941:21:0;;-1:-1:-1;37941:21:0;;;37843:8;37941:21;;;;;;:26;;37937:124;;-1:-1:-1;;;;;37988:21:0;;;;;;:17;:21;;;;;38030:15;37988:57;;37937:124;38086:10;38082:285;;;38129:24;;38113:13;:40;;-1:-1:-1;;;;38168:40:0;38129:24;;;;;;;-1:-1:-1;;;38113:40:0;-1:-1:-1;;;;38168:40:0;;;;;38184:24;;;;;-1:-1:-1;;;38168:40:0;;-1:-1:-1;;;;38274:30:0;-1:-1:-1;;;38237:22:0;;;;-1:-1:-1;;;38223:36:0;-1:-1:-1;;;;38274:30:0;;-1:-1:-1;;;38285:19:0;;;;-1:-1:-1;;;38274:30:0;;-1:-1:-1;;;;38319:36:0;-1:-1:-1;;;38333:22:0;;;;-1:-1:-1;;;38319:36:0;;;;;;;38082:285;38382:10;38381:11;:27;;;;;38397:11;38396:12;38381:27;38377:302;;;38441:24;;38425:13;:40;;-1:-1:-1;;;;38480:40:0;38441:24;;;;;;;-1:-1:-1;;;38425:40:0;-1:-1:-1;;;;38480:40:0;;;;;38496:24;;;;;-1:-1:-1;;;38480:40:0;;-1:-1:-1;;;;38586:30:0;-1:-1:-1;;;38549:22:0;;;;-1:-1:-1;;;38535:36:0;-1:-1:-1;;;;38586:30:0;;-1:-1:-1;;;38597:19:0;;;;-1:-1:-1;;;38586:30:0;;-1:-1:-1;;;;38631:36:0;-1:-1:-1;;;38645:22:0;;;;-1:-1:-1;;;38631:36:0;;;;;;;38377:302;38694:11;38693:12;:26;;;;-1:-1:-1;38710:9:0;;;;38709:10;38693:26;38689:79;;;38736:13;:20;;-1:-1:-1;;;;;;38736:20:0;-1:-1:-1;;;;;38736:20:0;;;;;38689:79;38912:11;;;-1:-1:-1;;;38912:11:0;;;;;-1:-1:-1;;;38888:8:0;;;;;-1:-1:-1;;;38861:11:0;;;;;38803:42;;-1:-1:-1;;;38832:13:0;;;;;-1:-1:-1;;;38803:13:0;;;:42;:::i;:::-;:69;;;;:::i;:::-;:93;;;;:::i;:::-;:120;;;;:::i;:::-;38778:9;:145;;-1:-1:-1;;;;38778:145:0;-1:-1:-1;;;38778:145:0;;;;;;;;;;;;;;38939:177;;;-1:-1:-1;;;38965:13:0;;;;23414:34:1;;-1:-1:-1;;;38993:13:0;;;;23479:2:1;23464:18;;23457:43;-1:-1:-1;;;39021:11:0;;;;23516:18:1;;;23509:43;;;;-1:-1:-1;;;39047:8:0;;;;23583:2:1;23568:18;;23561:43;-1:-1:-1;;;39070:11:0;;;;23635:3:1;23620:19;;23613:44;39096:9:0;;;;;23688:3:1;23673:19;;23666:44;38939:177:0;;23378:3:1;23363:19;38939:177:0;;;;;;;37375:1749;;;;:::o;3208:136::-;3266:7;3293:43;3297:1;3300;3293:43;;;;;;;;;;;;;;;;;:3;:43::i;46642:500::-;46733:16;;;46747:1;46733:16;;;;;;;;46709:21;;46733:16;;;;;;;;;;-1:-1:-1;46733:16:0;46709:40;;46778:4;46760;46765:1;46760:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;46760:23:0;;;:7;;;;;;;;;;:23;;;;46804:15;;:22;;;-1:-1:-1;;;46804:22:0;;;;:15;;;;;:20;;:22;;;;;46760:7;;46804:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46794:4;46799:1;46794:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;46794:32:0;;;:7;;;;;;;;;:32;46869:15;;46837:62;;46854:4;;46869:15;46887:11;46837:8;:62::i;:::-;46910:15;;:224;;-1:-1:-1;;;46910:224:0;;-1:-1:-1;;;;;46910:15:0;;;;:66;;:224;;46991:11;;46910:15;;47061:4;;47088;;47108:15;;46910:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47544:423;47658:15;;47626:62;;47643:4;;-1:-1:-1;;;;;47658:15:0;47676:11;47626:8;:62::i;:::-;47699:15;;47903;;47699:260;;-1:-1:-1;;;47699:260:0;;47771:4;47699:260;;;25567:34:1;25617:18;;;25610:34;;;47699:15:0;25660:18:1;;;25653:34;;;25703:18;;;25696:34;-1:-1:-1;;;;;47903:15:0;;;25746:19:1;;;25739:44;47933:15:0;25799:19:1;;;25792:35;47699:15:0;;;:31;;47738:9;;25501:19:1;;47699:260:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;206:548:1:-;318:4;347:2;376;365:9;358:21;408:6;402:13;451:6;446:2;435:9;431:18;424:34;476:1;486:140;500:6;497:1;494:13;486:140;;;595:14;;;591:23;;585:30;561:17;;;580:2;557:26;550:66;515:10;;486:140;;;490:3;675:1;670:2;661:6;650:9;646:22;642:31;635:42;745:2;738;734:7;729:2;721:6;717:15;713:29;702:9;698:45;694:54;686:62;;;;206:548;;;;:::o;759:131::-;-1:-1:-1;;;;;834:31:1;;824:42;;814:70;;880:1;877;870:12;895:315;963:6;971;1024:2;1012:9;1003:7;999:23;995:32;992:52;;;1040:1;1037;1030:12;992:52;1079:9;1066:23;1098:31;1123:5;1098:31;:::i;:::-;1148:5;1200:2;1185:18;;;;1172:32;;-1:-1:-1;;;895:315:1:o;1215:180::-;1274:6;1327:2;1315:9;1306:7;1302:23;1298:32;1295:52;;;1343:1;1340;1333:12;1295:52;-1:-1:-1;1366:23:1;;1215:180;-1:-1:-1;1215:180:1:o;1805:456::-;1882:6;1890;1898;1951:2;1939:9;1930:7;1926:23;1922:32;1919:52;;;1967:1;1964;1957:12;1919:52;2006:9;1993:23;2025:31;2050:5;2025:31;:::i;:::-;2075:5;-1:-1:-1;2132:2:1;2117:18;;2104:32;2145:33;2104:32;2145:33;:::i;:::-;1805:456;;2197:7;;-1:-1:-1;;;2251:2:1;2236:18;;;;2223:32;;1805:456::o;2908:247::-;2967:6;3020:2;3008:9;2999:7;2995:23;2991:32;2988:52;;;3036:1;3033;3026:12;2988:52;3075:9;3062:23;3094:31;3119:5;3094:31;:::i;3160:118::-;3246:5;3239:13;3232:21;3225:5;3222:32;3212:60;;3268:1;3265;3258:12;3283:382;3348:6;3356;3409:2;3397:9;3388:7;3384:23;3380:32;3377:52;;;3425:1;3422;3415:12;3377:52;3464:9;3451:23;3483:31;3508:5;3483:31;:::i;:::-;3533:5;-1:-1:-1;3590:2:1;3575:18;;3562:32;3603:30;3562:32;3603:30;:::i;:::-;3652:7;3642:17;;;3283:382;;;;;:::o;3670:529::-;3747:6;3755;3763;3816:2;3804:9;3795:7;3791:23;3787:32;3784:52;;;3832:1;3829;3822:12;3784:52;3871:9;3858:23;3890:31;3915:5;3890:31;:::i;:::-;3940:5;-1:-1:-1;3997:2:1;3982:18;;3969:32;4010:33;3969:32;4010:33;:::i;:::-;4062:7;-1:-1:-1;4121:2:1;4106:18;;4093:32;4134:33;4093:32;4134:33;:::i;:::-;4186:7;4176:17;;;3670:529;;;;;:::o;4204:156::-;4270:20;;4330:4;4319:16;;4309:27;;4299:55;;4350:1;4347;4340:12;4299:55;4204:156;;;:::o;4365:464::-;4450:6;4458;4466;4474;4482;4535:3;4523:9;4514:7;4510:23;4506:33;4503:53;;;4552:1;4549;4542:12;4503:53;4575:27;4592:9;4575:27;:::i;:::-;4565:37;;4621:36;4653:2;4642:9;4638:18;4621:36;:::i;:::-;4611:46;;4676:36;4708:2;4697:9;4693:18;4676:36;:::i;:::-;4666:46;;4731:36;4763:2;4752:9;4748:18;4731:36;:::i;:::-;4721:46;;4786:37;4818:3;4807:9;4803:19;4786:37;:::i;:::-;4776:47;;4365:464;;;;;;;;:::o;5337:388::-;5405:6;5413;5466:2;5454:9;5445:7;5441:23;5437:32;5434:52;;;5482:1;5479;5472:12;5434:52;5521:9;5508:23;5540:31;5565:5;5540:31;:::i;:::-;5590:5;-1:-1:-1;5647:2:1;5632:18;;5619:32;5660:33;5619:32;5660:33;:::i;5730:380::-;5809:1;5805:12;;;;5852;;;5873:61;;5927:4;5919:6;5915:17;5905:27;;5873:61;5980:2;5972:6;5969:14;5949:18;5946:38;5943:161;;6026:10;6021:3;6017:20;6014:1;6007:31;6061:4;6058:1;6051:15;6089:4;6086:1;6079:15;5943:161;;5730:380;;;:::o;6115:356::-;6317:2;6299:21;;;6336:18;;;6329:30;6395:34;6390:2;6375:18;;6368:62;6462:2;6447:18;;6115:356::o;7093:127::-;7154:10;7149:3;7145:20;7142:1;7135:31;7185:4;7182:1;7175:15;7209:4;7206:1;7199:15;7225:168;7298:9;;;7329;;7346:15;;;7340:22;;7326:37;7316:71;;7367:18;;:::i;7398:127::-;7459:10;7454:3;7450:20;7447:1;7440:31;7490:4;7487:1;7480:15;7514:4;7511:1;7504:15;7530:120;7570:1;7596;7586:35;;7601:18;;:::i;:::-;-1:-1:-1;7635:9:1;;7530:120::o;8880:184::-;8950:6;9003:2;8991:9;8982:7;8978:23;8974:32;8971:52;;;9019:1;9016;9009:12;8971:52;-1:-1:-1;9042:16:1;;8880:184;-1:-1:-1;8880:184:1:o;9374:245::-;9441:6;9494:2;9482:9;9473:7;9469:23;9465:32;9462:52;;;9510:1;9507;9500:12;9462:52;9542:9;9536:16;9561:28;9583:5;9561:28;:::i;9624:406::-;9826:2;9808:21;;;9865:2;9845:18;;;9838:30;9904:34;9899:2;9884:18;;9877:62;-1:-1:-1;;;9970:2:1;9955:18;;9948:40;10020:3;10005:19;;9624:406::o;11918:148::-;12006:4;11985:12;;;11999;;;11981:31;;12024:13;;12021:39;;;12040:18;;:::i;14552:125::-;14617:9;;;14638:10;;;14635:36;;;14651:18;;:::i;15846:401::-;16048:2;16030:21;;;16087:2;16067:18;;;16060:30;16126:34;16121:2;16106:18;;16099:62;-1:-1:-1;;;16192:2:1;16177:18;;16170:35;16237:3;16222:19;;15846:401::o;16252:399::-;16454:2;16436:21;;;16493:2;16473:18;;;16466:30;16532:34;16527:2;16512:18;;16505:62;-1:-1:-1;;;16598:2:1;16583:18;;16576:33;16641:3;16626:19;;16252:399::o;17842:128::-;17909:9;;;17930:11;;;17927:37;;;17944:18;;:::i;19205:209::-;-1:-1:-1;;19369:38:1;;;;19351:57;;19339:2;19324:18;;19205:209::o;20502:165::-;20540:1;20574:4;20571:1;20567:12;20598:3;20588:37;;20605:18;;:::i;:::-;20657:3;20650:4;20647:1;20643:12;20639:22;20634:27;;;20502:165;;;;:::o;20672:151::-;20762:4;20755:12;;;20741;;;20737:31;;20780:14;;20777:40;;;20797:18;;:::i;23853:127::-;23914:10;23909:3;23905:20;23902:1;23895:31;23945:4;23942:1;23935:15;23969:4;23966:1;23959:15;23985:251;24055:6;24108:2;24096:9;24087:7;24083:23;24079:32;24076:52;;;24124:1;24121;24114:12;24076:52;24156:9;24150:16;24175:31;24200:5;24175:31;:::i;24241:980::-;24503:4;24551:3;24540:9;24536:19;24582:6;24571:9;24564:25;24608:2;24646:6;24641:2;24630:9;24626:18;24619:34;24689:3;24684:2;24673:9;24669:18;24662:31;24713:6;24748;24742:13;24779:6;24771;24764:22;24817:3;24806:9;24802:19;24795:26;;24856:2;24848:6;24844:15;24830:29;;24877:1;24887:195;24901:6;24898:1;24895:13;24887:195;;;24966:13;;-1:-1:-1;;;;;24962:39:1;24950:52;;25057:15;;;;25022:12;;;;24998:1;24916:9;24887:195;;;-1:-1:-1;;;;;;;25138:32:1;;;;25133:2;25118:18;;25111:60;-1:-1:-1;;;25202:3:1;25187:19;25180:35;25099:3;24241:980;-1:-1:-1;;;24241:980:1:o;25838:306::-;25926:6;25934;25942;25995:2;25983:9;25974:7;25970:23;25966:32;25963:52;;;26011:1;26008;26001:12;25963:52;26040:9;26034:16;26024:26;;26090:2;26079:9;26075:18;26069:25;26059:35;;26134:2;26123:9;26119:18;26113:25;26103:35;;25838:306;;;;;:::o

Swarm Source

ipfs://835471c3de882357c4226cb182a781251eb12c7a131c1135fe7e53f1afa0b213
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.