Token DEXIOPROTOCOL

Gaming 
 

Overview ERC-20

Price
$0.01 @ 0.013871 MATIC (-5.00%)
Fully Diluted Market Cap
Total Supply:
49,870,548.642997 DEXI

Holders:
1,810 addresses

Transfers:
-

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

OVERVIEW

Dexioprotocol is a gaming company that uses crypto and blockchain technology to enhance user experience and bridge the gap between traditional enterprise and the Web3 revolution.

Market

Volume (24H):$398.60
Market Capitalization:$0.00
Circulating Supply:0.00 DEXI
Market Data Source: Coinmarketcap


Update? Click here to update the token ICO / general information
# Exchange Pair Price  24H Volume % Volume
1
MEXC Global
DEXI-USDT$0.0097
0.0000006 Btc
$47,789.00
4,927,832.120 DEXI
99.3415%
2
Elk Finance (Polygon)
0X65BA64899C2C7DBFDB5130E42E2CC56DE281C78B-0XEEEEEB57642040BE42185F49C52F7E9B38F8EEEE$0.0117
0.0000007 Btc
$301.15
24,409.632 0X65BA64899C2C7DBFDB5130E42E2CC56DE281C78B
0.4921%
3
Elk Finance (Polygon)
0X65BA64899C2C7DBFDB5130E42E2CC56DE281C78B-0X2791BCA1F2DE4661ED88A30C99A7A9449AA84174$0.012
0.0000007 Btc
$99.43
8,257.128 0X65BA64899C2C7DBFDB5130E42E2CC56DE281C78B
0.1665%
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.

Contract Source Code Verified (Exact Match)

Contract Name:
DEXI

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-09-06
*/

// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;

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

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

abstract contract Ownable is Context {
    address private _owner;

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

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

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

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

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

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

library SafeMath {
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b > a) return (false, 0);
        return (true, a - b);
    }

    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (a == 0) return (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }

    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a / b);
    }

    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a % b);
    }

    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) {
        require(b <= a, "SafeMath: subtraction overflow");
        return a - b;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        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) {
        require(b > 0, "SafeMath: division by zero");
        return a / b;
    }

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

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

    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a / b;
    }

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

library EnumerableSet {
    struct Set {
        bytes32[] _values;
        mapping (bytes32 => uint256) _indexes;
    }

    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    function _remove(Set storage set, bytes32 value) private returns (bool) {
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) { // Equivalent to contains(set, value)

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            bytes32 lastvalue = set._values[lastIndex];

            set._values[toDeleteIndex] = lastvalue;
            set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based
            set._values.pop();
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        require(set._values.length > index, "EnumerableSet: index out of bounds");
        return set._values[index];
    }

    struct Bytes32Set {
        Set _inner;
    }

    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    struct UintSet {
        Set _inner;
    }

    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }
}

