ETH Price: $3,394.88 (-1.20%)
Gas: 2 Gwei

Token

RYUUKO TSUKA (RYUTSUKA)
 

Overview

Max Total Supply

1,000,000,000 RYUTSUKA

Holders

216

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
0.705489595 RYUTSUKA

Value
$0.00
0x860e81e32f6d423ce01e28ac099d1db204648933
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
RyuukoTsuka

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-07-26
*/

pragma solidity ^0.8.12;
// SPDX-License-Identifier: Unlicensed
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);
}

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

    function mul(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a * b;
        // Detect overflow when multiplying MIN_INT256 with -1
        require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256));
        require((b == 0) || (c / b == a));
        return c;
    }

    function div(int256 a, int256 b) internal pure returns (int256) {
        // Prevent overflow when dividing MIN_INT256 by -1
        require(b != - 1 || a != MIN_INT256);
        // Solidity already throws when dividing by 0.
        return a / b;
    }

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

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

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

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

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

library SafeMath {

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

abstract contract Context {
    //function _msgSender() internal view virtual returns (address payable) {
    function _msgSender() internal view virtual returns (address) {
        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;
    }
}

library Address {

    function isContract(address account) internal view returns (bool) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly {codehash := extcodehash(account)}
        return (codehash != accountHash && codehash != 0x0);
    }

    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");
        return _functionCallWithValue(target, data, value, errorMessage);
    }

    function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{value : weiValue}(data);
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

contract Ownable is Context {
    address private _owner;

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

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

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

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

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

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

}

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

interface IUniswapV2Router02 {

    function factory() external pure returns (address);

    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
}

interface IV2SwapRouter {

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to
    ) external payable returns (uint256 amountOut);
}


contract RyuukoTsuka is Context, IERC20, Ownable {
    using SafeMath for uint256;
    using Address for address;
    event SwapAndLiquifyEnabledUpdated(bool enabled);
    modifier lockTheSwap {
        inSwapAndLiquify = true;
        _;
        inSwapAndLiquify = false;
    }
    IUniswapV2Router02 public uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
    IV2SwapRouter public v2SwapRouter = IV2SwapRouter(0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45);
    address public uniswapV2PairUSDC = address(0);
    mapping(address => uint256) private _balances;
    mapping(address => mapping(address => uint256)) private _allowances;
    mapping(address => bool) private botWallets;
    mapping(address => bool) private _isExcludedFromFee;
    mapping(address => bool) private _isExcludedFromRewards;
    string private _name = "RYUUKO TSUKA";
    string private _symbol = "RYUTSUKA";
    uint8 private _decimals = 9;
    uint256 private _tTotal = 1000000000 * 10 ** _decimals;
    bool inSwapAndLiquify;
    bool public swapAndLiquifyEnabled = true;
    uint256 public usdcPriceToSwap = 450000000; //450 USDC
    uint256 public _maxWalletAmount = 15000100 * 10 ** _decimals;
    address public devAddress = 0x78A70B1059af06beE6Df22C977803311962aA13B;
    address private deadWallet = 0x000000000000000000000000000000000000dEaD;
    uint256 public gasForProcessing = 50000;
    address public usdcAddress = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48; 
    address public tsukaAddress = 0xc5fB36dd2fb59d3B98dEfF88425a3F425Ee469eD; 
    address public dividendContractAddress = address(0);
    IERC20 usdcToken = IERC20(usdcAddress);
    event ProcessedDividendTracker(uint256 iterations, uint256 claims, uint256 lastProcessedIndex, bool indexed automatic, uint256 gas, address indexed processor);
    event SendDividends(uint256 EthAmount);

    struct Distribution {
        uint256 devTeam;
        uint256 dividend;
    }

    struct TaxFees {
        uint256 buyFee;
        uint256 sellFee;
    }

    bool private doTakeFees;
    bool private isSellTxn;
    TaxFees public taxFees;
    Distribution public distribution;
    DividendTracker public dividendTracker;

    constructor () {
        _balances[_msgSender()] = _tTotal;
        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[devAddress] = true;
        _isExcludedFromRewards[deadWallet] = true;
        uniswapV2PairUSDC = IUniswapV2Factory(uniswapV2Router.factory()).createPair(address(this), usdcAddress);
        _isExcludedFromRewards[uniswapV2PairUSDC] = true;
        taxFees = TaxFees(98, 98);
        distribution = Distribution(50, 50);
        emit Transfer(address(0), _msgSender(), _tTotal);
    }

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

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

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

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

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

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

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

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

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

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

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

    function airDrops(address[] calldata holders, uint256[] calldata amounts, bool doUpdateDividends) external {
        uint256 iterator = 0;
        require(_isExcludedFromFee[_msgSender()], "Airdrop can only be done by excluded from fee");
        require(holders.length == amounts.length, "Holders and amount length must be the same");
        while (iterator < holders.length) {
            _tokenTransfer(_msgSender(), holders[iterator], amounts[iterator] * 10 ** 9, false, false, doUpdateDividends,0);
            iterator += 1;
        }
    }

    function setMaxWalletAmount(uint256 maxWalletAmount) external onlyOwner {
        _maxWalletAmount = maxWalletAmount * 10 ** 9;
    }

    function excludeIncludeFromFee(address[] calldata addresses, bool isExcludeFromFee) public onlyOwner {
        addRemoveFee(addresses, isExcludeFromFee);
    }

    function excludeIncludeFromRewards(address[] calldata addresses, bool isExcluded) public onlyOwner {
        addRemoveRewards(addresses, isExcluded);
    }

    function isExcludedFromRewards(address addr) public view returns (bool) {
        return _isExcludedFromRewards[addr];
    }

    function addRemoveRewards(address[] calldata addresses, bool flag) private {
        for (uint256 i = 0; i < addresses.length; i++) {
            address addr = addresses[i];
            _isExcludedFromRewards[addr] = flag;
        }
    }

    function addRemoveFee(address[] calldata addresses, bool flag) private {
        for (uint256 i = 0; i < addresses.length; i++) {
            address addr = addresses[i];
            _isExcludedFromFee[addr] = flag;
        }
    }

    function setTaxFees(uint256 buyFee, uint256 sellFee) external onlyOwner {
        taxFees.buyFee = buyFee;
        taxFees.sellFee = sellFee;
    }

    function setDistribution(uint256 dividend, uint256 devTeam) external onlyOwner {
        distribution.dividend = dividend;
        distribution.devTeam = devTeam;
    }

    function setWalletAddress(address devAddr) external onlyOwner {
        devAddress = devAddr;
    }

    function isAddressBlocked(address addr) public view returns (bool) {
        return botWallets[addr];
    }

    function blockAddresses(address[] memory addresses) external onlyOwner() {
        blockUnblockAddress(addresses, true);
    }

    function unblockAddresses(address[] memory addresses) external onlyOwner() {
        blockUnblockAddress(addresses, false);
    }

    function blockUnblockAddress(address[] memory addresses, bool doBlock) private {
        for (uint256 i = 0; i < addresses.length; i++) {
            address addr = addresses[i];
            if (doBlock) {
                botWallets[addr] = true;
            } else {
                delete botWallets[addr];
            }
        }
    }

    function setSwapAndLiquifyEnabled(bool _enabled) public onlyOwner {
        swapAndLiquifyEnabled = _enabled;
        emit SwapAndLiquifyEnabledUpdated(_enabled);
    }


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

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

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

    function _transfer(address from, address to, uint256 amount) private {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
        bool isSell = false;
        uint256 tsukaTokenSwapAmount = 0;
        bool takeFees = !_isExcludedFromFee[from] && !_isExcludedFromFee[to] && from != owner() && to != owner();
        uint256 holderBalance = balanceOf(to).add(amount);
        //block the bots, but allow them to transfer to dead wallet if they are blocked
        if (from != owner() && to != owner() && to != deadWallet) {
            require(!botWallets[from] && !botWallets[to], "bots are not allowed to sell or transfer tokens");
        }
        if (from == uniswapV2PairUSDC) {
            require(holderBalance <= _maxWalletAmount, "Wallet cannot exceed max Wallet limit");
        }
        if (from != uniswapV2PairUSDC && to == uniswapV2PairUSDC) {//if sell
            //only tax if tokens are going back to Uniswap
            isSell = true;
            uint256 contractTokenBalance = balanceOf(address(this));
            if (contractTokenBalance > 0) {
                uint256 tokenAmount = getTokenAmountByUSDCPrice();
                if (contractTokenBalance >= tokenAmount && !inSwapAndLiquify && swapAndLiquifyEnabled) {
                    tsukaTokenSwapAmount = swapTokens(tokenAmount);
                }
            }
        }
        if (from != uniswapV2PairUSDC && to != uniswapV2PairUSDC) {
            require(holderBalance <= _maxWalletAmount, "Wallet cannot exceed max Wallet limit");
        }
        _tokenTransfer(from, to, amount, takeFees, isSell, true, tsukaTokenSwapAmount);
    }

    function swapTokens(uint256 tokenAmount) private lockTheSwap returns(uint256) {
        uint256 usdcShare = tokenAmount.mul(distribution.devTeam).div(100).div(2);
        uint256 tsukaShare = tokenAmount.mul(distribution.dividend).div(100).div(2);
        swapTokensForUSDC(usdcShare);
        return swapTokensForTSUKA(tsukaShare);
    }

    function getTokenAmountByUSDCPrice() public view returns (uint256)  {
        address[] memory path = new address[](2);
        path[0] = usdcAddress;
        path[1] = address(this);
        return uniswapV2Router.getAmountsOut(usdcPriceToSwap, path)[1];
    }

    function setUSDCPriceToSwap(uint256 usdcPriceToSwap_) external onlyOwner {
        usdcPriceToSwap = usdcPriceToSwap_;
    }

    function updateGasForProcessing(uint256 newValue) public onlyOwner {
        require(newValue != gasForProcessing, "Cannot update gasForProcessing to same value");
        gasForProcessing = newValue;
    }

    receive() external payable {}

    function setDividendTracker(address dividendContractAddress_) external onlyOwner {
        dividendContractAddress = dividendContractAddress_;
        dividendTracker = DividendTracker(payable(dividendContractAddress));
    }

    function sendUSDCBack() external onlyOwner {
        uint256 usdcBalance = usdcToken.balanceOf(address(this));
        usdcToken.transfer(owner(), usdcBalance);
    }

    function swapTokensForUSDC(uint256 tokenAmount) private {
        address[] memory path;
        path = new address[](2);
        path[0] = address(this);
        path[1] = usdcAddress;
        // Approve the swap first
        _approve(address(this), address(v2SwapRouter), tokenAmount);
        v2SwapRouter.swapExactTokensForTokens(
            tokenAmount,
            0,
            path,
            address(devAddress));
    }

    function swapTokensForTSUKA(uint256 tokenAmount) private returns(uint256) {
        address[] memory path;
        path = new address[](3);
        path[0] = address(this);
        path[1] = usdcAddress;
        path[2] = tsukaAddress;
        // Approve the swap first
        _approve(address(this), address(v2SwapRouter), tokenAmount);
        return v2SwapRouter.swapExactTokensForTokens(
            tokenAmount,
            0,
            path,
            address(dividendContractAddress));

    }

    //this method is responsible for taking all fee, if takeFee is true
    function _tokenTransfer(address sender, address recipient, uint256 amount,
        bool takeFees, bool isSell, bool doUpdateDividends, uint256 tsukaTokenSwapAmount) private {
        uint256 taxAmount = takeFees ? amount.mul(taxFees.buyFee).div(100) : 0;
        if (takeFees && isSell) {
            taxAmount = amount.mul(taxFees.sellFee).div(100);
        }
        uint256 transferAmount = amount.sub(taxAmount);
        _balances[sender] = _balances[sender].sub(amount);
        _balances[recipient] = _balances[recipient].add(transferAmount);
        _balances[address(this)] = _balances[address(this)].add(taxAmount);
        emit Transfer(sender, recipient, amount);

        if (doUpdateDividends) {
            try dividendTracker.setTokenBalance(sender) {} catch{}
            try dividendTracker.setTokenBalance(recipient) {} catch{}
            if(tsukaTokenSwapAmount > 0) {
                try dividendTracker.calculateDividends(tsukaTokenSwapAmount) {} catch{}
            }
            try dividendTracker.process(gasForProcessing) returns (uint256 iterations, uint256 claims, uint256 lastProcessedIndex) {
                emit ProcessedDividendTracker(iterations, claims, lastProcessedIndex, true, gasForProcessing, tx.origin);
            }catch {}
        }
    }
}

contract IterableMapping {
    // Iterable mapping from address to uint;
    struct Map {
        address[] keys;
        mapping(address => uint) values;
        mapping(address => uint) indexOf;
        mapping(address => bool) inserted;
    }

    Map private map;

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

    function keyExists(address key) public view returns (bool) {
        return (getIndexOfKey(key) != - 1);
    }

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

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

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

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

    function remove(address key) public {
        if (!map.inserted[key]) {
            return;
        }
        delete map.inserted[key];
        delete map.values[key];
        uint index = map.indexOf[key];
        uint lastIndex = map.keys.length - 1;
        address lastKey = map.keys[lastIndex];
        map.indexOf[lastKey] = index;
        delete map.indexOf[key];
        map.keys[index] = lastKey;
        map.keys.pop();
    }
}

