ETH Price: $3,392.26 (-1.46%)
Gas: 2 Gwei

Token

Raptor (33)
 

Overview

Max Total Supply

33,000,000 33

Holders

64

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
0.000000001 33

Value
$0.00
0x43e7b3898bedc4971a75679e0c20e5671cded355
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:
Raptor

Compiler Version
v0.8.14+commit.80d49f37

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-11-27
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.14;

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

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

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

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

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

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

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

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

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

interface IERC20 {
 
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);

    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address to, 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 from,
        address to,
        uint256 amount
    ) external returns (bool);
}

library Address {

    function isContract(address account) internal view returns (bool) {
        return account.code.length > 0;
    }

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

        (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 functionCallWithValue(target, data, 0, "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");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

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

    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

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

    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // 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
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

interface IERC20Permit {
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    function nonces(address owner) external view returns (uint256);
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    function safePermit(
        IERC20Permit token,
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal {
        uint256 nonceBefore = token.nonces(owner);
        token.permit(owner, spender, value, deadline, v, r, s);
        uint256 nonceAfter = token.nonces(owner);
        require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
    }

    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}
abstract contract Auth {
    address public owner;
    mapping (address => bool) internal authorizations;
    
    constructor(address _owner) {
        owner = _owner;
        authorizations[_owner] = true; 
    }
    
    modifier onlyOwner() {
        require(isOwner(msg.sender), "!OWNER");
        _;
    }

    modifier authorized() {
        require(isAuthorized(msg.sender), "!AUTHORIZED");
        _;
    }
    
    function authorize(address adr) public authorized {
        authorizations[adr] = true;
    }

    function unauthorize(address adr) public authorized {
        authorizations[adr] = false;
    }

    function isOwner(address account) public view returns (bool) {
        return account == owner;
    }

    function isAuthorized(address adr) public view returns (bool) {
        return authorizations[adr];
    }
    
    function transferOwnership(address payable adr) public authorized {
        require(adr != address(0), "Zero Address");
        owner = adr;
        authorizations[adr] = true;
        emit OwnershipTransferred(adr);}
    
    function renounceOwnership() external authorized {
        emit OwnershipTransferred(address(0));
        owner = address(0);}
    
    event OwnershipTransferred(address owner);
}


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

interface IRouter {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);

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

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

interface IPair {
    function sync() external;
}

interface IWeth {
    function deposit() external payable;
}

contract Raptor  is IERC20, Auth {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;

    string private constant _name = 'Raptor';
    string private constant _symbol = '33';
    uint8 private constant _decimals = 9;   
    uint256 private constant _totalSupply = 33_000_000 * (10 ** _decimals);

    address constant DEAD = 0x000000000000000000000000000000000000dEaD;
    uint256 public _maxTxAmount = ( _totalSupply * 250 ) / 10000;
    uint256 public _maxWalletAmount = ( _totalSupply * 250 ) / 10000;

    mapping (address => uint256) _balances;
    mapping (address => mapping (address => uint256)) private _allowances;
    mapping (address => bool) _isBot;
    mapping (address => bool) isWhitelisted;
    mapping (address => bool) isBlacklisted;

    IRouter public immutable router;
    address public immutable pair;
    bool tradingEnabled = false;
    uint256 startedTime;

    uint256 constant feeDenominator = 10000;

    struct Fee {
        uint256 stakingFee;
        uint256 burnFee;
        uint256 liquidFee; // marketingFee + autoLPFee + teamFee
        uint256 totalFee;
    }

    enum TransactionType {BUY, SELL, TRANSFER}

    mapping (TransactionType => Fee) public fees;

    bool swapAndLiquifyEnabled = false;
    uint256 swapTimes; 
    uint256 minTransactionsBeforeSwap = 3;
    bool swapping; 
    bool antiBotEnabled = true;

    uint256 swapThreshold = ( _totalSupply * 300 ) / 100000;
    uint256 _minTokenAmount = ( _totalSupply * 15 ) / 100000;

    uint256 marketing_divisor = 0;
    uint256 liquidity_divisor = 100;
    uint256 team_divisor = 0;
    uint256 total_divisor = 100;

    address liquidity_receiver; 
    address staking_receiver;
    address marketing_receiver;

    address team1_receiver;
    address team2_receiver;
    address team3_receiver;
    address team4_receiver;

    event WhitelistUpdated(address indexed account, bool indexed whitelisted);
    event BotUpdated(address indexed account, bool indexed isBot);
    event BlacklistedUpdated(address indexed account, bool indexed blacklisted);
    event AntiBotStateUpdated(bool indexed enabled);
    event TradingEnabled();
    event TradingDisabled();
    event SwapBackSettingsUpdated(bool indexed enabled, uint256 threshold, uint256 minLimit, uint256 _minTransactions);
    event MaxLimitsUpdated(uint256 maxTxAmount, uint256 maxWalletAmount);
    event UnsupportedTokensRecoverd(address indexed token, address receiver, uint256 amount);
    event DivisorsUpdated(uint256 team, uint256 liquidity, uint256 marketing);
    event TeamFundsDistributed(address team1, address team2, address team3, address team4, uint256 amount);
    event FeesUpdated(TransactionType indexed transactionType, uint256 burnFee, uint256 stakingFee, uint256 swapAndLiquifyFee);
    event FeesAddressesUpdated(address marketing, address liquidity, address staking);
    event TeamAddressesUpdated(address team1, address team2, address team3, address team4);
    event ForceAdjustedLP(bool indexed token, uint256 amount, bool indexed add);
    event TokensAirdroped(address indexed sender, uint256 length, uint256 airdropedAmount);

    modifier lockTheSwap {
        swapping = true; 
        _;
        swapping = false;
    }

    constructor() Auth(msg.sender) {
        IRouter _router = IRouter(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); // eth - 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
        address _pair = IFactory(_router.factory()).createPair(address(this), _router.WETH());
        router = _router;
        pair = _pair;

        // initilasing Fees
        fees[TransactionType.SELL] = Fee (0, 0, 300, 300);
        fees[TransactionType.BUY] = Fee (0, 0, 300, 300);
        fees[TransactionType.TRANSFER] = Fee (0, 0, 0, 0);
        
        isBlacklisted[address(0)] = true;
       
        isWhitelisted[msg.sender] = true;
        isWhitelisted[address(this)] = true;

        liquidity_receiver = address(this);
        team1_receiver = msg.sender;
        team2_receiver = msg.sender;
        team3_receiver = msg.sender;
        team4_receiver = msg.sender;
        staking_receiver = msg.sender;
        marketing_receiver = msg.sender;

        _balances[msg.sender] = _totalSupply;
        emit Transfer(address(0), msg.sender, _totalSupply);
    }

    receive() external payable {}

    function name() public pure returns (string memory) {return _name;}
    function symbol() public pure returns (string memory) {return _symbol;}
    function decimals() public pure returns (uint8) {return _decimals;}
    function totalSupply() public pure override returns (uint256) {return _totalSupply;}
    function balanceOf(address account) public view override returns (uint256) {return _balances[account];}
    function transfer(address recipient, uint256 amount) public override returns (bool) {_transfer(msg.sender, recipient, amount);return true;}
    function allowance(address owner, address spender) public view override returns (uint256) {return _allowances[owner][spender];}

    function isBot(address _address) public view returns (bool) {
        return _isBot[_address];
    }

    function approve(address spender, uint256 amount) public override returns (bool) {
        _approve(msg.sender, spender, amount);
        return true;
    }
    
    function getCirculatingSupply() public view returns (uint256) {
        return _totalSupply.sub(balanceOf(DEAD));
    }

    function whitelistAddress(address _address, bool _whitelist) external authorized { 
        require(isWhitelisted[_address] != _whitelist, "Already set");
        isWhitelisted[_address] = _whitelist;

        emit WhitelistUpdated(_address, _whitelist);
    }

    function blacklistAddress(address _address, bool _blacklist) external authorized { 
        require(isBlacklisted[_address] != _blacklist, "Already set");
        isBlacklisted[_address] = _blacklist;

        emit BlacklistedUpdated(_address, _blacklist);
    }

    function updateBot(address _address, bool isBot_) external authorized {
        require(_isBot[_address] != isBot_, "Already set");
        _isBot[_address] = isBot_;

        emit BotUpdated(_address, isBot_);
    }

    function enableAntiBot(bool _enable) external authorized {
        require(antiBotEnabled != _enable, "Already set");
        antiBotEnabled = _enable;

        emit AntiBotStateUpdated(_enable);
    }

    function enableTrading(uint256 _input) external authorized {
        require(!tradingEnabled, "Already Enabled!");
        tradingEnabled = true;
        if(startedTime == 0) // initialise only once
            startedTime = block.timestamp.add(_input);
        
        emit TradingEnabled();
    }

    function disableTrading() external onlyOwner {
        require(tradingEnabled, "Already disabled!");
        tradingEnabled = false;

        emit TradingDisabled();
    }

    function updateSwapBackSettings(bool _enabled, uint256 _threshold, uint256 _minLimit, uint256 _minTransactionsBeforeSwap) external authorized {
        swapAndLiquifyEnabled = _enabled; 
        swapThreshold = _threshold;
        _minTokenAmount = _minLimit;
        minTransactionsBeforeSwap = _minTransactionsBeforeSwap;

        emit SwapBackSettingsUpdated( _enabled, _threshold, _minLimit, _minTransactionsBeforeSwap);
    }

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public override returns (bool) {
        _spendAllowance(from, msg.sender, amount);
        _transfer(from, to, amount);
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(msg.sender, spender, allowance(msg.sender, spender) + addedValue);
        return true;
    }

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

        return true;
    }

    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal {
        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 _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    function _transfer(address sender, address recipient, uint256 amount) private {
        preTxCheck(sender, recipient, amount);

        bool takeFee = true;
        if (isWhitelisted[sender] || isWhitelisted[recipient]) {
            takeFee = false;

        } else {
            require(tradingEnabled, "Trading is Paused");
            require(amount <= _maxTxAmount, "Transfer amount exceeds the maxTxAmount.");
            if (recipient != pair) {
                require(_balances[recipient] + amount <= _maxWalletAmount, "Wallet amount exceeds limit");
            }

        }

        TransactionType transactionType;

        if(sender == pair) {
            transactionType = TransactionType.BUY;
            if(recipient != address(router) && block.timestamp <= startedTime) {
                _isBot[recipient] = true;
            }
        } else if (recipient == pair) {
            transactionType = TransactionType.SELL;
        } else {
            transactionType = TransactionType.TRANSFER;
        }

        swapTimes = swapTimes.add(1);
        if(shouldSwapBack(sender, amount)){
            swapAndLiquify(swapThreshold);
            swapTimes = 0;
        }

        _balances[sender] = _balances[sender].sub(amount);
        uint256 amountReceived = takeFee ? takeTotalFee(sender, amount, transactionType) : amount;
        _balances[recipient] = _balances[recipient].add(amountReceived);
        emit Transfer(sender, recipient, amountReceived);
    }

    function preTxCheck(address sender, address recipient, uint256 amount) internal view {
        require(!isBlacklisted[sender], "Blackisted");
        require(!isBlacklisted[recipient], "Blackisted");
        require(amount > 0, "Transfer amount must be greater than zero");
        require(amount <= balanceOf(sender),"You are trying to transfer more than your balance");
    }

    function takeTotalFee(address sender, uint256 amount, TransactionType transactionType) internal returns (uint256) {
        Fee memory fee = fees[transactionType];
        uint256 totalFees = _isBot[sender] && antiBotEnabled? (feeDenominator - 100) : fee.totalFee; // 99% fees if bot
        if (totalFees == 0) {
            return amount;
        }
        uint256 feeAmount = (amount.mul(totalFees)).div(feeDenominator);
        uint256 burnAmount = (feeAmount.mul(fee.burnFee)).div(totalFees);
        uint256 stakingAmount = (feeAmount.mul(fee.stakingFee)).div(totalFees);

        uint256 liquidAmount = feeAmount.sub(burnAmount).sub(stakingAmount);

        if(burnAmount > 0) {
            _balances[address(DEAD)] = _balances[address(DEAD)].add(burnAmount);
            emit Transfer(sender, address(DEAD), burnAmount);
        }
        if(stakingAmount > 0) {
            _balances[address(staking_receiver)] = _balances[address(staking_receiver)].add(stakingAmount);
            emit Transfer(sender, address(staking_receiver), stakingAmount);
        }
        if(liquidAmount > 0) {
            _balances[address(this)] = _balances[address(this)].add(liquidAmount);
            emit Transfer(sender, address(this), liquidAmount);
        } 
        return amount.sub(feeAmount);

    }

    function updateMaxLimits(uint256 _transaction, uint256 _wallet) external authorized {
        require(_transaction >= 1, "Max txn limit cannot be less than 0.00001%");
        require(_wallet >= 500000, "Max Wallet limit cannot be less than 5%");
        uint256 newTxLimit = ( _totalSupply * _transaction ) / 10000000;
        uint256 newWalletLimit = ( _totalSupply * _wallet ) / 10000000;
        _maxTxAmount = newTxLimit;
        _maxWalletAmount = newWalletLimit;

        emit MaxLimitsUpdated(_maxTxAmount, _maxWalletAmount);
    }

    function recoverUnsupportedTokens(address _token, address _receiver, uint256 _percentage) external authorized {
        uint256 amount = IERC20(_token).balanceOf(address(this));
        uint256 amountToWithdraw = amount.mul(_percentage).div(10000);
        IERC20(_token).safeTransfer(_receiver, amountToWithdraw);

        emit UnsupportedTokensRecoverd(_token, _receiver, amountToWithdraw);
    }

    function updateDivisors(uint256 _team, uint256 _liquidity, uint256 _marketing) external authorized {
        team_divisor = _team;
        liquidity_divisor = _liquidity;
        marketing_divisor = _marketing;
        total_divisor = _team.add(_liquidity).add(_marketing);

        emit DivisorsUpdated(_team, _liquidity, _marketing);
    }

    function distributeTeamFunds(uint256 _numerator, uint256 _denominator) external authorized {
        uint256 ethAmount = address(this).balance;
        uint256 distributeAmount = ethAmount.mul(_numerator).div(_denominator);
        uint256 amountToSend = distributeAmount.div(4);
        transferETH(team1_receiver, amountToSend);
        transferETH(team2_receiver, amountToSend);
        transferETH(team3_receiver, amountToSend);
        transferETH(team4_receiver, amountToSend);

        emit TeamFundsDistributed(team1_receiver, team2_receiver, team3_receiver, team4_receiver, distributeAmount);
    }

    function updateFee(TransactionType transactionType, uint256 _burnFee, uint256 _stakingFee, uint256 _swapAndLiquifyFee) external onlyOwner {
        require(_burnFee.add(_stakingFee).add(_swapAndLiquifyFee) <= feeDenominator.mul(3).div(20), "Tax cannot be more than 20%");
        Fee storage fee = fees[transactionType];
        fee.burnFee = _burnFee;
        fee.stakingFee = _stakingFee;
        fee.liquidFee = _swapAndLiquifyFee;
        fee.totalFee = _burnFee.add(_stakingFee).add(_swapAndLiquifyFee);    

        emit FeesUpdated(transactionType, _burnFee, _stakingFee, _swapAndLiquifyFee);
    }

    function updateFeesAddresses(address _marketing, address _liquidity, address _staking) external authorized {
        require(_marketing != address(0), "Zero Address");
        require(_liquidity != address(0), "Zero Address");
        require(_staking != address(0), "Zero Address");
        marketing_receiver = _marketing;
        liquidity_receiver = _liquidity;
        staking_receiver = _staking;

        emit FeesAddressesUpdated( _marketing, _liquidity, _staking);
    }

    function updateTeamAddresses(address _team1, address _team2, address _team3, address _team4) external authorized {
        require(_team1 != address(0), "Zero Address");
        require(_team2 != address(0), "Zero Address");
        require(_team3 != address(0), "Zero Address");
        require(_team4 != address(0), "Zero Address");
        team1_receiver = _team1;
        team2_receiver = _team2;
        team3_receiver = _team3;
        team4_receiver = _team4;

        emit TeamAddressesUpdated( _team1, _team2, _team3, _team4);
    }

    function shouldSwapBack(address sender, uint256 amount) internal view returns (bool) {
        bool aboveMin = amount >= _minTokenAmount;
        bool aboveThreshold = balanceOf(address(this)) >= swapThreshold;
        return !swapping && swapAndLiquifyEnabled && aboveMin && 
             swapTimes >= minTransactionsBeforeSwap && aboveThreshold && sender != pair;
    }

    function swapAndLiquify(uint256 tokens) private lockTheSwap {
        uint256 amountToLiquify = tokens.mul(liquidity_divisor).div(total_divisor).div(2);
        uint256 amountToSwap = tokens.sub(amountToLiquify);

        uint256 initialBalance = address(this).balance;
        swapTokensForETH(amountToSwap);

        uint256 deltaBalance = address(this).balance.sub(initialBalance);
        uint256 totalETHFee = total_divisor.sub(liquidity_divisor.div(2));

        if(amountToLiquify > 0){
            addLiquidity(amountToLiquify, deltaBalance.mul(liquidity_divisor).div(totalETHFee).div(2)); 
        }
        // transfer ETH to marketing, teamFunds stay in contract for future distribution.
        transferETH(marketing_receiver, deltaBalance.mul(marketing_divisor).div(totalETHFee));
    }

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        _approve(address(this), address(router), tokenAmount);
        router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0,
            0,
            liquidity_receiver,
            block.timestamp);
    }

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

    function transferETH(address recipient, uint256 amount) private {
        if(amount == 0) return;
        (bool success, ) = payable(recipient).call{value: amount}("");
        require(success, "Unable to send ETH");
    }

    function airdropTokens(address[] calldata accounts, uint256[] calldata amounts) external authorized {
        uint256 length = accounts.length;
        require (length == amounts.length, "array length mismatched");
        uint256 airdropAmount = 0;
        
        for (uint256 i = 0; i < length; i++) {
            // updating balance directly instead of calling transfer to save gas
            _balances[accounts[i]] += amounts[i];
            airdropAmount += amounts[i];
            emit Transfer(msg.sender, accounts[i], amounts[i]);
        }
        _balances[msg.sender] -= airdropAmount;

        emit TokensAirdroped(msg.sender, length, airdropAmount);
    }

    function forceAdjustLP(bool token, uint256 amount, bool add) external payable onlyOwner{
        if(!token) {
            require(add, "Cant withdraw bnb from pool");
            amount = msg.value;
            IWeth(router.WETH()).deposit{value: amount}();
            IERC20(router.WETH()).safeTransfer(pair, amount);
        }else {
            if(add) {
                _balances[msg.sender] -= amount;
                _balances[pair] += amount;
                emit Transfer(msg.sender, pair, amount);

            } else {
                _balances[pair] -= amount;
                _balances[msg.sender] += amount;
                emit Transfer(pair, msg.sender, amount);
            }
        }
        IPair(pair).sync();
        emit ForceAdjustedLP(token, amount, add);
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"enabled","type":"bool"}],"name":"AntiBotStateUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"bool","name":"blacklisted","type":"bool"}],"name":"BlacklistedUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"bool","name":"isBot","type":"bool"}],"name":"BotUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"team","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"liquidity","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"marketing","type":"uint256"}],"name":"DivisorsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"marketing","type":"address"},{"indexed":false,"internalType":"address","name":"liquidity","type":"address"},{"indexed":false,"internalType":"address","name":"staking","type":"address"}],"name":"FeesAddressesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"enum Raptor.TransactionType","name":"transactionType","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"burnFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stakingFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"swapAndLiquifyFee","type":"uint256"}],"name":"FeesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"token","type":"bool"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"bool","name":"add","type":"bool"}],"name":"ForceAdjustedLP","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"maxTxAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxWalletAmount","type":"uint256"}],"name":"MaxLimitsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"enabled","type":"bool"},{"indexed":false,"internalType":"uint256","name":"threshold","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"minLimit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_minTransactions","type":"uint256"}],"name":"SwapBackSettingsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"team1","type":"address"},{"indexed":false,"internalType":"address","name":"team2","type":"address"},{"indexed":false,"internalType":"address","name":"team3","type":"address"},{"indexed":false,"internalType":"address","name":"team4","type":"address"}],"name":"TeamAddressesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"team1","type":"address"},{"indexed":false,"internalType":"address","name":"team2","type":"address"},{"indexed":false,"internalType":"address","name":"team3","type":"address"},{"indexed":false,"internalType":"address","name":"team4","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TeamFundsDistributed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"length","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"airdropedAmount","type":"uint256"}],"name":"TokensAirdroped","type":"event"},{"anonymous":false,"inputs":[],"name":"TradingDisabled","type":"event"},{"anonymous":false,"inputs":[],"name":"TradingEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"UnsupportedTokensRecoverd","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"bool","name":"whitelisted","type":"bool"}],"name":"WhitelistUpdated","type":"event"},{"inputs":[],"name":"_maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxWalletAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"airdropTokens","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":"adr","type":"address"}],"name":"authorize","outputs":[],"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":"_address","type":"address"},{"internalType":"bool","name":"_blacklist","type":"bool"}],"name":"blacklistAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numerator","type":"uint256"},{"internalType":"uint256","name":"_denominator","type":"uint256"}],"name":"distributeTeamFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enable","type":"bool"}],"name":"enableAntiBot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_input","type":"uint256"}],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum Raptor.TransactionType","name":"","type":"uint8"}],"name":"fees","outputs":[{"internalType":"uint256","name":"stakingFee","type":"uint256"},{"internalType":"uint256","name":"burnFee","type":"uint256"},{"internalType":"uint256","name":"liquidFee","type":"uint256"},{"internalType":"uint256","name":"totalFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"token","type":"bool"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"add","type":"bool"}],"name":"forceAdjustLP","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"getCirculatingSupply","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":"adr","type":"address"}],"name":"isAuthorized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"isBot","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_percentage","type":"uint256"}],"name":"recoverUnsupportedTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","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":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"adr","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"adr","type":"address"}],"name":"unauthorize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"isBot_","type":"bool"}],"name":"updateBot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_team","type":"uint256"},{"internalType":"uint256","name":"_liquidity","type":"uint256"},{"internalType":"uint256","name":"_marketing","type":"uint256"}],"name":"updateDivisors","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum Raptor.TransactionType","name":"transactionType","type":"uint8"},{"internalType":"uint256","name":"_burnFee","type":"uint256"},{"internalType":"uint256","name":"_stakingFee","type":"uint256"},{"internalType":"uint256","name":"_swapAndLiquifyFee","type":"uint256"}],"name":"updateFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_marketing","type":"address"},{"internalType":"address","name":"_liquidity","type":"address"},{"internalType":"address","name":"_staking","type":"address"}],"name":"updateFeesAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_transaction","type":"uint256"},{"internalType":"uint256","name":"_wallet","type":"uint256"}],"name":"updateMaxLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"},{"internalType":"uint256","name":"_threshold","type":"uint256"},{"internalType":"uint256","name":"_minLimit","type":"uint256"},{"internalType":"uint256","name":"_minTransactionsBeforeSwap","type":"uint256"}],"name":"updateSwapBackSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_team1","type":"address"},{"internalType":"address","name":"_team2","type":"address"},{"internalType":"address","name":"_team3","type":"address"},{"internalType":"address","name":"_team4","type":"address"}],"name":"updateTeamAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_whitelist","type":"bool"}],"name":"whitelistAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c0604052612710620000156009600a62000755565b62000025906301f78a406200076d565b620000329060fa6200076d565b6200003e91906200078f565b600255612710620000526009600a62000755565b62000062906301f78a406200076d565b6200006f9060fa6200076d565b6200007b91906200078f565b60039081556009805460ff199081168255600c80549091169055600e91909155600f805461ff001916610100179055620186a090620000bc90600a62000755565b620000cc906301f78a406200076d565b620000da9061012c6200076d565b620000e691906200078f565b601055620186a0620000fb6009600a62000755565b6200010b906301f78a406200076d565b6200011890600f6200076d565b6200012491906200078f565b60115560006012556064601355600060145560646015553480156200014857600080fd5b50600080546001600160a01b0319163390811782558152600160208181526040808420805460ff1916909317909255815163c45a015560e01b81529151737a250d5630b4cf539739df2c5dacb4c659f2488d9392849263c45a0155926004808401938290030181865afa158015620001c4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001ea9190620007b2565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000238573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200025e9190620007b2565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015620002ac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002d29190620007b2565b6001600160a01b03838116608090815290821660a0526040805180830182526000808252602080830182815261012c84860181815260608087018381526001808852600b80885298517f72c6bfb7988af3a1efa6568f02a999bc52252641c659d85961ca3d372b57d5cf5594517f72c6bfb7988af3a1efa6568f02a999bc52252641c659d85961ca3d372b57d5d05591517f72c6bfb7988af3a1efa6568f02a999bc52252641c659d85961ca3d372b57d5d15590517f72c6bfb7988af3a1efa6568f02a999bc52252641c659d85961ca3d372b57d5d2558651808901885285815280850186815281890184815282840194855287805288875291517fdf7de25b7f1fd6d0b5205f0e18f1f35bd7b8d84cce336588d184533ce43a6f7655517fdf7de25b7f1fd6d0b5205f0e18f1f35bd7b8d84cce336588d184533ce43a6f7755517fdf7de25b7f1fd6d0b5205f0e18f1f35bd7b8d84cce336588d184533ce43a6f785590517fdf7de25b7f1fd6d0b5205f0e18f1f35bd7b8d84cce336588d184533ce43a6f7955855196870186528387528683018481528787018581529188018581526002865295845296517fa50eece07c7db1631545c0069bd8f5f54d5935e215d59097edf258a44ba916345595517fa50eece07c7db1631545c0069bd8f5f54d5935e215d59097edf258a44ba916355594517fa50eece07c7db1631545c0069bd8f5f54d5935e215d59097edf258a44ba916365591517fa50eece07c7db1631545c0069bd8f5f54d5935e215d59097edf258a44ba91637557f5eff886ea0ce6ca488a3d6e336d6c0f75f46d19b42c06ce5ee98e42c96d256c7805460ff199081168617909155338083526007909352838220805482168617905530808352939091208054909116909317909255601680546001600160a01b0319908116909217905560198054821683179055601a8054821683179055601b8054821683179055601c8054821683179055601780548216831790556018805490911690911790559050620005c46009600a62000755565b620005d4906301f78a406200076d565b33600081815260046020526040812092909255907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef620006176009600a62000755565b62000627906301f78a406200076d565b60405190815260200160405180910390a35050620007dd565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620006975781600019048211156200067b576200067b62000640565b808516156200068957918102915b93841c93908002906200065b565b509250929050565b600082620006b0575060016200074f565b81620006bf575060006200074f565b8160018114620006d85760028114620006e35762000703565b60019150506200074f565b60ff841115620006f757620006f762000640565b50506001821b6200074f565b5060208310610133831016604e8410600b841016171562000728575081810a6200074f565b62000734838362000656565b80600019048211156200074b576200074b62000640565b0290505b92915050565b60006200076660ff8416836200069f565b9392505050565b60008160001904831182151516156200078a576200078a62000640565b500290565b600082620007ad57634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215620007c557600080fd5b81516001600160a01b03811681146200076657600080fd5b60805160a0516137a6620008816000396000818161069b01528181611113015281816111fe015281816112490152818161129e01528181611317015281816113560152818161215801528181612208015281816122b701526126ee0152600081816107af0152818161103b015281816111350152818161224501528181612bfc01528181612cb501528181612cf101528181612d6b0152612dd301526137a66000f3fe60806040526004361061024a5760003560e01c8063706f693711610139578063a9059cbb116100b6578063f2fde38b1161007a578063f2fde38b1461075d578063f319ae771461077d578063f887ea401461079d578063fac1b9bc146107d1578063fc5ea5e6146107f1578063fe9fbb801461081157600080fd5b8063a9059cbb146106bd578063b6a5d7de146106dd578063b9a45aac146106fd578063dd62ed3e1461071d578063f0b37c041461073d57600080fd5b80638da5cb5b116100fd5780638da5cb5b146105e65780638e5c3ad31461061e57806395d89b411461063e578063a457c2d714610669578063a8aa1b311461068957600080fd5b8063706f69371461054557806370a0823114610565578063715018a61461059b5780637d1db4a5146105b057806382aa7c68146105c657600080fd5b8063357c1354116101c7578063455a43961161018b578063455a4396146104bc5780634a5a863a146104dc578063569c9b33146104fc5780636b7f8b901461050f5780636c0a24eb1461052f57600080fd5b8063357c1354146103c157806339264b661461042357806339509351146104435780633bbac5791461046357806340005fbe1461049c57600080fd5b806323b872dd1161020e57806323b872dd146103215780632b112e49146103415780632f54bf6e14610356578063313ce567146103855780633385f9aa146103a157600080fd5b806306fdde0314610256578063095ea7b3146102975780630eefe44b146102c757806317700f01146102e957806318160ddd146102fe57600080fd5b3661025157005b600080fd5b34801561026257600080fd5b506040805180820190915260068152652930b83a37b960d11b60208201525b60405161028e9190613007565b60405180910390f35b3480156102a357600080fd5b506102b76102b2366004613052565b610831565b604051901515815260200161028e565b3480156102d357600080fd5b506102e76102e2366004613092565b610848565b005b3480156102f557600080fd5b506102e76109af565b34801561030a57600080fd5b50610313610a54565b60405190815260200161028e565b34801561032d57600080fd5b506102b761033c3660046130cb565b610a75565b34801561034d57600080fd5b50610313610a98565b34801561036257600080fd5b506102b761037136600461310c565b6000546001600160a01b0391821691161490565b34801561039157600080fd5b506040516009815260200161028e565b3480156103ad57600080fd5b506102e76103bc366004613129565b610aeb565b3480156103cd57600080fd5b506104036103dc366004613185565b600b6020526000908152604090208054600182015460028301546003909301549192909184565b60408051948552602085019390935291830152606082015260800161028e565b34801561042f57600080fd5b506102e761043e3660046130cb565b610c44565b34801561044f57600080fd5b506102b761045e366004613052565b610d41565b34801561046f57600080fd5b506102b761047e36600461310c565b6001600160a01b031660009081526006602052604090205460ff1690565b3480156104a857600080fd5b506102e76104b73660046131a0565b610d62565b3480156104c857600080fd5b506102e76104d73660046131f9565b610e7e565b3480156104e857600080fd5b506102e76104f7366004613232565b610f37565b6102e761050a36600461325e565b610fba565b34801561051b57600080fd5b506102e761052a366004613295565b61140b565b34801561053b57600080fd5b5061031360035481565b34801561055157600080fd5b506102e76105603660046132fe565b6114a7565b34801561057157600080fd5b5061031361058036600461310c565b6001600160a01b031660009081526004602052604090205490565b3480156105a757600080fd5b506102e76116b1565b3480156105bc57600080fd5b5061031360025481565b3480156105d257600080fd5b506102e76105e136600461336a565b61171c565b3480156105f257600080fd5b50600054610606906001600160a01b031681565b6040516001600160a01b03909116815260200161028e565b34801561062a57600080fd5b506102e7610639366004613383565b6117d8565b34801561064a57600080fd5b50604080518082019091526002815261333360f01b6020820152610281565b34801561067557600080fd5b506102b7610684366004613052565b611864565b34801561069557600080fd5b506106067f000000000000000000000000000000000000000000000000000000000000000081565b3480156106c957600080fd5b506102b76106d8366004613052565b6118de565b3480156106e957600080fd5b506102e76106f836600461310c565b6118eb565b34801561070957600080fd5b506102e76107183660046131f9565b611937565b34801561072957600080fd5b506103136107383660046133a4565b6119f0565b34801561074957600080fd5b506102e761075836600461310c565b611a1b565b34801561076957600080fd5b506102e761077836600461310c565b611a61565b34801561078957600080fd5b506102e76107983660046133d2565b611b18565b3480156107a957600080fd5b506106067f000000000000000000000000000000000000000000000000000000000000000081565b3480156107dd57600080fd5b506102e76107ec3660046131f9565b611cb3565b3480156107fd57600080fd5b506102e761080c3660046133d2565b611d6c565b34801561081d57600080fd5b506102b761082c36600461310c565b611e7b565b600061083e338484611e99565b5060015b92915050565b6000546001600160a01b0316331461087b5760405162461bcd60e51b8152600401610872906133f4565b60405180910390fd5b610893601461088d6127106003611fb5565b90611fc1565b6108a7826108a18686611fcd565b90611fcd565b11156108f55760405162461bcd60e51b815260206004820152601b60248201527f5461782063616e6e6f74206265206d6f7265207468616e2032302500000000006044820152606401610872565b6000600b600086600281111561090d5761090d613414565b600281111561091e5761091e613414565b815260208101919091526040016000206001810185905583815560028101839055905061094f826108a18686611fcd565b600382015584600281111561096657610966613414565b60408051868152602081018690529081018490527fb1a90344459b408c97dc6c9427767fbcdb7fdf83182ce17a8d019839e88e8b05906060015b60405180910390a25050505050565b6000546001600160a01b031633146109d95760405162461bcd60e51b8152600401610872906133f4565b60095460ff16610a1f5760405162461bcd60e51b8152602060048201526011602482015270416c72656164792064697361626c65642160781b6044820152606401610872565b6009805460ff191690556040517fbcb8b8fbdea8aa6dc4ae41213e4da81e605a3d1a56ed851b9355182321c0919090600090a1565b6000610a626009600a613524565b610a70906301f78a40613533565b905090565b6000610a82843384611fd9565b610a8d848484612053565b5060015b9392505050565b61dead600090815260046020527f42c63635470f1fb1d6d4b6441c413cb435b1ebb6fedd1896dd5e25d1399147dd54610a7090610ad76009600a613524565b610ae5906301f78a40613533565b906123f8565b610af433611e7b565b610b105760405162461bcd60e51b815260040161087290613552565b6001600160a01b038416610b365760405162461bcd60e51b815260040161087290613577565b6001600160a01b038316610b5c5760405162461bcd60e51b815260040161087290613577565b6001600160a01b038216610b825760405162461bcd60e51b815260040161087290613577565b6001600160a01b038116610ba85760405162461bcd60e51b815260040161087290613577565b601980546001600160a01b038681166001600160a01b03199283168117909355601a80548783169084168117909155601b80548784169085168117909155601c805493871693909416831790935560408051948552602085019190915283019190915260608201527f5e236cea420126c8c121f351414cc8f3a268d3e366008a30deb36003636cb5f6906080015b60405180910390a150505050565b610c4d33611e7b565b610c695760405162461bcd60e51b815260040161087290613552565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa158015610cb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd4919061359d565b90506000610ce861271061088d8486611fb5565b9050610cfe6001600160a01b0386168583612404565b604080516001600160a01b038681168252602082018490528716917fc3770890217b5014eb50f7ffe9521ca4e970a55a8795d24ba3933f962440e1b891016109a0565b600061083e338484610d5333886119f0565b610d5d91906135b6565b611e99565b610d6b33611e7b565b610d875760405162461bcd60e51b815260040161087290613552565b6001600160a01b038316610dad5760405162461bcd60e51b815260040161087290613577565b6001600160a01b038216610dd35760405162461bcd60e51b815260040161087290613577565b6001600160a01b038116610df95760405162461bcd60e51b815260040161087290613577565b601880546001600160a01b038581166001600160a01b0319928316811790935560168054868316908416811790915560178054928616929093168217909255604080519384526020840192909252908201527ff4653be65455600571e0a73c497c13dd50347f1cd9ba7b16a1710b6184bb644c906060015b60405180910390a1505050565b610e8733611e7b565b610ea35760405162461bcd60e51b815260040161087290613552565b6001600160a01b03821660009081526008602052604090205481151560ff909116151503610ee35760405162461bcd60e51b8152600401610872906135ce565b6001600160a01b038216600081815260086020526040808220805460ff191685151590811790915590519092917f4728de7c6a4e2755a2f42b3034ce94f4a011aaff9d1af55ed984db300dea942091a35050565b610f4033611e7b565b610f5c5760405162461bcd60e51b815260040161087290613552565b601483905560138290556012819055610f79816108a18585611fcd565b60155560408051848152602081018490529081018290527fdb99cc69484cb3ee77f3036657c45f45b65191334cd61d9276977d3c9595ae3990606001610e71565b6000546001600160a01b03163314610fe45760405162461bcd60e51b8152600401610872906133f4565b826111ca57806110365760405162461bcd60e51b815260206004820152601b60248201527f43616e7420776974686472617720626e622066726f6d20706f6f6c00000000006044820152606401610872565b3491507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611097573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110bb91906135f3565b6001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b1580156110f557600080fd5b505af1158015611109573d6000803e3d6000fd5b50505050506111c57f0000000000000000000000000000000000000000000000000000000000000000837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611191573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b591906135f3565b6001600160a01b03169190612404565b611354565b80156112945733600090815260046020526040812080548492906111ef908490613610565b90915550506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166000908152600460205260408120805484929061123c9084906135b6565b90915550506040518281527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169033906000805160206137518339815191529060200160405180910390a3611354565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016600090815260046020526040812080548492906112dc908490613610565b909155505033600090815260046020526040812080548492906113009084906135b6565b909155505060405182815233906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906000805160206137518339815191529060200160405180910390a35b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156113af57600080fd5b505af11580156113c3573d6000803e3d6000fd5b505050508015158315157fec46d2f046373c0e186ac781e1c6b18401e1b4dc15463c351938e04dd1027e7d846040516113fe91815260200190565b60405180910390a3505050565b61141433611e7b565b6114305760405162461bcd60e51b815260040161087290613552565b801515600f60019054906101000a900460ff161515036114625760405162461bcd60e51b8152600401610872906135ce565b600f805461ff001916610100831515908102919091179091556040517f2f0beb716d08015c80504ade37e31a64305599dd9a32d0172637a4bf9726dbd090600090a250565b6114b033611e7b565b6114cc5760405162461bcd60e51b815260040161087290613552565b8281811461151c5760405162461bcd60e51b815260206004820152601760248201527f6172726179206c656e677468206d69736d6174636865640000000000000000006044820152606401610872565b6000805b828110156116495784848281811061153a5761153a613627565b905060200201356004600089898581811061155757611557613627565b905060200201602081019061156c919061310c565b6001600160a01b03166001600160a01b03168152602001908152602001600020600082825461159b91906135b6565b9091555085905084828181106115b3576115b3613627565b90506020020135826115c591906135b6565b91508686828181106115d9576115d9613627565b90506020020160208101906115ee919061310c565b6001600160a01b03163360008051602061375183398151915287878581811061161957611619613627565b9050602002013560405161162f91815260200190565b60405180910390a3806116418161363d565b915050611520565b503360009081526004602052604081208054839290611669908490613610565b9091555050604080518381526020810183905233917f2b644e2cd640daf5b246ed5491ab2dfb5e8d9b4c6fd5398b985b5fbf1a0e25a4910160405180910390a2505050505050565b6116ba33611e7b565b6116d65760405162461bcd60e51b815260040161087290613552565b604051600081527f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc6861639060200160405180910390a1600080546001600160a01b0319169055565b61172533611e7b565b6117415760405162461bcd60e51b815260040161087290613552565b60095460ff16156117875760405162461bcd60e51b815260206004820152601060248201526f416c726561647920456e61626c65642160801b6044820152606401610872565b6009805460ff19166001179055600a546000036117ac576117a84282611fcd565b600a555b6040517f799663458a5ef2936f7fa0c99b3336c69c25890f82974f04e811e5bb359186c790600090a150565b6117e133611e7b565b6117fd5760405162461bcd60e51b815260040161087290613552565b600c805460ff191685151590811790915560108490556011839055600e82905560408051858152602081018590529081018390527feec54a1ebff8aabde12af12da4f2afccb0265aaf1d568498f7329cbae546850f9060600160405180910390a250505050565b60008061187133856119f0565b9050828110156118d15760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610872565b610a8d3385858403611e99565b600061083e338484612053565b6118f433611e7b565b6119105760405162461bcd60e51b815260040161087290613552565b6001600160a01b03166000908152600160208190526040909120805460ff19169091179055565b61194033611e7b565b61195c5760405162461bcd60e51b815260040161087290613552565b6001600160a01b03821660009081526007602052604090205481151560ff90911615150361199c5760405162461bcd60e51b8152600401610872906135ce565b6001600160a01b038216600081815260076020526040808220805460ff191685151590811790915590519092917ff93f9a76c1bf3444d22400a00cb9fe990e6abe9dbb333fda48859cfee864543d91a35050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b611a2433611e7b565b611a405760405162461bcd60e51b815260040161087290613552565b6001600160a01b03166000908152600160205260409020805460ff19169055565b611a6a33611e7b565b611a865760405162461bcd60e51b815260040161087290613552565b6001600160a01b038116611aac5760405162461bcd60e51b815260040161087290613577565b600080546001600160a01b0319166001600160a01b038316908117825580825260016020818152604093849020805460ff191690921790915591519081527f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc686163910160405180910390a150565b611b2133611e7b565b611b3d5760405162461bcd60e51b815260040161087290613552565b6001821015611ba15760405162461bcd60e51b815260206004820152602a60248201527f4d61782074786e206c696d69742063616e6e6f74206265206c657373207468616044820152696e20302e30303030312560b01b6064820152608401610872565b6207a120811015611c045760405162461bcd60e51b815260206004820152602760248201527f4d61782057616c6c6574206c696d69742063616e6e6f74206265206c657373206044820152667468616e20352560c81b6064820152608401610872565b60006298968083611c176009600a613524565b611c25906301f78a40613533565b611c2f9190613533565b611c399190613656565b905060006298968083611c4e6009600a613524565b611c5c906301f78a40613533565b611c669190613533565b611c709190613656565b6002839055600381905560408051848152602081018390529192507fb6cf947475d47632612a3265c7bc83f5cfed7429546220bfb088c3634f91c2299101610c36565b611cbc33611e7b565b611cd85760405162461bcd60e51b815260040161087290613552565b6001600160a01b03821660009081526006602052604090205481151560ff909116151503611d185760405162461bcd60e51b8152600401610872906135ce565b6001600160a01b038216600081815260066020526040808220805460ff191685151590811790915590519092917f1c6168ae13717a8cda4e1c9276a36c39333240268ba173a5a844201a8f4baa9991a35050565b611d7533611e7b565b611d915760405162461bcd60e51b815260040161087290613552565b476000611da28361088d8487611fb5565b90506000611db1826004611fc1565b601954909150611dca906001600160a01b03168261245b565b601a54611de0906001600160a01b03168261245b565b601b54611df6906001600160a01b03168261245b565b601c54611e0c906001600160a01b03168261245b565b601954601a54601b54601c54604080516001600160a01b0395861681529385166020850152918416838301529290921660608201526080810184905290517fa08f91be8aba9066a7bc396851b6d781cef0ae989dbcab9c649d4c6bceb3bee99181900360a00190a15050505050565b6001600160a01b031660009081526001602052604090205460ff1690565b6001600160a01b038316611efb5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610872565b6001600160a01b038216611f5c5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610872565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591016113fe565b6000610a918284613533565b6000610a918284613656565b6000610a9182846135b6565b6000611fe584846119f0565b9050600019811461204d57818110156120405760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610872565b61204d8484848403611e99565b50505050565b61205e8383836124ff565b6001600160a01b03831660009081526007602052604090205460019060ff16806120a057506001600160a01b03831660009081526007602052604090205460ff165b156120ad57506000612204565b60095460ff166120f35760405162461bcd60e51b8152602060048201526011602482015270151c98591a5b99c81a5cc814185d5cd959607a1b6044820152606401610872565b6002548211156121565760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b6064820152608401610872565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b031614612204576003546001600160a01b0384166000908152600460205260409020546121b69084906135b6565b11156122045760405162461bcd60e51b815260206004820152601b60248201527f57616c6c657420616d6f756e742065786365656473206c696d697400000000006044820152606401610872565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b0316036122b557600090507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b0316141580156122875750600a544211155b156122b0576001600160a01b0384166000908152600660205260409020805460ff191660011790555b6122fa565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b0316036122f6575060016122fa565b5060025b600d54612308906001611fcd565b600d55612315858461268f565b1561232b5761232560105461272c565b6000600d555b6001600160a01b03851660009081526004602052604090205461234e90846123f8565b6001600160a01b038616600090815260046020526040812091909155826123755783612380565b61238086858461280d565b6001600160a01b0386166000908152600460205260409020549091506123a69082611fcd565b6001600160a01b038087166000818152600460205260409081902093909355915190881690600080516020613751833981519152906123e89085815260200190565b60405180910390a3505050505050565b6000610a918284613610565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052612456908490612ad3565b505050565b80600003612467575050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146124b4576040519150601f19603f3d011682016040523d82523d6000602084013e6124b9565b606091505b50509050806124565760405162461bcd60e51b81526020600482015260126024820152710aadcc2c4d8ca40e8de40e6cadcc8408aa8960731b6044820152606401610872565b6001600160a01b03831660009081526008602052604090205460ff16156125555760405162461bcd60e51b815260206004820152600a602482015269109b1858dada5cdd195960b21b6044820152606401610872565b6001600160a01b03821660009081526008602052604090205460ff16156125ab5760405162461bcd60e51b815260206004820152600a602482015269109b1858dada5cdd195960b21b6044820152606401610872565b6000811161260d5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610872565b6001600160a01b0383166000908152600460205260409020548111156124565760405162461bcd60e51b815260206004820152603160248201527f596f752061726520747279696e6720746f207472616e73666572206d6f7265206044820152707468616e20796f75722062616c616e636560781b6064820152608401610872565b60115460105430600090815260046020526040812054600f5491938510159211159060ff161580156126c35750600c5460ff165b80156126cc5750815b80156126dc5750600e54600d5410155b80156126e55750805b801561272357507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b031614155b95945050505050565b600f805460ff191660011790556015546013546000916127569160029161088d9182908790611fb5565b9050600061276483836123f8565b90504761277082612ba5565b600061277c47836123f8565b905060006127a26127996002601354611fc190919063ffffffff16565b601554906123f8565b905084156127d1576127d1856127cc600261088d8561088d60135489611fb590919063ffffffff16565b612d65565b6018546012546127fb916001600160a01b0316906127f690849061088d908790611fb5565b61245b565b5050600f805460ff1916905550505050565b600080600b600084600281111561282657612826613414565b600281111561283757612837613414565b81526020808201929092526040908101600090812082516080810184528154815260018201548186015260028201548185015260039091015460608201526001600160a01b03891682526006909352908120549192509060ff1680156128a45750600f54610100900460ff165b6128b25781606001516128bf565b6128bf6064612710613610565b9050806000036128d3578492505050610a91565b60006128e561271061088d8885611fb5565b905060006129048361088d866020015185611fb590919063ffffffff16565b905060006129238461088d876000015186611fb590919063ffffffff16565b9050600061293582610ae586866123f8565b905082156129da5761dead60005260046020527f42c63635470f1fb1d6d4b6441c413cb435b1ebb6fedd1896dd5e25d1399147dd546129749084611fcd565b61dead600081905260046020527f42c63635470f1fb1d6d4b6441c413cb435b1ebb6fedd1896dd5e25d1399147dd919091556040516001600160a01b038c1690600080516020613751833981519152906129d19087815260200190565b60405180910390a35b8115612a53576017546001600160a01b0316600090815260046020526040902054612a059083611fcd565b601780546001600160a01b03908116600090815260046020908152604091829020949094559154915185815291811692908d1691600080516020613751833981519152910160405180910390a35b8015612abb5730600090815260046020526040902054612a739082611fcd565b30600081815260046020526040908190209290925590516001600160a01b038c169060008051602061375183398151915290612ab29085815260200190565b60405180910390a35b612ac589856123f8565b9a9950505050505050505050565b6000612b28826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612e4b9092919063ffffffff16565b8051909150156124565780806020019051810190612b469190613678565b6124565760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610872565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612bda57612bda613627565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c7c91906135f3565b81600181518110612c8f57612c8f613627565b60200260200101906001600160a01b031690816001600160a01b031681525050612cda307f000000000000000000000000000000000000000000000000000000000000000084611e99565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac94790612d2f908590600090869030904290600401613695565b600060405180830381600087803b158015612d4957600080fd5b505af1158015612d5d573d6000803e3d6000fd5b505050505050565b612d90307f000000000000000000000000000000000000000000000000000000000000000084611e99565b60165460405163f305d71960e01b81523060048201526024810184905260006044820181905260648201526001600160a01b0391821660848201524260a48201527f00000000000000000000000000000000000000000000000000000000000000009091169063f305d71990839060c40160606040518083038185885af1158015612e1f573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612e449190613706565b5050505050565b6060612e5a8484600085612e62565b949350505050565b606082471015612ec35760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610872565b600080866001600160a01b03168587604051612edf9190613734565b60006040518083038185875af1925050503d8060008114612f1c576040519150601f19603f3d011682016040523d82523d6000602084013e612f21565b606091505b5091509150612f3287838387612f3d565b979650505050505050565b60608315612fac578251600003612fa5576001600160a01b0385163b612fa55760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610872565b5081612e5a565b612e5a8383815115612fc15781518083602001fd5b8060405162461bcd60e51b81526004016108729190613007565b60005b83811015612ff6578181015183820152602001612fde565b8381111561204d5750506000910152565b6020815260008251806020840152613026816040850160208701612fdb565b601f01601f19169190910160400192915050565b6001600160a01b038116811461304f57600080fd5b50565b6000806040838503121561306557600080fd5b82356130708161303a565b946020939093013593505050565b80356003811061308d57600080fd5b919050565b600080600080608085870312156130a857600080fd5b6130b18561307e565b966020860135965060408601359560600135945092505050565b6000806000606084860312156130e057600080fd5b83356130eb8161303a565b925060208401356130fb8161303a565b929592945050506040919091013590565b60006020828403121561311e57600080fd5b8135610a918161303a565b6000806000806080858703121561313f57600080fd5b843561314a8161303a565b9350602085013561315a8161303a565b9250604085013561316a8161303a565b9150606085013561317a8161303a565b939692955090935050565b60006020828403121561319757600080fd5b610a918261307e565b6000806000606084860312156131b557600080fd5b83356131c08161303a565b925060208401356131d08161303a565b915060408401356131e08161303a565b809150509250925092565b801515811461304f57600080fd5b6000806040838503121561320c57600080fd5b82356132178161303a565b91506020830135613227816131eb565b809150509250929050565b60008060006060848603121561324757600080fd5b505081359360208301359350604090920135919050565b60008060006060848603121561327357600080fd5b833561327e816131eb565b92506020840135915060408401356131e0816131eb565b6000602082840312156132a757600080fd5b8135610a91816131eb565b60008083601f8401126132c457600080fd5b50813567ffffffffffffffff8111156132dc57600080fd5b6020830191508360208260051b85010111156132f757600080fd5b9250929050565b6000806000806040858703121561331457600080fd5b843567ffffffffffffffff8082111561332c57600080fd5b613338888389016132b2565b9096509450602087013591508082111561335157600080fd5b5061335e878288016132b2565b95989497509550505050565b60006020828403121561337c57600080fd5b5035919050565b6000806000806080858703121561339957600080fd5b84356130b1816131eb565b600080604083850312156133b757600080fd5b82356133c28161303a565b915060208301356132278161303a565b600080604083850312156133e557600080fd5b50508035926020909101359150565b60208082526006908201526510a7aba722a960d11b604082015260600190565b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600181815b8085111561347b5781600019048211156134615761346161342a565b8085161561346e57918102915b93841c9390800290613445565b509250929050565b60008261349257506001610842565b8161349f57506000610842565b81600181146134b557600281146134bf576134db565b6001915050610842565b60ff8411156134d0576134d061342a565b50506001821b610842565b5060208310610133831016604e8410600b84101617156134fe575081810a610842565b6135088383613440565b806000190482111561351c5761351c61342a565b029392505050565b6000610a9160ff841683613483565b600081600019048311821515161561354d5761354d61342a565b500290565b6020808252600b908201526a085055551213d49256915160aa1b604082015260600190565b6020808252600c908201526b5a65726f204164647265737360a01b604082015260600190565b6000602082840312156135af57600080fd5b5051919050565b600082198211156135c9576135c961342a565b500190565b6020808252600b908201526a105b1c9958591e481cd95d60aa1b604082015260600190565b60006020828403121561360557600080fd5b8151610a918161303a565b6000828210156136225761362261342a565b500390565b634e487b7160e01b600052603260045260246000fd5b60006001820161364f5761364f61342a565b5060010190565b60008261367357634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561368a57600080fd5b8151610a91816131eb565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156136e55784516001600160a01b0316835293830193918301916001016136c0565b50506001600160a01b03969096166060850152505050608001529392505050565b60008060006060848603121561371b57600080fd5b8351925060208401519150604084015190509250925092565b60008251613746818460208701612fdb565b919091019291505056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220a677c6081ae7ca9ee9be26cf8e607bb6378b4b2193bdc529b5132eb9d372691764736f6c634300080e0033