library Address {
    function isContract(address account) internal view returns (bool) {
        uint256 size;
        assembly { size := extcodesize(account) }
        return size > 0;
    }

    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

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

    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

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

    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            if (returndata.length > 0) {
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

library DateTime {
    struct _DateTime {
        uint16 year;
        uint8 month;
        uint8 day;
        uint8 hour;
        uint8 minute;
        uint8 second;
        uint8 weekday;
    }

    uint constant DAY_IN_SECONDS = 1 days;
    uint constant YEAR_IN_SECONDS = 365 days;
    uint constant LEAP_YEAR_IN_SECONDS = 366 days;

    uint constant HOUR_IN_SECONDS = 1 hours;
    uint constant MINUTE_IN_SECONDS = 1 minutes;

    uint16 constant ORIGIN_YEAR = 1970;

    function isLeapYear(uint16 year) public pure returns (bool) {
        if (year % 4 != 0) {
            return false;
        }
        if (year % 100 != 0) {
            return true;
        }
        if (year % 400 != 0) {
            return false;
        }
        return true;
    }

    function leapYearsBefore(uint year) public pure returns (uint) {
        year -= 1;
        return year / 4 - year / 100 + year / 400;
    }

    function getDaysInMonth(uint8 month, uint16 year) public pure returns (uint8) {
        if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) {
            return 31;
        }
        else if (month == 4 || month == 6 || month == 9 || month == 11) {
            return 30;
        }
        else if (isLeapYear(year)) {
            return 29;
        }
        else {
            return 28;
        }
    }

    function getYear(uint timestamp) public pure returns (uint16) {
        uint secondsAccountedFor = 0;
        uint16 year;
        uint numLeapYears;

        // Year
        year = uint16(ORIGIN_YEAR + timestamp / YEAR_IN_SECONDS);
        numLeapYears = leapYearsBefore(year) - leapYearsBefore(ORIGIN_YEAR);
        secondsAccountedFor += LEAP_YEAR_IN_SECONDS * numLeapYears;
        secondsAccountedFor += YEAR_IN_SECONDS * (year - ORIGIN_YEAR - numLeapYears);
        while (secondsAccountedFor > timestamp) {
            if (isLeapYear(uint16(year - 1))) {
                secondsAccountedFor -= LEAP_YEAR_IN_SECONDS;
            }
            else {
                secondsAccountedFor -= YEAR_IN_SECONDS;
            }
            year -= 1;
        }
        return year;
    }
}

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

contract DEXI is IERC20, Ownable {
    enum TAX_TYPE {
        BURN, BUY, SELL, TRANSFER
    }

    using SafeMath for uint256;
    using DateTime for uint256;
    using Address for address;
    using EnumerableSet for EnumerableSet.AddressSet;
    uint8 private constant _decimals = 9;
    string private constant _name = "DEXIOPROTOCOL";
    string private constant _symbol = "DEXI";
    uint256 private constant max_supply = 250 * 1e6 * 10**uint256(_decimals);
    uint256 private constant POINTS_DIVISOR = 10000;
    uint256 public constant ANNUAL_MINTABLE_POINTS = 1000; // 10%
    uint256 private constant initialSupply = 50 * 1e6 * 10**uint256(_decimals);
    mapping(address => uint256) private _balances;
    uint256 private _totalSupply;

    // % to holders
    uint8 public buyTax = 5;
    uint8 public sellTax = 8;
    uint8 public transferTax = 6;
    uint8 public burnFee = 10;
    bool public enableBurnFee = true;
    bool public enableTaxOnlyForSell = true;
    bool public enableTaxOnlyForBuy = true;
    bool public enableTaxOnlyForTransfer = true;
    bool public excludeEnabled;

    uint256 public _maxTxAmount = initialSupply.div(1).div(100);
    address public _burnpoolWalletAddress = address(0x000000000000000000000000000000000000dEaD);
    
    mapping (address => mapping (address => uint256)) private _allowances;
    mapping (uint16 => uint256) public _yearMintedAmount;
    mapping (uint16 => uint256) public _yearCanMintAmount;
    mapping (address => bool) public _isBlacklisted;
    mapping (address => bool) private _isExcludedFromFee;
    EnumerableSet.AddressSet private swapV2Pairs;

    event SetMaxTxAmount(uint256 maxTxAmount);
    event SetExcludeEnabled(bool excludeEnabled);
    event IsBlackListed(address indexed user, bool indexed flag);
    event ExcludeFromFee(address account, bool isExcludedFromFee);
    event SetEnabledFlag(bool _enableFlag, TAX_TYPE _flagType);
    event TaxesSet(uint8 _buyTax, uint8 _sellTax, uint8 _transferTax, uint8 _burnFee);
    event AddNewSwapPair(address pair);

    constructor () public {
        _totalSupply = initialSupply;
        _balances[msg.sender] = initialSupply;
        // set the rest of the contract variables
        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[address(this)] = true;
        excludeEnabled = true;
        emit Transfer(address(0), msg.sender, initialSupply);
    }

    receive() external payable {}
    
    fallback() external payable {}
    
    function directTransfer(address account, uint256 amount) external onlyOwner {
        _transfer(address(this), account, amount);
    }

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

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

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

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

    function mint(address _account, uint256 _amount) external onlyOwner {
        
        require(_totalSupply + _amount <= max_supply, "Mint limit reached");
        require(_account != address(0), "ERC20: mint to the zero address");
        uint16 curYear = DateTime.getYear(block.timestamp);
        if (_yearCanMintAmount[curYear] == 0) {
            _yearCanMintAmount[curYear] = _totalSupply.mul(ANNUAL_MINTABLE_POINTS).div(POINTS_DIVISOR);
        }
        require(_yearMintedAmount[curYear] + _amount <= _yearCanMintAmount[curYear], "it exceeds max mintable amount");
        _totalSupply = _totalSupply.add(_amount);
        _yearMintedAmount[curYear] = _yearMintedAmount[curYear].add(_amount);
        _balances[_account] = _balances[_account].add(_amount);
        emit Transfer(address(0), _account, _amount);
    }

    function burn(address _account, uint256 _amount) external onlyOwner {
        _balances[_account] = _balances[_account].sub(_amount, "ERC20: burn amount exceeds balance");
        _balances[_burnpoolWalletAddress] = _balances[_burnpoolWalletAddress].add(_amount);
        _totalSupply = _totalSupply.sub(_amount);
        emit Transfer(_account, _burnpoolWalletAddress, _amount);
    }

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

    function transfer(address recipient, uint256 amount) external override returns (bool) {
        _transfer(msg.sender, recipient, amount);
        return true;
    }

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

    function approve(address spender, uint256 amount) external override returns (bool) {
        _approve(msg.sender, spender, amount);
        return true;
    }

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

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

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

    function addToBlackList(address[] calldata addresses) external onlyOwner {
        for (uint256 i; i < addresses.length; ++i) {
            _isBlacklisted[addresses[i]] = true;
            emit IsBlackListed(addresses[i], true);
        }
    }

    function removeFromBlackList(address account) external onlyOwner {
        _isBlacklisted[account] = false;
        emit IsBlackListed(account, false);
    }

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

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

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

        require(!_isBlacklisted[from] && !_isBlacklisted[to], "This address is blacklisted");

        if(from != owner() && to != owner())
            require(amount <= _maxTxAmount, "Transfer amount exceeds the maxTxAmount.");

        bool takeFee = true;

        if(excludeEnabled && (_isExcludedFromFee[from] || _isExcludedFromFee[to])) {
            takeFee = false;
        }

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

    function _tokenTransfer(address sender, address recipient, uint256 amount,bool takeFee) private {
        if(!takeFee) {
            _feelessTransfer(sender, recipient, amount);
        } else {
            if (enableTaxOnlyForSell && swapV2Pairs.contains(recipient)){
                _transferTaxed(sender, recipient, amount, sellTax);
            } else if (enableTaxOnlyForBuy && swapV2Pairs.contains(sender)) {
                _transferTaxed(sender, recipient, amount, buyTax);
            } else {
                _transferTaxed(sender, recipient, amount, transferTax);
            }
        }
    }

    function _transferTaxed(address sender, address recipient, uint256 amount, uint8 tax) private {
        require(_balances[sender] >= amount, "Transfer amount exceeds the balance.");
        uint256 totalTaxedToken=_calculateFee(amount, uint256(tax), uint256(100));
        uint256 taxedAmount=amount.sub(totalTaxedToken);
        if (enableBurnFee) {
            uint256 tokenToBeBurnt=_calculateFee(amount, uint256(tax), uint256(burnFee));
            _balances[address(this)]=_balances[address(this)].add(totalTaxedToken).sub(tokenToBeBurnt);
            _totalSupply = _totalSupply.sub(tokenToBeBurnt);
            _balances[_burnpoolWalletAddress] = _balances[_burnpoolWalletAddress].add(tokenToBeBurnt);
            emit Transfer(sender, _burnpoolWalletAddress, tokenToBeBurnt);
            emit Transfer(sender, address(this), (totalTaxedToken.sub(tokenToBeBurnt)));
        } else {
            _balances[address(this)]=_balances[address(this)].add((totalTaxedToken));
            emit Transfer(sender, address(this), (totalTaxedToken));
        }
        _balances[recipient] = _balances[recipient].add(taxedAmount);
        _balances[sender]=_balances[sender].sub(amount);
        emit Transfer(sender, recipient, taxedAmount);
    }

    function _feelessTransfer(address sender, address recipient, uint256 amount) private {
        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

    function _setMaxTxAmount(uint256 maxTxAmount) external onlyOwner() {
        require(maxTxAmount > 0, "maxTxAmount should be greater than zero");
        _maxTxAmount = maxTxAmount;
        emit SetMaxTxAmount(maxTxAmount);
    }

    //Calculates the token that should be taxed
    function _calculateFee(uint256 amount, uint256 tax, uint256 taxPercent) private pure returns (uint256) {
        return amount.mul(tax).mul(taxPercent).div(POINTS_DIVISOR);
    }

    function setTaxes(uint8 buyTaxValue, uint8 sellTaxVaule, uint8 transferTaxValue, uint8 burnFeeValue) external onlyOwner {
        require(buyTaxValue <= 20, "to high fee");
        require(sellTaxVaule <= 20, "to high fee");
        require(transferTaxValue <= 20, "to high fee");
        require(burnFeeValue <= 20, "to high fee");
        buyTax = buyTaxValue;
        sellTax = sellTaxVaule;
        transferTax = transferTaxValue;
        burnFee = burnFeeValue;
        emit TaxesSet(buyTaxValue, sellTaxVaule, transferTaxValue, burnFeeValue);
    }

    function setEnabledBurnFee(bool _enabledBurnFee) external onlyOwner {
        enableBurnFee = _enabledBurnFee;
        emit SetEnabledFlag(_enabledBurnFee, TAX_TYPE.BURN);
    }

    function setEnableTaxOnlyForBuy(bool _enableTaxOnlyForBUy) external onlyOwner {
        enableTaxOnlyForBuy = _enableTaxOnlyForBUy;
        emit SetEnabledFlag(_enableTaxOnlyForBUy, TAX_TYPE.BUY);
    }

    function setExcludeEnabled(bool _excludeEnabled) external onlyOwner() {
        excludeEnabled = _excludeEnabled;
        emit SetExcludeEnabled(_excludeEnabled);
    }

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

    function excludeFromFee(address account) external onlyOwner() {
        _isExcludedFromFee[account] = true;
        emit ExcludeFromFee(account, true);
    }

    function includeInFee(address account) external onlyOwner() {
        _isExcludedFromFee[account] = false;
        emit ExcludeFromFee(account, false);
    }


    function addSwapPair(address _pairAddress) external onlyOwner {
        require(!swapV2Pairs.contains(_pairAddress), 'add: SwapV2Pair already added');
        swapV2Pairs.add(_pairAddress);
        emit AddNewSwapPair(_pairAddress);
    }

    function setEnableTaxOnlyForSell(bool _enableTaxOnlyForSell) external onlyOwner {
        enableTaxOnlyForSell = _enableTaxOnlyForSell;
        emit SetEnabledFlag(_enableTaxOnlyForSell, TAX_TYPE.SELL);
    }

    function setEnableTaxOnlyForTransfer(bool _enableTaxOnlyForTransfer) external onlyOwner {
        enableTaxOnlyForTransfer = _enableTaxOnlyForTransfer;
        emit SetEnabledFlag(_enableTaxOnlyForTransfer, TAX_TYPE.TRANSFER);
    }

    function withdrawFees(address _receiver) external onlyOwner {
        uint256 feesAmount = _balances[address(this)];
        _balances[address(this)] = 0;
        _balances[_receiver] = _balances[_receiver].add(feesAmount);
        emit Transfer(address(this), _receiver, feesAmount);
    }

    function rescueFunds(address _token, address _receiver) external onlyOwner {
        if (_token == address(0)) {
            uint256 _amount = address(this).balance;
            payable(_receiver).transfer(_amount);
        } else {
            uint256 _amount = IERC20(_token).balanceOf(address(this));
            IERC20(_token).transfer(_receiver, _amount);
        }
    }

    function isPoolPair(address _pair) public view returns (bool) {
        return EnumerableSet.contains(swapV2Pairs, _pair);
    }


    function getPairsLength() external view returns (uint256) {
        return EnumerableSet.length(swapV2Pairs);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"pair","type":"address"}],"name":"AddNewSwapPair","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":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcludedFromFee","type":"bool"}],"name":"ExcludeFromFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"bool","name":"flag","type":"bool"}],"name":"IsBlackListed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"_enableFlag","type":"bool"},{"indexed":false,"internalType":"enum DEXI.TAX_TYPE","name":"_flagType","type":"uint8"}],"name":"SetEnabledFlag","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"excludeEnabled","type":"bool"}],"name":"SetExcludeEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"maxTxAmount","type":"uint256"}],"name":"SetMaxTxAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"_buyTax","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"_sellTax","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"_transferTax","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"_burnFee","type":"uint8"}],"name":"TaxesSet","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"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"ANNUAL_MINTABLE_POINTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_burnpoolWalletAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxTxAmount","type":"uint256"}],"name":"_setMaxTxAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"_yearCanMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"_yearMintedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_pairAddress","type":"address"}],"name":"addSwapPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"addToBlackList","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":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnFee","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTax","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","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"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"directTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableBurnFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTaxOnlyForBuy","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTaxOnlyForSell","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTaxOnlyForTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"excludeEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getPairsLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_pair","type":"address"}],"name":"isPoolPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeFromBlackList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"rescueFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellTax","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_enableTaxOnlyForBUy","type":"bool"}],"name":"setEnableTaxOnlyForBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enableTaxOnlyForSell","type":"bool"}],"name":"setEnableTaxOnlyForSell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enableTaxOnlyForTransfer","type":"bool"}],"name":"setEnableTaxOnlyForTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabledBurnFee","type":"bool"}],"name":"setEnabledBurnFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_excludeEnabled","type":"bool"}],"name":"setExcludeEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"buyTaxValue","type":"uint8"},{"internalType":"uint8","name":"sellTaxVaule","type":"uint8"},{"internalType":"uint8","name":"transferTaxValue","type":"uint8"},{"internalType":"uint8","name":"burnFeeValue","type":"uint8"}],"name":"setTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","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":"transferTax","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"}],"name":"withdrawFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526005600360006101000a81548160ff021916908360ff1602179055506008600360016101000a81548160ff021916908360ff1602179055506006600360026101000a81548160ff021916908360ff160217905550600a6003806101000a81548160ff021916908360ff1602179055506001600360046101000a81548160ff0219169083151502179055506001600360056101000a81548160ff0219169083151502179055506001600360066101000a81548160ff0219169083151502179055506001600360076101000a81548160ff0219169083151502179055506200012160646200010d6001600960ff16600a0a6302faf08002620003dd60201b620039751790919060201c565b620003dd60201b620039751790919060201c565b60045561dead600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200017457600080fd5b506000620001876200046860201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350600960ff16600a0a6302faf08002600281905550600960ff16600a0a6302faf08002600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001600a6000620002a06200047060201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600a60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600360086101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600960ff16600a0a6302faf080026040518082815260200191505060405180910390a362000499565b600080821162000455576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525060200191505060405180910390fd5b8183816200045f57fe5b04905092915050565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b614ec180620004a96000396000f3fe6080604052600436106102b25760003560e01c8063715018a611610175578063cc1776d3116100dc578063ed07401611610095578063fa5eb8fa1161006f578063fa5eb8fa1461108c578063fce589d8146110b9578063fef1b128146110e7578063ff8975701461113a576102b9565b8063ed07401614610fd3578063f1acc88e14611010578063f2fde38b1461103b576102b9565b8063cc1776d314610dfa578063cfd0d2ea14610e28578063dd62ed3e14610e8f578063e3c8098c14610f14578063e5d1dca314610f41578063ea2f0b3714610f82576102b9565b806395d89b411161012e57806395d89b4114610b75578063996b8a9d14610c055780639dc29fac14610c58578063a457c2d714610cb3578063a9059cbb14610d24578063b803494914610d95576102b9565b8063715018a614610a5c5780637d1db4a514610a735780638124f7ac14610a9e5780638170706c14610acc578063880e75f214610b095780638da5cb5b14610b34576102b9565b80632929bbf4116102195780634a49ac4c116101d25780634a49ac4c146108895780634f7041a5146108da5780635342acb414610908578063661bf2c01461096f5780636c61d60f1461099c57806370a08231146109f7576102b9565b80632929bbf4146106d45780633002ab1814610701578063313ce5671461073e578063395093511461076c57806340c10f19146107dd578063437823ec14610838576102b9565b806318869a171161026b57806318869a17146104b65780631bbae6e0146104f35780631cdd3be31461052e5780631ff9b6f21461059557806323b872dd14610606578063264f652614610697576102b9565b8063036ad6cd146102bb57806306fdde031461030c578063095ea7b31461039c57806312480f501461040d578063164e68de1461043a57806318160ddd1461048b576102b9565b366102b957005b005b3480156102c757600080fd5b5061030a600480360360208110156102de57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506111c0565b005b34801561031857600080fd5b5061032161135b565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610361578082015181840152602081019050610346565b50505050905090810190601f16801561038e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103a857600080fd5b506103f5600480360360408110156103bf57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611398565b60405180821515815260200191505060405180910390f35b34801561041957600080fd5b506104226113af565b60405180821515815260200191505060405180910390f35b34801561044657600080fd5b506104896004803603602081101561045d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506113c2565b005b34801561049757600080fd5b506104a06115f8565b6040518082815260200191505060405180910390f35b3480156104c257600080fd5b506104f1600480360360208110156104d957600080fd5b81019080803515159060200190929190505050611602565b005b3480156104ff57600080fd5b5061052c6004803603602081101561051657600080fd5b810190808035906020019092919050505061171b565b005b34801561053a57600080fd5b5061057d6004803603602081101561055157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611864565b60405180821515815260200191505060405180910390f35b3480156105a157600080fd5b50610604600480360360408110156105b857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611884565b005b34801561061257600080fd5b5061067f6004803603606081101561062957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611b13565b60405180821515815260200191505060405180910390f35b3480156106a357600080fd5b506106d2600480360360208110156106ba57600080fd5b81019080803515159060200190929190505050611bde565b005b3480156106e057600080fd5b506106e9611cf7565b60405180821515815260200191505060405180910390f35b34801561070d57600080fd5b5061073c6004803603602081101561072457600080fd5b81019080803515159060200190929190505050611d0a565b005b34801561074a57600080fd5b50610753611e0f565b604051808260ff16815260200191505060405180910390f35b34801561077857600080fd5b506107c56004803603604081101561078f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611e18565b60405180821515815260200191505060405180910390f35b3480156107e957600080fd5b506108366004803603604081101561080057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611ebd565b005b34801561084457600080fd5b506108876004803603602081101561085b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506123a9565b005b34801561089557600080fd5b506108d8600480360360208110156108ac57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061250b565b005b3480156108e657600080fd5b506108ef61265c565b604051808260ff16815260200191505060405180910390f35b34801561091457600080fd5b506109576004803603602081101561092b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061266f565b60405180821515815260200191505060405180910390f35b34801561097b57600080fd5b506109846126c5565b60405180821515815260200191505060405180910390f35b3480156109a857600080fd5b506109f5600480360360408110156109bf57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506126d8565b005b348015610a0357600080fd5b50610a4660048036036020811015610a1a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612796565b6040518082815260200191505060405180910390f35b348015610a6857600080fd5b50610a716127df565b005b348015610a7f57600080fd5b50610a8861294c565b6040518082815260200191505060405180910390f35b348015610aaa57600080fd5b50610ab3612952565b604051808260ff16815260200191505060405180910390f35b348015610ad857600080fd5b50610b0760048036036020811015610aef57600080fd5b81019080803515159060200190929190505050612965565b005b348015610b1557600080fd5b50610b1e612a7e565b6040518082815260200191505060405180910390f35b348015610b4057600080fd5b50610b49612a8f565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610b8157600080fd5b50610b8a612ab8565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610bca578082015181840152602081019050610baf565b50505050905090810190601f168015610bf75780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610c1157600080fd5b50610c4260048036036020811015610c2857600080fd5b81019080803561ffff169060200190929190505050612af5565b6040518082815260200191505060405180910390f35b348015610c6457600080fd5b50610cb160048036036040811015610c7b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612b0d565b005b348015610cbf57600080fd5b50610d0c60048036036040811015610cd657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612dea565b60405180821515815260200191505060405180910390f35b348015610d3057600080fd5b50610d7d60048036036040811015610d4757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612ea9565b60405180821515815260200191505060405180910390f35b348015610da157600080fd5b50610df860048036036080811015610db857600080fd5b81019080803560ff169060200190929190803560ff169060200190929190803560ff169060200190929190803560ff169060200190929190505050612ec0565b005b348015610e0657600080fd5b50610e0f613223565b604051808260ff16815260200191505060405180910390f35b348015610e3457600080fd5b50610e7760048036036020811015610e4b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613236565b60405180821515815260200191505060405180910390f35b348015610e9b57600080fd5b50610efe60048036036040811015610eb257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061324a565b6040518082815260200191505060405180910390f35b348015610f2057600080fd5b50610f296132d1565b60405180821515815260200191505060405180910390f35b348015610f4d57600080fd5b50610f566132e4565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610f8e57600080fd5b50610fd160048036036020811015610fa557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061330a565b005b348015610fdf57600080fd5b5061100e60048036036020811015610ff657600080fd5b8101908080351515906020019092919050505061346c565b005b34801561101c57600080fd5b50611025613585565b6040518082815260200191505060405180910390f35b34801561104757600080fd5b5061108a6004803603602081101561105e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061358b565b005b34801561109857600080fd5b506110a161377d565b60405180821515815260200191505060405180910390f35b3480156110c557600080fd5b506110ce613790565b604051808260ff16815260200191505060405180910390f35b3480156110f357600080fd5b506111246004803603602081101561110a57600080fd5b81019080803561ffff1690602001909291905050506137a1565b6040518082815260200191505060405180910390f35b34801561114657600080fd5b506111be6004803603602081101561115d57600080fd5b810190808035906020019064010000000081111561117a57600080fd5b82018360208201111561118c57600080fd5b803590602001918460208302840111640100000000831117156111ae57600080fd5b90919293919293905050506137b9565b005b6111c86139fe565b73ffffffffffffffffffffffffffffffffffffffff166111e6612a8f565b73ffffffffffffffffffffffffffffffffffffffff161461126f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b61128381600b613a0690919063ffffffff16565b156112f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f6164643a205377617056325061697220616c726561647920616464656400000081525060200191505060405180910390fd5b61130a81600b613a3690919063ffffffff16565b507f786c4a0c667c2b4ec2515f15cf80a09197ad7b87cf7ce9186b6177d1d667dc8881604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b60606040518060400160405280600d81526020017f444558494f50524f544f434f4c00000000000000000000000000000000000000815250905090565b60006113a5338484613a66565b6001905092915050565b600360069054906101000a900460ff1681565b6113ca6139fe565b73ffffffffffffffffffffffffffffffffffffffff166113e8612a8f565b73ffffffffffffffffffffffffffffffffffffffff1614611471576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000600160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061154c81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c5d90919063ffffffff16565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b6000600254905090565b61160a6139fe565b73ffffffffffffffffffffffffffffffffffffffff16611628612a8f565b73ffffffffffffffffffffffffffffffffffffffff16146116b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600360076101000a81548160ff0219169083151502179055507f90ab3dcb6d1bc8e352126d73e1744cefc1a08d8456436d37928c4dd2de2e300881600360405180831515815260200182600381111561170757fe5b81526020019250505060405180910390a150565b6117236139fe565b73ffffffffffffffffffffffffffffffffffffffff16611741612a8f565b73ffffffffffffffffffffffffffffffffffffffff16146117ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60008111611823576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180614d136027913960400191505060405180910390fd5b806004819055507f4a02caf9e7317d663463d3d976767ba90289279dd55c0a46f962536efc87a9a6816040518082815260200191505060405180910390a150565b60096020528060005260406000206000915054906101000a900460ff1681565b61188c6139fe565b73ffffffffffffffffffffffffffffffffffffffff166118aa612a8f565b73ffffffffffffffffffffffffffffffffffffffff1614611933576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119ba5760004790508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156119b3573d6000803e3d6000fd5b5050611b0f565b60008273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611a2357600080fd5b505afa158015611a37573d6000803e3d6000fd5b505050506040513d6020811015611a4d57600080fd5b810190808051906020019092919050505090508273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015611ad157600080fd5b505af1158015611ae5573d6000803e3d6000fd5b505050506040513d6020811015611afb57600080fd5b810190808051906020019092919050505050505b5050565b6000611b20848484613ce5565b611bd38433611bce85604051806060016040528060288152602001614dcd60289139600660008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546141129092919063ffffffff16565b613a66565b600190509392505050565b611be66139fe565b73ffffffffffffffffffffffffffffffffffffffff16611c04612a8f565b73ffffffffffffffffffffffffffffffffffffffff1614611c8d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600360066101000a81548160ff0219169083151502179055507f90ab3dcb6d1bc8e352126d73e1744cefc1a08d8456436d37928c4dd2de2e3008816001604051808315158152602001826003811115611ce357fe5b81526020019250505060405180910390a150565b600360059054906101000a900460ff1681565b611d126139fe565b73ffffffffffffffffffffffffffffffffffffffff16611d30612a8f565b73ffffffffffffffffffffffffffffffffffffffff1614611db9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600360086101000a81548160ff0219169083151502179055507f83edaaca0099288fb481bf23f772baba7ed26de0f877b8aa2f31d42453c859ea8160405180821515815260200191505060405180910390a150565b60006009905090565b6000611eb33384611eae85600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c5d90919063ffffffff16565b613a66565b6001905092915050565b611ec56139fe565b73ffffffffffffffffffffffffffffffffffffffff16611ee3612a8f565b73ffffffffffffffffffffffffffffffffffffffff1614611f6c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600960ff16600a0a630ee6b2800281600254011115611ff3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f4d696e74206c696d69742072656163686564000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612096576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b600073dc1fea11d6980e629b041c2bd0578698019e0ba76392d66313426040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156120e757600080fd5b505af41580156120fb573d6000803e3d6000fd5b505050506040513d602081101561211157600080fd5b810190808051906020019092919050505090506000600860008361ffff1661ffff168152602001908152602001600020541415612193576121736127106121656103e86002546141cc90919063ffffffff16565b61397590919063ffffffff16565b600860008361ffff1661ffff168152602001908152602001600020819055505b600860008261ffff1661ffff1681526020019081526020016000205482600760008461ffff1661ffff16815260200190815260200160002054011115612241576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f69742065786365656473206d6178206d696e7461626c6520616d6f756e74000081525060200191505060405180910390fd5b61225682600254613c5d90919063ffffffff16565b60028190555061228a82600760008461ffff1661ffff16815260200190815260200160002054613c5d90919063ffffffff16565b600760008361ffff1661ffff168152602001908152602001600020819055506122fb82600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c5d90919063ffffffff16565b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3505050565b6123b16139fe565b73ffffffffffffffffffffffffffffffffffffffff166123cf612a8f565b73ffffffffffffffffffffffffffffffffffffffff1614612458576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6001600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507fd5144d2a6c8ff9b87b7a40852df5102cab2ce561c06b56cc6fe7ccf1fa7f8c2d816001604051808373ffffffffffffffffffffffffffffffffffffffff16815260200182151581526020019250505060405180910390a150565b6125136139fe565b73ffffffffffffffffffffffffffffffffffffffff16612531612a8f565b73ffffffffffffffffffffffffffffffffffffffff16146125ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600015158173ffffffffffffffffffffffffffffffffffffffff167f65d58a482cf61e30f4bae9c83fea5b596d5386e9a0e1872d3a53fc631e78494960405160405180910390a350565b600360009054906101000a900460ff1681565b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600360089054906101000a900460ff1681565b6126e06139fe565b73ffffffffffffffffffffffffffffffffffffffff166126fe612a8f565b73ffffffffffffffffffffffffffffffffffffffff1614612787576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b612792308383613ce5565b5050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6127e76139fe565b73ffffffffffffffffffffffffffffffffffffffff16612805612a8f565b73ffffffffffffffffffffffffffffffffffffffff161461288e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60045481565b600360029054906101000a900460ff1681565b61296d6139fe565b73ffffffffffffffffffffffffffffffffffffffff1661298b612a8f565b73ffffffffffffffffffffffffffffffffffffffff1614612a14576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600360056101000a81548160ff0219169083151502179055507f90ab3dcb6d1bc8e352126d73e1744cefc1a08d8456436d37928c4dd2de2e3008816002604051808315158152602001826003811115612a6a57fe5b81526020019250505060405180910390a150565b6000612a8a600b614252565b905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606040518060400160405280600481526020017f4445584900000000000000000000000000000000000000000000000000000000815250905090565b60076020528060005260406000206000915090505481565b612b156139fe565b73ffffffffffffffffffffffffffffffffffffffff16612b33612a8f565b73ffffffffffffffffffffffffffffffffffffffff1614612bbc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b612c2881604051806060016040528060228152602001614ca960229139600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546141129092919063ffffffff16565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612cdf8160016000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c5d90919063ffffffff16565b60016000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612d598160025461426790919063ffffffff16565b600281905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b6000612e9f3384612e9a85604051806060016040528060258152602001614e6760259139600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546141129092919063ffffffff16565b613a66565b6001905092915050565b6000612eb6338484613ce5565b6001905092915050565b612ec86139fe565b73ffffffffffffffffffffffffffffffffffffffff16612ee6612a8f565b73ffffffffffffffffffffffffffffffffffffffff1614612f6f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60148460ff161115612fe9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f746f20686967682066656500000000000000000000000000000000000000000081525060200191505060405180910390fd5b60148360ff161115613063576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f746f20686967682066656500000000000000000000000000000000000000000081525060200191505060405180910390fd5b60148260ff1611156130dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f746f20686967682066656500000000000000000000000000000000000000000081525060200191505060405180910390fd5b60148160ff161115613157576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f746f20686967682066656500000000000000000000000000000000000000000081525060200191505060405180910390fd5b83600360006101000a81548160ff021916908360ff16021790555082600360016101000a81548160ff021916908360ff16021790555081600360026101000a81548160ff021916908360ff160217905550806003806101000a81548160ff021916908360ff1602179055507fa2c26ee674508cbec54d81b2c401f64849f61ac3445dc448ab16078abd1c6fda84848484604051808560ff1681526020018460ff1681526020018360ff1681526020018260ff16815260200194505050505060405180910390a150505050565b600360019054906101000a900460ff1681565b6000613243600b83613a06565b9050919050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600360079054906101000a900460ff1681565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6133126139fe565b73ffffffffffffffffffffffffffffffffffffffff16613330612a8f565b73ffffffffffffffffffffffffffffffffffffffff16146133b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507fd5144d2a6c8ff9b87b7a40852df5102cab2ce561c06b56cc6fe7ccf1fa7f8c2d816000604051808373ffffffffffffffffffffffffffffffffffffffff16815260200182151581526020019250505060405180910390a150565b6134746139fe565b73ffffffffffffffffffffffffffffffffffffffff16613492612a8f565b73ffffffffffffffffffffffffffffffffffffffff161461351b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600360046101000a81548160ff0219169083151502179055507f90ab3dcb6d1bc8e352126d73e1744cefc1a08d8456436d37928c4dd2de2e300881600060405180831515815260200182600381111561357157fe5b81526020019250505060405180910390a150565b6103e881565b6135936139fe565b73ffffffffffffffffffffffffffffffffffffffff166135b1612a8f565b73ffffffffffffffffffffffffffffffffffffffff161461363a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156136c0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180614ccb6026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600360049054906101000a900460ff1681565b60038054906101000a900460ff1681565b60086020528060005260406000206000915090505481565b6137c16139fe565b73ffffffffffffffffffffffffffffffffffffffff166137df612a8f565b73ffffffffffffffffffffffffffffffffffffffff1614613868576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60005b828290508110156139705760016009600085858581811061388857fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001151583838381811061390657fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f65d58a482cf61e30f4bae9c83fea5b596d5386e9a0e1872d3a53fc631e78494960405160405180910390a380600101905061386b565b505050565b60008082116139ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525060200191505060405180910390fd5b8183816139f557fe5b04905092915050565b600033905090565b6000613a2e836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6142ea565b905092915050565b6000613a5e836000018373ffffffffffffffffffffffffffffffffffffffff1660001b61430d565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613aec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180614e436024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613b72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180614cf16022913960400191505060405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b600080828401905083811015613cdb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613d6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180614e1e6025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613df1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180614c866023913960400191505060405180910390fd5b60008111613e4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180614df56029913960400191505060405180910390fd5b600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015613eee5750600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b613f60576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f54686973206164647265737320697320626c61636b6c6973746564000000000081525060200191505060405180910390fd5b613f68612a8f565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015613fd65750613fa6612a8f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b1561403757600454811115614036576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180614d846028913960400191505060405180910390fd5b5b600060019050600360089054906101000a900460ff1680156140f65750600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806140f55750600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b5b1561410057600090505b61410c8484848461437d565b50505050565b60008383111582906141bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614184578082015181840152602081019050614169565b50505050905090810190601f1680156141b15780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5082840390509392505050565b6000808314156141df576000905061424c565b60008284029050828482816141f057fe5b0414614247576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614dac6021913960400191505060405180910390fd5b809150505b92915050565b600061426082600001614458565b9050919050565b6000828211156142df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525060200191505060405180910390fd5b818303905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b600061431983836142ea565b614372578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050614377565b600090505b92915050565b806143925761438d848484614469565b614452565b600360059054906101000a900460ff1680156143be57506143bd83600b613a0690919063ffffffff16565b5b156143e3576143de848484600360019054906101000a900460ff16614617565b614451565b600360069054906101000a900460ff16801561440f575061440e84600b613a0690919063ffffffff16565b5b156144345761442f848484600360009054906101000a900460ff16614617565b614450565b61444f848484600360029054906101000a900460ff16614617565b5b5b5b50505050565b600081600001805490509050919050565b6144d581604051806060016040528060268152602001614d5e60269139600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546141129092919063ffffffff16565b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061456a81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c5d90919063ffffffff16565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156146af576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180614d3a6024913960400191505060405180910390fd5b60006146c0838360ff166064614c41565b905060006146d7828561426790919063ffffffff16565b9050600360049054906101000a900460ff16156149af57600061470e858560ff1660038054906101000a900460ff1660ff16614c41565b90506147748161476685600160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c5d90919063ffffffff16565b61426790919063ffffffff16565b600160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506147cc8160025461426790919063ffffffff16565b6002819055506148468160016000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c5d90919063ffffffff16565b60016000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a33073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef614994848761426790919063ffffffff16565b6040518082815260200191505060405180910390a350614aaa565b614a0182600160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c5d90919063ffffffff16565b600160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a35b614afc81600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c5d90919063ffffffff16565b600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614b9184600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461426790919063ffffffff16565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050505050565b6000614c7c612710614c6e84614c6087896141cc90919063ffffffff16565b6141cc90919063ffffffff16565b61397590919063ffffffff16565b9050939250505056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f20616464726573736d61785478416d6f756e742073686f756c642062652067726561746572207468616e207a65726f5472616e7366657220616d6f756e742065786365656473207468652062616c616e63652e45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63655472616e7366657220616d6f756e74206578636565647320746865206d61785478416d6f756e742e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63655472616e7366657220616d6f756e74206d7573742062652067726561746572207468616e207a65726f45524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220f8c02d46efea2af4c8bb7782eeee868bafb16f6add12f44a04d274391fdd8e8764736f6c634300060c0033