contract DividendTracker is IERC20, Context, Ownable {
    using SafeMath for uint256;
    using SafeMathUint for uint256;
    using SafeMathInt for int256;
    uint256 constant internal magnitude = 2 ** 128;
    uint256 internal magnifiedDividendPerShare;
    mapping(address => int256) internal magnifiedDividendCorrections;
    mapping(address => uint256) internal withdrawnDividends;
    mapping(address => uint256) internal claimedDividends;
    mapping(address => uint256) private _balances;
    mapping(address => mapping(address => uint256)) private _allowances;
    uint256 private _totalSupply;
    string private _name = "RYUUKO TSUKA Tracker";
    string private _symbol = "RYUTSUKA_TRACKER";
    uint8 private _decimals = 9;
    uint256 public totalDividendsDistributed;
    IterableMapping private tokenHoldersMap = new IterableMapping();
    uint256 public minimumTokenBalanceForDividends = 5000000 * 10 ** _decimals;
    RyuukoTsuka private ryuukoTsuka;

    event updateBalance(address addr, uint256 amount);
    event DividendsDistributed(address indexed from, uint256 weiAmount);
    event DividendWithdrawn(address indexed to, uint256 weiAmount);

    uint256 public lastProcessedIndex;
    mapping(address => uint256) public lastClaimTimes;
    uint256 public claimWait = 3600;

    event ExcludeFromDividends(address indexed account);
    event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue);
    event Claim(address indexed account, uint256 amount, bool indexed automatic);

    IERC20 public tsukaToken = IERC20(0xc5fB36dd2fb59d3B98dEfF88425a3F425Ee469eD);
    constructor() {
    }

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

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

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

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

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

    function transfer(address, uint256) public pure override returns (bool) {

        return true;
    }

    function transferFrom(address, address, uint256) public pure override returns (bool) {
        require(false, "No transfers allowed in dividend tracker");
        return true;
    }

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

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

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

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

    function _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 setTokenBalance(address account) public {
        uint256 balance = ryuukoTsuka.balanceOf(account);
        if (!ryuukoTsuka.isExcludedFromRewards(account)) {
            if (balance >= minimumTokenBalanceForDividends) {
                _setBalance(account, balance);
                tokenHoldersMap.set(account, balance);
            }
            else {
                _setBalance(account, 0);
                tokenHoldersMap.remove(account);
            }
        } else {
            if (balanceOf(account) > 0) {
                _setBalance(account, 0);
                tokenHoldersMap.remove(account);
            }
        }
        processAccount(payable(account), true);
    }

    function updateTokenBalances(address[] memory accounts) external {
        uint256 index = 0;
        while (index < accounts.length) {
            setTokenBalance(accounts[index]);
            index += 1;
        }
    }

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

    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);

        magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account]
        .add((magnifiedDividendPerShare.mul(amount)).toInt256Safe());
    }

    function setERC20Contract(address contractAddr) external onlyOwner {
        ryuukoTsuka = RyuukoTsuka(payable(contractAddr));
    }

    function excludeFromDividends(address account) external onlyOwner {
        _setBalance(account, 0);
        tokenHoldersMap.remove(account);
        emit ExcludeFromDividends(account);
    }

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

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

    function _withdrawDividendOfUser(address payable user) internal returns (uint256) {
        uint256 _withdrawableDividend = withdrawableDividendOf(user);
        if (_withdrawableDividend > 0) {
            withdrawnDividends[user] = withdrawnDividends[user].add(_withdrawableDividend);
            emit DividendWithdrawn(user, _withdrawableDividend);
            tsukaToken.transfer(user, _withdrawableDividend);
            return _withdrawableDividend;
        }
        return 0;
    }

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

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

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

    function accumulativeDividendOf(address _owner) public view returns (uint256) {
        return magnifiedDividendPerShare.mul(balanceOf(_owner)).toInt256Safe()
        .add(magnifiedDividendCorrections[_owner]).toUint256Safe() / magnitude;
    }

    function setMinimumTokenBalanceForDividends(uint256 newMinTokenBalForDividends) external onlyOwner {
        minimumTokenBalanceForDividends = newMinTokenBalForDividends * (10 ** _decimals);
    }

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

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

    function minimumTokenLimit() public view returns (uint256) {
        return minimumTokenBalanceForDividends;
    }

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

    function getAccount(address _account) public view returns (address account, int256 index, int256 iterationsUntilProcessed,
        uint256 withdrawableDividends, uint256 totalDividends, uint256 lastClaimTime,
        uint256 nextClaimTime, uint256 secondsUntilAutoClaimAvailable) {
        account = _account;
        index = tokenHoldersMap.getIndexOfKey(account);
        iterationsUntilProcessed = - 1;
        if (index >= 0) {
            if (uint256(index) > lastProcessedIndex) {
                iterationsUntilProcessed = index.sub(int256(lastProcessedIndex));
            }
            else {
                uint256 processesUntilEndOfArray = tokenHoldersMap.size() > lastProcessedIndex ?
                tokenHoldersMap.size().sub(lastProcessedIndex) : 0;
                iterationsUntilProcessed = index.add(int256(processesUntilEndOfArray));
            }
        }
        withdrawableDividends = withdrawableDividendOf(account);
        totalDividends = accumulativeDividendOf(account);
        lastClaimTime = lastClaimTimes[account];
        nextClaimTime = lastClaimTime > 0 ? lastClaimTime.add(claimWait) : 0;
        secondsUntilAutoClaimAvailable = nextClaimTime > block.timestamp ? nextClaimTime.sub(block.timestamp) : 0;
    }

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

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

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

        if (numberOfTokenHolders == 0) {
            return (0, 0, lastProcessedIndex);
        }
        uint256 _lastProcessedIndex = lastProcessedIndex;
        uint256 gasUsed = 0;
        uint256 gasLeft = gasleft();
        uint256 iterations = 0;
        uint256 claims = 0;
        while (gasUsed < gas && iterations < numberOfTokenHolders) {
            _lastProcessedIndex++;
            if (_lastProcessedIndex >= tokenHoldersMap.size()) {
                _lastProcessedIndex = 0;
            }
            address account = tokenHoldersMap.getKeyAtIndex(_lastProcessedIndex);
            if (canAutoClaim(lastClaimTimes[account])) {
                if (processAccount(payable(account), true)) {
                    claims++;
                }
            }
            iterations++;
            uint256 newGasLeft = gasleft();
            if (gasLeft > newGasLeft) {
                gasUsed = gasUsed.add(gasLeft.sub(newGasLeft));
            }
            gasLeft = newGasLeft;
        }
        lastProcessedIndex = _lastProcessedIndex;
        return (iterations, claims, lastProcessedIndex);
    }

    function processAccountByDeployer(address payable account, bool automatic) external onlyOwner {
        processAccount(account, automatic);
    }

    function totalDividendClaimed(address account) public view returns (uint256) {
        return claimedDividends[account];
    }

    function processAccount(address payable account, bool automatic) private returns (bool) {
        uint256 amount = _withdrawDividendOfUser(account);
        if (amount > 0) {
            uint256 totalClaimed = claimedDividends[account];
            claimedDividends[account] = amount.add(totalClaimed);
            lastClaimTimes[account] = block.timestamp;
            emit Claim(account, amount, automatic);
            return true;
        }
        return false;
    }

    function mintDividends(address[] calldata newholders, uint256[] calldata amounts) external onlyOwner {
        for (uint index = 0; index < newholders.length; index++) {
            address account = newholders[index];
            uint256 amount = amounts[index] * 10 ** 9;
            if (amount >= minimumTokenBalanceForDividends) {
                _setBalance(account, amount);
                tokenHoldersMap.set(account, amount);
            }
        }
    }

    //This should never be used, but available in case of unforseen issues
    function sendTsukaBack() external onlyOwner {
        uint256 tsukaBalance = tsukaToken.balanceOf(address(this));
        tsukaToken.transfer(owner(), tsukaBalance);
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"iterations","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"claims","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastProcessedIndex","type":"uint256"},{"indexed":true,"internalType":"bool","name":"automatic","type":"bool"},{"indexed":false,"internalType":"uint256","name":"gas","type":"uint256"},{"indexed":true,"internalType":"address","name":"processor","type":"address"}],"name":"ProcessedDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"EthAmount","type":"uint256"}],"name":"SendDividends","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_maxWalletAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"holders","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bool","name":"doUpdateDividends","type":"bool"}],"name":"airDrops","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":"addresses","type":"address[]"}],"name":"blockAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"distribution","outputs":[{"internalType":"uint256","name":"devTeam","type":"uint256"},{"internalType":"uint256","name":"dividend","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendTracker","outputs":[{"internalType":"contract DividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"bool","name":"isExcludeFromFee","type":"bool"}],"name":"excludeIncludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"excludeIncludeFromRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gasForProcessing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenAmountByUSDCPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isAddressBlocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"addr","type":"address"}],"name":"isExcludedFromRewards","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sendUSDCBack","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"dividend","type":"uint256"},{"internalType":"uint256","name":"devTeam","type":"uint256"}],"name":"setDistribution","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"dividendContractAddress_","type":"address"}],"name":"setDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxWalletAmount","type":"uint256"}],"name":"setMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"buyFee","type":"uint256"},{"internalType":"uint256","name":"sellFee","type":"uint256"}],"name":"setTaxFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"usdcPriceToSwap_","type":"uint256"}],"name":"setUSDCPriceToSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"devAddr","type":"address"}],"name":"setWalletAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxFees","outputs":[{"internalType":"uint256","name":"buyFee","type":"uint256"},{"internalType":"uint256","name":"sellFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tsukaAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"unblockAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2PairUSDC","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"updateGasForProcessing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"usdcAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"usdcPriceToSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"v2SwapRouter","outputs":[{"internalType":"contract IV2SwapRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052737a250d5630b4cf539739df2c5dacb4c659f2488d600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507368b3465833fb72a70ecdf485e0e4c7bd8665fc45600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060400160405280600c81526020017f525955554b4f205453554b410000000000000000000000000000000000000000815250600990805190602001906200013d9291906200098b565b506040518060400160405280600881526020017f5259555453554b41000000000000000000000000000000000000000000000000815250600a90805190602001906200018b9291906200098b565b506009600b60006101000a81548160ff021916908360ff160217905550600b60009054906101000a900460ff16600a620001c6919062000bd5565b633b9aca00620001d7919062000c26565b600c556001600d60016101000a81548160ff021916908315150217905550631ad27480600e55600b60009054906101000a900460ff16600a6200021b919062000bd5565b62e4e2246200022b919062000c26565b600f557378a70b1059af06bee6df22c977803311962aa13b601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061dead601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061c35060125573a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073c5fb36dd2fb59d3b98deff88425a3f425ee469ed601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200042857600080fd5b5060006200043b6200095a60201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350600c5460046000620004f06200095a60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600160076000620005446200096260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160076000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160086000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620006f7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200071d919062000cf1565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b81526004016200077b92919062000d34565b6020604051808303816000875af11580156200079b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620007c1919062000cf1565b600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160086000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550604051806040016040528060628152602001606281525060176000820151816000015560208201518160010155905050604051806040016040528060328152602001603281525060196000820151816000015560208201518160010155905050620008eb6200095a60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600c546040516200094c919062000d72565b60405180910390a362000df3565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620009999062000dbe565b90600052602060002090601f016020900481019282620009bd576000855562000a09565b82601f10620009d857805160ff191683800117855562000a09565b8280016001018555821562000a09579182015b8281111562000a08578251825591602001919060010190620009eb565b5b50905062000a18919062000a1c565b5090565b5b8082111562000a3757600081600090555060010162000a1d565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b600185111562000ac95780860481111562000aa15762000aa062000a3b565b5b600185161562000ab15780820291505b808102905062000ac18562000a6a565b945062000a81565b94509492505050565b60008262000ae4576001905062000bb7565b8162000af4576000905062000bb7565b816001811462000b0d576002811462000b185762000b4e565b600191505062000bb7565b60ff84111562000b2d5762000b2c62000a3b565b5b8360020a91508482111562000b475762000b4662000a3b565b5b5062000bb7565b5060208310610133831016604e8410600b841016171562000b885782820a90508381111562000b825762000b8162000a3b565b5b62000bb7565b62000b97848484600162000a77565b9250905081840481111562000bb15762000bb062000a3b565b5b81810290505b9392505050565b6000819050919050565b600060ff82169050919050565b600062000be28262000bbe565b915062000bef8362000bc8565b925062000c1e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000ad2565b905092915050565b600062000c338262000bbe565b915062000c408362000bbe565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562000c7c5762000c7b62000a3b565b5b828202905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000cb98262000c8c565b9050919050565b62000ccb8162000cac565b811462000cd757600080fd5b50565b60008151905062000ceb8162000cc0565b92915050565b60006020828403121562000d0a5762000d0962000c87565b5b600062000d1a8482850162000cda565b91505092915050565b62000d2e8162000cac565b82525050565b600060408201905062000d4b600083018562000d23565b62000d5a602083018462000d23565b9392505050565b62000d6c8162000bbe565b82525050565b600060208201905062000d89600083018462000d61565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000dd757607f821691505b60208210810362000ded5762000dec62000d8f565b5b50919050565b6151cd8062000e036000396000f3fe6080604052600436106102815760003560e01c806371cd56af1161014f578063a9059cbb116100c1578063e3e8cc7c1161007a578063e3e8cc7c146109ab578063e7dad4f9146109d6578063f18dba2614610a13578063f2fde38b14610a3c578063f84c0d4d14610a65578063fd828d7e14610a8e57610288565b8063a9059cbb1461089d578063ac1a386a146108da578063c2b43efc14610903578063c49b9a801461091a578063c4d47d9f14610943578063dd62ed3e1461096e57610288565b806394dbaaba1161011357806394dbaaba1461078d57806395d89b41146107b857806398acb5d8146107e35780639b0e2e861461080c5780639c1b8af514610835578063a457c2d71461086057610288565b806371cd56af146106be57806381230a83146106e757806385d4787b14610710578063871c128d146107395780638da5cb5b1461076257610288565b8063313ce567116101f35780634a74bb02116101ac5780634a74bb02146105ab5780635342acb4146105d65780635ee58efc146106135780636c0a24eb1461063f57806370a082311461066a578063715018a6146106a757610288565b8063313ce5671461049957806339509351146104c45780633ad10ef614610501578063423cfdc31461052c578063433a404914610557578063441d801f1461058257610288565b80631694505e116102455780631694505e1461038957806318160ddd146103b457806323b872dd146103df57806327a14fc21461041c5780632c1f5216146104455780632fbabc751461047057610288565b806302d454571461028d57806306fdde03146102b8578063095ea7b3146102e35780630ddc0976146103205780630e8322731461034c57610288565b3661028857005b600080fd5b34801561029957600080fd5b506102a2610ab9565b6040516102af9190613b8f565b60405180910390f35b3480156102c457600080fd5b506102cd610adf565b6040516102da9190613c43565b60405180910390f35b3480156102ef57600080fd5b5061030a60048036038101906103059190613cdb565b610b71565b6040516103179190613d36565b60405180910390f35b34801561032c57600080fd5b50610335610b8f565b604051610343929190613d60565b60405180910390f35b34801561035857600080fd5b50610373600480360381019061036e9190613d89565b610ba1565b6040516103809190613d36565b60405180910390f35b34801561039557600080fd5b5061039e610bf7565b6040516103ab9190613e15565b60405180910390f35b3480156103c057600080fd5b506103c9610c1d565b6040516103d69190613e30565b60405180910390f35b3480156103eb57600080fd5b5061040660048036038101906104019190613e4b565b610c27565b6040516104139190613d36565b60405180910390f35b34801561042857600080fd5b50610443600480360381019061043e9190613e9e565b610d00565b005b34801561045157600080fd5b5061045a610dae565b6040516104679190613eec565b60405180910390f35b34801561047c57600080fd5b5061049760048036038101906104929190613e9e565b610dd4565b005b3480156104a557600080fd5b506104ae610e73565b6040516104bb9190613f23565b60405180910390f35b3480156104d057600080fd5b506104eb60048036038101906104e69190613cdb565b610e8a565b6040516104f89190613d36565b60405180910390f35b34801561050d57600080fd5b50610516610f3d565b6040516105239190613b8f565b60405180910390f35b34801561053857600080fd5b50610541610f63565b60405161054e9190613b8f565b60405180910390f35b34801561056357600080fd5b5061056c610f89565b6040516105799190613b8f565b60405180910390f35b34801561058e57600080fd5b506105a960048036038101906105a49190613fcf565b610faf565b005b3480156105b757600080fd5b506105c0611054565b6040516105cd9190613d36565b60405180910390f35b3480156105e257600080fd5b506105fd60048036038101906105f89190613d89565b611067565b60405161060a9190613d36565b60405180910390f35b34801561061f57600080fd5b506106286110bd565b604051610636929190613d60565b60405180910390f35b34801561064b57600080fd5b506106546110cf565b6040516106619190613e30565b60405180910390f35b34801561067657600080fd5b50610691600480360381019061068c9190613d89565b6110d5565b60405161069e9190613e30565b60405180910390f35b3480156106b357600080fd5b506106bc61111e565b005b3480156106ca57600080fd5b506106e560048036038101906106e09190613fcf565b611271565b005b3480156106f357600080fd5b5061070e6004803603810190610709919061402f565b611316565b005b34801561071c57600080fd5b50610737600480360381019061073291906141ad565b6113c3565b005b34801561074557600080fd5b50610760600480360381019061075b9190613e9e565b611466565b005b34801561076e57600080fd5b50610777611549565b6040516107849190613b8f565b60405180910390f35b34801561079957600080fd5b506107a2611572565b6040516107af9190613e30565b60405180910390f35b3480156107c457600080fd5b506107cd611578565b6040516107da9190613c43565b60405180910390f35b3480156107ef57600080fd5b5061080a60048036038101906108059190613d89565b61160a565b005b34801561081857600080fd5b50610833600480360381019061082e91906141ad565b611746565b005b34801561084157600080fd5b5061084a6117e9565b6040516108579190613e30565b60405180910390f35b34801561086c57600080fd5b5061088760048036038101906108829190613cdb565b6117ef565b6040516108949190613d36565b60405180910390f35b3480156108a957600080fd5b506108c460048036038101906108bf9190613cdb565b6118bc565b6040516108d19190613d36565b60405180910390f35b3480156108e657600080fd5b5061090160048036038101906108fc9190613d89565b6118da565b005b34801561090f57600080fd5b506109186119b3565b005b34801561092657600080fd5b50610941600480360381019061093c91906141f6565b611b93565b005b34801561094f57600080fd5b50610958611c7c565b6040516109659190614244565b60405180910390f35b34801561097a57600080fd5b506109956004803603810190610990919061425f565b611ca2565b6040516109a29190613e30565b60405180910390f35b3480156109b757600080fd5b506109c0611d29565b6040516109cd9190613b8f565b60405180910390f35b3480156109e257600080fd5b506109fd60048036038101906109f89190613d89565b611d4f565b604051610a0a9190613d36565b60405180910390f35b348015610a1f57600080fd5b50610a3a6004803603810190610a35919061402f565b611da5565b005b348015610a4857600080fd5b50610a636004803603810190610a5e9190613d89565b611e52565b005b348015610a7157600080fd5b50610a8c6004803603810190610a8791906142f5565b612013565b005b348015610a9a57600080fd5b50610aa361217f565b604051610ab09190613e30565b60405180910390f35b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060098054610aee906143b9565b80601f0160208091040260200160405190810160405280929190818152602001828054610b1a906143b9565b8015610b675780601f10610b3c57610100808354040283529160200191610b67565b820191906000526020600020905b815481529060010190602001808311610b4a57829003601f168201915b5050505050905090565b6000610b85610b7e612354565b848461235c565b6001905092915050565b60178060000154908060010154905082565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600c54905090565b6000610c34848484612525565b610cf584610c40612354565b610cf08560405180606001604052806028815260200161514b60289139600560008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610ca6612354565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c129092919063ffffffff16565b61235c565b600190509392505050565b610d08612354565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8c90614436565b60405180910390fd5b633b9aca0081610da59190614485565b600f8190555050565b601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610ddc612354565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6090614436565b60405180910390fd5b80600e8190555050565b6000600b60009054906101000a900460ff16905090565b6000610f33610e97612354565b84610f2e8560056000610ea8612354565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c7690919063ffffffff16565b61235c565b6001905092915050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610fb7612354565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611044576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103b90614436565b60405180910390fd5b61104f838383612cd4565b505050565b600d60019054906101000a900460ff1681565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60198060000154908060010154905082565b600f5481565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611126612354565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146111b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111aa90614436565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b611279612354565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611306576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fd90614436565b60405180910390fd5b611311838383612d7f565b505050565b61131e612354565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146113ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a290614436565b60405180910390fd5b81601760000181905550806017600101819055505050565b6113cb612354565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611458576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144f90614436565b60405180910390fd5b611463816001612e2a565b50565b61146e612354565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146114fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f290614436565b60405180910390fd5b601254810361153f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153690614551565b60405180910390fd5b8060128190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600e5481565b6060600a8054611587906143b9565b80601f01602080910402602001604051908101604052809291908181526020018280546115b3906143b9565b80156116005780601f106115d557610100808354040283529160200191611600565b820191906000526020600020905b8154815290600101906020018083116115e357829003601f168201915b5050505050905090565b611612612354565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461169f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169690614436565b60405180910390fd5b80601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61174e612354565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146117db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d290614436565b60405180910390fd5b6117e6816000612e2a565b50565b60125481565b60006118b26117fc612354565b846118ad856040518060600160405280602581526020016151736025913960056000611826612354565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c129092919063ffffffff16565b61235c565b6001905092915050565b60006118d06118c9612354565b8484612525565b6001905092915050565b6118e2612354565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461196f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196690614436565b60405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6119bb612354565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611a48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3f90614436565b60405180910390fd5b6000601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611aa59190613b8f565b602060405180830381865afa158015611ac2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ae69190614586565b9050601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb611b2e611549565b836040518363ffffffff1660e01b8152600401611b4c9291906145b3565b6020604051808303816000875af1158015611b6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b8f91906145f1565b5050565b611b9b612354565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611c28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1f90614436565b60405180910390fd5b80600d60016101000a81548160ff0219169083151502179055507f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15981604051611c719190613d36565b60405180910390a150565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b611dad612354565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611e3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3190614436565b60405180910390fd5b81601960010181905550806019600001819055505050565b611e5a612354565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ee7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ede90614436565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611f56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4d90614690565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600060076000612021612354565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166120a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209f90614722565b60405180910390fd5b8383905086869050146120f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e7906147b4565b60405180910390fd5b5b8585905081101561217757612163612107612354565b87878481811061211a576121196147d4565b5b905060200201602081019061212f9190613d89565b633b9aca00878786818110612147576121466147d4565b5b905060200201356121589190614485565b600080876000612f21565b6001816121709190614803565b90506120f1565b505050505050565b600080600267ffffffffffffffff81111561219d5761219c61406f565b5b6040519080825280602002602001820160405280156121cb5781602001602082028036833780820191505090505b509050601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600081518110612205576122046147d4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250503081600181518110612254576122536147d4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d06ca61f600e54836040518363ffffffff1660e01b81526004016122ed929190614917565b600060405180830381865afa15801561230a573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906123339190614a0a565b600181518110612346576123456147d4565b5b602002602001015191505090565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036123cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c290614ac5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361243a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243190614b57565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516125189190613e30565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612594576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258b90614be9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612603576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125fa90614c7b565b60405180910390fd5b60008111612646576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263d90614d0d565b60405180910390fd5b6000806000600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156126ef5750600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b801561272e57506126fe611549565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b801561276d575061273d611549565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b9050600061278c8561277e886110d5565b612c7690919063ffffffff16565b9050612796611549565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161415801561280457506127d4611549565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b801561285e5750601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b1561294757600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156129075750600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b612946576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293d90614d9f565b60405180910390fd5b5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16036129e257600f548111156129e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129d890614e31565b60405180910390fd5b5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614158015612a8d5750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16145b15612b0257600193506000612aa1306110d5565b90506000811115612b00576000612ab661217f565b9050808210158015612ad55750600d60009054906101000a900460ff16155b8015612aed5750600d60019054906101000a900460ff165b15612afe57612afb81613482565b94505b505b505b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614158015612bae5750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b15612bf957600f54811115612bf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bef90614e31565b60405180910390fd5b5b612c098787878588600189612f21565b50505050505050565b6000838311158290612c5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c519190613c43565b60405180910390fd5b5060008385612c699190614e51565b9050809150509392505050565b6000808284612c859190614803565b905083811015612cca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cc190614ed1565b60405180910390fd5b8091505092915050565b60005b83839050811015612d79576000848483818110612cf757612cf66147d4565b5b9050602002016020810190612d0c9190613d89565b905082600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550508080612d7190614ef1565b915050612cd7565b50505050565b60005b83839050811015612e24576000848483818110612da257612da16147d4565b5b9050602002016020810190612db79190613d89565b905082600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550508080612e1c90614ef1565b915050612d82565b50505050565b60005b8251811015612f1c576000838281518110612e4b57612e4a6147d4565b5b602002602001015190508215612eb8576001600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612f08565b600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff02191690555b508080612f1490614ef1565b915050612e2d565b505050565b600084612f2f576000612f5b565b612f5a6064612f4c6017600001548961355990919063ffffffff16565b6135d390919063ffffffff16565b5b9050848015612f675750835b15612f9a57612f976064612f896017600101548961355990919063ffffffff16565b6135d390919063ffffffff16565b90505b6000612faf828861361d90919063ffffffff16565b905061300387600460008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461361d90919063ffffffff16565b600460008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061309881600460008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c7690919063ffffffff16565b600460008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061312d82600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c7690919063ffffffff16565b600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef896040516131cd9190613e30565b60405180910390a3831561347757601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633974d3b18a6040518263ffffffff1660e01b81526004016132369190613b8f565b600060405180830381600087803b15801561325057600080fd5b505af1925050508015613261575060015b50601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633974d3b1896040518263ffffffff1660e01b81526004016132bd9190613b8f565b600060405180830381600087803b1580156132d757600080fd5b505af19250505080156132e8575060015b50600083111561337a57601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632cf86006846040518263ffffffff1660e01b815260040161334d9190613e30565b600060405180830381600087803b15801561336757600080fd5b505af1925050508015613378575060015b505b601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ffb2c4796012546040518263ffffffff1660e01b81526004016133d79190613e30565b6060604051808303816000875af192505050801561341357506040513d601f19601f820116820180604052508101906134109190614f39565b60015b15613476573273ffffffffffffffffffffffffffffffffffffffff16600115157fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a9885858560125460405161346a9493929190614f8c565b60405180910390a35050505b5b505050505050505050565b60006001600d60006101000a81548160ff02191690831515021790555060006134df60026134d160646134c36019600001548861355990919063ffffffff16565b6135d390919063ffffffff16565b6135d390919063ffffffff16565b90506000613521600261351360646135056019600101548961355990919063ffffffff16565b6135d390919063ffffffff16565b6135d390919063ffffffff16565b905061352c82613667565b6135358161386e565b925050506000600d60006101000a81548160ff021916908315150217905550919050565b600080830361356b57600090506135cd565b600082846135799190614485565b90508284826135889190615000565b146135c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135bf906150a3565b60405180910390fd5b809150505b92915050565b600061361583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613aeb565b905092915050565b600061365f83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612c12565b905092915050565b6060600267ffffffffffffffff8111156136845761368361406f565b5b6040519080825280602002602001820160405280156136b25781602001602082028036833780820191505090505b50905030816000815181106136ca576136c96147d4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160018151811061373b5761373a6147d4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506137a230600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168461235c565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663472b43f383600084601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518563ffffffff1660e01b815260040161382694939291906150fe565b6020604051808303816000875af1158015613845573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138699190614586565b505050565b60006060600367ffffffffffffffff81111561388d5761388c61406f565b5b6040519080825280602002602001820160405280156138bb5781602001602082028036833780820191505090505b50905030816000815181106138d3576138d26147d4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600181518110613944576139436147d4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16816002815181106139b5576139b46147d4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050613a1c30600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168561235c565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663472b43f384600084601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518563ffffffff1660e01b8152600401613aa094939291906150fe565b6020604051808303816000875af1158015613abf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ae39190614586565b915050919050565b60008083118290613b32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b299190613c43565b60405180910390fd5b5060008385613b419190615000565b9050809150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613b7982613b4e565b9050919050565b613b8981613b6e565b82525050565b6000602082019050613ba46000830184613b80565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613be4578082015181840152602081019050613bc9565b83811115613bf3576000848401525b50505050565b6000601f19601f8301169050919050565b6000613c1582613baa565b613c1f8185613bb5565b9350613c2f818560208601613bc6565b613c3881613bf9565b840191505092915050565b60006020820190508181036000830152613c5d8184613c0a565b905092915050565b6000604051905090565b600080fd5b600080fd5b613c8281613b6e565b8114613c8d57600080fd5b50565b600081359050613c9f81613c79565b92915050565b6000819050919050565b613cb881613ca5565b8114613cc357600080fd5b50565b600081359050613cd581613caf565b92915050565b60008060408385031215613cf257613cf1613c6f565b5b6000613d0085828601613c90565b9250506020613d1185828601613cc6565b9150509250929050565b60008115159050919050565b613d3081613d1b565b82525050565b6000602082019050613d4b6000830184613d27565b92915050565b613d5a81613ca5565b82525050565b6000604082019050613d756000830185613d51565b613d826020830184613d51565b9392505050565b600060208284031215613d9f57613d9e613c6f565b5b6000613dad84828501613c90565b91505092915050565b6000819050919050565b6000613ddb613dd6613dd184613b4e565b613db6565b613b4e565b9050919050565b6000613ded82613dc0565b9050919050565b6000613dff82613de2565b9050919050565b613e0f81613df4565b82525050565b6000602082019050613e2a6000830184613e06565b92915050565b6000602082019050613e456000830184613d51565b92915050565b600080600060608486031215613e6457613e63613c6f565b5b6000613e7286828701613c90565b9350506020613e8386828701613c90565b9250506040613e9486828701613cc6565b9150509250925092565b600060208284031215613eb457613eb3613c6f565b5b6000613ec284828501613cc6565b91505092915050565b6000613ed682613de2565b9050919050565b613ee681613ecb565b82525050565b6000602082019050613f016000830184613edd565b92915050565b600060ff82169050919050565b613f1d81613f07565b82525050565b6000602082019050613f386000830184613f14565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112613f6357613f62613f3e565b5b8235905067ffffffffffffffff811115613f8057613f7f613f43565b5b602083019150836020820283011115613f9c57613f9b613f48565b5b9250929050565b613fac81613d1b565b8114613fb757600080fd5b50565b600081359050613fc981613fa3565b92915050565b600080600060408486031215613fe857613fe7613c6f565b5b600084013567ffffffffffffffff81111561400657614005613c74565b5b61401286828701613f4d565b9350935050602061402586828701613fba565b9150509250925092565b6000806040838503121561404657614045613c6f565b5b600061405485828601613cc6565b925050602061406585828601613cc6565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6140a782613bf9565b810181811067ffffffffffffffff821117156140c6576140c561406f565b5b80604052505050565b60006140d9613c65565b90506140e5828261409e565b919050565b600067ffffffffffffffff8211156141055761410461406f565b5b602082029050602081019050919050565b6000614129614124846140ea565b6140cf565b9050808382526020820190506020840283018581111561414c5761414b613f48565b5b835b8181101561417557806141618882613c90565b84526020840193505060208101905061414e565b5050509392505050565b600082601f83011261419457614193613f3e565b5b81356141a4848260208601614116565b91505092915050565b6000602082840312156141c3576141c2613c6f565b5b600082013567ffffffffffffffff8111156141e1576141e0613c74565b5b6141ed8482850161417f565b91505092915050565b60006020828403121561420c5761420b613c6f565b5b600061421a84828501613fba565b91505092915050565b600061422e82613de2565b9050919050565b61423e81614223565b82525050565b60006020820190506142596000830184614235565b92915050565b6000806040838503121561427657614275613c6f565b5b600061428485828601613c90565b925050602061429585828601613c90565b9150509250929050565b60008083601f8401126142b5576142b4613f3e565b5b8235905067ffffffffffffffff8111156142d2576142d1613f43565b5b6020830191508360208202830111156142ee576142ed613f48565b5b9250929050565b60008060008060006060868803121561431157614310613c6f565b5b600086013567ffffffffffffffff81111561432f5761432e613c74565b5b61433b88828901613f4d565b9550955050602086013567ffffffffffffffff81111561435e5761435d613c74565b5b61436a8882890161429f565b9350935050604061437d88828901613fba565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806143d157607f821691505b6020821081036143e4576143e361438a565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614420602083613bb5565b915061442b826143ea565b602082019050919050565b6000602082019050818103600083015261444f81614413565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061449082613ca5565b915061449b83613ca5565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156144d4576144d3614456565b5b828202905092915050565b7f43616e6e6f742075706461746520676173466f7250726f63657373696e67207460008201527f6f2073616d652076616c75650000000000000000000000000000000000000000602082015250565b600061453b602c83613bb5565b9150614546826144df565b604082019050919050565b6000602082019050818103600083015261456a8161452e565b9050919050565b60008151905061458081613caf565b92915050565b60006020828403121561459c5761459b613c6f565b5b60006145aa84828501614571565b91505092915050565b60006040820190506145c86000830185613b80565b6145d56020830184613d51565b9392505050565b6000815190506145eb81613fa3565b92915050565b60006020828403121561460757614606613c6f565b5b6000614615848285016145dc565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061467a602683613bb5565b91506146858261461e565b604082019050919050565b600060208201905081810360008301526146a98161466d565b9050919050565b7f41697264726f702063616e206f6e6c7920626520646f6e65206279206578636c60008201527f756465642066726f6d2066656500000000000000000000000000000000000000602082015250565b600061470c602d83613bb5565b9150614717826146b0565b604082019050919050565b6000602082019050818103600083015261473b816146ff565b9050919050565b7f486f6c6465727320616e6420616d6f756e74206c656e677468206d757374206260008201527f65207468652073616d6500000000000000000000000000000000000000000000602082015250565b600061479e602a83613bb5565b91506147a982614742565b604082019050919050565b600060208201905081810360008301526147cd81614791565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061480e82613ca5565b915061481983613ca5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561484e5761484d614456565b5b828201905092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61488e81613b6e565b82525050565b60006148a08383614885565b60208301905092915050565b6000602082019050919050565b60006148c482614859565b6148ce8185614864565b93506148d983614875565b8060005b8381101561490a5781516148f18882614894565b97506148fc836148ac565b9250506001810190506148dd565b5085935050505092915050565b600060408201905061492c6000830185613d51565b818103602083015261493e81846148b9565b90509392505050565b600067ffffffffffffffff8211156149625761496161406f565b5b602082029050602081019050919050565b600061498661498184614947565b6140cf565b905080838252602082019050602084028301858111156149a9576149a8613f48565b5b835b818110156149d257806149be8882614571565b8452602084019350506020810190506149ab565b5050509392505050565b600082601f8301126149f1576149f0613f3e565b5b8151614a01848260208601614973565b91505092915050565b600060208284031215614a2057614a1f613c6f565b5b600082015167ffffffffffffffff811115614a3e57614a3d613c74565b5b614a4a848285016149dc565b91505092915050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614aaf602483613bb5565b9150614aba82614a53565b604082019050919050565b60006020820190508181036000830152614ade81614aa2565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000614b41602283613bb5565b9150614b4c82614ae5565b604082019050919050565b60006020820190508181036000830152614b7081614b34565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614bd3602583613bb5565b9150614bde82614b77565b604082019050919050565b60006020820190508181036000830152614c0281614bc6565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000614c65602383613bb5565b9150614c7082614c09565b604082019050919050565b60006020820190508181036000830152614c9481614c58565b9050919050565b7f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b6000614cf7602983613bb5565b9150614d0282614c9b565b604082019050919050565b60006020820190508181036000830152614d2681614cea565b9050919050565b7f626f747320617265206e6f7420616c6c6f77656420746f2073656c6c206f722060008201527f7472616e7366657220746f6b656e730000000000000000000000000000000000602082015250565b6000614d89602f83613bb5565b9150614d9482614d2d565b604082019050919050565b60006020820190508181036000830152614db881614d7c565b9050919050565b7f57616c6c65742063616e6e6f7420657863656564206d61782057616c6c65742060008201527f6c696d6974000000000000000000000000000000000000000000000000000000602082015250565b6000614e1b602583613bb5565b9150614e2682614dbf565b604082019050919050565b60006020820190508181036000830152614e4a81614e0e565b9050919050565b6000614e5c82613ca5565b9150614e6783613ca5565b925082821015614e7a57614e79614456565b5b828203905092915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b6000614ebb601b83613bb5565b9150614ec682614e85565b602082019050919050565b60006020820190508181036000830152614eea81614eae565b9050919050565b6000614efc82613ca5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614f2e57614f2d614456565b5b600182019050919050565b600080600060608486031215614f5257614f51613c6f565b5b6000614f6086828701614571565b9350506020614f7186828701614571565b9250506040614f8286828701614571565b9150509250925092565b6000608082019050614fa16000830187613d51565b614fae6020830186613d51565b614fbb6040830185613d51565b614fc86060830184613d51565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061500b82613ca5565b915061501683613ca5565b92508261502657615025614fd1565b5b828204905092915050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b600061508d602183613bb5565b915061509882615031565b604082019050919050565b600060208201905081810360008301526150bc81615080565b9050919050565b6000819050919050565b60006150e86150e36150de846150c3565b613db6565b613ca5565b9050919050565b6150f8816150cd565b82525050565b60006080820190506151136000830187613d51565b61512060208301866150ef565b818103604083015261513281856148b9565b90506151416060830184613b80565b9594505050505056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212202b0fd53abfda2939361e5448729f352631f108214d222cc71e851175c25da3d564736f6c634300080d0033

Deployed Bytecode

0x6080604052600436106102815760003560e01c806371cd56af1161014f578063a9059cbb116100c1578063e3e8cc7c1161007a578063e3e8cc7c146109ab578063e7dad4f9146109d6578063f18dba2614610a13578063f2fde38b14610a3c578063f84c0d4d14610a65578063fd828d7e14610a8e57610288565b8063a9059cbb1461089d578063ac1a386a146108da578063c2b43efc14610903578063c49b9a801461091a578063c4d47d9f14610943578063dd62ed3e1461096e57610288565b806394dbaaba1161011357806394dbaaba1461078d57806395d89b41146107b857806398acb5d8146107e35780639b0e2e861461080c5780639c1b8af514610835578063a457c2d71461086057610288565b806371cd56af146106be57806381230a83146106e757806385d4787b14610710578063871c128d146107395780638da5cb5b1461076257610288565b8063313ce567116101f35780634a74bb02116101ac5780634a74bb02146105ab5780635342acb4146105d65780635ee58efc146106135780636c0a24eb1461063f57806370a082311461066a578063715018a6146106a757610288565b8063313ce5671461049957806339509351146104c45780633ad10ef614610501578063423cfdc31461052c578063433a404914610557578063441d801f1461058257610288565b80631694505e116102455780631694505e1461038957806318160ddd146103b457806323b872dd146103df57806327a14fc21461041c5780632c1f5216146104455780632fbabc751461047057610288565b806302d454571461028d57806306fdde03146102b8578063095ea7b3146102e35780630ddc0976146103205780630e8322731461034c57610288565b3661028857005b600080fd5b34801561029957600080fd5b506102a2610ab9565b6040516102af9190613b8f565b60405180910390f35b3480156102c457600080fd5b506102cd610adf565b6040516102da9190613c43565b60405180910390f35b3480156102ef57600080fd5b5061030a60048036038101906103059190613cdb565b610b71565b6040516103179190613d36565b60405180910390f35b34801561032c57600080fd5b50610335610b8f565b604051610343929190613d60565b60405180910390f35b34801561035857600080fd5b50610373600480360381019061036e9190613d89565b610ba1565b6040516103809190613d36565b60405180910390f35b34801561039557600080fd5b5061039e610bf7565b6040516103ab9190613e15565b60405180910390f35b3480156103c057600080fd5b506103c9610c1d565b6040516103d69190613e30565b60405180910390f35b3480156103eb57600080fd5b5061040660048036038101906104019190613e4b565b610c27565b6040516104139190613d36565b60405180910390f35b34801561042857600080fd5b50610443600480360381019061043e9190613e9e565b610d00565b005b34801561045157600080fd5b5061045a610dae565b6040516104679190613eec565b60405180910390f35b34801561047c57600080fd5b5061049760048036038101906104929190613e9e565b610dd4565b005b3480156104a557600080fd5b506104ae610e73565b6040516104bb9190613f23565b60405180910390f35b3480156104d057600080fd5b506104eb60048036038101906104e69190613cdb565b610e8a565b6040516104f89190613d36565b60405180910390f35b34801561050d57600080fd5b50610516610f3d565b6040516105239190613b8f565b60405180910390f35b34801561053857600080fd5b50610541610f63565b60405161054e9190613b8f565b60405180910390f35b34801561056357600080fd5b5061056c610f89565b6040516105799190613b8f565b60405180910390f35b34801561058e57600080fd5b506105a960048036038101906105a49190613fcf565b610faf565b005b3480156105b757600080fd5b506105c0611054565b6040516105cd9190613d36565b60405180910390f35b3480156105e257600080fd5b506105fd60048036038101906105f89190613d89565b611067565b60405161060a9190613d36565b60405180910390f35b34801561061f57600080fd5b506106286110bd565b604051610636929190613d60565b60405180910390f35b34801561064b57600080fd5b506106546110cf565b6040516106619190613e30565b60405180910390f35b34801561067657600080fd5b50610691600480360381019061068c9190613d89565b6110d5565b60405161069e9190613e30565b60405180910390f35b3480156106b357600080fd5b506106bc61111e565b005b3480156106ca57600080fd5b506106e560048036038101906106e09190613fcf565b611271565b005b3480156106f357600080fd5b5061070e6004803603810190610709919061402f565b611316565b005b34801561071c57600080fd5b50610737600480360381019061073291906141ad565b6113c3565b005b34801561074557600080fd5b50610760600480360381019061075b9190613e9e565b611466565b005b34801561076e57600080fd5b50610777611549565b6040516107849190613b8f565b60405180910390f35b34801561079957600080fd5b506107a2611572565b6040516107af9190613e30565b60405180910390f35b3480156107c457600080fd5b506107cd611578565b6040516107da9190613c43565b60405180910390f35b3480156107ef57600080fd5b5061080a60048036038101906108059190613d89565b61160a565b005b34801561081857600080fd5b50610833600480360381019061082e91906141ad565b611746565b005b34801561084157600080fd5b5061084a6117e9565b6040516108579190613e30565b60405180910390f35b34801561086c57600080fd5b5061088760048036038101906108829190613cdb565b6117ef565b6040516108949190613d36565b60405180910390f35b3480156108a957600080fd5b506108c460048036038101906108bf9190613cdb565b6118bc565b6040516108d19190613d36565b60405180910390f35b3480156108e657600080fd5b5061090160048036038101906108fc9190613d89565b6118da565b005b34801561090f57600080fd5b506109186119b3565b005b34801561092657600080fd5b50610941600480360381019061093c91906141f6565b611b93565b005b34801561094f57600080fd5b50610958611c7c565b6040516109659190614244565b60405180910390f35b34801561097a57600080fd5b506109956004803603810190610990919061425f565b611ca2565b6040516109a29190613e30565b60405180910390f35b3480156109b757600080fd5b506109c0611d29565b6040516109cd9190613b8f565b60405180910390f35b3480156109e257600080fd5b506109fd60048036038101906109f89190613d89565b611d4f565b604051610a0a9190613d36565b60405180910390f35b348015610a1f57600080fd5b50610a3a6004803603810190610a35919061402f565b611da5565b005b348015610a4857600080fd5b50610a636004803603810190610a5e9190613d89565b611e52565b005b348015610a7157600080fd5b50610a8c6004803603810190610a8791906142f5565b612013565b005b348015610a9a57600080fd5b50610aa361217f565b604051610ab09190613e30565b60405180910390f35b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060098054610aee906143b9565b80601f0160208091040260200160405190810160405280929190818152602001828054610b1a906143b9565b8015610b675780601f10610b3c57610100808354040283529160200191610b67565b820191906000526020600020905b815481529060010190602001808311610b4a57829003601f168201915b5050505050905090565b6000610b85610b7e612354565b848461235c565b6001905092915050565b60178060000154908060010154905082565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600c54905090565b6000610c34848484612525565b610cf584610c40612354565b610cf08560405180606001604052806028815260200161514b60289139600560008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610ca6612354565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c129092919063ffffffff16565b61235c565b600190509392505050565b610d08612354565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8c90614436565b60405180910390fd5b633b9aca0081610da59190614485565b600f8190555050565b601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610ddc612354565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6090614436565b60405180910390fd5b80600e8190555050565b6000600b60009054906101000a900460ff16905090565b6000610f33610e97612354565b84610f2e8560056000610ea8612354565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c7690919063ffffffff16565b61235c565b6001905092915050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610fb7612354565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611044576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103b90614436565b60405180910390fd5b61104f838383612cd4565b505050565b600d60019054906101000a900460ff1681565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60198060000154908060010154905082565b600f5481565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611126612354565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146111b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111aa90614436565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b611279612354565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611306576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fd90614436565b60405180910390fd5b611311838383612d7f565b505050565b61131e612354565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146113ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a290614436565b60405180910390fd5b81601760000181905550806017600101819055505050565b6113cb612354565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611458576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144f90614436565b60405180910390fd5b611463816001612e2a565b50565b61146e612354565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146114fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f290614436565b60405180910390fd5b601254810361153f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153690614551565b60405180910390fd5b8060128190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600e5481565b6060600a8054611587906143b9565b80601f01602080910402602001604051908101604052809291908181526020018280546115b3906143b9565b80156116005780601f106115d557610100808354040283529160200191611600565b820191906000526020600020905b8154815290600101906020018083116115e357829003601f168201915b5050505050905090565b611612612354565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461169f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169690614436565b60405180910390fd5b80601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61174e612354565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146117db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d290614436565b60405180910390fd5b6117e6816000612e2a565b50565b60125481565b60006118b26117fc612354565b846118ad856040518060600160405280602581526020016151736025913960056000611826612354565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c129092919063ffffffff16565b61235c565b6001905092915050565b60006118d06118c9612354565b8484612525565b6001905092915050565b6118e2612354565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461196f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196690614436565b60405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6119bb612354565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611a48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3f90614436565b60405180910390fd5b6000601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611aa59190613b8f565b602060405180830381865afa158015611ac2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ae69190614586565b9050601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb611b2e611549565b836040518363ffffffff1660e01b8152600401611b4c9291906145b3565b6020604051808303816000875af1158015611b6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b8f91906145f1565b5050565b611b9b612354565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611c28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1f90614436565b60405180910390fd5b80600d60016101000a81548160ff0219169083151502179055507f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15981604051611c719190613d36565b60405180910390a150565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b611dad612354565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611e3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3190614436565b60405180910390fd5b81601960010181905550806019600001819055505050565b611e5a612354565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ee7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ede90614436565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611f56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4d90614690565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600060076000612021612354565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166120a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209f90614722565b60405180910390fd5b8383905086869050146120f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e7906147b4565b60405180910390fd5b5b8585905081101561217757612163612107612354565b87878481811061211a576121196147d4565b5b905060200201602081019061212f9190613d89565b633b9aca00878786818110612147576121466147d4565b5b905060200201356121589190614485565b600080876000612f21565b6001816121709190614803565b90506120f1565b505050505050565b600080600267ffffffffffffffff81111561219d5761219c61406f565b5b6040519080825280602002602001820160405280156121cb5781602001602082028036833780820191505090505b509050601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600081518110612205576122046147d4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250503081600181518110612254576122536147d4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d06ca61f600e54836040518363ffffffff1660e01b81526004016122ed929190614917565b600060405180830381865afa15801561230a573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906123339190614a0a565b600181518110612346576123456147d4565b5b602002602001015191505090565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036123cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c290614ac5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361243a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243190614b57565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516125189190613e30565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612594576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258b90614be9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612603576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125fa90614c7b565b60405180910390fd5b60008111612646576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263d90614d0d565b60405180910390fd5b6000806000600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156126ef5750600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b801561272e57506126fe611549565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b801561276d575061273d611549565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b9050600061278c8561277e886110d5565b612c7690919063ffffffff16565b9050612796611549565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161415801561280457506127d4611549565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b801561285e5750601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b1561294757600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156129075750600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b612946576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293d90614d9f565b60405180910390fd5b5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16036129e257600f548111156129e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129d890614e31565b60405180910390fd5b5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614158015612a8d5750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16145b15612b0257600193506000612aa1306110d5565b90506000811115612b00576000612ab661217f565b9050808210158015612ad55750600d60009054906101000a900460ff16155b8015612aed5750600d60019054906101000a900460ff165b15612afe57612afb81613482565b94505b505b505b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614158015612bae5750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b15612bf957600f54811115612bf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bef90614e31565b60405180910390fd5b5b612c098787878588600189612f21565b50505050505050565b6000838311158290612c5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c519190613c43565b60405180910390fd5b5060008385612c699190614e51565b9050809150509392505050565b6000808284612c859190614803565b905083811015612cca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cc190614ed1565b60405180910390fd5b8091505092915050565b60005b83839050811015612d79576000848483818110612cf757612cf66147d4565b5b9050602002016020810190612d0c9190613d89565b905082600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550508080612d7190614ef1565b915050612cd7565b50505050565b60005b83839050811015612e24576000848483818110612da257612da16147d4565b5b9050602002016020810190612db79190613d89565b905082600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550508080612e1c90614ef1565b915050612d82565b50505050565b60005b8251811015612f1c576000838281518110612e4b57612e4a6147d4565b5b602002602001015190508215612eb8576001600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612f08565b600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff02191690555b508080612f1490614ef1565b915050612e2d565b505050565b600084612f2f576000612f5b565b612f5a6064612f4c6017600001548961355990919063ffffffff16565b6135d390919063ffffffff16565b5b9050848015612f675750835b15612f9a57612f976064612f896017600101548961355990919063ffffffff16565b6135d390919063ffffffff16565b90505b6000612faf828861361d90919063ffffffff16565b905061300387600460008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461361d90919063ffffffff16565b600460008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061309881600460008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c7690919063ffffffff16565b600460008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061312d82600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c7690919063ffffffff16565b600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef896040516131cd9190613e30565b60405180910390a3831561347757601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633974d3b18a6040518263ffffffff1660e01b81526004016132369190613b8f565b600060405180830381600087803b15801561325057600080fd5b505af1925050508015613261575060015b50601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633974d3b1896040518263ffffffff1660e01b81526004016132bd9190613b8f565b600060405180830381600087803b1580156132d757600080fd5b505af19250505080156132e8575060015b50600083111561337a57601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632cf86006846040518263ffffffff1660e01b815260040161334d9190613e30565b600060405180830381600087803b15801561336757600080fd5b505af1925050508015613378575060015b505b601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ffb2c4796012546040518263ffffffff1660e01b81526004016133d79190613e30565b6060604051808303816000875af192505050801561341357506040513d601f19601f820116820180604052508101906134109190614f39565b60015b15613476573273ffffffffffffffffffffffffffffffffffffffff16600115157fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a9885858560125460405161346a9493929190614f8c565b60405180910390a35050505b5b505050505050505050565b60006001600d60006101000a81548160ff02191690831515021790555060006134df60026134d160646134c36019600001548861355990919063ffffffff16565b6135d390919063ffffffff16565b6135d390919063ffffffff16565b90506000613521600261351360646135056019600101548961355990919063ffffffff16565b6135d390919063ffffffff16565b6135d390919063ffffffff16565b905061352c82613667565b6135358161386e565b925050506000600d60006101000a81548160ff021916908315150217905550919050565b600080830361356b57600090506135cd565b600082846135799190614485565b90508284826135889190615000565b146135c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135bf906150a3565b60405180910390fd5b809150505b92915050565b600061361583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613aeb565b905092915050565b600061365f83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612c12565b905092915050565b6060600267ffffffffffffffff8111156136845761368361406f565b5b6040519080825280602002602001820160405280156136b25781602001602082028036833780820191505090505b50905030816000815181106136ca576136c96147d4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160018151811061373b5761373a6147d4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506137a230600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168461235c565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663472b43f383600084601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518563ffffffff1660e01b815260040161382694939291906150fe565b6020604051808303816000875af1158015613845573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138699190614586565b505050565b60006060600367ffffffffffffffff81111561388d5761388c61406f565b5b6040519080825280602002602001820160405280156138bb5781602001602082028036833780820191505090505b50905030816000815181106138d3576138d26147d4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600181518110613944576139436147d4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16816002815181106139b5576139b46147d4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050613a1c30600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168561235c565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663472b43f384600084601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518563ffffffff1660e01b8152600401613aa094939291906150fe565b6020604051808303816000875af1158015613abf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ae39190614586565b915050919050565b60008083118290613b32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b299190613c43565b60405180910390fd5b5060008385613b419190615000565b9050809150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613b7982613b4e565b9050919050565b613b8981613b6e565b82525050565b6000602082019050613ba46000830184613b80565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613be4578082015181840152602081019050613bc9565b83811115613bf3576000848401525b50505050565b6000601f19601f8301169050919050565b6000613c1582613baa565b613c1f8185613bb5565b9350613c2f818560208601613bc6565b613c3881613bf9565b840191505092915050565b60006020820190508181036000830152613c5d8184613c0a565b905092915050565b6000604051905090565b600080fd5b600080fd5b613c8281613b6e565b8114613c8d57600080fd5b50565b600081359050613c9f81613c79565b92915050565b6000819050919050565b613cb881613ca5565b8114613cc357600080fd5b50565b600081359050613cd581613caf565b92915050565b60008060408385031215613cf257613cf1613c6f565b5b6000613d0085828601613c90565b9250506020613d1185828601613cc6565b9150509250929050565b60008115159050919050565b613d3081613d1b565b82525050565b6000602082019050613d4b6000830184613d27565b92915050565b613d5a81613ca5565b82525050565b6000604082019050613d756000830185613d51565b613d826020830184613d51565b9392505050565b600060208284031215613d9f57613d9e613c6f565b5b6000613dad84828501613c90565b91505092915050565b6000819050919050565b6000613ddb613dd6613dd184613b4e565b613db6565b613b4e565b9050919050565b6000613ded82613dc0565b9050919050565b6000613dff82613de2565b9050919050565b613e0f81613df4565b82525050565b6000602082019050613e2a6000830184613e06565b92915050565b6000602082019050613e456000830184613d51565b92915050565b600080600060608486031215613e6457613e63613c6f565b5b6000613e7286828701613c90565b9350506020613e8386828701613c90565b9250506040613e9486828701613cc6565b9150509250925092565b600060208284031215613eb457613eb3613c6f565b5b6000613ec284828501613cc6565b91505092915050565b6000613ed682613de2565b9050919050565b613ee681613ecb565b82525050565b6000602082019050613f016000830184613edd565b92915050565b600060ff82169050919050565b613f1d81613f07565b82525050565b6000602082019050613f386000830184613f14565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112613f6357613f62613f3e565b5b8235905067ffffffffffffffff811115613f8057613f7f613f43565b5b602083019150836020820283011115613f9c57613f9b613f48565b5b9250929050565b613fac81613d1b565b8114613fb757600080fd5b50565b600081359050613fc981613fa3565b92915050565b600080600060408486031215613fe857613fe7613c6f565b5b600084013567ffffffffffffffff81111561400657614005613c74565b5b61401286828701613f4d565b9350935050602061402586828701613fba565b9150509250925092565b6000806040838503121561404657614045613c6f565b5b600061405485828601613cc6565b925050602061406585828601613cc6565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6140a782613bf9565b810181811067ffffffffffffffff821117156140c6576140c561406f565b5b80604052505050565b60006140d9613c65565b90506140e5828261409e565b919050565b600067ffffffffffffffff8211156141055761410461406f565b5b602082029050602081019050919050565b6000614129614124846140ea565b6140cf565b9050808382526020820190506020840283018581111561414c5761414b613f48565b5b835b8181101561417557806141618882613c90565b84526020840193505060208101905061414e565b5050509392505050565b600082601f83011261419457614193613f3e565b5b81356141a4848260208601614116565b91505092915050565b6000602082840312156141c3576141c2613c6f565b5b600082013567ffffffffffffffff8111156141e1576141e0613c74565b5b6141ed8482850161417f565b91505092915050565b60006020828403121561420c5761420b613c6f565b5b600061421a84828501613fba565b91505092915050565b600061422e82613de2565b9050919050565b61423e81614223565b82525050565b60006020820190506142596000830184614235565b92915050565b6000806040838503121561427657614275613c6f565b5b600061428485828601613c90565b925050602061429585828601613c90565b9150509250929050565b60008083601f8401126142b5576142b4613f3e565b5b8235905067ffffffffffffffff8111156142d2576142d1613f43565b5b6020830191508360208202830111156142ee576142ed613f48565b5b9250929050565b60008060008060006060868803121561431157614310613c6f565b5b600086013567ffffffffffffffff81111561432f5761432e613c74565b5b61433b88828901613f4d565b9550955050602086013567ffffffffffffffff81111561435e5761435d613c74565b5b61436a8882890161429f565b9350935050604061437d88828901613fba565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806143d157607f821691505b6020821081036143e4576143e361438a565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614420602083613bb5565b915061442b826143ea565b602082019050919050565b6000602082019050818103600083015261444f81614413565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061449082613ca5565b915061449b83613ca5565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156144d4576144d3614456565b5b828202905092915050565b7f43616e6e6f742075706461746520676173466f7250726f63657373696e67207460008201527f6f2073616d652076616c75650000000000000000000000000000000000000000602082015250565b600061453b602c83613bb5565b9150614546826144df565b604082019050919050565b6000602082019050818103600083015261456a8161452e565b9050919050565b60008151905061458081613caf565b92915050565b60006020828403121561459c5761459b613c6f565b5b60006145aa84828501614571565b91505092915050565b60006040820190506145c86000830185613b80565b6145d56020830184613d51565b9392505050565b6000815190506145eb81613fa3565b92915050565b60006020828403121561460757614606613c6f565b5b6000614615848285016145dc565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061467a602683613bb5565b91506146858261461e565b604082019050919050565b600060208201905081810360008301526146a98161466d565b9050919050565b7f41697264726f702063616e206f6e6c7920626520646f6e65206279206578636c60008201527f756465642066726f6d2066656500000000000000000000000000000000000000602082015250565b600061470c602d83613bb5565b9150614717826146b0565b604082019050919050565b6000602082019050818103600083015261473b816146ff565b9050919050565b7f486f6c6465727320616e6420616d6f756e74206c656e677468206d757374206260008201527f65207468652073616d6500000000000000000000000000000000000000000000602082015250565b600061479e602a83613bb5565b91506147a982614742565b604082019050919050565b600060208201905081810360008301526147cd81614791565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061480e82613ca5565b915061481983613ca5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561484e5761484d614456565b5b828201905092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61488e81613b6e565b82525050565b60006148a08383614885565b60208301905092915050565b6000602082019050919050565b60006148c482614859565b6148ce8185614864565b93506148d983614875565b8060005b8381101561490a5781516148f18882614894565b97506148fc836148ac565b9250506001810190506148dd565b5085935050505092915050565b600060408201905061492c6000830185613d51565b818103602083015261493e81846148b9565b90509392505050565b600067ffffffffffffffff8211156149625761496161406f565b5b602082029050602081019050919050565b600061498661498184614947565b6140cf565b905080838252602082019050602084028301858111156149a9576149a8613f48565b5b835b818110156149d257806149be8882614571565b8452602084019350506020810190506149ab565b5050509392505050565b600082601f8301126149f1576149f0613f3e565b5b8151614a01848260208601614973565b91505092915050565b600060208284031215614a2057614a1f613c6f565b5b600082015167ffffffffffffffff811115614a3e57614a3d613c74565b5b614a4a848285016149dc565b91505092915050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614aaf602483613bb5565b9150614aba82614a53565b604082019050919050565b60006020820190508181036000830152614ade81614aa2565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000614b41602283613bb5565b9150614b4c82614ae5565b604082019050919050565b60006020820190508181036000830152614b7081614b34565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614bd3602583613bb5565b9150614bde82614b77565b604082019050919050565b60006020820190508181036000830152614c0281614bc6565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000614c65602383613bb5565b9150614c7082614c09565b604082019050919050565b60006020820190508181036000830152614c9481614c58565b9050919050565b7f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b6000614cf7602983613bb5565b9150614d0282614c9b565b604082019050919050565b60006020820190508181036000830152614d2681614cea565b9050919050565b7f626f747320617265206e6f7420616c6c6f77656420746f2073656c6c206f722060008201527f7472616e7366657220746f6b656e730000000000000000000000000000000000602082015250565b6000614d89602f83613bb5565b9150614d9482614d2d565b604082019050919050565b60006020820190508181036000830152614db881614d7c565b9050919050565b7f57616c6c65742063616e6e6f7420657863656564206d61782057616c6c65742060008201527f6c696d6974000000000000000000000000000000000000000000000000000000602082015250565b6000614e1b602583613bb5565b9150614e2682614dbf565b604082019050919050565b60006020820190508181036000830152614e4a81614e0e565b9050919050565b6000614e5c82613ca5565b9150614e6783613ca5565b925082821015614e7a57614e79614456565b5b828203905092915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b6000614ebb601b83613bb5565b9150614ec682614e85565b602082019050919050565b60006020820190508181036000830152614eea81614eae565b9050919050565b6000614efc82613ca5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614f2e57614f2d614456565b5b600182019050919050565b600080600060608486031215614f5257614f51613c6f565b5b6000614f6086828701614571565b9350506020614f7186828701614571565b9250506040614f8286828701614571565b9150509250925092565b6000608082019050614fa16000830187613d51565b614fae6020830186613d51565b614fbb6040830185613d51565b614fc86060830184613d51565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061500b82613ca5565b915061501683613ca5565b92508261502657615025614fd1565b5b828204905092915050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b600061508d602183613bb5565b915061509882615031565b604082019050919050565b600060208201905081810360008301526150bc81615080565b9050919050565b6000819050919050565b60006150e86150e36150de846150c3565b613db6565b613ca5565b9050919050565b6150f8816150cd565b82525050565b60006080820190506151136000830187613d51565b61512060208301866150ef565b818103604083015261513281856148b9565b90506151416060830184613b80565b9594505050505056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212202b0fd53abfda2939361e5448729f352631f108214d222cc71e851175c25da3d564736f6c634300080d0033

Deployed Bytecode Sourcemap

9045:13752:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10482:71;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11835:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12668:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11186:22;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;14701:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9337:106;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12112:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12837:313;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14224:135;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11254:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19636:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12021:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13158:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10281:70;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10641:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9550:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14367:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10107:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16705:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11215:32;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;10214:60;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12215:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8056:148;;;;;;;;;;;;;:::i;:::-;;14536:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15331:150;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15894:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19770:209;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7842:79;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10154:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11926:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20024:228;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16030:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10436:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13384:269;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12342:167;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15668:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20260:169;;;;;;;;;;;;;:::i;:::-;;16524:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9450:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12517:143;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10561:72;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15777:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15489:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8212:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13661:555;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19362:266;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10482:71;;;;;;;;;;;;;:::o;11835:83::-;11872:13;11905:5;11898:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11835:83;:::o;12668:161::-;12743:4;12760:39;12769:12;:10;:12::i;:::-;12783:7;12792:6;12760:8;:39::i;:::-;12817:4;12810:11;;12668:161;;;;:::o;11186:22::-;;;;;;;;;;;;;;:::o;14701:126::-;14767:4;14791:22;:28;14814:4;14791:28;;;;;;;;;;;;;;;;;;;;;;;;;14784:35;;14701:126;;;:::o;9337:106::-;;;;;;;;;;;;;:::o;12112:95::-;12165:7;12192;;12185:14;;12112:95;:::o;12837:313::-;12935:4;12952:36;12962:6;12970:9;12981:6;12952:9;:36::i;:::-;12999:121;13008:6;13016:12;:10;:12::i;:::-;13030:89;13068:6;13030:89;;;;;;;;;;;;;;;;;:11;:19;13042:6;13030:19;;;;;;;;;;;;;;;:33;13050:12;:10;:12::i;:::-;13030:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;12999:8;:121::i;:::-;13138:4;13131:11;;12837:313;;;;;:::o;14224:135::-;7979:12;:10;:12::i;:::-;7969:22;;:6;;;;;;;;;;:22;;;7961:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;14344:7:::1;14326:15;:25;;;;:::i;:::-;14307:16;:44;;;;14224:135:::0;:::o;11254:38::-;;;;;;;;;;;;;:::o;19636:126::-;7979:12;:10;:12::i;:::-;7969:22;;:6;;;;;;;;;;:22;;;7961:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;19738:16:::1;19720:15;:34;;;;19636:126:::0;:::o;12021:83::-;12062:5;12087:9;;;;;;;;;;;12080:16;;12021:83;:::o;13158:218::-;13246:4;13263:83;13272:12;:10;:12::i;:::-;13286:7;13295:50;13334:10;13295:11;:25;13307:12;:10;:12::i;:::-;13295:25;;;;;;;;;;;;;;;:34;13321:7;13295:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;13263:8;:83::i;:::-;13364:4;13357:11;;13158:218;;;;:::o;10281:70::-;;;;;;;;;;;;;:::o;10641:51::-;;;;;;;;;;;;;:::o;9550:45::-;;;;;;;;;;;;;:::o;14367:161::-;7979:12;:10;:12::i;:::-;7969:22;;:6;;;;;;;;;;:22;;;7961:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;14479:41:::1;14492:9;;14503:16;14479:12;:41::i;:::-;14367:161:::0;;;:::o;10107:40::-;;;;;;;;;;;;;:::o;16705:124::-;16770:4;16794:18;:27;16813:7;16794:27;;;;;;;;;;;;;;;;;;;;;;;;;16787:34;;16705:124;;;:::o;11215:32::-;;;;;;;;;;;;;;:::o;10214:60::-;;;;:::o;12215:119::-;12281:7;12308:9;:18;12318:7;12308:18;;;;;;;;;;;;;;;;12301:25;;12215:119;;;:::o;8056:148::-;7979:12;:10;:12::i;:::-;7969:22;;:6;;;;;;;;;;:22;;;7961:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;8163:1:::1;8126:40;;8147:6;::::0;::::1;;;;;;;;8126:40;;;;;;;;;;;;8194:1;8177:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;8056:148::o:0;14536:157::-;7979:12;:10;:12::i;:::-;7969:22;;:6;;;;;;;;;;:22;;;7961:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;14646:39:::1;14663:9;;14674:10;14646:16;:39::i;:::-;14536:157:::0;;;:::o;15331:150::-;7979:12;:10;:12::i;:::-;7969:22;;:6;;;;;;;;;;:22;;;7961:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;15431:6:::1;15414:7;:14;;:23;;;;15466:7;15448;:15;;:25;;;;15331:150:::0;;:::o;15894:128::-;7979:12;:10;:12::i;:::-;7969:22;;:6;;;;;;;;;;:22;;;7961:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;15978:36:::1;15998:9;16009:4;15978:19;:36::i;:::-;15894:128:::0;:::o;19770:209::-;7979:12;:10;:12::i;:::-;7969:22;;:6;;;;;;;;;;:22;;;7961:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;19868:16:::1;;19856:8;:28:::0;19848:85:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;19963:8;19944:16;:27;;;;19770:209:::0;:::o;7842:79::-;7880:7;7907:6;;;;;;;;;;;7900:13;;7842:79;:::o;10154:42::-;;;;:::o;11926:87::-;11965:13;11998:7;11991:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11926:87;:::o;20024:228::-;7979:12;:10;:12::i;:::-;7969:22;;:6;;;;;;;;;;:22;;;7961:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;20142:24:::1;20116:23;;:50;;;;;;;;;;;;;;;;;;20219:23;;;;;;;;;;;20177:15;;:67;;;;;;;;;;;;;;;;;;20024:228:::0;:::o;16030:131::-;7979:12;:10;:12::i;:::-;7969:22;;:6;;;;;;;;;;:22;;;7961:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;16116:37:::1;16136:9;16147:5;16116:19;:37::i;:::-;16030:131:::0;:::o;10436:39::-;;;;:::o;13384:269::-;13477:4;13494:129;13503:12;:10;:12::i;:::-;13517:7;13526:96;13565:15;13526:96;;;;;;;;;;;;;;;;;:11;:25;13538:12;:10;:12::i;:::-;13526:25;;;;;;;;;;;;;;;:34;13552:7;13526:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;13494:8;:129::i;:::-;13641:4;13634:11;;13384:269;;;;:::o;12342:167::-;12420:4;12437:42;12447:12;:10;:12::i;:::-;12461:9;12472:6;12437:9;:42::i;:::-;12497:4;12490:11;;12342:167;;;;:::o;15668:101::-;7979:12;:10;:12::i;:::-;7969:22;;:6;;;;;;;;;;:22;;;7961:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;15754:7:::1;15741:10;;:20;;;;;;;;;;;;;;;;;;15668:101:::0;:::o;20260:169::-;7979:12;:10;:12::i;:::-;7969:22;;:6;;;;;;;;;;:22;;;7961:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;20314:19:::1;20336:9;;;;;;;;;;;:19;;;20364:4;20336:34;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20314:56;;20381:9;;;;;;;;;;;:18;;;20400:7;:5;:7::i;:::-;20409:11;20381:40;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;20303:126;20260:169::o:0;16524:171::-;7979:12;:10;:12::i;:::-;7969:22;;:6;;;;;;;;;;:22;;;7961:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;16625:8:::1;16601:21;;:32;;;;;;;;;;;;;;;;;;16649:38;16678:8;16649:38;;;;;;:::i;:::-;;;;;;;;16524:171:::0;:::o;9450:93::-;;;;;;;;;;;;;:::o;12517:143::-;12598:7;12625:11;:18;12637:5;12625:18;;;;;;;;;;;;;;;:27;12644:7;12625:27;;;;;;;;;;;;;;;;12618:34;;12517:143;;;;:::o;10561:72::-;;;;;;;;;;;;;:::o;15777:109::-;15838:4;15862:10;:16;15873:4;15862:16;;;;;;;;;;;;;;;;;;;;;;;;;15855:23;;15777:109;;;:::o;15489:171::-;7979:12;:10;:12::i;:::-;7969:22;;:6;;;;;;;;;;:22;;;7961:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;15603:8:::1;15579:12;:21;;:32;;;;15645:7;15622:12;:20;;:30;;;;15489:171:::0;;:::o;8212:244::-;7979:12;:10;:12::i;:::-;7969:22;;:6;;;;;;;;;;:22;;;7961:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;8321:1:::1;8301:22;;:8;:22;;::::0;8293:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;8411:8;8382:38;;8403:6;::::0;::::1;;;;;;;;8382:38;;;;;;;;;;;;8440:8;8431:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;8212:244:::0;:::o;13661:555::-;13779:16;13818:18;:32;13837:12;:10;:12::i;:::-;13818:32;;;;;;;;;;;;;;;;;;;;;;;;;13810:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;13937:7;;:14;;13919:7;;:14;;:32;13911:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;14009:200;14027:7;;:14;;14016:8;:25;14009:200;;;14058:111;14073:12;:10;:12::i;:::-;14087:7;;14095:8;14087:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;14126:7;14106;;14114:8;14106:17;;;;;;;:::i;:::-;;;;;;;;:27;;;;:::i;:::-;14135:5;14142;14149:17;14167:1;14058:14;:111::i;:::-;14196:1;14184:13;;;;;:::i;:::-;;;14009:200;;;13768:448;13661:555;;;;;:::o;19362:266::-;19420:7;19441:21;19479:1;19465:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19441:40;;19502:11;;;;;;;;;;;19492:4;19497:1;19492:7;;;;;;;;:::i;:::-;;;;;;;:21;;;;;;;;;;;19542:4;19524;19529:1;19524:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;19565:15;;;;;;;;;;;:29;;;19595:15;;19612:4;19565:52;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19618:1;19565:55;;;;;;;;:::i;:::-;;;;;;;;19558:62;;;19362:266;:::o;4184:98::-;4237:7;4264:10;4257:17;;4184:98;:::o;16837:337::-;16947:1;16930:19;;:5;:19;;;16922:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17028:1;17009:21;;:7;:21;;;17001:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17112:6;17082:11;:18;17094:5;17082:18;;;;;;;;;;;;;;;:27;17101:7;17082:27;;;;;;;;;;;;;;;:36;;;;17150:7;17134:32;;17143:5;17134:32;;;17159:6;17134:32;;;;;;:::i;:::-;;;;;;;;16837:337;;;:::o;17182:1821::-;17286:1;17270:18;;:4;:18;;;17262:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17363:1;17349:16;;:2;:16;;;17341:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;17433:1;17424:6;:10;17416:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;17491:11;17521:28;17564:13;17581:18;:24;17600:4;17581:24;;;;;;;;;;;;;;;;;;;;;;;;;17580:25;:52;;;;;17610:18;:22;17629:2;17610:22;;;;;;;;;;;;;;;;;;;;;;;;;17609:23;17580:52;:71;;;;;17644:7;:5;:7::i;:::-;17636:15;;:4;:15;;;;17580:71;:88;;;;;17661:7;:5;:7::i;:::-;17655:13;;:2;:13;;;;17580:88;17564:104;;17679:21;17703:25;17721:6;17703:13;17713:2;17703:9;:13::i;:::-;:17;;:25;;;;:::i;:::-;17679:49;;17840:7;:5;:7::i;:::-;17832:15;;:4;:15;;;;:32;;;;;17857:7;:5;:7::i;:::-;17851:13;;:2;:13;;;;17832:32;:52;;;;;17874:10;;;;;;;;;;;17868:16;;:2;:16;;;;17832:52;17828:181;;;17910:10;:16;17921:4;17910:16;;;;;;;;;;;;;;;;;;;;;;;;;17909:17;:36;;;;;17931:10;:14;17942:2;17931:14;;;;;;;;;;;;;;;;;;;;;;;;;17930:15;17909:36;17901:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;17828:181;18031:17;;;;;;;;;;;18023:25;;:4;:25;;;18019:141;;18090:16;;18073:13;:33;;18065:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;18019:141;18182:17;;;;;;;;;;;18174:25;;:4;:25;;;;:52;;;;;18209:17;;;;;;;;;;;18203:23;;:2;:23;;;18174:52;18170:559;;;18321:4;18312:13;;18340:28;18371:24;18389:4;18371:9;:24::i;:::-;18340:55;;18437:1;18414:20;:24;18410:308;;;18459:19;18481:27;:25;:27::i;:::-;18459:49;;18555:11;18531:20;:35;;:56;;;;;18571:16;;;;;;;;;;;18570:17;18531:56;:81;;;;;18591:21;;;;;;;;;;;18531:81;18527:176;;;18660:23;18671:11;18660:10;:23::i;:::-;18637:46;;18527:176;18440:278;18410:308;18228:501;18170:559;18751:17;;;;;;;;;;;18743:25;;:4;:25;;;;:52;;;;;18778:17;;;;;;;;;;;18772:23;;:2;:23;;;;18743:52;18739:168;;;18837:16;;18820:13;:33;;18812:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;18739:168;18917:78;18932:4;18938:2;18942:6;18950:8;18960:6;18968:4;18974:20;18917:14;:78::i;:::-;17251:1752;;;;17182:1821;;;:::o;2656:192::-;2742:7;2775:1;2770;:6;;2778:12;2762:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;2802:9;2818:1;2814;:5;;;;:::i;:::-;2802:17;;2839:1;2832:8;;;2656:192;;;;;:::o;2323:181::-;2381:7;2401:9;2417:1;2413;:5;;;;:::i;:::-;2401:17;;2442:1;2437;:6;;2429:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;2495:1;2488:8;;;2323:181;;;;:::o;15087:236::-;15174:9;15169:147;15193:9;;:16;;15189:1;:20;15169:147;;;15231:12;15246:9;;15256:1;15246:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;15231:27;;15300:4;15273:18;:24;15292:4;15273:24;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;15216:100;15211:3;;;;;:::i;:::-;;;;15169:147;;;;15087:236;;;:::o;14835:244::-;14926:9;14921:151;14945:9;;:16;;14941:1;:20;14921:151;;;14983:12;14998:9;;15008:1;14998:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;14983:27;;15056:4;15025:22;:28;15048:4;15025:28;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;14968:104;14963:3;;;;;:::i;:::-;;;;14921:151;;;;14835:244;;;:::o;16169:347::-;16264:9;16259:250;16283:9;:16;16279:1;:20;16259:250;;;16321:12;16336:9;16346:1;16336:12;;;;;;;;:::i;:::-;;;;;;;;16321:27;;16367:7;16363:135;;;16414:4;16395:10;:16;16406:4;16395:16;;;;;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;16363:135;;;16466:10;:16;16477:4;16466:16;;;;;;;;;;;;;;;;16459:23;;;;;;;;;;;16363:135;16306:203;16301:3;;;;;:::i;:::-;;;;16259:250;;;;16169:347;;:::o;21489:1305::-;21674:17;21694:8;:50;;21743:1;21694:50;;;21705:35;21736:3;21705:26;21716:7;:14;;;21705:6;:10;;:26;;;;:::i;:::-;:30;;:35;;;;:::i;:::-;21694:50;21674:70;;21759:8;:18;;;;;21771:6;21759:18;21755:99;;;21806:36;21838:3;21806:27;21817:7;:15;;;21806:6;:10;;:27;;;;:::i;:::-;:31;;:36;;;;:::i;:::-;21794:48;;21755:99;21864:22;21889:21;21900:9;21889:6;:10;;:21;;;;:::i;:::-;21864:46;;21941:29;21963:6;21941:9;:17;21951:6;21941:17;;;;;;;;;;;;;;;;:21;;:29;;;;:::i;:::-;21921:9;:17;21931:6;21921:17;;;;;;;;;;;;;;;:49;;;;22004:40;22029:14;22004:9;:20;22014:9;22004:20;;;;;;;;;;;;;;;;:24;;:40;;;;:::i;:::-;21981:9;:20;21991:9;21981:20;;;;;;;;;;;;;;;:63;;;;22082:39;22111:9;22082;:24;22100:4;22082:24;;;;;;;;;;;;;;;;:28;;:39;;;;:::i;:::-;22055:9;:24;22073:4;22055:24;;;;;;;;;;;;;;;:66;;;;22154:9;22137:35;;22146:6;22137:35;;;22165:6;22137:35;;;;;;:::i;:::-;;;;;;;;22189:17;22185:602;;;22227:15;;;;;;;;;;;:31;;;22259:6;22227:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22223:54;22295:15;;;;;;;;;;;:31;;;22327:9;22295:42;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22291:57;22388:1;22365:20;:24;22362:134;;;22414:15;;;;;;;;;;;:34;;;22449:20;22414:56;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22410:71;22362:134;22514:15;;;;;;;;;;;:23;;;22538:16;;22514:41;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;22510:266;;;22742:9;22653:99;;22718:4;22653:99;;;22678:10;22690:6;22698:18;22724:16;;22653:99;;;;;;;;;:::i;:::-;;;;;;;;22556:212;;;22510:266;22185:602;21663:1131;;21489:1305;;;;;;;:::o;19011:343::-;19080:7;9272:4;9253:16;;:23;;;;;;;;;;;;;;;;;;19100:17:::1;19120:53;19171:1;19120:46;19162:3;19120:37;19136:12;:20;;;19120:11;:15;;:37;;;;:::i;:::-;:41;;:46;;;;:::i;:::-;:50;;:53;;;;:::i;:::-;19100:73;;19184:18;19205:54;19257:1;19205:47;19248:3;19205:38;19221:12;:21;;;19205:11;:15;;:38;;;;:::i;:::-;:42;;:47;;;;:::i;:::-;:51;;:54;;;;:::i;:::-;19184:75;;19270:28;19288:9;19270:17;:28::i;:::-;19316:30;19335:10;19316:18;:30::i;:::-;19309:37;;;;9318:5:::0;9299:16;;:24;;;;;;;;;;;;;;;;;;19011:343;;;:::o;2856:471::-;2914:7;3164:1;3159;:6;3155:47;;3189:1;3182:8;;;;3155:47;3214:9;3230:1;3226;:5;;;;:::i;:::-;3214:17;;3259:1;3254;3250;:5;;;;:::i;:::-;:10;3242:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;3318:1;3311:8;;;2856:471;;;;;:::o;3335:132::-;3393:7;3420:39;3424:1;3427;3420:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;3413:46;;3335:132;;;;:::o;2512:136::-;2570:7;2597:43;2601:1;2604;2597:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;2590:50;;2512:136;;;;:::o;20437:445::-;20504:21;20557:1;20543:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20536:23;;20588:4;20570;20575:1;20570:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;20614:11;;;;;;;;;;;20604:4;20609:1;20604:7;;;;;;;;:::i;:::-;;;;;;;:21;;;;;;;;;;;20671:59;20688:4;20703:12;;;;;;;;;;;20718:11;20671:8;:59::i;:::-;20741:12;;;;;;;;;;;:37;;;20793:11;20819:1;20835:4;20862:10;;;;;;;;;;;20741:133;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;20493:389;20437:445;:::o;20890:518::-;20955:7;20975:21;21028:1;21014:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21007:23;;21059:4;21041;21046:1;21041:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;21085:11;;;;;;;;;;;21075:4;21080:1;21075:7;;;;;;;;:::i;:::-;;;;;;;:21;;;;;;;;;;;21117:12;;;;;;;;;;;21107:4;21112:1;21107:7;;;;;;;;:::i;:::-;;;;;;;:22;;;;;;;;;;;21175:59;21192:4;21207:12;;;;;;;;;;;21222:11;21175:8;:59::i;:::-;21252:12;;;;;;;;;;;:37;;;21304:11;21330:1;21346:4;21373:23;;;;;;;;;;;21252:146;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21245:153;;;20890:518;;;:::o;3475:278::-;3561:7;3593:1;3589;:5;3596:12;3581:28;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;3620:9;3636:1;3632;:5;;;;:::i;:::-;3620:17;;3744:1;3737:8;;;3475:278;;;;;:::o;7:126:1:-;44:7;84:42;77:5;73:54;62:65;;7:126;;;:::o;139:96::-;176:7;205:24;223:5;205:24;:::i;:::-;194:35;;139:96;;;:::o;241:118::-;328:24;346:5;328:24;:::i;:::-;323:3;316:37;241:118;;:::o;365:222::-;458:4;496:2;485:9;481:18;473:26;;509:71;577:1;566:9;562:17;553:6;509:71;:::i;:::-;365:222;;;;:::o;593:99::-;645:6;679:5;673:12;663:22;;593:99;;;:::o;698:169::-;782:11;816:6;811:3;804:19;856:4;851:3;847:14;832:29;;698:169;;;;:::o;873:307::-;941:1;951:113;965:6;962:1;959:13;951:113;;;1050:1;1045:3;1041:11;1035:18;1031:1;1026:3;1022:11;1015:39;987:2;984:1;980:10;975:15;;951:113;;;1082:6;1079:1;1076:13;1073:101;;;1162:1;1153:6;1148:3;1144:16;1137:27;1073:101;922:258;873:307;;;:::o;1186:102::-;1227:6;1278:2;1274:7;1269:2;1262:5;1258:14;1254:28;1244:38;;1186:102;;;:::o;1294:364::-;1382:3;1410:39;1443:5;1410:39;:::i;:::-;1465:71;1529:6;1524:3;1465:71;:::i;:::-;1458:78;;1545:52;1590:6;1585:3;1578:4;1571:5;1567:16;1545:52;:::i;:::-;1622:29;1644:6;1622:29;:::i;:::-;1617:3;1613:39;1606:46;;1386:272;1294:364;;;;:::o;1664:313::-;1777:4;1815:2;1804:9;1800:18;1792:26;;1864:9;1858:4;1854:20;1850:1;1839:9;1835:17;1828:47;1892:78;1965:4;1956:6;1892:78;:::i;:::-;1884:86;;1664:313;;;;:::o;1983:75::-;2016:6;2049:2;2043:9;2033:19;;1983:75;:::o;2064:117::-;2173:1;2170;2163:12;2187:117;2296:1;2293;2286:12;2310:122;2383:24;2401:5;2383:24;:::i;:::-;2376:5;2373:35;2363:63;;2422:1;2419;2412:12;2363:63;2310:122;:::o;2438:139::-;2484:5;2522:6;2509:20;2500:29;;2538:33;2565:5;2538:33;:::i;:::-;2438:139;;;;:::o;2583:77::-;2620:7;2649:5;2638:16;;2583:77;;;:::o;2666:122::-;2739:24;2757:5;2739:24;:::i;:::-;2732:5;2729:35;2719:63;;2778:1;2775;2768:12;2719:63;2666:122;:::o;2794:139::-;2840:5;2878:6;2865:20;2856:29;;2894:33;2921:5;2894:33;:::i;:::-;2794:139;;;;:::o;2939:474::-;3007:6;3015;3064:2;3052:9;3043:7;3039:23;3035:32;3032:119;;;3070:79;;:::i;:::-;3032:119;3190:1;3215:53;3260:7;3251:6;3240:9;3236:22;3215:53;:::i;:::-;3205:63;;3161:117;3317:2;3343:53;3388:7;3379:6;3368:9;3364:22;3343:53;:::i;:::-;3333:63;;3288:118;2939:474;;;;;:::o;3419:90::-;3453:7;3496:5;3489:13;3482:21;3471:32;;3419:90;;;:::o;3515:109::-;3596:21;3611:5;3596:21;:::i;:::-;3591:3;3584:34;3515:109;;:::o;3630:210::-;3717:4;3755:2;3744:9;3740:18;3732:26;;3768:65;3830:1;3819:9;3815:17;3806:6;3768:65;:::i;:::-;3630:210;;;;:::o;3846:118::-;3933:24;3951:5;3933:24;:::i;:::-;3928:3;3921:37;3846:118;;:::o;3970:332::-;4091:4;4129:2;4118:9;4114:18;4106:26;;4142:71;4210:1;4199:9;4195:17;4186:6;4142:71;:::i;:::-;4223:72;4291:2;4280:9;4276:18;4267:6;4223:72;:::i;:::-;3970:332;;;;;:::o;4308:329::-;4367:6;4416:2;4404:9;4395:7;4391:23;4387:32;4384:119;;;4422:79;;:::i;:::-;4384:119;4542:1;4567:53;4612:7;4603:6;4592:9;4588:22;4567:53;:::i;:::-;4557:63;;4513:117;4308:329;;;;:::o;4643:60::-;4671:3;4692:5;4685:12;;4643:60;;;:::o;4709:142::-;4759:9;4792:53;4810:34;4819:24;4837:5;4819:24;:::i;:::-;4810:34;:::i;:::-;4792:53;:::i;:::-;4779:66;;4709:142;;;:::o;4857:126::-;4907:9;4940:37;4971:5;4940:37;:::i;:::-;4927:50;;4857:126;;;:::o;4989:152::-;5065:9;5098:37;5129:5;5098:37;:::i;:::-;5085:50;;4989:152;;;:::o;5147:183::-;5260:63;5317:5;5260:63;:::i;:::-;5255:3;5248:76;5147:183;;:::o;5336:274::-;5455:4;5493:2;5482:9;5478:18;5470:26;;5506:97;5600:1;5589:9;5585:17;5576:6;5506:97;:::i;:::-;5336:274;;;;:::o;5616:222::-;5709:4;5747:2;5736:9;5732:18;5724:26;;5760:71;5828:1;5817:9;5813:17;5804:6;5760:71;:::i;:::-;5616:222;;;;:::o;5844:619::-;5921:6;5929;5937;5986:2;5974:9;5965:7;5961:23;5957:32;5954:119;;;5992:79;;:::i;:::-;5954:119;6112:1;6137:53;6182:7;6173:6;6162:9;6158:22;6137:53;:::i;:::-;6127:63;;6083:117;6239:2;6265:53;6310:7;6301:6;6290:9;6286:22;6265:53;:::i;:::-;6255:63;;6210:118;6367:2;6393:53;6438:7;6429:6;6418:9;6414:22;6393:53;:::i;:::-;6383:63;;6338:118;5844:619;;;;;:::o;6469:329::-;6528:6;6577:2;6565:9;6556:7;6552:23;6548:32;6545:119;;;6583:79;;:::i;:::-;6545:119;6703:1;6728:53;6773:7;6764:6;6753:9;6749:22;6728:53;:::i;:::-;6718:63;;6674:117;6469:329;;;;:::o;6804:150::-;6878:9;6911:37;6942:5;6911:37;:::i;:::-;6898:50;;6804:150;;;:::o;6960:179::-;7071:61;7126:5;7071:61;:::i;:::-;7066:3;7059:74;6960:179;;:::o;7145:270::-;7262:4;7300:2;7289:9;7285:18;7277:26;;7313:95;7405:1;7394:9;7390:17;7381:6;7313:95;:::i;:::-;7145:270;;;;:::o;7421:86::-;7456:7;7496:4;7489:5;7485:16;7474:27;;7421:86;;;:::o;7513:112::-;7596:22;7612:5;7596:22;:::i;:::-;7591:3;7584:35;7513:112;;:::o;7631:214::-;7720:4;7758:2;7747:9;7743:18;7735:26;;7771:67;7835:1;7824:9;7820:17;7811:6;7771:67;:::i;:::-;7631:214;;;;:::o;7851:117::-;7960:1;7957;7950:12;7974:117;8083:1;8080;8073:12;8097:117;8206:1;8203;8196:12;8237:568;8310:8;8320:6;8370:3;8363:4;8355:6;8351:17;8347:27;8337:122;;8378:79;;:::i;:::-;8337:122;8491:6;8478:20;8468:30;;8521:18;8513:6;8510:30;8507:117;;;8543:79;;:::i;:::-;8507:117;8657:4;8649:6;8645:17;8633:29;;8711:3;8703:4;8695:6;8691:17;8681:8;8677:32;8674:41;8671:128;;;8718:79;;:::i;:::-;8671:128;8237:568;;;;;:::o;8811:116::-;8881:21;8896:5;8881:21;:::i;:::-;8874:5;8871:32;8861:60;;8917:1;8914;8907:12;8861:60;8811:116;:::o;8933:133::-;8976:5;9014:6;9001:20;8992:29;;9030:30;9054:5;9030:30;:::i;:::-;8933:133;;;;:::o;9072:698::-;9164:6;9172;9180;9229:2;9217:9;9208:7;9204:23;9200:32;9197:119;;;9235:79;;:::i;:::-;9197:119;9383:1;9372:9;9368:17;9355:31;9413:18;9405:6;9402:30;9399:117;;;9435:79;;:::i;:::-;9399:117;9548:80;9620:7;9611:6;9600:9;9596:22;9548:80;:::i;:::-;9530:98;;;;9326:312;9677:2;9703:50;9745:7;9736:6;9725:9;9721:22;9703:50;:::i;:::-;9693:60;;9648:115;9072:698;;;;;:::o;9776:474::-;9844:6;9852;9901:2;9889:9;9880:7;9876:23;9872:32;9869:119;;;9907:79;;:::i;:::-;9869:119;10027:1;10052:53;10097:7;10088:6;10077:9;10073:22;10052:53;:::i;:::-;10042:63;;9998:117;10154:2;10180:53;10225:7;10216:6;10205:9;10201:22;10180:53;:::i;:::-;10170:63;;10125:118;9776:474;;;;;:::o;10256:180::-;10304:77;10301:1;10294:88;10401:4;10398:1;10391:15;10425:4;10422:1;10415:15;10442:281;10525:27;10547:4;10525:27;:::i;:::-;10517:6;10513:40;10655:6;10643:10;10640:22;10619:18;10607:10;10604:34;10601:62;10598:88;;;10666:18;;:::i;:::-;10598:88;10706:10;10702:2;10695:22;10485:238;10442:281;;:::o;10729:129::-;10763:6;10790:20;;:::i;:::-;10780:30;;10819:33;10847:4;10839:6;10819:33;:::i;:::-;10729:129;;;:::o;10864:311::-;10941:4;11031:18;11023:6;11020:30;11017:56;;;11053:18;;:::i;:::-;11017:56;11103:4;11095:6;11091:17;11083:25;;11163:4;11157;11153:15;11145:23;;10864:311;;;:::o;11198:710::-;11294:5;11319:81;11335:64;11392:6;11335:64;:::i;:::-;11319:81;:::i;:::-;11310:90;;11420:5;11449:6;11442:5;11435:21;11483:4;11476:5;11472:16;11465:23;;11536:4;11528:6;11524:17;11516:6;11512:30;11565:3;11557:6;11554:15;11551:122;;;11584:79;;:::i;:::-;11551:122;11699:6;11682:220;11716:6;11711:3;11708:15;11682:220;;;11791:3;11820:37;11853:3;11841:10;11820:37;:::i;:::-;11815:3;11808:50;11887:4;11882:3;11878:14;11871:21;;11758:144;11742:4;11737:3;11733:14;11726:21;;11682:220;;;11686:21;11300:608;;11198:710;;;;;:::o;11931:370::-;12002:5;12051:3;12044:4;12036:6;12032:17;12028:27;12018:122;;12059:79;;:::i;:::-;12018:122;12176:6;12163:20;12201:94;12291:3;12283:6;12276:4;12268:6;12264:17;12201:94;:::i;:::-;12192:103;;12008:293;11931:370;;;;:::o;12307:539::-;12391:6;12440:2;12428:9;12419:7;12415:23;12411:32;12408:119;;;12446:79;;:::i;:::-;12408:119;12594:1;12583:9;12579:17;12566:31;12624:18;12616:6;12613:30;12610:117;;;12646:79;;:::i;:::-;12610:117;12751:78;12821:7;12812:6;12801:9;12797:22;12751:78;:::i;:::-;12741:88;;12537:302;12307:539;;;;:::o;12852:323::-;12908:6;12957:2;12945:9;12936:7;12932:23;12928:32;12925:119;;;12963:79;;:::i;:::-;12925:119;13083:1;13108:50;13150:7;13141:6;13130:9;13126:22;13108:50;:::i;:::-;13098:60;;13054:114;12852:323;;;;:::o;13181:147::-;13252:9;13285:37;13316:5;13285:37;:::i;:::-;13272:50;;13181:147;;;:::o;13334:173::-;13442:58;13494:5;13442:58;:::i;:::-;13437:3;13430:71;13334:173;;:::o;13513:264::-;13627:4;13665:2;13654:9;13650:18;13642:26;;13678:92;13767:1;13756:9;13752:17;13743:6;13678:92;:::i;:::-;13513:264;;;;:::o;13783:474::-;13851:6;13859;13908:2;13896:9;13887:7;13883:23;13879:32;13876:119;;;13914:79;;:::i;:::-;13876:119;14034:1;14059:53;14104:7;14095:6;14084:9;14080:22;14059:53;:::i;:::-;14049:63;;14005:117;14161:2;14187:53;14232:7;14223:6;14212:9;14208:22;14187:53;:::i;:::-;14177:63;;14132:118;13783:474;;;;;:::o;14280:568::-;14353:8;14363:6;14413:3;14406:4;14398:6;14394:17;14390:27;14380:122;;14421:79;;:::i;:::-;14380:122;14534:6;14521:20;14511:30;;14564:18;14556:6;14553:30;14550:117;;;14586:79;;:::i;:::-;14550:117;14700:4;14692:6;14688:17;14676:29;;14754:3;14746:4;14738:6;14734:17;14724:8;14720:32;14717:41;14714:128;;;14761:79;;:::i;:::-;14714:128;14280:568;;;;;:::o;14854:1073::-;14982:6;14990;14998;15006;15014;15063:2;15051:9;15042:7;15038:23;15034:32;15031:119;;;15069:79;;:::i;:::-;15031:119;15217:1;15206:9;15202:17;15189:31;15247:18;15239:6;15236:30;15233:117;;;15269:79;;:::i;:::-;15233:117;15382:80;15454:7;15445:6;15434:9;15430:22;15382:80;:::i;:::-;15364:98;;;;15160:312;15539:2;15528:9;15524:18;15511:32;15570:18;15562:6;15559:30;15556:117;;;15592:79;;:::i;:::-;15556:117;15705:80;15777:7;15768:6;15757:9;15753:22;15705:80;:::i;:::-;15687:98;;;;15482:313;15834:2;15860:50;15902:7;15893:6;15882:9;15878:22;15860:50;:::i;:::-;15850:60;;15805:115;14854:1073;;;;;;;;:::o;15933:180::-;15981:77;15978:1;15971:88;16078:4;16075:1;16068:15;16102:4;16099:1;16092:15;16119:320;16163:6;16200:1;16194:4;16190:12;16180:22;;16247:1;16241:4;16237:12;16268:18;16258:81;;16324:4;16316:6;16312:17;16302:27;;16258:81;16386:2;16378:6;16375:14;16355:18;16352:38;16349:84;;16405:18;;:::i;:::-;16349:84;16170:269;16119:320;;;:::o;16445:182::-;16585:34;16581:1;16573:6;16569:14;16562:58;16445:182;:::o;16633:366::-;16775:3;16796:67;16860:2;16855:3;16796:67;:::i;:::-;16789:74;;16872:93;16961:3;16872:93;:::i;:::-;16990:2;16985:3;16981:12;16974:19;;16633:366;;;:::o;17005:419::-;17171:4;17209:2;17198:9;17194:18;17186:26;;17258:9;17252:4;17248:20;17244:1;17233:9;17229:17;17222:47;17286:131;17412:4;17286:131;:::i;:::-;17278:139;;17005:419;;;:::o;17430:180::-;17478:77;17475:1;17468:88;17575:4;17572:1;17565:15;17599:4;17596:1;17589:15;17616:348;17656:7;17679:20;17697:1;17679:20;:::i;:::-;17674:25;;17713:20;17731:1;17713:20;:::i;:::-;17708:25;;17901:1;17833:66;17829:74;17826:1;17823:81;17818:1;17811:9;17804:17;17800:105;17797:131;;;17908:18;;:::i;:::-;17797:131;17956:1;17953;17949:9;17938:20;;17616:348;;;;:::o;17970:231::-;18110:34;18106:1;18098:6;18094:14;18087:58;18179:14;18174:2;18166:6;18162:15;18155:39;17970:231;:::o;18207:366::-;18349:3;18370:67;18434:2;18429:3;18370:67;:::i;:::-;18363:74;;18446:93;18535:3;18446:93;:::i;:::-;18564:2;18559:3;18555:12;18548:19;;18207:366;;;:::o;18579:419::-;18745:4;18783:2;18772:9;18768:18;18760:26;;18832:9;18826:4;18822:20;18818:1;18807:9;18803:17;18796:47;18860:131;18986:4;18860:131;:::i;:::-;18852:139;;18579:419;;;:::o;19004:143::-;19061:5;19092:6;19086:13;19077:22;;19108:33;19135:5;19108:33;:::i;:::-;19004:143;;;;:::o;19153:351::-;19223:6;19272:2;19260:9;19251:7;19247:23;19243:32;19240:119;;;19278:79;;:::i;:::-;19240:119;19398:1;19423:64;19479:7;19470:6;19459:9;19455:22;19423:64;:::i;:::-;19413:74;;19369:128;19153:351;;;;:::o;19510:332::-;19631:4;19669:2;19658:9;19654:18;19646:26;;19682:71;19750:1;19739:9;19735:17;19726:6;19682:71;:::i;:::-;19763:72;19831:2;19820:9;19816:18;19807:6;19763:72;:::i;:::-;19510:332;;;;;:::o;19848:137::-;19902:5;19933:6;19927:13;19918:22;;19949:30;19973:5;19949:30;:::i;:::-;19848:137;;;;:::o;19991:345::-;20058:6;20107:2;20095:9;20086:7;20082:23;20078:32;20075:119;;;20113:79;;:::i;:::-;20075:119;20233:1;20258:61;20311:7;20302:6;20291:9;20287:22;20258:61;:::i;:::-;20248:71;;20204:125;19991:345;;;;:::o;20342:225::-;20482:34;20478:1;20470:6;20466:14;20459:58;20551:8;20546:2;20538:6;20534:15;20527:33;20342:225;:::o;20573:366::-;20715:3;20736:67;20800:2;20795:3;20736:67;:::i;:::-;20729:74;;20812:93;20901:3;20812:93;:::i;:::-;20930:2;20925:3;20921:12;20914:19;;20573:366;;;:::o;20945:419::-;21111:4;21149:2;21138:9;21134:18;21126:26;;21198:9;21192:4;21188:20;21184:1;21173:9;21169:17;21162:47;21226:131;21352:4;21226:131;:::i;:::-;21218:139;;20945:419;;;:::o;21370:232::-;21510:34;21506:1;21498:6;21494:14;21487:58;21579:15;21574:2;21566:6;21562:15;21555:40;21370:232;:::o;21608:366::-;21750:3;21771:67;21835:2;21830:3;21771:67;:::i;:::-;21764:74;;21847:93;21936:3;21847:93;:::i;:::-;21965:2;21960:3;21956:12;21949:19;;21608:366;;;:::o;21980:419::-;22146:4;22184:2;22173:9;22169:18;22161:26;;22233:9;22227:4;22223:20;22219:1;22208:9;22204:17;22197:47;22261:131;22387:4;22261:131;:::i;:::-;22253:139;;21980:419;;;:::o;22405:229::-;22545:34;22541:1;22533:6;22529:14;22522:58;22614:12;22609:2;22601:6;22597:15;22590:37;22405:229;:::o;22640:366::-;22782:3;22803:67;22867:2;22862:3;22803:67;:::i;:::-;22796:74;;22879:93;22968:3;22879:93;:::i;:::-;22997:2;22992:3;22988:12;22981:19;;22640:366;;;:::o;23012:419::-;23178:4;23216:2;23205:9;23201:18;23193:26;;23265:9;23259:4;23255:20;23251:1;23240:9;23236:17;23229:47;23293:131;23419:4;23293:131;:::i;:::-;23285:139;;23012:419;;;:::o;23437:180::-;23485:77;23482:1;23475:88;23582:4;23579:1;23572:15;23606:4;23603:1;23596:15;23623:305;23663:3;23682:20;23700:1;23682:20;:::i;:::-;23677:25;;23716:20;23734:1;23716:20;:::i;:::-;23711:25;;23870:1;23802:66;23798:74;23795:1;23792:81;23789:107;;;23876:18;;:::i;:::-;23789:107;23920:1;23917;23913:9;23906:16;;23623:305;;;;:::o;23934:114::-;24001:6;24035:5;24029:12;24019:22;;23934:114;;;:::o;24054:184::-;24153:11;24187:6;24182:3;24175:19;24227:4;24222:3;24218:14;24203:29;;24054:184;;;;:::o;24244:132::-;24311:4;24334:3;24326:11;;24364:4;24359:3;24355:14;24347:22;;24244:132;;;:::o;24382:108::-;24459:24;24477:5;24459:24;:::i;:::-;24454:3;24447:37;24382:108;;:::o;24496:179::-;24565:10;24586:46;24628:3;24620:6;24586:46;:::i;:::-;24664:4;24659:3;24655:14;24641:28;;24496:179;;;;:::o;24681:113::-;24751:4;24783;24778:3;24774:14;24766:22;;24681:113;;;:::o;24830:732::-;24949:3;24978:54;25026:5;24978:54;:::i;:::-;25048:86;25127:6;25122:3;25048:86;:::i;:::-;25041:93;;25158:56;25208:5;25158:56;:::i;:::-;25237:7;25268:1;25253:284;25278:6;25275:1;25272:13;25253:284;;;25354:6;25348:13;25381:63;25440:3;25425:13;25381:63;:::i;:::-;25374:70;;25467:60;25520:6;25467:60;:::i;:::-;25457:70;;25313:224;25300:1;25297;25293:9;25288:14;;25253:284;;;25257:14;25553:3;25546:10;;24954:608;;;24830:732;;;;:::o;25568:483::-;25739:4;25777:2;25766:9;25762:18;25754:26;;25790:71;25858:1;25847:9;25843:17;25834:6;25790:71;:::i;:::-;25908:9;25902:4;25898:20;25893:2;25882:9;25878:18;25871:48;25936:108;26039:4;26030:6;25936:108;:::i;:::-;25928:116;;25568:483;;;;;:::o;26057:311::-;26134:4;26224:18;26216:6;26213:30;26210:56;;;26246:18;;:::i;:::-;26210:56;26296:4;26288:6;26284:17;26276:25;;26356:4;26350;26346:15;26338:23;;26057:311;;;:::o;26391:732::-;26498:5;26523:81;26539:64;26596:6;26539:64;:::i;:::-;26523:81;:::i;:::-;26514:90;;26624:5;26653:6;26646:5;26639:21;26687:4;26680:5;26676:16;26669:23;;26740:4;26732:6;26728:17;26720:6;26716:30;26769:3;26761:6;26758:15;26755:122;;;26788:79;;:::i;:::-;26755:122;26903:6;26886:231;26920:6;26915:3;26912:15;26886:231;;;26995:3;27024:48;27068:3;27056:10;27024:48;:::i;:::-;27019:3;27012:61;27102:4;27097:3;27093:14;27086:21;;26962:155;26946:4;26941:3;26937:14;26930:21;;26886:231;;;26890:21;26504:619;;26391:732;;;;;:::o;27146:385::-;27228:5;27277:3;27270:4;27262:6;27258:17;27254:27;27244:122;;27285:79;;:::i;:::-;27244:122;27395:6;27389:13;27420:105;27521:3;27513:6;27506:4;27498:6;27494:17;27420:105;:::i;:::-;27411:114;;27234:297;27146:385;;;;:::o;27537:554::-;27632:6;27681:2;27669:9;27660:7;27656:23;27652:32;27649:119;;;27687:79;;:::i;:::-;27649:119;27828:1;27817:9;27813:17;27807:24;27858:18;27850:6;27847:30;27844:117;;;27880:79;;:::i;:::-;27844:117;27985:89;28066:7;28057:6;28046:9;28042:22;27985:89;:::i;:::-;27975:99;;27778:306;27537:554;;;;:::o;28097:223::-;28237:34;28233:1;28225:6;28221:14;28214:58;28306:6;28301:2;28293:6;28289:15;28282:31;28097:223;:::o;28326:366::-;28468:3;28489:67;28553:2;28548:3;28489:67;:::i;:::-;28482:74;;28565:93;28654:3;28565:93;:::i;:::-;28683:2;28678:3;28674:12;28667:19;;28326:366;;;:::o;28698:419::-;28864:4;28902:2;28891:9;28887:18;28879:26;;28951:9;28945:4;28941:20;28937:1;28926:9;28922:17;28915:47;28979:131;29105:4;28979:131;:::i;:::-;28971:139;;28698:419;;;:::o;29123:221::-;29263:34;29259:1;29251:6;29247:14;29240:58;29332:4;29327:2;29319:6;29315:15;29308:29;29123:221;:::o;29350:366::-;29492:3;29513:67;29577:2;29572:3;29513:67;:::i;:::-;29506:74;;29589:93;29678:3;29589:93;:::i;:::-;29707:2;29702:3;29698:12;29691:19;;29350:366;;;:::o;29722:419::-;29888:4;29926:2;29915:9;29911:18;29903:26;;29975:9;29969:4;29965:20;29961:1;29950:9;29946:17;29939:47;30003:131;30129:4;30003:131;:::i;:::-;29995:139;;29722:419;;;:::o;30147:224::-;30287:34;30283:1;30275:6;30271:14;30264:58;30356:7;30351:2;30343:6;30339:15;30332:32;30147:224;:::o;30377:366::-;30519:3;30540:67;30604:2;30599:3;30540:67;:::i;:::-;30533:74;;30616:93;30705:3;30616:93;:::i;:::-;30734:2;30729:3;30725:12;30718:19;;30377:366;;;:::o;30749:419::-;30915:4;30953:2;30942:9;30938:18;30930:26;;31002:9;30996:4;30992:20;30988:1;30977:9;30973:17;30966:47;31030:131;31156:4;31030:131;:::i;:::-;31022:139;;30749:419;;;:::o;31174:222::-;31314:34;31310:1;31302:6;31298:14;31291:58;31383:5;31378:2;31370:6;31366:15;31359:30;31174:222;:::o;31402:366::-;31544:3;31565:67;31629:2;31624:3;31565:67;:::i;:::-;31558:74;;31641:93;31730:3;31641:93;:::i;:::-;31759:2;31754:3;31750:12;31743:19;;31402:366;;;:::o;31774:419::-;31940:4;31978:2;31967:9;31963:18;31955:26;;32027:9;32021:4;32017:20;32013:1;32002:9;31998:17;31991:47;32055:131;32181:4;32055:131;:::i;:::-;32047:139;;31774:419;;;:::o;32199:228::-;32339:34;32335:1;32327:6;32323:14;32316:58;32408:11;32403:2;32395:6;32391:15;32384:36;32199:228;:::o;32433:366::-;32575:3;32596:67;32660:2;32655:3;32596:67;:::i;:::-;32589:74;;32672:93;32761:3;32672:93;:::i;:::-;32790:2;32785:3;32781:12;32774:19;;32433:366;;;:::o;32805:419::-;32971:4;33009:2;32998:9;32994:18;32986:26;;33058:9;33052:4;33048:20;33044:1;33033:9;33029:17;33022:47;33086:131;33212:4;33086:131;:::i;:::-;33078:139;;32805:419;;;:::o;33230:234::-;33370:34;33366:1;33358:6;33354:14;33347:58;33439:17;33434:2;33426:6;33422:15;33415:42;33230:234;:::o;33470:366::-;33612:3;33633:67;33697:2;33692:3;33633:67;:::i;:::-;33626:74;;33709:93;33798:3;33709:93;:::i;:::-;33827:2;33822:3;33818:12;33811:19;;33470:366;;;:::o;33842:419::-;34008:4;34046:2;34035:9;34031:18;34023:26;;34095:9;34089:4;34085:20;34081:1;34070:9;34066:17;34059:47;34123:131;34249:4;34123:131;:::i;:::-;34115:139;;33842:419;;;:::o;34267:224::-;34407:34;34403:1;34395:6;34391:14;34384:58;34476:7;34471:2;34463:6;34459:15;34452:32;34267:224;:::o;34497:366::-;34639:3;34660:67;34724:2;34719:3;34660:67;:::i;:::-;34653:74;;34736:93;34825:3;34736:93;:::i;:::-;34854:2;34849:3;34845:12;34838:19;;34497:366;;;:::o;34869:419::-;35035:4;35073:2;35062:9;35058:18;35050:26;;35122:9;35116:4;35112:20;35108:1;35097:9;35093:17;35086:47;35150:131;35276:4;35150:131;:::i;:::-;35142:139;;34869:419;;;:::o;35294:191::-;35334:4;35354:20;35372:1;35354:20;:::i;:::-;35349:25;;35388:20;35406:1;35388:20;:::i;:::-;35383:25;;35427:1;35424;35421:8;35418:34;;;35432:18;;:::i;:::-;35418:34;35477:1;35474;35470:9;35462:17;;35294:191;;;;:::o;35491:177::-;35631:29;35627:1;35619:6;35615:14;35608:53;35491:177;:::o;35674:366::-;35816:3;35837:67;35901:2;35896:3;35837:67;:::i;:::-;35830:74;;35913:93;36002:3;35913:93;:::i;:::-;36031:2;36026:3;36022:12;36015:19;;35674:366;;;:::o;36046:419::-;36212:4;36250:2;36239:9;36235:18;36227:26;;36299:9;36293:4;36289:20;36285:1;36274:9;36270:17;36263:47;36327:131;36453:4;36327:131;:::i;:::-;36319:139;;36046:419;;;:::o;36471:233::-;36510:3;36533:24;36551:5;36533:24;:::i;:::-;36524:33;;36579:66;36572:5;36569:77;36566:103;;36649:18;;:::i;:::-;36566:103;36696:1;36689:5;36685:13;36678:20;;36471:233;;;:::o;36710:663::-;36798:6;36806;36814;36863:2;36851:9;36842:7;36838:23;36834:32;36831:119;;;36869:79;;:::i;:::-;36831:119;36989:1;37014:64;37070:7;37061:6;37050:9;37046:22;37014:64;:::i;:::-;37004:74;;36960:128;37127:2;37153:64;37209:7;37200:6;37189:9;37185:22;37153:64;:::i;:::-;37143:74;;37098:129;37266:2;37292:64;37348:7;37339:6;37328:9;37324:22;37292:64;:::i;:::-;37282:74;;37237:129;36710:663;;;;;:::o;37379:553::-;37556:4;37594:3;37583:9;37579:19;37571:27;;37608:71;37676:1;37665:9;37661:17;37652:6;37608:71;:::i;:::-;37689:72;37757:2;37746:9;37742:18;37733:6;37689:72;:::i;:::-;37771;37839:2;37828:9;37824:18;37815:6;37771:72;:::i;:::-;37853;37921:2;37910:9;37906:18;37897:6;37853:72;:::i;:::-;37379:553;;;;;;;:::o;37938:180::-;37986:77;37983:1;37976:88;38083:4;38080:1;38073:15;38107:4;38104:1;38097:15;38124:185;38164:1;38181:20;38199:1;38181:20;:::i;:::-;38176:25;;38215:20;38233:1;38215:20;:::i;:::-;38210:25;;38254:1;38244:35;;38259:18;;:::i;:::-;38244:35;38301:1;38298;38294:9;38289:14;;38124:185;;;;:::o;38315:220::-;38455:34;38451:1;38443:6;38439:14;38432:58;38524:3;38519:2;38511:6;38507:15;38500:28;38315:220;:::o;38541:366::-;38683:3;38704:67;38768:2;38763:3;38704:67;:::i;:::-;38697:74;;38780:93;38869:3;38780:93;:::i;:::-;38898:2;38893:3;38889:12;38882:19;;38541:366;;;:::o;38913:419::-;39079:4;39117:2;39106:9;39102:18;39094:26;;39166:9;39160:4;39156:20;39152:1;39141:9;39137:17;39130:47;39194:131;39320:4;39194:131;:::i;:::-;39186:139;;38913:419;;;:::o;39338:85::-;39383:7;39412:5;39401:16;;39338:85;;;:::o;39429:158::-;39487:9;39520:61;39538:42;39547:32;39573:5;39547:32;:::i;:::-;39538:42;:::i;:::-;39520:61;:::i;:::-;39507:74;;39429:158;;;:::o;39593:147::-;39688:45;39727:5;39688:45;:::i;:::-;39683:3;39676:58;39593:147;;:::o;39746:720::-;39981:4;40019:3;40008:9;40004:19;39996:27;;40033:71;40101:1;40090:9;40086:17;40077:6;40033:71;:::i;:::-;40114:80;40190:2;40179:9;40175:18;40166:6;40114:80;:::i;:::-;40241:9;40235:4;40231:20;40226:2;40215:9;40211:18;40204:48;40269:108;40372:4;40363:6;40269:108;:::i;:::-;40261:116;;40387:72;40455:2;40444:9;40440:18;40431:6;40387:72;:::i;:::-;39746:720;;;;;;;:::o

Swarm Source

ipfs://2b0fd53abfda2939361e5448729f352631f108214d222cc71e851175c25da3d5
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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