Deployed Bytecode

0x60806040526004361061024a5760003560e01c8063706f693711610139578063a9059cbb116100b6578063f2fde38b1161007a578063f2fde38b1461075d578063f319ae771461077d578063f887ea401461079d578063fac1b9bc146107d1578063fc5ea5e6146107f1578063fe9fbb801461081157600080fd5b8063a9059cbb146106bd578063b6a5d7de146106dd578063b9a45aac146106fd578063dd62ed3e1461071d578063f0b37c041461073d57600080fd5b80638da5cb5b116100fd5780638da5cb5b146105e65780638e5c3ad31461061e57806395d89b411461063e578063a457c2d714610669578063a8aa1b311461068957600080fd5b8063706f69371461054557806370a0823114610565578063715018a61461059b5780637d1db4a5146105b057806382aa7c68146105c657600080fd5b8063357c1354116101c7578063455a43961161018b578063455a4396146104bc5780634a5a863a146104dc578063569c9b33146104fc5780636b7f8b901461050f5780636c0a24eb1461052f57600080fd5b8063357c1354146103c157806339264b661461042357806339509351146104435780633bbac5791461046357806340005fbe1461049c57600080fd5b806323b872dd1161020e57806323b872dd146103215780632b112e49146103415780632f54bf6e14610356578063313ce567146103855780633385f9aa146103a157600080fd5b806306fdde0314610256578063095ea7b3146102975780630eefe44b146102c757806317700f01146102e957806318160ddd146102fe57600080fd5b3661025157005b600080fd5b34801561026257600080fd5b506040805180820190915260068152652930b83a37b960d11b60208201525b60405161028e9190613007565b60405180910390f35b3480156102a357600080fd5b506102b76102b2366004613052565b610831565b604051901515815260200161028e565b3480156102d357600080fd5b506102e76102e2366004613092565b610848565b005b3480156102f557600080fd5b506102e76109af565b34801561030a57600080fd5b50610313610a54565b60405190815260200161028e565b34801561032d57600080fd5b506102b761033c3660046130cb565b610a75565b34801561034d57600080fd5b50610313610a98565b34801561036257600080fd5b506102b761037136600461310c565b6000546001600160a01b0391821691161490565b34801561039157600080fd5b506040516009815260200161028e565b3480156103ad57600080fd5b506102e76103bc366004613129565b610aeb565b3480156103cd57600080fd5b506104036103dc366004613185565b600b6020526000908152604090208054600182015460028301546003909301549192909184565b60408051948552602085019390935291830152606082015260800161028e565b34801561042f57600080fd5b506102e761043e3660046130cb565b610c44565b34801561044f57600080fd5b506102b761045e366004613052565b610d41565b34801561046f57600080fd5b506102b761047e36600461310c565b6001600160a01b031660009081526006602052604090205460ff1690565b3480156104a857600080fd5b506102e76104b73660046131a0565b610d62565b3480156104c857600080fd5b506102e76104d73660046131f9565b610e7e565b3480156104e857600080fd5b506102e76104f7366004613232565b610f37565b6102e761050a36600461325e565b610fba565b34801561051b57600080fd5b506102e761052a366004613295565b61140b565b34801561053b57600080fd5b5061031360035481565b34801561055157600080fd5b506102e76105603660046132fe565b6114a7565b34801561057157600080fd5b5061031361058036600461310c565b6001600160a01b031660009081526004602052604090205490565b3480156105a757600080fd5b506102e76116b1565b3480156105bc57600080fd5b5061031360025481565b3480156105d257600080fd5b506102e76105e136600461336a565b61171c565b3480156105f257600080fd5b50600054610606906001600160a01b031681565b6040516001600160a01b03909116815260200161028e565b34801561062a57600080fd5b506102e7610639366004613383565b6117d8565b34801561064a57600080fd5b50604080518082019091526002815261333360f01b6020820152610281565b34801561067557600080fd5b506102b7610684366004613052565b611864565b34801561069557600080fd5b506106067f0000000000000000000000008cb4dd2c830b259440754d4c7a1313624482da0a81565b3480156106c957600080fd5b506102b76106d8366004613052565b6118de565b3480156106e957600080fd5b506102e76106f836600461310c565b6118eb565b34801561070957600080fd5b506102e76107183660046131f9565b611937565b34801561072957600080fd5b506103136107383660046133a4565b6119f0565b34801561074957600080fd5b506102e761075836600461310c565b611a1b565b34801561076957600080fd5b506102e761077836600461310c565b611a61565b34801561078957600080fd5b506102e76107983660046133d2565b611b18565b3480156107a957600080fd5b506106067f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b3480156107dd57600080fd5b506102e76107ec3660046131f9565b611cb3565b3480156107fd57600080fd5b506102e761080c3660046133d2565b611d6c565b34801561081d57600080fd5b506102b761082c36600461310c565b611e7b565b600061083e338484611e99565b5060015b92915050565b6000546001600160a01b0316331461087b5760405162461bcd60e51b8152600401610872906133f4565b60405180910390fd5b610893601461088d6127106003611fb5565b90611fc1565b6108a7826108a18686611fcd565b90611fcd565b11156108f55760405162461bcd60e51b815260206004820152601b60248201527f5461782063616e6e6f74206265206d6f7265207468616e2032302500000000006044820152606401610872565b6000600b600086600281111561090d5761090d613414565b600281111561091e5761091e613414565b815260208101919091526040016000206001810185905583815560028101839055905061094f826108a18686611fcd565b600382015584600281111561096657610966613414565b60408051868152602081018690529081018490527fb1a90344459b408c97dc6c9427767fbcdb7fdf83182ce17a8d019839e88e8b05906060015b60405180910390a25050505050565b6000546001600160a01b031633146109d95760405162461bcd60e51b8152600401610872906133f4565b60095460ff16610a1f5760405162461bcd60e51b8152602060048201526011602482015270416c72656164792064697361626c65642160781b6044820152606401610872565b6009805460ff191690556040517fbcb8b8fbdea8aa6dc4ae41213e4da81e605a3d1a56ed851b9355182321c0919090600090a1565b6000610a626009600a613524565b610a70906301f78a40613533565b905090565b6000610a82843384611fd9565b610a8d848484612053565b5060015b9392505050565b61dead600090815260046020527f42c63635470f1fb1d6d4b6441c413cb435b1ebb6fedd1896dd5e25d1399147dd54610a7090610ad76009600a613524565b610ae5906301f78a40613533565b906123f8565b610af433611e7b565b610b105760405162461bcd60e51b815260040161087290613552565b6001600160a01b038416610b365760405162461bcd60e51b815260040161087290613577565b6001600160a01b038316610b5c5760405162461bcd60e51b815260040161087290613577565b6001600160a01b038216610b825760405162461bcd60e51b815260040161087290613577565b6001600160a01b038116610ba85760405162461bcd60e51b815260040161087290613577565b601980546001600160a01b038681166001600160a01b03199283168117909355601a80548783169084168117909155601b80548784169085168117909155601c805493871693909416831790935560408051948552602085019190915283019190915260608201527f5e236cea420126c8c121f351414cc8f3a268d3e366008a30deb36003636cb5f6906080015b60405180910390a150505050565b610c4d33611e7b565b610c695760405162461bcd60e51b815260040161087290613552565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa158015610cb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd4919061359d565b90506000610ce861271061088d8486611fb5565b9050610cfe6001600160a01b0386168583612404565b604080516001600160a01b038681168252602082018490528716917fc3770890217b5014eb50f7ffe9521ca4e970a55a8795d24ba3933f962440e1b891016109a0565b600061083e338484610d5333886119f0565b610d5d91906135b6565b611e99565b610d6b33611e7b565b610d875760405162461bcd60e51b815260040161087290613552565b6001600160a01b038316610dad5760405162461bcd60e51b815260040161087290613577565b6001600160a01b038216610dd35760405162461bcd60e51b815260040161087290613577565b6001600160a01b038116610df95760405162461bcd60e51b815260040161087290613577565b601880546001600160a01b038581166001600160a01b0319928316811790935560168054868316908416811790915560178054928616929093168217909255604080519384526020840192909252908201527ff4653be65455600571e0a73c497c13dd50347f1cd9ba7b16a1710b6184bb644c906060015b60405180910390a1505050565b610e8733611e7b565b610ea35760405162461bcd60e51b815260040161087290613552565b6001600160a01b03821660009081526008602052604090205481151560ff909116151503610ee35760405162461bcd60e51b8152600401610872906135ce565b6001600160a01b038216600081815260086020526040808220805460ff191685151590811790915590519092917f4728de7c6a4e2755a2f42b3034ce94f4a011aaff9d1af55ed984db300dea942091a35050565b610f4033611e7b565b610f5c5760405162461bcd60e51b815260040161087290613552565b601483905560138290556012819055610f79816108a18585611fcd565b60155560408051848152602081018490529081018290527fdb99cc69484cb3ee77f3036657c45f45b65191334cd61d9276977d3c9595ae3990606001610e71565b6000546001600160a01b03163314610fe45760405162461bcd60e51b8152600401610872906133f4565b826111ca57806110365760405162461bcd60e51b815260206004820152601b60248201527f43616e7420776974686472617720626e622066726f6d20706f6f6c00000000006044820152606401610872565b3491507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611097573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110bb91906135f3565b6001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b1580156110f557600080fd5b505af1158015611109573d6000803e3d6000fd5b50505050506111c57f0000000000000000000000008cb4dd2c830b259440754d4c7a1313624482da0a837f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611191573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b591906135f3565b6001600160a01b03169190612404565b611354565b80156112945733600090815260046020526040812080548492906111ef908490613610565b90915550506001600160a01b037f0000000000000000000000008cb4dd2c830b259440754d4c7a1313624482da0a166000908152600460205260408120805484929061123c9084906135b6565b90915550506040518281527f0000000000000000000000008cb4dd2c830b259440754d4c7a1313624482da0a6001600160a01b03169033906000805160206137518339815191529060200160405180910390a3611354565b6001600160a01b037f0000000000000000000000008cb4dd2c830b259440754d4c7a1313624482da0a16600090815260046020526040812080548492906112dc908490613610565b909155505033600090815260046020526040812080548492906113009084906135b6565b909155505060405182815233906001600160a01b037f0000000000000000000000008cb4dd2c830b259440754d4c7a1313624482da0a16906000805160206137518339815191529060200160405180910390a35b7f0000000000000000000000008cb4dd2c830b259440754d4c7a1313624482da0a6001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156113af57600080fd5b505af11580156113c3573d6000803e3d6000fd5b505050508015158315157fec46d2f046373c0e186ac781e1c6b18401e1b4dc15463c351938e04dd1027e7d846040516113fe91815260200190565b60405180910390a3505050565b61141433611e7b565b6114305760405162461bcd60e51b815260040161087290613552565b801515600f60019054906101000a900460ff161515036114625760405162461bcd60e51b8152600401610872906135ce565b600f805461ff001916610100831515908102919091179091556040517f2f0beb716d08015c80504ade37e31a64305599dd9a32d0172637a4bf9726dbd090600090a250565b6114b033611e7b565b6114cc5760405162461bcd60e51b815260040161087290613552565b8281811461151c5760405162461bcd60e51b815260206004820152601760248201527f6172726179206c656e677468206d69736d6174636865640000000000000000006044820152606401610872565b6000805b828110156116495784848281811061153a5761153a613627565b905060200201356004600089898581811061155757611557613627565b905060200201602081019061156c919061310c565b6001600160a01b03166001600160a01b03168152602001908152602001600020600082825461159b91906135b6565b9091555085905084828181106115b3576115b3613627565b90506020020135826115c591906135b6565b91508686828181106115d9576115d9613627565b90506020020160208101906115ee919061310c565b6001600160a01b03163360008051602061375183398151915287878581811061161957611619613627565b9050602002013560405161162f91815260200190565b60405180910390a3806116418161363d565b915050611520565b503360009081526004602052604081208054839290611669908490613610565b9091555050604080518381526020810183905233917f2b644e2cd640daf5b246ed5491ab2dfb5e8d9b4c6fd5398b985b5fbf1a0e25a4910160405180910390a2505050505050565b6116ba33611e7b565b6116d65760405162461bcd60e51b815260040161087290613552565b604051600081527f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc6861639060200160405180910390a1600080546001600160a01b0319169055565b61172533611e7b565b6117415760405162461bcd60e51b815260040161087290613552565b60095460ff16156117875760405162461bcd60e51b815260206004820152601060248201526f416c726561647920456e61626c65642160801b6044820152606401610872565b6009805460ff19166001179055600a546000036117ac576117a84282611fcd565b600a555b6040517f799663458a5ef2936f7fa0c99b3336c69c25890f82974f04e811e5bb359186c790600090a150565b6117e133611e7b565b6117fd5760405162461bcd60e51b815260040161087290613552565b600c805460ff191685151590811790915560108490556011839055600e82905560408051858152602081018590529081018390527feec54a1ebff8aabde12af12da4f2afccb0265aaf1d568498f7329cbae546850f9060600160405180910390a250505050565b60008061187133856119f0565b9050828110156118d15760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610872565b610a8d3385858403611e99565b600061083e338484612053565b6118f433611e7b565b6119105760405162461bcd60e51b815260040161087290613552565b6001600160a01b03166000908152600160208190526040909120805460ff19169091179055565b61194033611e7b565b61195c5760405162461bcd60e51b815260040161087290613552565b6001600160a01b03821660009081526007602052604090205481151560ff90911615150361199c5760405162461bcd60e51b8152600401610872906135ce565b6001600160a01b038216600081815260076020526040808220805460ff191685151590811790915590519092917ff93f9a76c1bf3444d22400a00cb9fe990e6abe9dbb333fda48859cfee864543d91a35050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b611a2433611e7b565b611a405760405162461bcd60e51b815260040161087290613552565b6001600160a01b03166000908152600160205260409020805460ff19169055565b611a6a33611e7b565b611a865760405162461bcd60e51b815260040161087290613552565b6001600160a01b038116611aac5760405162461bcd60e51b815260040161087290613577565b600080546001600160a01b0319166001600160a01b038316908117825580825260016020818152604093849020805460ff191690921790915591519081527f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc686163910160405180910390a150565b611b2133611e7b565b611b3d5760405162461bcd60e51b815260040161087290613552565b6001821015611ba15760405162461bcd60e51b815260206004820152602a60248201527f4d61782074786e206c696d69742063616e6e6f74206265206c657373207468616044820152696e20302e30303030312560b01b6064820152608401610872565b6207a120811015611c045760405162461bcd60e51b815260206004820152602760248201527f4d61782057616c6c6574206c696d69742063616e6e6f74206265206c657373206044820152667468616e20352560c81b6064820152608401610872565b60006298968083611c176009600a613524565b611c25906301f78a40613533565b611c2f9190613533565b611c399190613656565b905060006298968083611c4e6009600a613524565b611c5c906301f78a40613533565b611c669190613533565b611c709190613656565b6002839055600381905560408051848152602081018390529192507fb6cf947475d47632612a3265c7bc83f5cfed7429546220bfb088c3634f91c2299101610c36565b611cbc33611e7b565b611cd85760405162461bcd60e51b815260040161087290613552565b6001600160a01b03821660009081526006602052604090205481151560ff909116151503611d185760405162461bcd60e51b8152600401610872906135ce565b6001600160a01b038216600081815260066020526040808220805460ff191685151590811790915590519092917f1c6168ae13717a8cda4e1c9276a36c39333240268ba173a5a844201a8f4baa9991a35050565b611d7533611e7b565b611d915760405162461bcd60e51b815260040161087290613552565b476000611da28361088d8487611fb5565b90506000611db1826004611fc1565b601954909150611dca906001600160a01b03168261245b565b601a54611de0906001600160a01b03168261245b565b601b54611df6906001600160a01b03168261245b565b601c54611e0c906001600160a01b03168261245b565b601954601a54601b54601c54604080516001600160a01b0395861681529385166020850152918416838301529290921660608201526080810184905290517fa08f91be8aba9066a7bc396851b6d781cef0ae989dbcab9c649d4c6bceb3bee99181900360a00190a15050505050565b6001600160a01b031660009081526001602052604090205460ff1690565b6001600160a01b038316611efb5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610872565b6001600160a01b038216611f5c5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610872565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591016113fe565b6000610a918284613533565b6000610a918284613656565b6000610a9182846135b6565b6000611fe584846119f0565b9050600019811461204d57818110156120405760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610872565b61204d8484848403611e99565b50505050565b61205e8383836124ff565b6001600160a01b03831660009081526007602052604090205460019060ff16806120a057506001600160a01b03831660009081526007602052604090205460ff165b156120ad57506000612204565b60095460ff166120f35760405162461bcd60e51b8152602060048201526011602482015270151c98591a5b99c81a5cc814185d5cd959607a1b6044820152606401610872565b6002548211156121565760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b6064820152608401610872565b7f0000000000000000000000008cb4dd2c830b259440754d4c7a1313624482da0a6001600160a01b0316836001600160a01b031614612204576003546001600160a01b0384166000908152600460205260409020546121b69084906135b6565b11156122045760405162461bcd60e51b815260206004820152601b60248201527f57616c6c657420616d6f756e742065786365656473206c696d697400000000006044820152606401610872565b60007f0000000000000000000000008cb4dd2c830b259440754d4c7a1313624482da0a6001600160a01b0316856001600160a01b0316036122b557600090507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316846001600160a01b0316141580156122875750600a544211155b156122b0576001600160a01b0384166000908152600660205260409020805460ff191660011790555b6122fa565b7f0000000000000000000000008cb4dd2c830b259440754d4c7a1313624482da0a6001600160a01b0316846001600160a01b0316036122f6575060016122fa565b5060025b600d54612308906001611fcd565b600d55612315858461268f565b1561232b5761232560105461272c565b6000600d555b6001600160a01b03851660009081526004602052604090205461234e90846123f8565b6001600160a01b038616600090815260046020526040812091909155826123755783612380565b61238086858461280d565b6001600160a01b0386166000908152600460205260409020549091506123a69082611fcd565b6001600160a01b038087166000818152600460205260409081902093909355915190881690600080516020613751833981519152906123e89085815260200190565b60405180910390a3505050505050565b6000610a918284613610565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052612456908490612ad3565b505050565b80600003612467575050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146124b4576040519150601f19603f3d011682016040523d82523d6000602084013e6124b9565b606091505b50509050806124565760405162461bcd60e51b81526020600482015260126024820152710aadcc2c4d8ca40e8de40e6cadcc8408aa8960731b6044820152606401610872565b6001600160a01b03831660009081526008602052604090205460ff16156125555760405162461bcd60e51b815260206004820152600a602482015269109b1858dada5cdd195960b21b6044820152606401610872565b6001600160a01b03821660009081526008602052604090205460ff16156125ab5760405162461bcd60e51b815260206004820152600a602482015269109b1858dada5cdd195960b21b6044820152606401610872565b6000811161260d5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610872565b6001600160a01b0383166000908152600460205260409020548111156124565760405162461bcd60e51b815260206004820152603160248201527f596f752061726520747279696e6720746f207472616e73666572206d6f7265206044820152707468616e20796f75722062616c616e636560781b6064820152608401610872565b60115460105430600090815260046020526040812054600f5491938510159211159060ff161580156126c35750600c5460ff165b80156126cc5750815b80156126dc5750600e54600d5410155b80156126e55750805b801561272357507f0000000000000000000000008cb4dd2c830b259440754d4c7a1313624482da0a6001600160a01b0316856001600160a01b031614155b95945050505050565b600f805460ff191660011790556015546013546000916127569160029161088d9182908790611fb5565b9050600061276483836123f8565b90504761277082612ba5565b600061277c47836123f8565b905060006127a26127996002601354611fc190919063ffffffff16565b601554906123f8565b905084156127d1576127d1856127cc600261088d8561088d60135489611fb590919063ffffffff16565b612d65565b6018546012546127fb916001600160a01b0316906127f690849061088d908790611fb5565b61245b565b5050600f805460ff1916905550505050565b600080600b600084600281111561282657612826613414565b600281111561283757612837613414565b81526020808201929092526040908101600090812082516080810184528154815260018201548186015260028201548185015260039091015460608201526001600160a01b03891682526006909352908120549192509060ff1680156128a45750600f54610100900460ff165b6128b25781606001516128bf565b6128bf6064612710613610565b9050806000036128d3578492505050610a91565b60006128e561271061088d8885611fb5565b905060006129048361088d866020015185611fb590919063ffffffff16565b905060006129238461088d876000015186611fb590919063ffffffff16565b9050600061293582610ae586866123f8565b905082156129da5761dead60005260046020527f42c63635470f1fb1d6d4b6441c413cb435b1ebb6fedd1896dd5e25d1399147dd546129749084611fcd565b61dead600081905260046020527f42c63635470f1fb1d6d4b6441c413cb435b1ebb6fedd1896dd5e25d1399147dd919091556040516001600160a01b038c1690600080516020613751833981519152906129d19087815260200190565b60405180910390a35b8115612a53576017546001600160a01b0316600090815260046020526040902054612a059083611fcd565b601780546001600160a01b03908116600090815260046020908152604091829020949094559154915185815291811692908d1691600080516020613751833981519152910160405180910390a35b8015612abb5730600090815260046020526040902054612a739082611fcd565b30600081815260046020526040908190209290925590516001600160a01b038c169060008051602061375183398151915290612ab29085815260200190565b60405180910390a35b612ac589856123f8565b9a9950505050505050505050565b6000612b28826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612e4b9092919063ffffffff16565b8051909150156124565780806020019051810190612b469190613678565b6124565760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610872565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612bda57612bda613627565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c7c91906135f3565b81600181518110612c8f57612c8f613627565b60200260200101906001600160a01b031690816001600160a01b031681525050612cda307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84611e99565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063791ac94790612d2f908590600090869030904290600401613695565b600060405180830381600087803b158015612d4957600080fd5b505af1158015612d5d573d6000803e3d6000fd5b505050505050565b612d90307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84611e99565b60165460405163f305d71960e01b81523060048201526024810184905260006044820181905260648201526001600160a01b0391821660848201524260a48201527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d9091169063f305d71990839060c40160606040518083038185885af1158015612e1f573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612e449190613706565b5050505050565b6060612e5a8484600085612e62565b949350505050565b606082471015612ec35760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610872565b600080866001600160a01b03168587604051612edf9190613734565b60006040518083038185875af1925050503d8060008114612f1c576040519150601f19603f3d011682016040523d82523d6000602084013e612f21565b606091505b5091509150612f3287838387612f3d565b979650505050505050565b60608315612fac578251600003612fa5576001600160a01b0385163b612fa55760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610872565b5081612e5a565b612e5a8383815115612fc15781518083602001fd5b8060405162461bcd60e51b81526004016108729190613007565b60005b83811015612ff6578181015183820152602001612fde565b8381111561204d5750506000910152565b6020815260008251806020840152613026816040850160208701612fdb565b601f01601f19169190910160400192915050565b6001600160a01b038116811461304f57600080fd5b50565b6000806040838503121561306557600080fd5b82356130708161303a565b946020939093013593505050565b80356003811061308d57600080fd5b919050565b600080600080608085870312156130a857600080fd5b6130b18561307e565b966020860135965060408601359560600135945092505050565b6000806000606084860312156130e057600080fd5b83356130eb8161303a565b925060208401356130fb8161303a565b929592945050506040919091013590565b60006020828403121561311e57600080fd5b8135610a918161303a565b6000806000806080858703121561313f57600080fd5b843561314a8161303a565b9350602085013561315a8161303a565b9250604085013561316a8161303a565b9150606085013561317a8161303a565b939692955090935050565b60006020828403121561319757600080fd5b610a918261307e565b6000806000606084860312156131b557600080fd5b83356131c08161303a565b925060208401356131d08161303a565b915060408401356131e08161303a565b809150509250925092565b801515811461304f57600080fd5b6000806040838503121561320c57600080fd5b82356132178161303a565b91506020830135613227816131eb565b809150509250929050565b60008060006060848603121561324757600080fd5b505081359360208301359350604090920135919050565b60008060006060848603121561327357600080fd5b833561327e816131eb565b92506020840135915060408401356131e0816131eb565b6000602082840312156132a757600080fd5b8135610a91816131eb565b60008083601f8401126132c457600080fd5b50813567ffffffffffffffff8111156132dc57600080fd5b6020830191508360208260051b85010111156132f757600080fd5b9250929050565b6000806000806040858703121561331457600080fd5b843567ffffffffffffffff8082111561332c57600080fd5b613338888389016132b2565b9096509450602087013591508082111561335157600080fd5b5061335e878288016132b2565b95989497509550505050565b60006020828403121561337c57600080fd5b5035919050565b6000806000806080858703121561339957600080fd5b84356130b1816131eb565b600080604083850312156133b757600080fd5b82356133c28161303a565b915060208301356132278161303a565b600080604083850312156133e557600080fd5b50508035926020909101359150565b60208082526006908201526510a7aba722a960d11b604082015260600190565b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600181815b8085111561347b5781600019048211156134615761346161342a565b8085161561346e57918102915b93841c9390800290613445565b509250929050565b60008261349257506001610842565b8161349f57506000610842565b81600181146134b557600281146134bf576134db565b6001915050610842565b60ff8411156134d0576134d061342a565b50506001821b610842565b5060208310610133831016604e8410600b84101617156134fe575081810a610842565b6135088383613440565b806000190482111561351c5761351c61342a565b029392505050565b6000610a9160ff841683613483565b600081600019048311821515161561354d5761354d61342a565b500290565b6020808252600b908201526a085055551213d49256915160aa1b604082015260600190565b6020808252600c908201526b5a65726f204164647265737360a01b604082015260600190565b6000602082840312156135af57600080fd5b5051919050565b600082198211156135c9576135c961342a565b500190565b6020808252600b908201526a105b1c9958591e481cd95d60aa1b604082015260600190565b60006020828403121561360557600080fd5b8151610a918161303a565b6000828210156136225761362261342a565b500390565b634e487b7160e01b600052603260045260246000fd5b60006001820161364f5761364f61342a565b5060010190565b60008261367357634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561368a57600080fd5b8151610a91816131eb565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156136e55784516001600160a01b0316835293830193918301916001016136c0565b50506001600160a01b03969096166060850152505050608001529392505050565b60008060006060848603121561371b57600080fd5b8351925060208401519150604084015190509250925092565b60008251613746818460208701612fdb565b919091019291505056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220a677c6081ae7ca9ee9be26cf8e607bb6378b4b2193bdc529b5132eb9d372691764736f6c634300080e0033