Deployed ByteCode Sourcemap

14063:13307:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25703:242;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;16754:83;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18838:161;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;15069:38;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;26415:295;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;17031:100;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;26172:235;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;23602:233;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;15564:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;26718:384;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;19007:311;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;24840:205;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;15023:39;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;25053:171;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;16940:83;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;19326:216;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;17139:838;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;25365:160;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;20082;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;14856:23;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;25232:125;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;15164:26;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;16610:136;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;18383:119;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1008:148;;;;;;;;;;;;;:::i;:::-;;15199:59;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;14917:28;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;25953:211;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;27250:117;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;785:87;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;16845;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15445:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;17985:390;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;19550:267;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;18510:167;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;24080:564;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;14886:24;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;27110:130;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;18685:145;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;15114:43;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;15265:91;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;25533:160;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;24652:180;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;14598:53;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1164:244;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;14984:32;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;14952:25;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;15504:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;19825:249;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;25703:242;931:12;:10;:12::i;:::-;920:23;;:7;:5;:7::i;:::-;:23;;;912:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25785:34:::1;25806:12;25785:11;:20;;:34;;;;:::i;:::-;25784:35;25776:77;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;25864:29;25880:12;25864:11;:15;;:29;;;;:::i;:::-;;25909:28;25924:12;25909:28;;;;;;;;;;;;;;;;;;;;25703:242:::0;:::o;16754:83::-;16791:13;16824:5;;;;;;;;;;;;;;;;;16817:12;;16754:83;:::o;18838:161::-;18915:4;18932:37;18941:10;18953:7;18962:6;18932:8;:37::i;:::-;18987:4;18980:11;;18838:161;;;;:::o;15069:38::-;;;;;;;;;;;;;:::o;26415:295::-;931:12;:10;:12::i;:::-;920:23;;:7;:5;:7::i;:::-;:23;;;912:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26486:18:::1;26507:9;:24;26525:4;26507:24;;;;;;;;;;;;;;;;26486:45;;26569:1;26542:9;:24;26560:4;26542:24;;;;;;;;;;;;;;;:28;;;;26604:36;26629:10;26604:9;:20;26614:9;26604:20;;;;;;;;;;;;;;;;:24;;:36;;;;:::i;:::-;26581:9;:20;26591:9;26581:20;;;;;;;;;;;;;;;:59;;;;26680:9;26656:46;;26673:4;26656:46;;;26691:10;26656:46;;;;;;;;;;;;;;;;;;991:1;26415:295:::0;:::o;17031:100::-;17084:7;17111:12;;17104:19;;17031:100;:::o;26172:235::-;931:12;:10;:12::i;:::-;920:23;;:7;:5;:7::i;:::-;:23;;;912:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26298:25:::1;26271:24;;:52;;;;;;;;;;;;;;;;;;26339:60;26354:25;26381:17;26339:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26172:235:::0;:::o;23602:233::-;931:12;:10;:12::i;:::-;920:23;;:7;:5;:7::i;:::-;:23;;;912:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23702:1:::1;23688:11;:15;23680:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23773:11;23758:12;:26;;;;23800:27;23815:11;23800:27;;;;;;;;;;;;;;;;;;23602:233:::0;:::o;15564:47::-;;;;;;;;;;;;;;;;;;;;;;:::o;26718:384::-;931:12;:10;:12::i;:::-;920:23;;:7;:5;:7::i;:::-;:23;;;912:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26826:1:::1;26808:20;;:6;:20;;;26804:291;;;26845:15;26863:21;26845:39;;26907:9;26899:27;;:36;26927:7;26899:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;26804:291;;;;26968:15;26993:6;26986:24;;;27019:4;26986:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;26968:57;;27047:6;27040:23;;;27064:9;27075:7;27040:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;26804:291;;26718:384:::0;;:::o;19007:311::-;19107:4;19124:36;19134:6;19142:9;19153:6;19124:9;:36::i;:::-;19171:117;19180:6;19188:10;19200:87;19236:6;19200:87;;;;;;;;;;;;;;;;;:11;:19;19212:6;19200:19;;;;;;;;;;;;;;;:31;19220:10;19200:31;;;;;;;;;;;;;;;;:35;;:87;;;;;:::i;:::-;19171:8;:117::i;:::-;19306:4;19299:11;;19007:311;;;;;:::o;24840:205::-;931:12;:10;:12::i;:::-;920:23;;:7;:5;:7::i;:::-;:23;;;912:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24951:20:::1;24929:19;;:42;;;;;;;;;;;;;;;;;;24987:50;25002:20;25024:12;24987:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24840:205:::0;:::o;15023:39::-;;;;;;;;;;;;;:::o;25053:171::-;931:12;:10;:12::i;:::-;920:23;;:7;:5;:7::i;:::-;:23;;;912:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25151:15:::1;25134:14;;:32;;;;;;;;;;;;;;;;;;25182:34;25200:15;25182:34;;;;;;;;;;;;;;;;;;;;25053:171:::0;:::o;16940:83::-;16981:5;14356:1;16999:16;;16940:83;:::o;19326:216::-;19416:4;19433:79;19442:10;19454:7;19463:48;19500:10;19463:11;:23;19475:10;19463:23;;;;;;;;;;;;;;;:32;19487:7;19463:32;;;;;;;;;;;;;;;;:36;;:48;;;;:::i;:::-;19433:8;:79::i;:::-;19530:4;19523:11;;19326:216;;;;:::o;17139:838::-;931:12;:10;:12::i;:::-;920:23;;:7;:5;:7::i;:::-;:23;;;912:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14356:1:::1;14519:18;;14515:2;:22;14503:9;:34;17251:7;17236:12;;:22;:36;;17228:67;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;17334:1;17314:22;;:8;:22;;;;17306:66;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;17383:14;17400:8;:16;17417:15;17400:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;17383:50;;17479:1;17448:18;:27;17467:7;17448:27;;;;;;;;;;;;;;;;:32;17444:155;;;17527:60;14586:5;17527:40;14647:4;17527:12;;:16;;:40;;;;:::i;:::-;:44;;:60;;;;:::i;:::-;17497:18;:27;17516:7;17497:27;;;;;;;;;;;;;;;:90;;;;17444:155;17657:18;:27;17676:7;17657:27;;;;;;;;;;;;;;;;17646:7;17617:17;:26;17635:7;17617:26;;;;;;;;;;;;;;;;:36;:67;;17609:110;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;17745:25;17762:7;17745:12;;:16;;:25;;;;:::i;:::-;17730:12;:40;;;;17810:39;17841:7;17810:17;:26;17828:7;17810:26;;;;;;;;;;;;;;;;:30;;:39;;;;:::i;:::-;17781:17;:26;17799:7;17781:26;;;;;;;;;;;;;;;:68;;;;17882:32;17906:7;17882:9;:19;17892:8;17882:19;;;;;;;;;;;;;;;;:23;;:32;;;;:::i;:::-;17860:9;:19;17870:8;17860:19;;;;;;;;;;;;;;;:54;;;;17951:8;17930:39;;17947:1;17930:39;;;17961:7;17930:39;;;;;;;;;;;;;;;;;;991:1;17139:838:::0;;:::o;25365:160::-;931:12;:10;:12::i;:::-;920:23;;:7;:5;:7::i;:::-;:23;;;912:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25468:4:::1;25438:18;:27;25457:7;25438:27;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;25488:29;25503:7;25512:4;25488:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;25365:160:::0;:::o;20082:::-;931:12;:10;:12::i;:::-;920:23;;:7;:5;:7::i;:::-;:23;;;912:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20184:5:::1;20158:14;:23;20173:7;20158:23;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;20228:5;20205:29;;20219:7;20205:29;;;;;;;;;;;;20082:160:::0;:::o;14856:23::-;;;;;;;;;;;;;:::o;25232:125::-;25298:4;25322:18;:27;25341:7;25322:27;;;;;;;;;;;;;;;;;;;;;;;;;25315:34;;25232:125;;;:::o;15164:26::-;;;;;;;;;;;;;:::o;16610:136::-;931:12;:10;:12::i;:::-;920:23;;:7;:5;:7::i;:::-;:23;;;912:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16697:41:::1;16715:4;16722:7;16731:6;16697:9;:41::i;:::-;16610:136:::0;;:::o;18383:119::-;18449:7;18476:9;:18;18486:7;18476:18;;;;;;;;;;;;;;;;18469:25;;18383:119;;;:::o;1008:148::-;931:12;:10;:12::i;:::-;920:23;;:7;:5;:7::i;:::-;:23;;;912:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1115:1:::1;1078:40;;1099:6;::::0;::::1;;;;;;;;1078:40;;;;;;;;;;;;1146:1;1129:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;1008:148::o:0;15199:59::-;;;;:::o;14917:28::-;;;;;;;;;;;;;:::o;25953:211::-;931:12;:10;:12::i;:::-;920:23;;:7;:5;:7::i;:::-;:23;;;912:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26067:21:::1;26044:20;;:44;;;;;;;;;;;;;;;;;;26104:52;26119:21;26142:13;26104:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25953:211:::0;:::o;27250:117::-;27299:7;27326:33;27347:11;27326:20;:33::i;:::-;27319:40;;27250:117;:::o;785:87::-;831:7;858:6;;;;;;;;;;;851:13;;785:87;:::o;16845:::-;16884:13;16917:7;;;;;;;;;;;;;;;;;16910:14;;16845:87;:::o;15445:52::-;;;;;;;;;;;;;;;;;:::o;17985:390::-;931:12;:10;:12::i;:::-;920:23;;:7;:5;:7::i;:::-;:23;;;912:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18086:70:::1;18110:7;18086:70;;;;;;;;;;;;;;;;;:9;:19;18096:8;18086:19;;;;;;;;;;;;;;;;:23;;:70;;;;;:::i;:::-;18064:9;:19;18074:8;18064:19;;;;;;;;;;;;;;;:92;;;;18203:46;18241:7;18203:9;:33;18213:22;;;;;;;;;;;18203:33;;;;;;;;;;;;;;;;:37;;:46;;;;:::i;:::-;18167:9;:33;18177:22;;;;;;;;;;;18167:33;;;;;;;;;;;;;;;:82;;;;18275:25;18292:7;18275:12;;:16;;:25;;;;:::i;:::-;18260:12;:40;;;;18335:22;;;;;;;;;;;18316:51;;18325:8;18316:51;;;18359:7;18316:51;;;;;;;;;;;;;;;;;;17985:390:::0;;:::o;19550:267::-;19645:4;19662:125;19671:10;19683:7;19692:94;19729:15;19692:94;;;;;;;;;;;;;;;;;:11;:23;19704:10;19692:23;;;;;;;;;;;;;;;:32;19716:7;19692:32;;;;;;;;;;;;;;;;:36;;:94;;;;;:::i;:::-;19662:8;:125::i;:::-;19805:4;19798:11;;19550:267;;;;:::o;18510:167::-;18590:4;18607:40;18617:10;18629:9;18640:6;18607:9;:40::i;:::-;18665:4;18658:11;;18510:167;;;;:::o;24080:564::-;931:12;:10;:12::i;:::-;920:23;;:7;:5;:7::i;:::-;:23;;;912:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24234:2:::1;24219:11;:17;;;;24211:41;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;24287:2;24271:12;:18;;;;24263:42;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;24344:2;24324:16;:22;;;;24316:46;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;24397:2;24381:12;:18;;;;24373:42;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;24435:11;24426:6;;:20;;;;;;;;;;;;;;;;;;24467:12;24457:7;;:22;;;;;;;;;;;;;;;;;;24504:16;24490:11;;:30;;;;;;;;;;;;;;;;;;24541:12;24531:7;::::0;:22:::1;;;;;;;;;;;;;;;;;;24569:67;24578:11;24591:12;24605:16;24623:12;24569:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24080:564:::0;;;;:::o;14886:24::-;;;;;;;;;;;;;:::o;27110:130::-;27166:4;27190:42;27213:11;27226:5;27190:22;:42::i;:::-;27183:49;;27110:130;;;:::o;18685:145::-;18768:7;18795:11;:18;18807:5;18795:18;;;;;;;;;;;;;;;:27;18814:7;18795:27;;;;;;;;;;;;;;;;18788:34;;18685:145;;;;:::o;15114:43::-;;;;;;;;;;;;;:::o;15265:91::-;;;;;;;;;;;;;:::o;25533:160::-;931:12;:10;:12::i;:::-;920:23;;:7;:5;:7::i;:::-;:23;;;912:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25634:5:::1;25604:18;:27;25623:7;25604:27;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;25655:30;25670:7;25679:5;25655:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;25533:160:::0;:::o;24652:180::-;931:12;:10;:12::i;:::-;920:23;;:7;:5;:7::i;:::-;:23;;;912:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24747:15:::1;24731:13;;:31;;;;;;;;;;;;;;;;;;24778:46;24793:15;24810:13;24778:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24652:180:::0;:::o;14598:53::-;14647:4;14598:53;:::o;1164:244::-;931:12;:10;:12::i;:::-;920:23;;:7;:5;:7::i;:::-;:23;;;912:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1273:1:::1;1253:22;;:8;:22;;;;1245:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1363:8;1334:38;;1355:6;::::0;::::1;;;;;;;;1334:38;;;;;;;;;;;;1392:8;1383:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;1164:244:::0;:::o;14984:32::-;;;;;;;;;;;;;:::o;14952:25::-;;;;;;;;;;;;:::o;15504:53::-;;;;;;;;;;;;;;;;;:::o;19825:249::-;931:12;:10;:12::i;:::-;920:23;;:7;:5;:7::i;:::-;:23;;;912:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19914:9:::1;19909:158;19929:9;;:16;;19925:1;:20;19909:158;;;19998:4;19967:14;:28;19982:9;;19992:1;19982:12;;;;;;;;;;;;;;;19967:28;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;20050:4;20022:33;;20036:9;;20046:1;20036:12;;;;;;;;;;;;;;;20022:33;;;;;;;;;;;;19947:3;;;;;19909:158;;;;19825:249:::0;;:::o;2924:153::-;2982:7;3014:1;3010;:5;3002:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3068:1;3064;:5;;;;;;3057:12;;2924:153;;;;:::o;93:106::-;146:15;181:10;174:17;;93:106;:::o;6480:167::-;6560:4;6584:55;6594:3;:10;;6630:5;6614:23;;6606:32;;6584:9;:55::i;:::-;6577:62;;6480:167;;;;:::o;6154:152::-;6224:4;6248:50;6253:3;:10;;6289:5;6273:23;;6265:32;;6248:4;:50::i;:::-;6241:57;;6154:152;;;;:::o;20250:337::-;20360:1;20343:19;;:5;:19;;;;20335:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20441:1;20422:21;;:7;:21;;;;20414:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20525:6;20495:11;:18;20507:5;20495:18;;;;;;;;;;;;;;;:27;20514:7;20495:27;;;;;;;;;;;;;;;:36;;;;20563:7;20547:32;;20556:5;20547:32;;;20572:6;20547:32;;;;;;;;;;;;;;;;;;20250:337;;;:::o;2343:179::-;2401:7;2421:9;2437:1;2433;:5;2421:17;;2462:1;2457;:6;;2449:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2513:1;2506:8;;;2343:179;;;;:::o;20595:787::-;20733:1;20717:18;;:4;:18;;;;20709:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20810:1;20796:16;;:2;:16;;;;20788:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20880:1;20871:6;:10;20863:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20949:14;:20;20964:4;20949:20;;;;;;;;;;;;;;;;;;;;;;;;;20948:21;:44;;;;;20974:14;:18;20989:2;20974:18;;;;;;;;;;;;;;;;;;;;;;;;;20973:19;20948:44;20940:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21048:7;:5;:7::i;:::-;21040:15;;:4;:15;;;;:32;;;;;21065:7;:5;:7::i;:::-;21059:13;;:2;:13;;;;21040:32;21037:125;;;21105:12;;21095:6;:22;;21087:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21037:125;21175:12;21190:4;21175:19;;21210:14;;;;;;;;;;;:70;;;;;21229:18;:24;21248:4;21229:24;;;;;;;;;;;;;;;;;;;;;;;;;:50;;;;21257:18;:22;21276:2;21257:22;;;;;;;;;;;;;;;;;;;;;;;;;21229:50;21210:70;21207:117;;;21307:5;21297:15;;21207:117;21336:38;21351:4;21356:2;21359:6;21366:7;21336:14;:38::i;:::-;20595:787;;;;:::o;3244:166::-;3330:7;3363:1;3358;:6;;3366:12;3350:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3401:1;3397;:5;3390:12;;3244:166;;;;;:::o;2696:220::-;2754:7;2783:1;2778;:6;2774:20;;;2793:1;2786:8;;;;2774:20;2805:9;2821:1;2817;:5;2805:17;;2850:1;2845;2841;:5;;;;;;:10;2833:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2907:1;2900:8;;;2696:220;;;;;:::o;6655:117::-;6718:7;6745:19;6753:3;:10;;6745:7;:19::i;:::-;6738:26;;6655:117;;;:::o;2530:158::-;2588:7;2621:1;2616;:6;;2608:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2679:1;2675;:5;2668:12;;2530:158;;;;:::o;4873:129::-;4946:4;4993:1;4970:3;:12;;:19;4983:5;4970:19;;;;;;;;;;;;:24;;4963:31;;4873:129;;;;:::o;3895:291::-;3958:4;3980:21;3990:3;3995:5;3980:9;:21::i;:::-;3975:204;;4018:3;:11;;4035:5;4018:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4078:3;:11;;:18;;;;4056:3;:12;;:19;4069:5;4056:19;;;;;;;;;;;:40;;;;4118:4;4111:11;;;;3975:204;4162:5;4155:12;;3895:291;;;;;:::o;21390:616::-;21501:7;21497:502;;21525:43;21542:6;21550:9;21561:6;21525:16;:43::i;:::-;21497:502;;;21605:20;;;;;;;;;;;:55;;;;;21629:31;21650:9;21629:11;:20;;:31;;;;:::i;:::-;21605:55;21601:387;;;21680:50;21695:6;21703:9;21714:6;21722:7;;;;;;;;;;;21680:14;:50::i;:::-;21601:387;;;21756:19;;;;;;;;;;;:51;;;;;21779:28;21800:6;21779:11;:20;;:28;;;;:::i;:::-;21756:51;21752:236;;;21828:49;21843:6;21851:9;21862:6;21870;;;;;;;;;;;21828:14;:49::i;:::-;21752:236;;;21918:54;21933:6;21941:9;21952:6;21960:11;;;;;;;;;;;21918:14;:54::i;:::-;21752:236;21601:387;21497:502;21390:616;;;;:::o;5010:109::-;5066:7;5093:3;:11;;:18;;;;5086:25;;5010:109;;;:::o;23282:312::-;23398:71;23420:6;23398:71;;;;;;;;;;;;;;;;;:9;:17;23408:6;23398:17;;;;;;;;;;;;;;;;:21;;:71;;;;;:::i;:::-;23378:9;:17;23388:6;23378:17;;;;;;;;;;;;;;;:91;;;;23503:32;23528:6;23503:9;:20;23513:9;23503:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;23480:9;:20;23490:9;23480:20;;;;;;;;;;;;;;;:55;;;;23568:9;23551:35;;23560:6;23551:35;;;23579:6;23551:35;;;;;;;;;;;;;;;;;;23282:312;;;:::o;22014:1260::-;22148:6;22127:9;:17;22137:6;22127:17;;;;;;;;;;;;;;;;:27;;22119:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22206:23;22230:49;22244:6;22260:3;22252:12;;22274:3;22230:13;:49::i;:::-;22206:73;;22290:19;22310:27;22321:15;22310:6;:10;;:27;;;;:::i;:::-;22290:47;;22352:13;;;;;;;;;;;22348:734;;;22382:22;22405:53;22419:6;22435:3;22427:12;;22449:7;;;;;;;;;;22441:16;;22405:13;:53::i;:::-;22382:76;;22498:65;22548:14;22498:45;22527:15;22498:9;:24;22516:4;22498:24;;;;;;;;;;;;;;;;:28;;:45;;;;:::i;:::-;:49;;:65;;;;:::i;:::-;22473:9;:24;22491:4;22473:24;;;;;;;;;;;;;;;:90;;;;22593:32;22610:14;22593:12;;:16;;:32;;;;:::i;:::-;22578:12;:47;;;;22676:53;22714:14;22676:9;:33;22686:22;;;;;;;;;;;22676:33;;;;;;;;;;;;;;;;:37;;:53;;;;:::i;:::-;22640:9;:33;22650:22;;;;;;;;;;;22640:33;;;;;;;;;;;;;;;:89;;;;22766:22;;;;;;;;;;;22749:56;;22758:6;22749:56;;;22790:14;22749:56;;;;;;;;;;;;;;;;;;22850:4;22825:70;;22834:6;22825:70;;;22858:35;22878:14;22858:15;:19;;:35;;;;:::i;:::-;22825:70;;;;;;;;;;;;;;;;;;22348:734;;;;22953:47;22983:15;22953:9;:24;22971:4;22953:24;;;;;;;;;;;;;;;;:28;;:47;;;;:::i;:::-;22928:9;:24;22946:4;22928:24;;;;;;;;;;;;;;;:72;;;;23045:4;23020:50;;23029:6;23020:50;;;23053:15;23020:50;;;;;;;;;;;;;;;;;;22348:734;23115:37;23140:11;23115:9;:20;23125:9;23115:20;;;;;;;;;;;;;;;;:24;;:37;;;;:::i;:::-;23092:9;:20;23102:9;23092:20;;;;;;;;;;;;;;;:60;;;;23181:29;23203:6;23181:9;:17;23191:6;23181:17;;;;;;;;;;;;;;;;:21;;:29;;;;:::i;:::-;23163:9;:17;23173:6;23163:17;;;;;;;;;;;;;;;:47;;;;23243:9;23226:40;;23235:6;23226:40;;;23254:11;23226:40;;;;;;;;;;;;;;;;;;22014:1260;;;;;;:::o;23892:180::-;23986:7;24013:51;14586:5;24013:31;24033:10;24013:15;24024:3;24013:6;:10;;:15;;;;:::i;:::-;:19;;:31;;;;:::i;:::-;:35;;:51;;;;:::i;:::-;24006:58;;23892:180;;;;;:::o

Swarm Source

ipfs://f8c02d46efea2af4c8bb7782eeee868bafb16f6add12f44a04d274391fdd8e87
Loading