Deployed Bytecode Sourcemap

13749:19821:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18183:67;;;;;;;;;;-1:-1:-1;18243:5:0;;;;;;;;;;;;-1:-1:-1;;;18243:5:0;;;;18183:67;;;;;;;:::i;:::-;;;;;;;;18995:159;;;;;;;;;;-1:-1:-1;18995:159:0;;;;;:::i;:::-;;:::i;:::-;;;1286:14:1;;1279:22;1261:41;;1249:2;1234:18;18995:159:0;1121:187:1;28156:614:0;;;;;;;;;;-1:-1:-1;28156:614:0;;;;;:::i;:::-;;:::i;:::-;;20600:176;;;;;;;;;;;;;:::i;18406:84::-;;;;;;;;;;;;;:::i;:::-;;;2049:25:1;;;2037:2;2022:18;18406:84:0;1903:177:1;21229:249:0;;;;;;;;;;-1:-1:-1;21229:249:0;;;;;:::i;:::-;;:::i;19166:121::-;;;;;;;;;;;;;:::i;11938:103::-;;;;;;;;;;-1:-1:-1;11938:103:0;;;;;:::i;:::-;11993:4;12028:5;-1:-1:-1;;;;;12017:16:0;;;12028:5;;12017:16;;11938:103;18333:67;;;;;;;;;;-1:-1:-1;18333:67:0;;13984:1;2940:36:1;;2928:2;2913:18;18333:67:0;2798:184:1;29274:552:0;;;;;;;;;;-1:-1:-1;29274:552:0;;;;;:::i;:::-;;:::i;14950:44::-;;;;;;;;;;-1:-1:-1;14950:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4118:25:1;;;4174:2;4159:18;;4152:34;;;;4202:18;;;4195:34;4260:2;4245:18;;4238:34;4105:3;4090:19;14950:44:0;3887:391:1;26763:404:0;;;;;;;;;;-1:-1:-1;26763:404:0;;;;;:::i;:::-;;:::i;21486:209::-;;;;;;;;;;-1:-1:-1;21486:209:0;;;;;:::i;:::-;;:::i;18885:102::-;;;;;;;;;;-1:-1:-1;18885:102:0;;;;;:::i;:::-;-1:-1:-1;;;;;18963:16:0;18939:4;18963:16;;;:6;:16;;;;;;;;;18885:102;28778:488;;;;;;;;;;-1:-1:-1;28778:488:0;;;;;:::i;:::-;;:::i;19568:267::-;;;;;;;;;;-1:-1:-1;19568:267:0;;;;;:::i;:::-;;:::i;27175:348::-;;;;;;;;;;-1:-1:-1;27175:348:0;;;;;:::i;:::-;;:::i;32760:805::-;;;;;;:::i;:::-;;:::i;20072:206::-;;;;;;;;;;-1:-1:-1;20072:206:0;;;;;:::i;:::-;;:::i;14214:64::-;;;;;;;;;;;;;;;;32067:685;;;;;;;;;;-1:-1:-1;32067:685:0;;;;;:::i;:::-;;:::i;18496:103::-;;;;;;;;;;-1:-1:-1;18496:103:0;;;;;:::i;:::-;-1:-1:-1;;;;;18579:18:0;18562:7;18579:18;;;:9;:18;;;;;;;18496:103;12401:128;;;;;;;;;;;;;:::i;14147:60::-;;;;;;;;;;;;;;;;20286:306;;;;;;;;;;-1:-1:-1;20286:306:0;;;;;:::i;:::-;;:::i;11315:20::-;;;;;;;;;;-1:-1:-1;11315:20:0;;;;-1:-1:-1;;;;;11315:20:0;;;;;;-1:-1:-1;;;;;7842:32:1;;;7824:51;;7812:2;7797:18;11315:20:0;7678:203:1;20784:437:0;;;;;;;;;;-1:-1:-1;20784:437:0;;;;;:::i;:::-;;:::i;18256:71::-;;;;;;;;;;-1:-1:-1;18318:7:0;;;;;;;;;;;;-1:-1:-1;;;18318:7:0;;;;18256:71;;21703:407;;;;;;;;;;-1:-1:-1;21703:407:0;;;;;:::i;:::-;;:::i;14579:29::-;;;;;;;;;;;;;;;18605:139;;;;;;;;;;-1:-1:-1;18605:139:0;;;;;:::i;:::-;;:::i;11729:95::-;;;;;;;;;;-1:-1:-1;11729:95:0;;;;;:::i;:::-;;:::i;19295:265::-;;;;;;;;;;-1:-1:-1;19295:265:0;;;;;:::i;:::-;;:::i;18750:127::-;;;;;;;;;;-1:-1:-1;18750:127:0;;;;;:::i;:::-;;:::i;11832:98::-;;;;;;;;;;-1:-1:-1;11832:98:0;;;;;:::i;:::-;;:::i;12168:221::-;;;;;;;;;;-1:-1:-1;12168:221:0;;;;;:::i;:::-;;:::i;26207:548::-;;;;;;;;;;-1:-1:-1;26207:548:0;;;;;:::i;:::-;;:::i;14541:31::-;;;;;;;;;;;;;;;19843:221;;;;;;;;;;-1:-1:-1;19843:221:0;;;;;:::i;:::-;;:::i;27531:617::-;;;;;;;;;;-1:-1:-1;27531:617:0;;;;;:::i;:::-;;:::i;12049:107::-;;;;;;;;;;-1:-1:-1;12049:107:0;;;;;:::i;:::-;;:::i;18995:159::-;19070:4;19087:37;19096:10;19108:7;19117:6;19087:8;:37::i;:::-;-1:-1:-1;19142:4:0;18995:159;;;;;:::o;28156:614::-;11993:4;12028:5;-1:-1:-1;;;;;12028:5:0;11566:10;12017:16;11550:38;;;;-1:-1:-1;;;11550:38:0;;;;;;;:::i;:::-;;;;;;;;;28366:29:::1;28392:2;28366:21;14711:5;28385:1;28366:18;:21::i;:::-;:25:::0;::::1;:29::i;:::-;28313:49;28343:18:::0;28313:25:::1;:8:::0;28326:11;28313:12:::1;:25::i;:::-;:29:::0;::::1;:49::i;:::-;:82;;28305:122;;;::::0;-1:-1:-1;;;28305:122:0;;10003:2:1;28305:122:0::1;::::0;::::1;9985:21:1::0;10042:2;10022:18;;;10015:30;10081:29;10061:18;;;10054:57;10128:18;;28305:122:0::1;9801:351:1::0;28305:122:0::1;28438:15;28456:4;:21;28461:15;28456:21;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;28456:21:0;28488:11:::1;::::0;::::1;:22:::0;;;28521:28;;;28560:13:::1;::::0;::::1;:34:::0;;;28456:21;-1:-1:-1;28620:49:0::1;28576:18:::0;28620:25:::1;28502:8:::0;28538:11;28620:12:::1;:25::i;:49::-;28605:12;::::0;::::1;:64:::0;28703:15;28691:71:::1;::::0;::::1;;;;;;:::i;:::-;;::::0;;10491:25:1;;;10547:2;10532:18;;10525:34;;;10575:18;;;10568:34;;;28691:71:0::1;::::0;10479:2:1;10464:18;28691:71:0::1;;;;;;;;28294:476;28156:614:::0;;;;:::o;20600:176::-;11993:4;12028:5;-1:-1:-1;;;;;12028:5:0;11566:10;12017:16;11550:38;;;;-1:-1:-1;;;11550:38:0;;;;;;;:::i;:::-;20664:14:::1;::::0;::::1;;20656:44;;;::::0;-1:-1:-1;;;20656:44:0;;10815:2:1;20656:44:0::1;::::0;::::1;10797:21:1::0;10854:2;10834:18;;;10827:30;-1:-1:-1;;;10873:18:1;;;10866:47;10930:18;;20656:44:0::1;10613:341:1::0;20656:44:0::1;20711:14;:22:::0;;-1:-1:-1;;20711:22:0::1;::::0;;20751:17:::1;::::0;::::1;::::0;20728:5:::1;::::0;20751:17:::1;20600:176::o:0;18406:84::-;18459:7;14049:15;13984:1;14049:2;:15;:::i;:::-;14035:30;;:10;:30;:::i;:::-;18469:19;;18406:84;:::o;21229:249::-;21352:4;21369:41;21385:4;21391:10;21403:6;21369:15;:41::i;:::-;21421:27;21431:4;21437:2;21441:6;21421:9;:27::i;:::-;-1:-1:-1;21466:4:0;21229:249;;;;;;:::o;19166:121::-;14098:42;19219:7;18579:18;;;:9;:18;;;;19246:33;;14049:15;13984:1;14049:2;:15;:::i;:::-;14035:30;;:10;:30;:::i;:::-;19246:16;;:33::i;29274:552::-;11657:24;11670:10;11657:12;:24::i;:::-;11649:48;;;;-1:-1:-1;;;11649:48:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29406:20:0;::::1;29398:45;;;;-1:-1:-1::0;;;29398:45:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;29462:20:0;::::1;29454:45;;;;-1:-1:-1::0;;;29454:45:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;29518:20:0;::::1;29510:45;;;;-1:-1:-1::0;;;29510:45:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;29574:20:0;::::1;29566:45;;;;-1:-1:-1::0;;;29566:45:0::1;;;;;;;:::i;:::-;29622:14;:23:::0;;-1:-1:-1;;;;;29622:23:0;;::::1;-1:-1:-1::0;;;;;;29622:23:0;;::::1;::::0;::::1;::::0;;;29656:14:::1;:23:::0;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;29690:14:::1;:23:::0;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;29724:14:::1;:23:::0;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;29765:53:::1;::::0;;13597:34:1;;;13662:2;13647:18;;13640:43;;;;13699:18;;13692:43;;;;13766:2;13751:18;;13744:43;29765:53:0::1;::::0;13546:3:1;13531:19;29765:53:0::1;;;;;;;;29274:552:::0;;;;:::o;26763:404::-;11657:24;11670:10;11657:12;:24::i;:::-;11649:48;;;;-1:-1:-1;;;11649:48:0;;;;;;;:::i;:::-;26901:39:::1;::::0;-1:-1:-1;;;26901:39:0;;26934:4:::1;26901:39;::::0;::::1;7824:51:1::0;26884:14:0::1;::::0;-1:-1:-1;;;;;26901:24:0;::::1;::::0;::::1;::::0;7797:18:1;;26901:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26884:56:::0;-1:-1:-1;26951:24:0::1;26978:34;27006:5;26978:23;26884:56:::0;26989:11;26978:10:::1;:23::i;:34::-;26951:61:::0;-1:-1:-1;27023:56:0::1;-1:-1:-1::0;;;;;27023:27:0;::::1;27051:9:::0;26951:61;27023:27:::1;:56::i;:::-;27097:62;::::0;;-1:-1:-1;;;;;14179:32:1;;;14161:51;;14243:2;14228:18;;14221:34;;;27097:62:0;::::1;::::0;::::1;::::0;14134:18:1;27097:62:0::1;13987:274:1::0;21486:209:0;21574:4;21591:74;21600:10;21612:7;21654:10;21621:30;21631:10;21643:7;21621:9;:30::i;:::-;:43;;;;:::i;:::-;21591:8;:74::i;28778:488::-;11657:24;11670:10;11657:12;:24::i;:::-;11649:48;;;;-1:-1:-1;;;11649:48:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;28904:24:0;::::1;28896:49;;;;-1:-1:-1::0;;;28896:49:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;28964:24:0;::::1;28956:49;;;;-1:-1:-1::0;;;28956:49:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;29024:22:0;::::1;29016:47;;;;-1:-1:-1::0;;;29016:47:0::1;;;;;;;:::i;:::-;29074:18;:31:::0;;-1:-1:-1;;;;;29074:31:0;;::::1;-1:-1:-1::0;;;;;;29074:31:0;;::::1;::::0;::::1;::::0;;;29116:18:::1;:31:::0;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;29158:16:::1;:27:::0;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;29203:55:::1;::::0;;14639:34:1;;;14704:2;14689:18;;14682:43;;;;14741:18;;;14734:43;29203:55:0::1;::::0;14589:2:1;14574:18;29203:55:0::1;;;;;;;;28778:488:::0;;;:::o;19568:267::-;11657:24;11670:10;11657:12;:24::i;:::-;11649:48;;;;-1:-1:-1;;;11649:48:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19669:23:0;::::1;;::::0;;;:13:::1;:23;::::0;;;;;:37;::::1;;:23;::::0;;::::1;:37;;::::0;19661:61:::1;;;;-1:-1:-1::0;;;19661:61:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;19733:23:0;::::1;;::::0;;;:13:::1;:23;::::0;;;;;:36;;-1:-1:-1;;19733:36:0::1;::::0;::::1;;::::0;;::::1;::::0;;;19787:40;;19733:36;;:23;19787:40:::1;::::0;::::1;19568:267:::0;;:::o;27175:348::-;11657:24;11670:10;11657:12;:24::i;:::-;11649:48;;;;-1:-1:-1;;;11649:48:0;;;;;;;:::i;:::-;27285:12:::1;:20:::0;;;27316:17:::1;:30:::0;;;27357:17:::1;:30:::0;;;27414:37:::1;27377:10:::0;27414:21:::1;27300:5:::0;27336:10;27414:9:::1;:21::i;:37::-;27398:13;:53:::0;27469:46:::1;::::0;;10491:25:1;;;10547:2;10532:18;;10525:34;;;10575:18;;;10568:34;;;27469:46:0::1;::::0;10479:2:1;10464:18;27469:46:0::1;10289:319:1::0;32760:805:0;11993:4;12028:5;-1:-1:-1;;;;;12028:5:0;11566:10;12017:16;11550:38;;;;-1:-1:-1;;;11550:38:0;;;;;;;:::i;:::-;32862:5:::1;32858:620;;32892:3;32884:43;;;::::0;-1:-1:-1;;;32884:43:0;;15330:2:1;32884:43:0::1;::::0;::::1;15312:21:1::0;15369:2;15349:18;;;15342:30;15408:29;15388:18;;;15381:57;15455:18;;32884:43:0::1;15128:351:1::0;32884:43:0::1;32951:9;32942:18;;32981:6;-1:-1:-1::0;;;;;32981:11:0::1;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;32975:28:0::1;;33011:6;32975:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;33035:48;33070:4;33076:6;33042;-1:-1:-1::0;;;;;33042:11:0::1;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;33035:34:0::1;::::0;:48;:34:::1;:48::i;:::-;32858:620;;;33118:3;33115:352;;;33152:10;33142:21;::::0;;;:9:::1;:21;::::0;;;;:31;;33167:6;;33142:21;:31:::1;::::0;33167:6;;33142:31:::1;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;33202:4:0::1;33192:15;;::::0;;;:9:::1;:15;::::0;;;;:25;;33211:6;;33192:15;:25:::1;::::0;33211:6;;33192:25:::1;:::i;:::-;::::0;;;-1:-1:-1;;33241:34:0::1;::::0;2049:25:1;;;33262:4:0::1;-1:-1:-1::0;;;;;33241:34:0::1;::::0;33250:10:::1;::::0;-1:-1:-1;;;;;;;;;;;33241:34:0;2037:2:1;2022:18;33241:34:0::1;;;;;;;33115:352;;;-1:-1:-1::0;;;;;33328:4:0::1;33318:15;;::::0;;;:9:::1;:15;::::0;;;;:25;;33337:6;;33318:15;:25:::1;::::0;33337:6;;33318:25:::1;:::i;:::-;::::0;;;-1:-1:-1;;33372:10:0::1;33362:21;::::0;;;:9:::1;:21;::::0;;;;:31;;33387:6;;33362:21;:31:::1;::::0;33387:6;;33362:31:::1;:::i;:::-;::::0;;;-1:-1:-1;;33417:34:0::1;::::0;2049:25:1;;;33432:10:0::1;::::0;-1:-1:-1;;;;;33426:4:0::1;33417:34;::::0;-1:-1:-1;;;;;;;;;;;33417:34:0;2037:2:1;2022:18;33417:34:0::1;;;;;;;33115:352;33494:4;-1:-1:-1::0;;;;;33488:16:0::1;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;33553:3;33522:35;;33538:5;33522:35;;;33545:6;33522:35;;;;2049:25:1::0;;2037:2;2022:18;;1903:177;33522:35:0::1;;;;;;;;32760:805:::0;;;:::o;20072:206::-;11657:24;11670:10;11657:12;:24::i;:::-;11649:48;;;;-1:-1:-1;;;11649:48:0;;;;;;;:::i;:::-;20166:7:::1;20148:25;;:14;;;;;;;;;;;:25;;::::0;20140:49:::1;;;;-1:-1:-1::0;;;20140:49:0::1;;;;;;;:::i;:::-;20200:14;:24:::0;;-1:-1:-1;;20200:24:0::1;;::::0;::::1;;::::0;;::::1;::::0;;;::::1;::::0;;;20242:28:::1;::::0;::::1;::::0;-1:-1:-1;;20242:28:0::1;20072:206:::0;:::o;32067:685::-;11657:24;11670:10;11657:12;:24::i;:::-;11649:48;;;;-1:-1:-1;;;11649:48:0;;;;;;;:::i;:::-;32195:8;32230:24;;::::1;32221:61;;;::::0;-1:-1:-1;;;32221:61:0;;16072:2:1;32221:61:0::1;::::0;::::1;16054:21:1::0;16111:2;16091:18;;;16084:30;16150:25;16130:18;;;16123:53;16193:18;;32221:61:0::1;15870:347:1::0;32221:61:0::1;32293:21;32344:9:::0;32339:289:::1;32363:6;32359:1;:10;32339:289;;;32499:7;;32507:1;32499:10;;;;;;;:::i;:::-;;;;;;;32473:9;:22;32483:8;;32492:1;32483:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;32473:22:0::1;-1:-1:-1::0;;;;;32473:22:0::1;;;;;;;;;;;;;:36;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;32541:7:0;;-1:-1:-1;32541:7:0;32549:1;32541:10;;::::1;;;;;:::i;:::-;;;;;;;32524:27;;;;;:::i;:::-;;;32592:8;;32601:1;32592:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;32571:45:0::1;32580:10;-1:-1:-1::0;;;;;;;;;;;32605:7:0;;32613:1;32605:10;;::::1;;;;;:::i;:::-;;;;;;;32571:45;;;;2049:25:1::0;;2037:2;2022:18;;1903:177;32571:45:0::1;;;;;;;;32371:3:::0;::::1;::::0;::::1;:::i;:::-;;;;32339:289;;;-1:-1:-1::0;32648:10:0::1;32638:21;::::0;;;:9:::1;:21;::::0;;;;:38;;32663:13;;32638:21;:38:::1;::::0;32663:13;;32638:38:::1;:::i;:::-;::::0;;;-1:-1:-1;;32694:50:0::1;::::0;;16668:25:1;;;16724:2;16709:18;;16702:34;;;32710:10:0::1;::::0;32694:50:::1;::::0;16641:18:1;32694:50:0::1;;;;;;;32167:585;;32067:685:::0;;;;:::o;12401:128::-;11657:24;11670:10;11657:12;:24::i;:::-;11649:48;;;;-1:-1:-1;;;11649:48:0;;;;;;;:::i;:::-;12466:32:::1;::::0;12495:1:::1;7824:51:1::0;;12466:32:0::1;::::0;7812:2:1;7797:18;12466:32:0::1;;;;;;;12525:1;12509:18:::0;;-1:-1:-1;;;;;;12509:18:0::1;::::0;;12401:128::o;20286:306::-;11657:24;11670:10;11657:12;:24::i;:::-;11649:48;;;;-1:-1:-1;;;11649:48:0;;;;;;;:::i;:::-;20365:14:::1;::::0;::::1;;20364:15;20356:44;;;::::0;-1:-1:-1;;;20356:44:0;;16949:2:1;20356:44:0::1;::::0;::::1;16931:21:1::0;16988:2;16968:18;;;16961:30;-1:-1:-1;;;17007:18:1;;;17000:46;17063:18;;20356:44:0::1;16747:340:1::0;20356:44:0::1;20411:14;:21:::0;;-1:-1:-1;;20411:21:0::1;20428:4;20411:21;::::0;;20446:11:::1;::::0;20411:14:::1;20446:16:::0;20443:99:::1;;20515:27;:15;20535:6:::0;20515:19:::1;:27::i;:::-;20501:11;:41:::0;20443:99:::1;20568:16;::::0;::::1;::::0;;;::::1;20286:306:::0;:::o;20784:437::-;11657:24;11670:10;11657:12;:24::i;:::-;11649:48;;;;-1:-1:-1;;;11649:48:0;;;;;;;:::i;:::-;20937:21:::1;:32:::0;;-1:-1:-1;;20937:32:0::1;::::0;::::1;;::::0;;::::1;::::0;;;20981:13:::1;:26:::0;;;21018:15:::1;:27:::0;;;21056:25:::1;:54:::0;;;21128:85:::1;::::0;;10491:25:1;;;10547:2;10532:18;;10525:34;;;10575:18;;;10568:34;;;21128:85:0::1;::::0;10479:2:1;10464:18;21128:85:0::1;;;;;;;20784:437:::0;;;;:::o;21703:407::-;21796:4;21813:24;21840:30;21850:10;21862:7;21840:9;:30::i;:::-;21813:57;;21909:15;21889:16;:35;;21881:85;;;;-1:-1:-1;;;21881:85:0;;17294:2:1;21881:85:0;;;17276:21:1;17333:2;17313:18;;;17306:30;17372:34;17352:18;;;17345:62;-1:-1:-1;;;17423:18:1;;;17416:35;17468:19;;21881:85:0;17092:401:1;21881:85:0;22002:65;22011:10;22023:7;22051:15;22032:16;:34;22002:8;:65::i;18605:139::-;18683:4;18690:40;18700:10;18712:9;18723:6;18690:9;:40::i;11729:95::-;11657:24;11670:10;11657:12;:24::i;:::-;11649:48;;;;-1:-1:-1;;;11649:48:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;11790:19:0::1;;::::0;;;11812:4:::1;11790:19;::::0;;;;;;;:26;;-1:-1:-1;;11790:26:0::1;::::0;;::::1;::::0;;11729:95::o;19295:265::-;11657:24;11670:10;11657:12;:24::i;:::-;11649:48;;;;-1:-1:-1;;;11649:48:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19396:23:0;::::1;;::::0;;;:13:::1;:23;::::0;;;;;:37;::::1;;:23;::::0;;::::1;:37;;::::0;19388:61:::1;;;;-1:-1:-1::0;;;19388:61:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;19460:23:0;::::1;;::::0;;;:13:::1;:23;::::0;;;;;:36;;-1:-1:-1;;19460:36:0::1;::::0;::::1;;::::0;;::::1;::::0;;;19514:38;;19460:36;;:23;19514:38:::1;::::0;::::1;19295:265:::0;;:::o;18750:127::-;-1:-1:-1;;;;;18848:18:0;;;18831:7;18848:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;18750:127::o;11832:98::-;11657:24;11670:10;11657:12;:24::i;:::-;11649:48;;;;-1:-1:-1;;;11649:48:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;11895:19:0::1;11917:5;11895:19:::0;;;:14:::1;:19;::::0;;;;:27;;-1:-1:-1;;11895:27:0::1;::::0;;11832:98::o;12168:221::-;11657:24;11670:10;11657:12;:24::i;:::-;11649:48;;;;-1:-1:-1;;;11649:48:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;12253:17:0;::::1;12245:42;;;;-1:-1:-1::0;;;12245:42:0::1;;;;;;;:::i;:::-;12298:5;:11:::0;;-1:-1:-1;;;;;;12298:11:0::1;-1:-1:-1::0;;;;;12298:11:0;::::1;::::0;;::::1;::::0;;12320:19;;;-1:-1:-1;12320:19:0::1;::::0;;;;;;;;:26;;-1:-1:-1;;12320:26:0::1;::::0;;::::1;::::0;;;12362:25;;7824:51:1;;;12362:25:0::1;::::0;7797:18:1;12362:25:0::1;;;;;;;12168:221:::0;:::o;26207:548::-;11657:24;11670:10;11657:12;:24::i;:::-;11649:48;;;;-1:-1:-1;;;11649:48:0;;;;;;;:::i;:::-;26326:1:::1;26310:12;:17;;26302:72;;;::::0;-1:-1:-1;;;26302:72:0;;17916:2:1;26302:72:0::1;::::0;::::1;17898:21:1::0;17955:2;17935:18;;;17928:30;17994:34;17974:18;;;17967:62;-1:-1:-1;;;18045:18:1;;;18038:40;18095:19;;26302:72:0::1;17714:406:1::0;26302:72:0::1;26404:6;26393:7;:17;;26385:69;;;::::0;-1:-1:-1;;;26385:69:0;;18327:2:1;26385:69:0::1;::::0;::::1;18309:21:1::0;18366:2;18346:18;;;18339:30;18405:34;18385:18;;;18378:62;-1:-1:-1;;;18456:18:1;;;18449:37;18503:19;;26385:69:0::1;18125:403:1::0;26385:69:0::1;26465:18;26520:8;26503:12:::0;14049:15:::1;13984:1;14049:2;:15;:::i;:::-;14035:30;::::0;:10:::1;:30;:::i;:::-;26488:27;;;;:::i;:::-;26486:42;;;;:::i;:::-;26465:63:::0;-1:-1:-1;26539:22:0::1;26593:8;26581:7:::0;14049:15:::1;13984:1;14049:2;:15;:::i;:::-;14035:30;::::0;:10:::1;:30;:::i;:::-;26566:22;;;;:::i;:::-;26564:37;;;;:::i;:::-;26612:12;:25:::0;;;26648:16:::1;:33:::0;;;26699:48:::1;::::0;;16668:25:1;;;16724:2;16709:18;;16702:34;;;26648:33:0;;-1:-1:-1;26699:48:0::1;::::0;16641:18:1;26699:48:0::1;16494:248:1::0;19843:221:0;11657:24;11670:10;11657:12;:24::i;:::-;11649:48;;;;-1:-1:-1;;;11649:48:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19932:16:0;::::1;;::::0;;;:6:::1;:16;::::0;;;;;:26;::::1;;:16;::::0;;::::1;:26;;::::0;19924:50:::1;;;;-1:-1:-1::0;;;19924:50:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;19985:16:0;::::1;;::::0;;;:6:::1;:16;::::0;;;;;:25;;-1:-1:-1;;19985:25:0::1;::::0;::::1;;::::0;;::::1;::::0;;;20028:28;;19985:25;;:16;20028:28:::1;::::0;::::1;19843:221:::0;;:::o;27531:617::-;11657:24;11670:10;11657:12;:24::i;:::-;11649:48;;;;-1:-1:-1;;;11649:48:0;;;;;;;:::i;:::-;27653:21:::1;27633:17;27712:43;27742:12:::0;27712:25:::1;27653:21:::0;27726:10;27712:13:::1;:25::i;:43::-;27685:70:::0;-1:-1:-1;27766:20:0::1;27789:23;27685:70:::0;27810:1:::1;27789:20;:23::i;:::-;27835:14;::::0;27766:46;;-1:-1:-1;27823:41:0::1;::::0;-1:-1:-1;;;;;27835:14:0::1;27766:46:::0;27823:11:::1;:41::i;:::-;27887:14;::::0;27875:41:::1;::::0;-1:-1:-1;;;;;27887:14:0::1;27903:12:::0;27875:11:::1;:41::i;:::-;27939:14;::::0;27927:41:::1;::::0;-1:-1:-1;;;;;27939:14:0::1;27955:12:::0;27927:11:::1;:41::i;:::-;27991:14;::::0;27979:41:::1;::::0;-1:-1:-1;;;;;27991:14:0::1;28007:12:::0;27979:11:::1;:41::i;:::-;28059:14;::::0;28075::::1;::::0;28091::::1;::::0;28107::::1;::::0;28038:102:::1;::::0;;-1:-1:-1;;;;;28059:14:0;;::::1;19052:34:1::0;;28075:14:0;;::::1;19117:2:1::0;19102:18;;19095:43;28091:14:0;;::::1;19154:18:1::0;;;19147:43;28107:14:0;;;::::1;19221:2:1::0;19206:18;;19199:43;19273:3;19258:19;;19251:35;;;28038:102:0;;::::1;::::0;;;;19001:3:1;28038:102:0;;::::1;27622:526;;;27531:617:::0;;:::o;12049:107::-;-1:-1:-1;;;;;12129:19:0;12105:4;12129:19;;;:14;:19;;;;;;;;;12049:107::o;22118:372::-;-1:-1:-1;;;;;22246:19:0;;22238:68;;;;-1:-1:-1;;;22238:68:0;;19499:2:1;22238:68:0;;;19481:21:1;19538:2;19518:18;;;19511:30;19577:34;19557:18;;;19550:62;-1:-1:-1;;;19628:18:1;;;19621:34;19672:19;;22238:68:0;19297:400:1;22238:68:0;-1:-1:-1;;;;;22325:21:0;;22317:68;;;;-1:-1:-1;;;22317:68:0;;19904:2:1;22317:68:0;;;19886:21:1;19943:2;19923:18;;;19916:30;19982:34;19962:18;;;19955:62;-1:-1:-1;;;20033:18:1;;;20026:32;20075:19;;22317:68:0;19702:398:1;22317:68:0;-1:-1:-1;;;;;22398:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;22450:32;;2049:25:1;;;22450:32:0;;2022:18:1;22450:32:0;1903:177:1;1648:98:0;1706:7;1733:5;1737:1;1733;:5;:::i;1754:98::-;1812:7;1839:5;1843:1;1839;:5;:::i;1436:98::-;1494:7;1521:5;1525:1;1521;:5;:::i;22498:453::-;22633:24;22660:25;22670:5;22677:7;22660:9;:25::i;:::-;22633:52;;-1:-1:-1;;22700:16:0;:37;22696:248;;22782:6;22762:16;:26;;22754:68;;;;-1:-1:-1;;;22754:68:0;;20307:2:1;22754:68:0;;;20289:21:1;20346:2;20326:18;;;20319:30;20385:31;20365:18;;;20358:59;20434:18;;22754:68:0;20105:353:1;22754:68:0;22866:51;22875:5;22882:7;22910:6;22891:16;:25;22866:8;:51::i;:::-;22622:329;22498:453;;;:::o;22959:1517::-;23048:37;23059:6;23067:9;23078:6;23048:10;:37::i;:::-;-1:-1:-1;;;;;23132:21:0;;23098:12;23132:21;;;:13;:21;;;;;;23113:4;;23132:21;;;:49;;-1:-1:-1;;;;;;23157:24:0;;;;;;:13;:24;;;;;;;;23132:49;23128:429;;;-1:-1:-1;23208:5:0;23128:429;;;23256:14;;;;23248:44;;;;-1:-1:-1;;;23248:44:0;;20665:2:1;23248:44:0;;;20647:21:1;20704:2;20684:18;;;20677:30;-1:-1:-1;;;20723:18:1;;;20716:47;20780:18;;23248:44:0;20463:341:1;23248:44:0;23325:12;;23315:6;:22;;23307:75;;;;-1:-1:-1;;;23307:75:0;;21011:2:1;23307:75:0;;;20993:21:1;21050:2;21030:18;;;21023:30;21089:34;21069:18;;;21062:62;-1:-1:-1;;;21140:18:1;;;21133:38;21188:19;;23307:75:0;20809:404:1;23307:75:0;23414:4;-1:-1:-1;;;;;23401:17:0;:9;-1:-1:-1;;;;;23401:17:0;;23397:147;;23480:16;;-1:-1:-1;;;;;23447:20:0;;;;;;:9;:20;;;;;;:29;;23470:6;;23447:29;:::i;:::-;:49;;23439:89;;;;-1:-1:-1;;;23439:89:0;;21420:2:1;23439:89:0;;;21402:21:1;21459:2;21439:18;;;21432:30;21498:29;21478:18;;;21471:57;21545:18;;23439:89:0;21218:351:1;23439:89:0;23569:31;23626:4;-1:-1:-1;;;;;23616:14:0;:6;-1:-1:-1;;;;;23616:14:0;;23613:392;;23665:19;23647:37;;23723:6;-1:-1:-1;;;;;23702:28:0;:9;-1:-1:-1;;;;;23702:28:0;;;:62;;;;;23753:11;;23734:15;:30;;23702:62;23699:126;;;-1:-1:-1;;;;;23785:17:0;;;;;;:6;:17;;;;;:24;;-1:-1:-1;;23785:24:0;23805:4;23785:24;;;23699:126;23613:392;;;23859:4;-1:-1:-1;;;;;23846:17:0;:9;-1:-1:-1;;;;;23846:17:0;;23842:163;;-1:-1:-1;23898:20:0;23842:163;;;-1:-1:-1;23969:24:0;23842:163;24029:9;;:16;;24043:1;24029:13;:16::i;:::-;24017:9;:28;24059:30;24074:6;24082;24059:14;:30::i;:::-;24056:118;;;24105:29;24120:13;;24105:14;:29::i;:::-;24161:1;24149:9;:13;24056:118;-1:-1:-1;;;;;24206:17:0;;;;;;:9;:17;;;;;;:29;;24228:6;24206:21;:29::i;:::-;-1:-1:-1;;;;;24186:17:0;;;;;;:9;:17;;;;;:49;;;;24271:7;:64;;24329:6;24271:64;;;24281:45;24294:6;24302;24310:15;24281:12;:45::i;:::-;-1:-1:-1;;;;;24369:20:0;;;;;;:9;:20;;;;;;24246:89;;-1:-1:-1;24369:40:0;;24246:89;24369:24;:40::i;:::-;-1:-1:-1;;;;;24346:20:0;;;;;;;:9;:20;;;;;;;:63;;;;24425:43;;;;;;-1:-1:-1;;;;;;;;;;;24425:43:0;;;24453:14;2049:25:1;;2037:2;2022:18;;1903:177;24425:43:0;;;;;;;;23037:1439;;;22959:1517;;;:::o;1542:98::-;1600:7;1627:5;1631:1;1627;:5;:::i;8141:211::-;8285:58;;;-1:-1:-1;;;;;14179:32:1;;8285:58:0;;;14161:51:1;14228:18;;;;14221:34;;;8285:58:0;;;;;;;;;;14134:18:1;;;;8285:58:0;;;;;;;;-1:-1:-1;;;;;8285:58:0;-1:-1:-1;;;8285:58:0;;;8258:86;;8278:5;;8258:19;:86::i;:::-;8141:211;;;:::o;31833:226::-;31911:6;31921:1;31911:11;31908:23;;31833:226;;:::o;31908:23::-;31942:12;31968:9;-1:-1:-1;;;;;31960:23:0;31991:6;31960:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31941:61;;;32021:7;32013:38;;;;-1:-1:-1;;;32013:38:0;;21986:2:1;32013:38:0;;;21968:21:1;22025:2;22005:18;;;21998:30;-1:-1:-1;;;22044:18:1;;;22037:48;22102:18;;32013:38:0;21784:342:1;24484:382:0;-1:-1:-1;;;;;24589:21:0;;;;;;:13;:21;;;;;;;;24588:22;24580:45;;;;-1:-1:-1;;;24580:45:0;;22333:2:1;24580:45:0;;;22315:21:1;22372:2;22352:18;;;22345:30;-1:-1:-1;;;22391:18:1;;;22384:40;22441:18;;24580:45:0;22131:334:1;24580:45:0;-1:-1:-1;;;;;24645:24:0;;;;;;:13;:24;;;;;;;;24644:25;24636:48;;;;-1:-1:-1;;;24636:48:0;;22333:2:1;24636:48:0;;;22315:21:1;22372:2;22352:18;;;22345:30;-1:-1:-1;;;22391:18:1;;;22384:40;22441:18;;24636:48:0;22131:334:1;24636:48:0;24712:1;24703:6;:10;24695:64;;;;-1:-1:-1;;;24695:64:0;;22672:2:1;24695:64:0;;;22654:21:1;22711:2;22691:18;;;22684:30;22750:34;22730:18;;;22723:62;-1:-1:-1;;;22801:18:1;;;22794:39;22850:19;;24695:64:0;22470:405:1;24695:64:0;-1:-1:-1;;;;;18579:18:0;;18562:7;18579:18;;;:9;:18;;;;;;24778:6;:27;;24770:88;;;;-1:-1:-1;;;24770:88:0;;23082:2:1;24770:88:0;;;23064:21:1;23121:2;23101:18;;;23094:30;23160:34;23140:18;;;23133:62;-1:-1:-1;;;23211:18:1;;;23204:47;23268:19;;24770:88:0;22880:413:1;29834:376:0;29956:15;;30032:13;;30022:4;29913;18579:18;;;:9;:18;;;;;;30064:8;;29913:4;;29946:25;;;;-1:-1:-1;30004:41:0;;30064:8;;30063:9;:34;;;;-1:-1:-1;30076:21:0;;;;30063:34;:46;;;;;30101:8;30063:46;:103;;;;;30141:25;;30128:9;;:38;;30063:103;:121;;;;;30170:14;30063:121;:139;;;;;30198:4;-1:-1:-1;;;;;30188:14:0;:6;-1:-1:-1;;;;;30188:14:0;;;30063:139;30056:146;29834:376;-1:-1:-1;;;;;29834:376:0:o;30218:814::-;16997:8;:15;;-1:-1:-1;;16997:15:0;17008:4;16997:15;;;30349:13:::1;::::0;30326:17:::1;::::0;16997:8;;30315:55:::1;::::0;30368:1:::1;::::0;30315:48:::1;::::0;;;:6;;:10:::1;:29::i;:55::-;30289:81:::0;-1:-1:-1;30381:20:0::1;30404:27;:6:::0;30289:81;30404:10:::1;:27::i;:::-;30381:50:::0;-1:-1:-1;30469:21:0::1;30501:30;30381:50:::0;30501:16:::1;:30::i;:::-;30544:20;30567:41;:21;30593:14:::0;30567:25:::1;:41::i;:::-;30544:64;;30619:19;30641:43;30659:24;30681:1;30659:17;;:21;;:24;;;;:::i;:::-;30641:13;::::0;;:17:::1;:43::i;:::-;30619:65:::0;-1:-1:-1;30700:19:0;;30697:141:::1;;30735:90;30748:15;30765:59;30822:1;30765:52;30805:11;30765:35;30782:17;;30765:12;:16;;:35;;;;:::i;:59::-;30735:12;:90::i;:::-;30951:18;::::0;30988:17:::1;::::0;30939:85:::1;::::0;-1:-1:-1;;;;;30951:18:0::1;::::0;30971:52:::1;::::0;31011:11;;30971:35:::1;::::0;:12;;:16:::1;:35::i;:52::-;30939:11;:85::i;:::-;-1:-1:-1::0;;17036:8:0;:16;;-1:-1:-1;;17036:16:0;;;-1:-1:-1;;;;30218:814:0:o;24874:1325::-;24979:7;24999:14;25016:4;:21;25021:15;25016:21;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;25016:21:0;;;24999:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25068:14:0;;;;:6;:14;;;;;;;24999:38;;-1:-1:-1;;25068:14:0;;:32;;;;-1:-1:-1;25086:14:0;;;;;;;25068:32;:71;;25127:3;:12;;;25068:71;;;25103:20;25120:3;14711:5;25103:20;:::i;:::-;25048:91;;25173:9;25186:1;25173:14;25169:60;;25211:6;25204:13;;;;;;25169:60;25239:17;25259:43;14711:5;25260:21;:6;25271:9;25260:10;:21::i;25259:43::-;25239:63;;25313:18;25334:43;25367:9;25335:26;25349:3;:11;;;25335:9;:13;;:26;;;;:::i;25334:43::-;25313:64;;25388:21;25412:46;25448:9;25413:29;25427:3;:14;;;25413:9;:13;;:29;;;;:::i;25412:46::-;25388:70;-1:-1:-1;25471:20:0;25494:44;25388:70;25494:25;:9;25508:10;25494:13;:25::i;:44::-;25471:67;-1:-1:-1;25554:14:0;;25551:176;;14098:42;25612:24;;:9;:24;;;;:40;;25641:10;25612:28;:40::i;:::-;14098:42;25585:24;;;;:9;:24;;;:67;;;;:24;25672:43;-1:-1:-1;;;;;25672:43:0;;;-1:-1:-1;;;;;;;;;;;25672:43:0;;;25704:10;2049:25:1;;2037:2;2022:18;;1903:177;25672:43:0;;;;;;;;25551:176;25740:17;;25737:221;;25831:16;;-1:-1:-1;;;;;25831:16:0;25813:36;;;;:9;:36;;;;;;:55;;25854:13;25813:40;:55::i;:::-;25792:16;;;-1:-1:-1;;;;;25792:16:0;;;25774:36;;;;:9;:36;;;;;;;;;:94;;;;25913:16;;25888:58;;2049:25:1;;;25913:16:0;;;;25888:58;;;;-1:-1:-1;;;;;;;;;;;25888:58:0;2022:18:1;25888:58:0;;;;;;;25737:221;25971:16;;25968:182;;26049:4;26031:24;;;;:9;:24;;;;;;:42;;26060:12;26031:28;:42::i;:::-;26022:4;26004:24;;;;:9;:24;;;;;;;:69;;;;26093:45;;-1:-1:-1;;;;;26093:45:0;;;-1:-1:-1;;;;;;;;;;;26093:45:0;;;26125:12;2049:25:1;;2037:2;2022:18;;1903:177;26093:45:0;;;;;;;;25968:182;26168:21;:6;26179:9;26168:10;:21::i;:::-;26161:28;24874:1325;-1:-1:-1;;;;;;;;;;24874:1325:0:o;10564:716::-;10988:23;11014:69;11042:4;11014:69;;;;;;;;;;;;;;;;;11022:5;-1:-1:-1;;;;;11014:27:0;;;:69;;;;;:::i;:::-;11098:17;;10988:95;;-1:-1:-1;11098:21:0;11094:179;;11195:10;11184:30;;;;;;;;;;;;:::i;:::-;11176:85;;;;-1:-1:-1;;;11176:85:0;;23750:2:1;11176:85:0;;;23732:21:1;23789:2;23769:18;;;23762:30;23828:34;23808:18;;;23801:62;-1:-1:-1;;;23879:18:1;;;23872:40;23929:19;;11176:85:0;23548:406:1;31391:434:0;31481:16;;;31495:1;31481:16;;;;;;;;31457:21;;31481:16;;;;;;;;;;-1:-1:-1;31481:16:0;31457:40;;31526:4;31508;31513:1;31508:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;31508:23:0;;;-1:-1:-1;;;;;31508:23:0;;;;;31552:6;-1:-1:-1;;;;;31552:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31542:4;31547:1;31542:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;31542:23:0;;;-1:-1:-1;;;;;31542:23:0;;;;;31576:53;31593:4;31608:6;31617:11;31576:8;:53::i;:::-;31640:177;;-1:-1:-1;;;31640:177:0;;-1:-1:-1;;;;;31640:6:0;:57;;;;:177;;31712:11;;31738:1;;31754:4;;31781;;31801:15;;31640:177;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31446:379;31391:434;:::o;31040:343::-;31121:53;31138:4;31153:6;31162:11;31121:8;:53::i;:::-;31326:18;;31185:190;;-1:-1:-1;;;31185:190:0;;31248:4;31185:190;;;25417:34:1;25467:18;;;25460:34;;;31294:1:0;25510:18:1;;;25503:34;;;25553:18;;;25546:34;-1:-1:-1;;;;;31326:18:0;;;25596:19:1;;;25589:44;31359:15:0;25649:19:1;;;25642:35;31185:6:0;:22;;;;;;31215:9;;25351:19:1;;31185:190:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;31040:343;;:::o;4075:229::-;4212:12;4244:52;4266:6;4274:4;4280:1;4283:12;4244:21;:52::i;:::-;4237:59;4075:229;-1:-1:-1;;;;4075:229:0:o;4580:455::-;4750:12;4808:5;4783:21;:30;;4775:81;;;;-1:-1:-1;;;4775:81:0;;26201:2:1;4775:81:0;;;26183:21:1;26240:2;26220:18;;;26213:30;26279:34;26259:18;;;26252:62;-1:-1:-1;;;26330:18:1;;;26323:36;26376:19;;4775:81:0;25999:402:1;4775:81:0;4868:12;4882:23;4909:6;-1:-1:-1;;;;;4909:11:0;4928:5;4935:4;4909:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4867:73;;;;4958:69;4985:6;4993:7;5002:10;5014:12;4958:26;:69::i;:::-;4951:76;4580:455;-1:-1:-1;;;;;;;4580:455:0:o;6139:644::-;6324:12;6353:7;6349:427;;;6381:10;:17;6402:1;6381:22;6377:290;;-1:-1:-1;;;;;3516:19:0;;;6591:60;;;;-1:-1:-1;;;6591:60:0;;26887:2:1;6591:60:0;;;26869:21:1;26926:2;26906:18;;;26899:30;26965:31;26945:18;;;26938:59;27014:18;;6591:60:0;26685:353:1;6591:60:0;-1:-1:-1;6688:10:0;6681:17;;6349:427;6731:33;6739:10;6751:12;7265:17;;:21;7261:388;;7497:10;7491:17;7554:15;7541:10;7537:2;7533:19;7526:44;7261:388;7624:12;7617:20;;-1:-1:-1;;;7617:20:0;;;;;;;;:::i;14:258:1:-;86:1;96:113;110:6;107:1;104:13;96:113;;;186:11;;;180:18;167:11;;;160:39;132:2;125:10;96:113;;;227:6;224:1;221:13;218:48;;;-1:-1:-1;;262:1:1;244:16;;237:27;14:258::o;277:383::-;426:2;415:9;408:21;389:4;458:6;452:13;501:6;496:2;485:9;481:18;474:34;517:66;576:6;571:2;560:9;556:18;551:2;543:6;539:15;517:66;:::i;:::-;644:2;623:15;-1:-1:-1;;619:29:1;604:45;;;;651:2;600:54;;277:383;-1:-1:-1;;277:383:1:o;665:131::-;-1:-1:-1;;;;;740:31:1;;730:42;;720:70;;786:1;783;776:12;720:70;665:131;:::o;801:315::-;869:6;877;930:2;918:9;909:7;905:23;901:32;898:52;;;946:1;943;936:12;898:52;985:9;972:23;1004:31;1029:5;1004:31;:::i;:::-;1054:5;1106:2;1091:18;;;;1078:32;;-1:-1:-1;;;801:315:1:o;1313:156::-;1394:20;;1443:1;1433:12;;1423:40;;1459:1;1456;1449:12;1423:40;1313:156;;;:::o;1474:424::-;1580:6;1588;1596;1604;1657:3;1645:9;1636:7;1632:23;1628:33;1625:53;;;1674:1;1671;1664:12;1625:53;1697:42;1729:9;1697:42;:::i;:::-;1687:52;1786:2;1771:18;;1758:32;;-1:-1:-1;1837:2:1;1822:18;;1809:32;;1888:2;1873:18;1860:32;;-1:-1:-1;1474:424:1;-1:-1:-1;;;1474:424:1:o;2085:456::-;2162:6;2170;2178;2231:2;2219:9;2210:7;2206:23;2202:32;2199:52;;;2247:1;2244;2237:12;2199:52;2286:9;2273:23;2305:31;2330:5;2305:31;:::i;:::-;2355:5;-1:-1:-1;2412:2:1;2397:18;;2384:32;2425:33;2384:32;2425:33;:::i;:::-;2085:456;;2477:7;;-1:-1:-1;;;2531:2:1;2516:18;;;;2503:32;;2085:456::o;2546:247::-;2605:6;2658:2;2646:9;2637:7;2633:23;2629:32;2626:52;;;2674:1;2671;2664:12;2626:52;2713:9;2700:23;2732:31;2757:5;2732:31;:::i;2987:671::-;3073:6;3081;3089;3097;3150:3;3138:9;3129:7;3125:23;3121:33;3118:53;;;3167:1;3164;3157:12;3118:53;3206:9;3193:23;3225:31;3250:5;3225:31;:::i;:::-;3275:5;-1:-1:-1;3332:2:1;3317:18;;3304:32;3345:33;3304:32;3345:33;:::i;:::-;3397:7;-1:-1:-1;3456:2:1;3441:18;;3428:32;3469:33;3428:32;3469:33;:::i;:::-;3521:7;-1:-1:-1;3580:2:1;3565:18;;3552:32;3593:33;3552:32;3593:33;:::i;:::-;2987:671;;;;-1:-1:-1;2987:671:1;;-1:-1:-1;;2987:671:1:o;3663:219::-;3742:6;3795:2;3783:9;3774:7;3770:23;3766:32;3763:52;;;3811:1;3808;3801:12;3763:52;3834:42;3866:9;3834:42;:::i;4283:529::-;4360:6;4368;4376;4429:2;4417:9;4408:7;4404:23;4400:32;4397:52;;;4445:1;4442;4435:12;4397:52;4484:9;4471:23;4503:31;4528:5;4503:31;:::i;:::-;4553:5;-1:-1:-1;4610:2:1;4595:18;;4582:32;4623:33;4582:32;4623:33;:::i;:::-;4675:7;-1:-1:-1;4734:2:1;4719:18;;4706:32;4747:33;4706:32;4747:33;:::i;:::-;4799:7;4789:17;;;4283:529;;;;;:::o;4817:118::-;4903:5;4896:13;4889:21;4882:5;4879:32;4869:60;;4925:1;4922;4915:12;4940:382;5005:6;5013;5066:2;5054:9;5045:7;5041:23;5037:32;5034:52;;;5082:1;5079;5072:12;5034:52;5121:9;5108:23;5140:31;5165:5;5140:31;:::i;:::-;5190:5;-1:-1:-1;5247:2:1;5232:18;;5219:32;5260:30;5219:32;5260:30;:::i;:::-;5309:7;5299:17;;;4940:382;;;;;:::o;5327:316::-;5404:6;5412;5420;5473:2;5461:9;5452:7;5448:23;5444:32;5441:52;;;5489:1;5486;5479:12;5441:52;-1:-1:-1;;5512:23:1;;;5582:2;5567:18;;5554:32;;-1:-1:-1;5633:2:1;5618:18;;;5605:32;;5327:316;-1:-1:-1;5327:316:1:o;5648:444::-;5719:6;5727;5735;5788:2;5776:9;5767:7;5763:23;5759:32;5756:52;;;5804:1;5801;5794:12;5756:52;5843:9;5830:23;5862:28;5884:5;5862:28;:::i;:::-;5909:5;-1:-1:-1;5961:2:1;5946:18;;5933:32;;-1:-1:-1;6017:2:1;6002:18;;5989:32;6030:30;5989:32;6030:30;:::i;6097:241::-;6153:6;6206:2;6194:9;6185:7;6181:23;6177:32;6174:52;;;6222:1;6219;6212:12;6174:52;6261:9;6248:23;6280:28;6302:5;6280:28;:::i;6343:367::-;6406:8;6416:6;6470:3;6463:4;6455:6;6451:17;6447:27;6437:55;;6488:1;6485;6478:12;6437:55;-1:-1:-1;6511:20:1;;6554:18;6543:30;;6540:50;;;6586:1;6583;6576:12;6540:50;6623:4;6615:6;6611:17;6599:29;;6683:3;6676:4;6666:6;6663:1;6659:14;6651:6;6647:27;6643:38;6640:47;6637:67;;;6700:1;6697;6690:12;6637:67;6343:367;;;;;:::o;6715:773::-;6837:6;6845;6853;6861;6914:2;6902:9;6893:7;6889:23;6885:32;6882:52;;;6930:1;6927;6920:12;6882:52;6970:9;6957:23;6999:18;7040:2;7032:6;7029:14;7026:34;;;7056:1;7053;7046:12;7026:34;7095:70;7157:7;7148:6;7137:9;7133:22;7095:70;:::i;:::-;7184:8;;-1:-1:-1;7069:96:1;-1:-1:-1;7272:2:1;7257:18;;7244:32;;-1:-1:-1;7288:16:1;;;7285:36;;;7317:1;7314;7307:12;7285:36;;7356:72;7420:7;7409:8;7398:9;7394:24;7356:72;:::i;:::-;6715:773;;;;-1:-1:-1;7447:8:1;-1:-1:-1;;;;6715:773:1:o;7493:180::-;7552:6;7605:2;7593:9;7584:7;7580:23;7576:32;7573:52;;;7621:1;7618;7611:12;7573:52;-1:-1:-1;7644:23:1;;7493:180;-1:-1:-1;7493:180:1:o;7886:446::-;7969:6;7977;7985;7993;8046:3;8034:9;8025:7;8021:23;8017:33;8014:53;;;8063:1;8060;8053:12;8014:53;8102:9;8089:23;8121:28;8143:5;8121:28;:::i;8337:388::-;8405:6;8413;8466:2;8454:9;8445:7;8441:23;8437:32;8434:52;;;8482:1;8479;8472:12;8434:52;8521:9;8508:23;8540:31;8565:5;8540:31;:::i;:::-;8590:5;-1:-1:-1;8647:2:1;8632:18;;8619:32;8660:33;8619:32;8660:33;:::i;8990:248::-;9058:6;9066;9119:2;9107:9;9098:7;9094:23;9090:32;9087:52;;;9135:1;9132;9125:12;9087:52;-1:-1:-1;;9158:23:1;;;9228:2;9213:18;;;9200:32;;-1:-1:-1;8990:248:1:o;9467:329::-;9669:2;9651:21;;;9708:1;9688:18;;;9681:29;-1:-1:-1;;;9741:2:1;9726:18;;9719:36;9787:2;9772:18;;9467:329::o;10157:127::-;10218:10;10213:3;10209:20;10206:1;10199:31;10249:4;10246:1;10239:15;10273:4;10270:1;10263:15;10959:127;11020:10;11015:3;11011:20;11008:1;11001:31;11051:4;11048:1;11041:15;11075:4;11072:1;11065:15;11091:422;11180:1;11223:5;11180:1;11237:270;11258:7;11248:8;11245:21;11237:270;;;11317:4;11313:1;11309:6;11305:17;11299:4;11296:27;11293:53;;;11326:18;;:::i;:::-;11376:7;11366:8;11362:22;11359:55;;;11396:16;;;;11359:55;11475:22;;;;11435:15;;;;11237:270;;;11241:3;11091:422;;;;;:::o;11518:806::-;11567:5;11597:8;11587:80;;-1:-1:-1;11638:1:1;11652:5;;11587:80;11686:4;11676:76;;-1:-1:-1;11723:1:1;11737:5;;11676:76;11768:4;11786:1;11781:59;;;;11854:1;11849:130;;;;11761:218;;11781:59;11811:1;11802:10;;11825:5;;;11849:130;11886:3;11876:8;11873:17;11870:43;;;11893:18;;:::i;:::-;-1:-1:-1;;11949:1:1;11935:16;;11964:5;;11761:218;;12063:2;12053:8;12050:16;12044:3;12038:4;12035:13;12031:36;12025:2;12015:8;12012:16;12007:2;12001:4;11998:12;11994:35;11991:77;11988:159;;;-1:-1:-1;12100:19:1;;;12132:5;;11988:159;12179:34;12204:8;12198:4;12179:34;:::i;:::-;12249:6;12245:1;12241:6;12237:19;12228:7;12225:32;12222:58;;;12260:18;;:::i;:::-;12298:20;;11518:806;-1:-1:-1;;;11518:806:1:o;12329:140::-;12387:5;12416:47;12457:4;12447:8;12443:19;12437:4;12416:47;:::i;12474:168::-;12514:7;12580:1;12576;12572:6;12568:14;12565:1;12562:21;12557:1;12550:9;12543:17;12539:45;12536:71;;;12587:18;;:::i;:::-;-1:-1:-1;12627:9:1;;12474:168::o;12647:335::-;12849:2;12831:21;;;12888:2;12868:18;;;12861:30;-1:-1:-1;;;12922:2:1;12907:18;;12900:41;12973:2;12958:18;;12647:335::o;12987:336::-;13189:2;13171:21;;;13228:2;13208:18;;;13201:30;-1:-1:-1;;;13262:2:1;13247:18;;13240:42;13314:2;13299:18;;12987:336::o;13798:184::-;13868:6;13921:2;13909:9;13900:7;13896:23;13892:32;13889:52;;;13937:1;13934;13927:12;13889:52;-1:-1:-1;13960:16:1;;13798:184;-1:-1:-1;13798:184:1:o;14266:128::-;14306:3;14337:1;14333:6;14330:1;14327:13;14324:39;;;14343:18;;:::i;:::-;-1:-1:-1;14379:9:1;;14266:128::o;14788:335::-;14990:2;14972:21;;;15029:2;15009:18;;;15002:30;-1:-1:-1;;;15063:2:1;15048:18;;15041:41;15114:2;15099:18;;14788:335::o;15484:251::-;15554:6;15607:2;15595:9;15586:7;15582:23;15578:32;15575:52;;;15623:1;15620;15613:12;15575:52;15655:9;15649:16;15674:31;15699:5;15674:31;:::i;15740:125::-;15780:4;15808:1;15805;15802:8;15799:34;;;15813:18;;:::i;:::-;-1:-1:-1;15850:9:1;;15740:125::o;16222:127::-;16283:10;16278:3;16274:20;16271:1;16264:31;16314:4;16311:1;16304:15;16338:4;16335:1;16328:15;16354:135;16393:3;16414:17;;;16411:43;;16434:18;;:::i;:::-;-1:-1:-1;16481:1:1;16470:13;;16354:135::o;18533:217::-;18573:1;18599;18589:132;;18643:10;18638:3;18634:20;18631:1;18624:31;18678:4;18675:1;18668:15;18706:4;18703:1;18696:15;18589:132;-1:-1:-1;18735:9:1;;18533:217::o;23298:245::-;23365:6;23418:2;23406:9;23397:7;23393:23;23389:32;23386:52;;;23434:1;23431;23424:12;23386:52;23466:9;23460:16;23485:28;23507:5;23485:28;:::i;24091:980::-;24353:4;24401:3;24390:9;24386:19;24432:6;24421:9;24414:25;24458:2;24496:6;24491:2;24480:9;24476:18;24469:34;24539:3;24534:2;24523:9;24519:18;24512:31;24563:6;24598;24592:13;24629:6;24621;24614:22;24667:3;24656:9;24652:19;24645:26;;24706:2;24698:6;24694:15;24680:29;;24727:1;24737:195;24751:6;24748:1;24745:13;24737:195;;;24816:13;;-1:-1:-1;;;;;24812:39:1;24800:52;;24907:15;;;;24872:12;;;;24848:1;24766:9;24737:195;;;-1:-1:-1;;;;;;;24988:32:1;;;;24983:2;24968:18;;24961:60;-1:-1:-1;;;25052:3:1;25037:19;25030:35;24949:3;24091:980;-1:-1:-1;;;24091:980:1:o;25688:306::-;25776:6;25784;25792;25845:2;25833:9;25824:7;25820:23;25816:32;25813:52;;;25861:1;25858;25851:12;25813:52;25890:9;25884:16;25874:26;;25940:2;25929:9;25925:18;25919:25;25909:35;;25984:2;25973:9;25969:18;25963:25;25953:35;;25688:306;;;;;:::o;26406:274::-;26535:3;26573:6;26567:13;26589:53;26635:6;26630:3;26623:4;26615:6;26611:17;26589:53;:::i;:::-;26658:16;;;;;26406:274;-1:-1:-1;;26406:274:1:o

Swarm Source

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