ETH Price: $2,893.31 (-10.20%)
Gas: 14 Gwei

Token

SAJA (SJA)
 

Overview

Max Total Supply

1,000,000,000,000,000,000 SJA

Holders

2,072 (0.00%)

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
17,981,469,029,093.929445508 SJA

Value
$0.00
0x80ff59d3518ca8954c5c2a642fc3d553486a9bbd
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:
Saja

Compiler Version
v0.8.12+commit.f00d7308

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

pragma solidity ^0.8.12;
// SPDX-License-Identifier: Unlicensed
interface IERC20 {

    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}



/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */

library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

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

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

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

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


/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != accountHash && codehash != 0x0);
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

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

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return _functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    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");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        return _functionCallWithValue(target, data, value, errorMessage);
    }

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

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

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

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
    * @dev Leaves the contract without owner. It will not be possible to call
    * `onlyOwner` functions anymore. Can only be called by the current owner.
    *
    * NOTE: Renouncing ownership will leave the contract without an owner,
    * thereby removing any functionality that is only available to the owner.
    */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }

}

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

interface IUniswapV2Router02 {
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    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);
}

contract Saja is Context, IERC20, Ownable {
    using SafeMath for uint256;
    using Address for address;

    event SwapAndLiquifyEnabledUpdated(bool enabled);
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqudity
    );

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

    mapping (address => uint256) private _rOwned;
    mapping (address => uint256) private _tOwned;
    mapping (address => mapping (address => uint256)) private _allowances;
    mapping (address => bool) private botWallets;
    mapping (address => bool) private _isExcludedFromFee;
    mapping (address => bool) private isExchangeWallet;

    uint256 private constant MAX = ~uint256(0);
    uint256 private _tTotal = 1000000000000 * 10 ** 6 * 10 ** 9;
    uint256 private _rTotal = (MAX - (MAX % _tTotal));
    uint256 private _tFeeTotal;

    string private _name = "SAJA";
    string private _symbol = "SJA";
    uint8 private _decimals = 9;
    bool private tradingOpen = false;
    IUniswapV2Router02 public uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
    address public uniswapV2Pair = address(0);
    bool inSwapAndLiquify;
    bool public swapAndLiquifyEnabled = true;
    uint256 public numTokensSellToAddToLiquidity = 200000000000000 * 10**9;
    uint256 private _largeSellNumOfTokens = 1000000000000000 * 10**9;
    address public marketingWallet = 0x31B57AbebC76bdDbd24eDE95af389864cD946504;
    address public charityWallet = 0x5DaD183635A9e2D9DF33f75D8eE7B1f8347d218C;
    address public devWallet = 0x23ddF6552cAC65aDB710bBB0906F6a838C5FB5D2;
    address public deadWallet = 0x000000000000000000000000000000000000dEaD;

    struct Distribution {
        uint256 sharePercentage;
        uint256 marketingFeePercentage;
        uint256 charityFeePercentage;
        uint256 devFeePercentage;
    }

    struct TaxFees {
        uint256 reflectionFee;
        uint256 liquidityFee;
        uint256 sellReflectionFee;
        uint256 sellLiquidityFee;
        uint256 superSellOffFee;
    }
    bool private doTakeFees;
    bool private isSellTxn;
    TaxFees public taxFees;
    Distribution public distribution;
    
    constructor () {
        _rOwned[_msgSender()] = _rTotal;
        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[_msgSender()] = true;
        _isExcludedFromFee[marketingWallet] = true;
        _isExcludedFromFee[charityWallet] = true;
        _isExcludedFromFee[devWallet] = true;
        taxFees = TaxFees(1,7,1,1,10);
        distribution = Distribution(60, 50, 25, 25);

        emit Transfer(address(0), _msgSender(), _tTotal);
    }

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

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

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

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

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

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

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

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

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

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

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

    function totalFees() public view returns (uint256) {
        return _tFeeTotal;
    }

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

    function deliver(uint256 tAmount) public {
        address sender = _msgSender();
        (uint256 rAmount,,,,,) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rTotal = _rTotal.sub(rAmount);
        _tFeeTotal = _tFeeTotal.add(tAmount);
    }

    function reflectionFromToken(uint256 tAmount, bool deductTransferFee) public view returns(uint256) {
        require(tAmount <= _tTotal, "Amount must be less than supply");
        if (!deductTransferFee) {
            (uint256 rAmount,,,,,) = _getValues(tAmount);
            return rAmount;
        } else {
            (,uint256 rTransferAmount,,,,) = _getValues(tAmount);
            return rTransferAmount;
        }
    }

    function tokenFromReflection(uint256 rAmount) public view returns(uint256) {
        require(rAmount <= _rTotal, "Amount must be less than total reflections");
        uint256 currentRate =  _getRate();
        return rAmount.div(currentRate);
    }

    function excludeFromFee(address[] calldata addresses) public onlyOwner {
        addRemoveFee(addresses, true);
    }

    function includeInFee(address[] calldata addresses) public onlyOwner {
        addRemoveFee(addresses, false);
    }

    function addExchange(address[] calldata addresses) public onlyOwner {
        addRemoveExchange(addresses, true);
    }

    function removeExchange(address[] calldata addresses) public onlyOwner {
        addRemoveExchange(addresses, false);
    }

    function createV2Pair() external onlyOwner {
        require(uniswapV2Pair == address(0),"UniswapV2Pair has already been set");
        uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(address(this), uniswapV2Router.WETH());
    }
    function addRemoveExchange(address[] calldata addresses, bool flag) private {
        for (uint256 i = 0; i < addresses.length; i++) {
            address addr = addresses[i];
            isExchangeWallet[addr] = flag;
        }
    }

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

    function setLargeSellNumOfTokens(uint256 largeSellNumOfTokens) external onlyOwner {
        _largeSellNumOfTokens = largeSellNumOfTokens * 10**9;
    }

    function setTaxFees(uint256 reflectionFee, uint256 liquidityFee, uint256 sellReflectionFee, uint256 sellLiquidityFee, uint256 superSellOffFee) external onlyOwner {
        taxFees.reflectionFee = reflectionFee;
        taxFees.liquidityFee = liquidityFee;
        taxFees.sellLiquidityFee = sellLiquidityFee;
        taxFees.sellReflectionFee = sellReflectionFee;
        taxFees.superSellOffFee = superSellOffFee;
    }

    function setDistribution(uint256 marketingFeePercentage, uint256 charityFeePercentage, uint256 devFeePercentage,
        uint256 sharePercentage) external onlyOwner {
        require(marketingFeePercentage.add(charityFeePercentage).add(devFeePercentage) == 100, "Fee percentage must equal 100");
        distribution.marketingFeePercentage = marketingFeePercentage;
        distribution.charityFeePercentage = charityFeePercentage;
        distribution.devFeePercentage = devFeePercentage;
        distribution.sharePercentage = sharePercentage;
    }

    function setNumTokensToSell(uint256 numTokensSellToAddToLiquidity_) external onlyOwner {
        numTokensSellToAddToLiquidity = numTokensSellToAddToLiquidity_ * 10**9;
    }

    function setWallets(address _marketingWallet, address _charityWallet, address _devWallet) external onlyOwner {
        marketingWallet = _marketingWallet;
        charityWallet = _charityWallet;
        devWallet = _devWallet;
    }

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

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

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

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

    function getContractTokenBalance() public view returns (uint256) {
        return balanceOf(address(this));
    }

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

    receive() external payable {}

    function _reflectFee(uint256 rFee, uint256 tFee) private {
        _rTotal = _rTotal.sub(rFee);
        _tFeeTotal = _tFeeTotal.add(tFee);
    }

    function _getValues(uint256 tAmount) private view returns (uint256, uint256, uint256, uint256, uint256, uint256) {
        (uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getTValues(tAmount);
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(tAmount, tFee, tLiquidity, _getRate());
        return (rAmount, rTransferAmount, rFee, tTransferAmount, tFee, tLiquidity);
    }

    function _getTValues(uint256 tAmount) private view returns (uint256, uint256, uint256) {
        uint256 tFee = calculateTaxFee(tAmount);
        uint256 tLiquidity = calculateLiquidityFee(tAmount);
        uint256 tTransferAmount = tAmount.sub(tFee).sub(tLiquidity);
        return (tTransferAmount, tFee, tLiquidity);
    }

    function _getRValues(uint256 tAmount, uint256 tFee, uint256 tLiquidity, uint256 currentRate) private pure returns (uint256, uint256, uint256) {
        uint256 rAmount = tAmount.mul(currentRate);
        uint256 rFee = tFee.mul(currentRate);
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        uint256 rTransferAmount = rAmount.sub(rFee).sub(rLiquidity);
        return (rAmount, rTransferAmount, rFee);
    }

    function _getRate() private view returns(uint256) {
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
        return rSupply.div(tSupply);
    }

    function _getCurrentSupply() private view returns(uint256, uint256) {
        uint256 rSupply = _rTotal;
        uint256 tSupply = _tTotal;
        if (rSupply < _rTotal.div(_tTotal)) return (_rTotal, _tTotal);
        return (rSupply, tSupply);
    }

    function _takeLiquidity(uint256 tLiquidity) private {
        uint256 currentRate =  _getRate();
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        _rOwned[address(this)] = _rOwned[address(this)].add(rLiquidity);
    }

    function calculateTaxFee(uint256 _amount) private view returns (uint256) {
        uint256 reflectionFee = 0;
        if(doTakeFees) {
            reflectionFee = taxFees.reflectionFee;
            if(isSellTxn) {
                reflectionFee = reflectionFee.add(taxFees.sellReflectionFee);
            }
        }
        return _amount.mul(reflectionFee).div(10**2);
    }

    function calculateLiquidityFee(uint256 _amount) private view returns (uint256) {
        uint256 totalLiquidityFee = 0;
        if(doTakeFees) {
            totalLiquidityFee = taxFees.liquidityFee;
            if(isSellTxn) {
                totalLiquidityFee = totalLiquidityFee.add(taxFees.sellLiquidityFee);
                if(_amount >= _largeSellNumOfTokens) {
                    totalLiquidityFee = totalLiquidityFee.add(taxFees.superSellOffFee);
                }
            }
        }
        return _amount.mul(totalLiquidityFee).div(10**2);
    }

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

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

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

    function _transfer(address from, address to, uint256 amount) private {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
        require(uniswapV2Pair != address(0),"UniswapV2Pair has not been set");
        bool isSell = false;

        //block the bots, but allow them to transfer to dead wallet if they are blocked
        if(from != owner() && to != owner() && to != deadWallet) {
            require(!botWallets[from] && !botWallets[to], "bots are not allowed to sell or transfer tokens");
        }
        bool takeFees = !_isExcludedFromFee[from] && !_isExcludedFromFee[to] && from != owner() && to != owner();

        if(from != uniswapV2Pair && to == uniswapV2Pair || (!isExchangeWallet[from] && isExchangeWallet[to])) { //if sell
            //only tax if tokens are going back to Uniswap
            isSell = true;
            sellTaxTokens();
        }
        if(from != uniswapV2Pair && to != uniswapV2Pair && !isExchangeWallet[from] && !isExchangeWallet[to]) {
            takeFees = false;
        }
        _tokenTransfer(from, to, amount, takeFees, isSell);
    }

    function sellTaxTokens() private {
        uint256 contractTokenBalance = balanceOf(address(this));
        if (contractTokenBalance >= numTokensSellToAddToLiquidity && !inSwapAndLiquify && swapAndLiquifyEnabled) {
            //distribution shares is the percentage to be shared between marketing, charity, and dev wallets
            //remainder will be for the liquidity pool
            uint256 balanceToShareTokens = contractTokenBalance.mul(distribution.sharePercentage).div(100);
            uint256 liquidityPoolTokens = contractTokenBalance.sub(balanceToShareTokens);

            //just in case distribution Share Percentage is set to 100%, there will be no tokens to be swapped for liquidity pool
            if(liquidityPoolTokens > 0) {
                //add liquidity
                swapAndLiquify(liquidityPoolTokens);
            }
            //send eth to wallets (marketing, charity, dev)
            distributeShares(balanceToShareTokens);
        }
    }

    function swapAndLiquify(uint256 contractTokenBalance) private lockTheSwap {
        uint256 half = contractTokenBalance.div(2);
        uint256 otherHalf = contractTokenBalance.sub(half);
        uint256 initialBalance = address(this).balance;
        swapTokensForEth(half);
        uint256 newBalance = address(this).balance.sub(initialBalance);
        addLiquidity(otherHalf, newBalance);
        emit SwapAndLiquify(half, newBalance, otherHalf);
    }

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // add the liquidity
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            owner(),
            block.timestamp
        );
    }
    function distributeShares(uint256 balanceToShareTokens) private lockTheSwap {
        swapTokensForEth(balanceToShareTokens);
        uint256 balanceToShare = address(this).balance;
        uint256 marketingShare = balanceToShare.mul(distribution.marketingFeePercentage).div(100);
        uint256 charityShare = balanceToShare.mul(distribution.charityFeePercentage).div(100);
        uint256 devShare = balanceToShare.mul(distribution.devFeePercentage).div(100);
        payable(marketingWallet).transfer(marketingShare);
        payable(charityWallet).transfer(charityShare);
        payable(devWallet).transfer(devShare);

    }

    function swapTokensForEth(uint256 tokenAmount) private {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }

    //this method is responsible for taking all fee, if takeFee is true
    function _tokenTransfer(address sender, address recipient, uint256 amount, bool takeFees, bool isSell) private {
        doTakeFees = takeFees;
        isSellTxn = isSell;
        _transferStandard(sender, recipient, amount);
    }

    function _transferStandard(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"addExchange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"newholders","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"airDrops","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"blockAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"charityWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"createV2Pair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deadWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"}],"name":"deliver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"distribution","outputs":[{"internalType":"uint256","name":"sharePercentage","type":"uint256"},{"internalType":"uint256","name":"marketingFeePercentage","type":"uint256"},{"internalType":"uint256","name":"charityFeePercentage","type":"uint256"},{"internalType":"uint256","name":"devFeePercentage","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getContractTokenBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isAddressBlocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numTokensSellToAddToLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"removeExchange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketingFeePercentage","type":"uint256"},{"internalType":"uint256","name":"charityFeePercentage","type":"uint256"},{"internalType":"uint256","name":"devFeePercentage","type":"uint256"},{"internalType":"uint256","name":"sharePercentage","type":"uint256"}],"name":"setDistribution","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"largeSellNumOfTokens","type":"uint256"}],"name":"setLargeSellNumOfTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numTokensSellToAddToLiquidity_","type":"uint256"}],"name":"setNumTokensToSell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"reflectionFee","type":"uint256"},{"internalType":"uint256","name":"liquidityFee","type":"uint256"},{"internalType":"uint256","name":"sellReflectionFee","type":"uint256"},{"internalType":"uint256","name":"sellLiquidityFee","type":"uint256"},{"internalType":"uint256","name":"superSellOffFee","type":"uint256"}],"name":"setTaxFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_marketingWallet","type":"address"},{"internalType":"address","name":"_charityWallet","type":"address"},{"internalType":"address","name":"_devWallet","type":"address"}],"name":"setWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxFees","outputs":[{"internalType":"uint256","name":"reflectionFee","type":"uint256"},{"internalType":"uint256","name":"liquidityFee","type":"uint256"},{"internalType":"uint256","name":"sellReflectionFee","type":"uint256"},{"internalType":"uint256","name":"sellLiquidityFee","type":"uint256"},{"internalType":"uint256","name":"superSellOffFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"unblockAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526b033b2e3c9fd0803ce8000000600755600754600019620000269190620008b8565b6000196200003591906200091f565b6008556040518060400160405280600481526020017f53414a4100000000000000000000000000000000000000000000000000000000815250600a908051906020019062000085929190620007cf565b506040518060400160405280600381526020017f534a410000000000000000000000000000000000000000000000000000000000815250600b9080519060200190620000d3929190620007cf565b506009600c60006101000a81548160ff021916908360ff1602179055506000600c60016101000a81548160ff021916908315150217905550737a250d5630b4cf539739df2c5dacb4c659f2488d600c60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600d60156101000a81548160ff021916908315150217905550692a5a058fc295ed000000600e5569d3c21bcecceda1000000600f557331b57abebc76bddbd24ede95af389864cd946504601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550735dad183635a9e2d9df33f75d8ee7b1f8347d218c601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507323ddf6552cac65adb710bbb0906f6a838c5fb5d2601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061dead601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200032857600080fd5b5060006200033b6200079e60201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35060085460016000620003f06200079e60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060016005600062000444620007a660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160056000620004ab6200079e60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160056000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160056000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160056000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506040518060a0016040528060018152602001600781526020016001815260200160018152602001600a815250601460008201518160000155602082015181600101556040820151816002015560608201518160030155608082015181600401559050506040518060800160405280603c8152602001603281526020016019815260200160198152506019600082015181600001556020820151816001015560408201518160020155606082015181600301559050506200072f6200079e60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6007546040516200079091906200096b565b60405180910390a3620009ed565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620007dd90620009b7565b90600052602060002090601f0160209004810192826200080157600085556200084d565b82601f106200081c57805160ff19168380011785556200084d565b828001600101855582156200084d579182015b828111156200084c5782518255916020019190600101906200082f565b5b5090506200085c919062000860565b5090565b5b808211156200087b57600081600090555060010162000861565b5090565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000620008c5826200087f565b9150620008d2836200087f565b925082620008e557620008e462000889565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200092c826200087f565b915062000939836200087f565b9250828210156200094f576200094e620008f0565b5b828203905092915050565b62000965816200087f565b82525050565b60006020820190506200098260008301846200095a565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620009d057607f821691505b60208210811415620009e757620009e662000988565b5b50919050565b61568380620009fd6000396000f3fe6080604052600436106102765760003560e01c8063715018a61161014f5780639b0e2e86116100c1578063d12a76881161007a578063d12a768814610978578063dc0aa9cf146109a3578063dcda6af3146109cc578063dd62ed3e146109f5578063e7dad4f914610a32578063f2fde38b14610a6f5761027d565b80639b0e2e861461086c578063a457c2d714610895578063a9059cbb146108d2578063ab0d8b851461090f578063b6a9987214610938578063c49b9a801461094f5761027d565b80637ca2ea44116101135780637ca2ea441461076e57806385141a771461079757806385d4787b146107c25780638da5cb5b146107eb5780638ea5220f1461081657806395d89b41146108415761027d565b8063715018a6146106af57806371b9189c146106c657806375cb1bd1146106ef57806375f0a874146107185780637b208769146107435761027d565b8063313ce567116101e857806349bd5a5e116101ac57806349bd5a5e146105885780634a74bb02146105b35780635342acb4146105de57806354ed2dc21461061b5780635ee58efc1461064457806370a08231146106725761027d565b8063313ce5671461048f578063317d9453146104ba57806339509351146104e55780633bd5d173146105225780634549b0391461054b5761027d565b80630fc709e51161023a5780630fc709e51461036b57806313114a9d146103945780631694505e146103bf57806318160ddd146103ea57806323b872dd146104155780632d838119146104525761027d565b8063024022f714610282578063035ae135146102ab57806306fdde03146102d4578063095ea7b3146102ff5780630ddc09761461033c5761027d565b3661027d57005b600080fd5b34801561028e57600080fd5b506102a960048036038101906102a49190613f3a565b610a98565b005b3480156102b757600080fd5b506102d260048036038101906102cd9190613f3a565b610b3d565b005b3480156102e057600080fd5b506102e9610be2565b6040516102f69190614020565b60405180910390f35b34801561030b57600080fd5b50610326600480360381019061032191906140d6565b610c74565b6040516103339190614131565b60405180910390f35b34801561034857600080fd5b50610351610c92565b60405161036295949392919061415b565b60405180910390f35b34801561037757600080fd5b50610392600480360381019061038d91906141ae565b610cb6565b005b3480156103a057600080fd5b506103a9610de0565b6040516103b69190614215565b60405180910390f35b3480156103cb57600080fd5b506103d4610dea565b6040516103e1919061428f565b60405180910390f35b3480156103f657600080fd5b506103ff610e10565b60405161040c9190614215565b60405180910390f35b34801561042157600080fd5b5061043c600480360381019061043791906142aa565b610e1a565b6040516104499190614131565b60405180910390f35b34801561045e57600080fd5b50610479600480360381019061047491906142fd565b610ef3565b6040516104869190614215565b60405180910390f35b34801561049b57600080fd5b506104a4610f61565b6040516104b19190614346565b60405180910390f35b3480156104c657600080fd5b506104cf610f78565b6040516104dc9190614215565b60405180910390f35b3480156104f157600080fd5b5061050c600480360381019061050791906140d6565b610f88565b6040516105199190614131565b60405180910390f35b34801561052e57600080fd5b50610549600480360381019061054491906142fd565b61103b565b005b34801561055757600080fd5b50610572600480360381019061056d919061438d565b611129565b60405161057f9190614215565b60405180910390f35b34801561059457600080fd5b5061059d6111ad565b6040516105aa91906143dc565b60405180910390f35b3480156105bf57600080fd5b506105c86111d3565b6040516105d59190614131565b60405180910390f35b3480156105ea57600080fd5b50610605600480360381019061060091906143f7565b6111e6565b6040516106129190614131565b60405180910390f35b34801561062757600080fd5b50610642600480360381019061063d91906142fd565b61123c565b005b34801561065057600080fd5b506106596112ea565b6040516106699493929190614424565b60405180910390f35b34801561067e57600080fd5b50610699600480360381019061069491906143f7565b611308565b6040516106a69190614215565b60405180910390f35b3480156106bb57600080fd5b506106c4611359565b005b3480156106d257600080fd5b506106ed60048036038101906106e89190613f3a565b6114ac565b005b3480156106fb57600080fd5b5061071660048036038101906107119190614469565b611551565b005b34801561072457600080fd5b5061072d6116ae565b60405161073a91906143dc565b60405180910390f35b34801561074f57600080fd5b506107586116d4565b60405161076591906143dc565b60405180910390f35b34801561077a57600080fd5b50610795600480360381019061079091906142fd565b6116fa565b005b3480156107a357600080fd5b506107ac6117a8565b6040516107b991906143dc565b60405180910390f35b3480156107ce57600080fd5b506107e960048036038101906107e491906145fa565b6117ce565b005b3480156107f757600080fd5b50610800611871565b60405161080d91906143dc565b60405180910390f35b34801561082257600080fd5b5061082b61189a565b60405161083891906143dc565b60405180910390f35b34801561084d57600080fd5b506108566118c0565b6040516108639190614020565b60405180910390f35b34801561087857600080fd5b50610893600480360381019061088e91906145fa565b611952565b005b3480156108a157600080fd5b506108bc60048036038101906108b791906140d6565b6119f5565b6040516108c99190614131565b60405180910390f35b3480156108de57600080fd5b506108f960048036038101906108f491906140d6565b611ac2565b6040516109069190614131565b60405180910390f35b34801561091b57600080fd5b5061093660048036038101906109319190613f3a565b611ae0565b005b34801561094457600080fd5b5061094d611b85565b005b34801561095b57600080fd5b5061097660048036038101906109719190614643565b611e8b565b005b34801561098457600080fd5b5061098d611f74565b60405161099a9190614215565b60405180910390f35b3480156109af57600080fd5b506109ca60048036038101906109c59190614670565b611f7a565b005b3480156109d857600080fd5b506109f360048036038101906109ee9190614741565b612048565b005b348015610a0157600080fd5b50610a1c6004803603810190610a1791906147c2565b6121b0565b604051610a299190614215565b60405180910390f35b348015610a3e57600080fd5b50610a596004803603810190610a5491906143f7565b612237565b604051610a669190614131565b60405180910390f35b348015610a7b57600080fd5b50610a966004803603810190610a9191906143f7565b61228d565b005b610aa061244f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b249061484e565b60405180910390fd5b610b3982826000612457565b5050565b610b4561244f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610bd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc99061484e565b60405180910390fd5b610bde82826001612502565b5050565b6060600a8054610bf19061489d565b80601f0160208091040260200160405190810160405280929190818152602001828054610c1d9061489d565b8015610c6a5780601f10610c3f57610100808354040283529160200191610c6a565b820191906000526020600020905b815481529060010190602001808311610c4d57829003601f168201915b5050505050905090565b6000610c88610c8161244f565b84846125ad565b6001905092915050565b60148060000154908060010154908060020154908060030154908060040154905085565b610cbe61244f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d429061484e565b60405180910390fd5b6064610d7283610d64868861277890919063ffffffff16565b61277890919063ffffffff16565b14610db2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da99061491b565b60405180910390fd5b8360196001018190555082601960020181905550816019600301819055508060196000018190555050505050565b6000600954905090565b600c60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600754905090565b6000610e278484846127d6565b610ee884610e3361244f565b610ee38560405180606001604052806028815260200161560160289139600360008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610e9961244f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612f499092919063ffffffff16565b6125ad565b600190509392505050565b6000600854821115610f3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f31906149ad565b60405180910390fd5b6000610f44612fad565b9050610f598184612fd890919063ffffffff16565b915050919050565b6000600c60009054906101000a900460ff16905090565b6000610f8330611308565b905090565b6000611031610f9561244f565b8461102c8560036000610fa661244f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461277890919063ffffffff16565b6125ad565b6001905092915050565b600061104561244f565b9050600061105283613022565b505050505090506110ab81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461307e90919063ffffffff16565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506111038160085461307e90919063ffffffff16565b60088190555061111e8360095461277890919063ffffffff16565b600981905550505050565b6000600754831115611170576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116790614a19565b60405180910390fd5b8161119057600061118084613022565b50505050509050809150506111a7565b600061119b84613022565b50505050915050809150505b92915050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d60159054906101000a900460ff1681565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b61124461244f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146112d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c89061484e565b60405180910390fd5b633b9aca00816112e19190614a68565b600f8190555050565b60198060000154908060010154908060020154908060030154905084565b6000611352600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610ef3565b9050919050565b61136161244f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146113ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e59061484e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6114b461244f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611541576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115389061484e565b60405180910390fd5b61154d82826001612457565b5050565b61155961244f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146115e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115dd9061484e565b60405180910390fd5b82601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61170261244f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461178f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117869061484e565b60405180910390fd5b633b9aca008161179f9190614a68565b600e8190555050565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6117d661244f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611863576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185a9061484e565b60405180910390fd5b61186e8160016130c8565b50565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600b80546118cf9061489d565b80601f01602080910402602001604051908101604052809291908181526020018280546118fb9061489d565b80156119485780601f1061191d57610100808354040283529160200191611948565b820191906000526020600020905b81548152906001019060200180831161192b57829003601f168201915b5050505050905090565b61195a61244f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146119e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119de9061484e565b60405180910390fd5b6119f28160006130c8565b50565b6000611ab8611a0261244f565b84611ab3856040518060600160405280602581526020016156296025913960036000611a2c61244f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612f499092919063ffffffff16565b6125ad565b6001905092915050565b6000611ad6611acf61244f565b84846127d6565b6001905092915050565b611ae861244f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611b75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6c9061484e565b60405180910390fd5b611b8182826000612502565b5050565b611b8d61244f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611c1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c119061484e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611cab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca290614b34565b60405180910390fd5b600c60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d3c9190614b69565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630600c60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611dc5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611de99190614b69565b6040518363ffffffff1660e01b8152600401611e06929190614b96565b6020604051808303816000875af1158015611e25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e499190614b69565b600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b611e9361244f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611f20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f179061484e565b60405180910390fd5b80600d60156101000a81548160ff0219169083151502179055507f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15981604051611f699190614131565b60405180910390a150565b600e5481565b611f8261244f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461200f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120069061484e565b60405180910390fd5b84601460000181905550836014600101819055508160146003018190555082601460020181905550806014600401819055505050505050565b60006005600061205661244f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166120dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d490614c31565b60405180910390fd5b828290508585905014612125576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211c90614cc3565b60405180910390fd5b5b848490508110156121a95761219561213c61244f565b86868481811061214f5761214e614ce3565b5b905060200201602081019061216491906143f7565b633b9aca0086868681811061217c5761217b614ce3565b5b9050602002013561218d9190614a68565b6000806131bf565b6001816121a29190614d12565b9050612126565b5050505050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b61229561244f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612322576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123199061484e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612392576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238990614dda565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600033905090565b60005b838390508110156124fc57600084848381811061247a57612479614ce3565b5b905060200201602081019061248f91906143f7565b905082600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505080806124f490614dfa565b91505061245a565b50505050565b60005b838390508110156125a757600084848381811061252557612524614ce3565b5b905060200201602081019061253a91906143f7565b905082600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050808061259f90614dfa565b915050612505565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561261d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261490614eb5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561268d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268490614f47565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161276b9190614215565b60405180910390a3505050565b60008082846127879190614d12565b9050838110156127cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c390614fb3565b60405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612846576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283d90615045565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ad906150d7565b60405180910390fd5b600081116128f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f090615169565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561298b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612982906151d5565b60405180910390fd5b6000612995611871565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614158015612a0357506129d3611871565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b8015612a5d5750601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b15612b4657600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612b065750600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b612b45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3c90615267565b60405180910390fd5b5b6000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612bec5750600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015612c2b5750612bfb611871565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b8015612c6a5750612c3a611871565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b9050600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614158015612d175750600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b80612dc15750600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612dc05750600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b5b15612dd35760019150612dd2613205565b5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614158015612e7f5750600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b8015612ed55750600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015612f2b5750600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612f3557600090505b612f4285858584866131bf565b5050505050565b6000838311158290612f91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f889190614020565b60405180910390fd5b5060008385612fa09190615287565b9050809150509392505050565b6000806000612fba6132b6565b91509150612fd18183612fd890919063ffffffff16565b9250505090565b600061301a83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613303565b905092915050565b60008060008060008060008060006130398a613366565b92509250925060008060006130578d8686613052612fad565b6133c0565b9250925092508282828888889b509b509b509b509b509b5050505050505091939550919395565b60006130c083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612f49565b905092915050565b60005b82518110156131ba5760008382815181106130e9576130e8614ce3565b5b602002602001015190508215613156576001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506131a6565b600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff02191690555b5080806131b290614dfa565b9150506130cb565b505050565b81601360146101000a81548160ff02191690831515021790555080601360156101000a81548160ff0219169083151502179055506131fe858585613449565b5050505050565b600061321030611308565b9050600e5481101580156132315750600d60149054906101000a900460ff16155b80156132495750600d60159054906101000a900460ff165b156132b357600061327b606461326d6019600001548561361490919063ffffffff16565b612fd890919063ffffffff16565b90506000613292828461307e90919063ffffffff16565b905060008111156132a7576132a68161368f565b5b6132b082613765565b50505b50565b60008060006008549050600060075490506132de600754600854612fd890919063ffffffff16565b8210156132f6576008546007549350935050506132ff565b81819350935050505b9091565b6000808311829061334a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133419190614020565b60405180910390fd5b506000838561335991906152ea565b9050809150509392505050565b60008060008061337585613978565b90506000613382866139fb565b905060006133ab8261339d858a61307e90919063ffffffff16565b61307e90919063ffffffff16565b90508083839550955095505050509193909250565b6000806000806133d9858961361490919063ffffffff16565b905060006133f0868961361490919063ffffffff16565b90506000613407878961361490919063ffffffff16565b9050600061343082613422858761307e90919063ffffffff16565b61307e90919063ffffffff16565b9050838184965096509650505050509450945094915050565b60008060008060008061345b87613022565b9550955095509550955095506134b986600160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461307e90919063ffffffff16565b600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061354e85600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461277890919063ffffffff16565b600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061359a81613aa2565b6135a48483613b5f565b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516136019190614215565b60405180910390a3505050505050505050565b6000808314156136275760009050613689565b600082846136359190614a68565b905082848261364491906152ea565b14613684576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161367b9061538d565b60405180910390fd5b809150505b92915050565b6001600d60146101000a81548160ff02191690831515021790555060006136c0600283612fd890919063ffffffff16565b905060006136d7828461307e90919063ffffffff16565b905060004790506136e783613b99565b60006136fc824761307e90919063ffffffff16565b90506137088382613ddc565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb56184828560405161373b939291906153ad565b60405180910390a1505050506000600d60146101000a81548160ff02191690831515021790555050565b6001600d60146101000a81548160ff02191690831515021790555061378981613b99565b600047905060006137bb60646137ad6019600101548561361490919063ffffffff16565b612fd890919063ffffffff16565b905060006137ea60646137dc6019600201548661361490919063ffffffff16565b612fd890919063ffffffff16565b90506000613819606461380b6019600301548761361490919063ffffffff16565b612fd890919063ffffffff16565b9050601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050158015613883573d6000803e3d6000fd5b50601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f193505050501580156138ec573d6000803e3d6000fd5b50601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015613955573d6000803e3d6000fd5b50505050506000600d60146101000a81548160ff02191690831515021790555050565b60008060009050601360149054906101000a900460ff16156139cd576014600001549050601360159054906101000a900460ff16156139cc576139c96014600201548261277890919063ffffffff16565b90505b5b6139f360646139e5838661361490919063ffffffff16565b612fd890919063ffffffff16565b915050919050565b60008060009050601360149054906101000a900460ff1615613a74576014600101549050601360159054906101000a900460ff1615613a7357613a4c6014600301548261277890919063ffffffff16565b9050600f548310613a7257613a6f6014600401548261277890919063ffffffff16565b90505b5b5b613a9a6064613a8c838661361490919063ffffffff16565b612fd890919063ffffffff16565b915050919050565b6000613aac612fad565b90506000613ac3828461361490919063ffffffff16565b9050613b1781600160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461277890919063ffffffff16565b600160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050565b613b748260085461307e90919063ffffffff16565b600881905550613b8f8160095461277890919063ffffffff16565b6009819055505050565b6000600267ffffffffffffffff811115613bb657613bb56144bc565b5b604051908082528060200260200182016040528015613be45781602001602082028036833780820191505090505b5090503081600081518110613bfc57613bfb614ce3565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600c60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613ca3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cc79190614b69565b81600181518110613cdb57613cda614ce3565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050613d4230600c60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846125ad565b600c60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401613da69594939291906154dd565b600060405180830381600087803b158015613dc057600080fd5b505af1158015613dd4573d6000803e3d6000fd5b505050505050565b613e0930600c60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846125ad565b600c60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080613e55611871565b426040518863ffffffff1660e01b8152600401613e7796959493929190615537565b60606040518083038185885af1158015613e95573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190613eba91906155ad565b5050505050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f840112613efa57613ef9613ed5565b5b8235905067ffffffffffffffff811115613f1757613f16613eda565b5b602083019150836020820283011115613f3357613f32613edf565b5b9250929050565b60008060208385031215613f5157613f50613ecb565b5b600083013567ffffffffffffffff811115613f6f57613f6e613ed0565b5b613f7b85828601613ee4565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613fc1578082015181840152602081019050613fa6565b83811115613fd0576000848401525b50505050565b6000601f19601f8301169050919050565b6000613ff282613f87565b613ffc8185613f92565b935061400c818560208601613fa3565b61401581613fd6565b840191505092915050565b6000602082019050818103600083015261403a8184613fe7565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061406d82614042565b9050919050565b61407d81614062565b811461408857600080fd5b50565b60008135905061409a81614074565b92915050565b6000819050919050565b6140b3816140a0565b81146140be57600080fd5b50565b6000813590506140d0816140aa565b92915050565b600080604083850312156140ed576140ec613ecb565b5b60006140fb8582860161408b565b925050602061410c858286016140c1565b9150509250929050565b60008115159050919050565b61412b81614116565b82525050565b60006020820190506141466000830184614122565b92915050565b614155816140a0565b82525050565b600060a082019050614170600083018861414c565b61417d602083018761414c565b61418a604083018661414c565b614197606083018561414c565b6141a4608083018461414c565b9695505050505050565b600080600080608085870312156141c8576141c7613ecb565b5b60006141d6878288016140c1565b94505060206141e7878288016140c1565b93505060406141f8878288016140c1565b9250506060614209878288016140c1565b91505092959194509250565b600060208201905061422a600083018461414c565b92915050565b6000819050919050565b600061425561425061424b84614042565b614230565b614042565b9050919050565b60006142678261423a565b9050919050565b60006142798261425c565b9050919050565b6142898161426e565b82525050565b60006020820190506142a46000830184614280565b92915050565b6000806000606084860312156142c3576142c2613ecb565b5b60006142d18682870161408b565b93505060206142e28682870161408b565b92505060406142f3868287016140c1565b9150509250925092565b60006020828403121561431357614312613ecb565b5b6000614321848285016140c1565b91505092915050565b600060ff82169050919050565b6143408161432a565b82525050565b600060208201905061435b6000830184614337565b92915050565b61436a81614116565b811461437557600080fd5b50565b60008135905061438781614361565b92915050565b600080604083850312156143a4576143a3613ecb565b5b60006143b2858286016140c1565b92505060206143c385828601614378565b9150509250929050565b6143d681614062565b82525050565b60006020820190506143f160008301846143cd565b92915050565b60006020828403121561440d5761440c613ecb565b5b600061441b8482850161408b565b91505092915050565b6000608082019050614439600083018761414c565b614446602083018661414c565b614453604083018561414c565b614460606083018461414c565b95945050505050565b60008060006060848603121561448257614481613ecb565b5b60006144908682870161408b565b93505060206144a18682870161408b565b92505060406144b28682870161408b565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6144f482613fd6565b810181811067ffffffffffffffff82111715614513576145126144bc565b5b80604052505050565b6000614526613ec1565b905061453282826144eb565b919050565b600067ffffffffffffffff821115614552576145516144bc565b5b602082029050602081019050919050565b600061457661457184614537565b61451c565b9050808382526020820190506020840283018581111561459957614598613edf565b5b835b818110156145c257806145ae888261408b565b84526020840193505060208101905061459b565b5050509392505050565b600082601f8301126145e1576145e0613ed5565b5b81356145f1848260208601614563565b91505092915050565b6000602082840312156146105761460f613ecb565b5b600082013567ffffffffffffffff81111561462e5761462d613ed0565b5b61463a848285016145cc565b91505092915050565b60006020828403121561465957614658613ecb565b5b600061466784828501614378565b91505092915050565b600080600080600060a0868803121561468c5761468b613ecb565b5b600061469a888289016140c1565b95505060206146ab888289016140c1565b94505060406146bc888289016140c1565b93505060606146cd888289016140c1565b92505060806146de888289016140c1565b9150509295509295909350565b60008083601f84011261470157614700613ed5565b5b8235905067ffffffffffffffff81111561471e5761471d613eda565b5b60208301915083602082028301111561473a57614739613edf565b5b9250929050565b6000806000806040858703121561475b5761475a613ecb565b5b600085013567ffffffffffffffff81111561477957614778613ed0565b5b61478587828801613ee4565b9450945050602085013567ffffffffffffffff8111156147a8576147a7613ed0565b5b6147b4878288016146eb565b925092505092959194509250565b600080604083850312156147d9576147d8613ecb565b5b60006147e78582860161408b565b92505060206147f88582860161408b565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614838602083613f92565b915061484382614802565b602082019050919050565b600060208201905081810360008301526148678161482b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806148b557607f821691505b602082108114156148c9576148c861486e565b5b50919050565b7f4665652070657263656e74616765206d75737420657175616c20313030000000600082015250565b6000614905601d83613f92565b9150614910826148cf565b602082019050919050565b60006020820190508181036000830152614934816148f8565b9050919050565b7f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260008201527f65666c656374696f6e7300000000000000000000000000000000000000000000602082015250565b6000614997602a83613f92565b91506149a28261493b565b604082019050919050565b600060208201905081810360008301526149c68161498a565b9050919050565b7f416d6f756e74206d757374206265206c657373207468616e20737570706c7900600082015250565b6000614a03601f83613f92565b9150614a0e826149cd565b602082019050919050565b60006020820190508181036000830152614a32816149f6565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614a73826140a0565b9150614a7e836140a0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614ab757614ab6614a39565b5b828202905092915050565b7f556e69737761705632506169722068617320616c7265616479206265656e207360008201527f6574000000000000000000000000000000000000000000000000000000000000602082015250565b6000614b1e602283613f92565b9150614b2982614ac2565b604082019050919050565b60006020820190508181036000830152614b4d81614b11565b9050919050565b600081519050614b6381614074565b92915050565b600060208284031215614b7f57614b7e613ecb565b5b6000614b8d84828501614b54565b91505092915050565b6000604082019050614bab60008301856143cd565b614bb860208301846143cd565b9392505050565b7f41697264726f702063616e206f6e6c7920626520646f6e65206279206578636c60008201527f756465642066726f6d2066656500000000000000000000000000000000000000602082015250565b6000614c1b602d83613f92565b9150614c2682614bbf565b604082019050919050565b60006020820190508181036000830152614c4a81614c0e565b9050919050565b7f486f6c6465727320616e6420616d6f756e74206c656e677468206d757374206260008201527f65207468652073616d6500000000000000000000000000000000000000000000602082015250565b6000614cad602a83613f92565b9150614cb882614c51565b604082019050919050565b60006020820190508181036000830152614cdc81614ca0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614d1d826140a0565b9150614d28836140a0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614d5d57614d5c614a39565b5b828201905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614dc4602683613f92565b9150614dcf82614d68565b604082019050919050565b60006020820190508181036000830152614df381614db7565b9050919050565b6000614e05826140a0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614e3857614e37614a39565b5b600182019050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614e9f602483613f92565b9150614eaa82614e43565b604082019050919050565b60006020820190508181036000830152614ece81614e92565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000614f31602283613f92565b9150614f3c82614ed5565b604082019050919050565b60006020820190508181036000830152614f6081614f24565b9050919050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b6000614f9d601b83613f92565b9150614fa882614f67565b602082019050919050565b60006020820190508181036000830152614fcc81614f90565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061502f602583613f92565b915061503a82614fd3565b604082019050919050565b6000602082019050818103600083015261505e81615022565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006150c1602383613f92565b91506150cc82615065565b604082019050919050565b600060208201905081810360008301526150f0816150b4565b9050919050565b7f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b6000615153602983613f92565b915061515e826150f7565b604082019050919050565b6000602082019050818103600083015261518281615146565b9050919050565b7f556e697377617056325061697220686173206e6f74206265656e207365740000600082015250565b60006151bf601e83613f92565b91506151ca82615189565b602082019050919050565b600060208201905081810360008301526151ee816151b2565b9050919050565b7f626f747320617265206e6f7420616c6c6f77656420746f2073656c6c206f722060008201527f7472616e7366657220746f6b656e730000000000000000000000000000000000602082015250565b6000615251602f83613f92565b915061525c826151f5565b604082019050919050565b6000602082019050818103600083015261528081615244565b9050919050565b6000615292826140a0565b915061529d836140a0565b9250828210156152b0576152af614a39565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006152f5826140a0565b9150615300836140a0565b9250826153105761530f6152bb565b5b828204905092915050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b6000615377602183613f92565b91506153828261531b565b604082019050919050565b600060208201905081810360008301526153a68161536a565b9050919050565b60006060820190506153c2600083018661414c565b6153cf602083018561414c565b6153dc604083018461414c565b949350505050565b6000819050919050565b60006154096154046153ff846153e4565b614230565b6140a0565b9050919050565b615419816153ee565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61545481614062565b82525050565b6000615466838361544b565b60208301905092915050565b6000602082019050919050565b600061548a8261541f565b615494818561542a565b935061549f8361543b565b8060005b838110156154d05781516154b7888261545a565b97506154c283615472565b9250506001810190506154a3565b5085935050505092915050565b600060a0820190506154f2600083018861414c565b6154ff6020830187615410565b8181036040830152615511818661547f565b905061552060608301856143cd565b61552d608083018461414c565b9695505050505050565b600060c08201905061554c60008301896143cd565b615559602083018861414c565b6155666040830187615410565b6155736060830186615410565b61558060808301856143cd565b61558d60a083018461414c565b979650505050505050565b6000815190506155a7816140aa565b92915050565b6000806000606084860312156155c6576155c5613ecb565b5b60006155d486828701615598565b93505060206155e586828701615598565b92505060406155f686828701615598565b915050925092509256fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220e559567d193cf723aaefd4d1968470262458c35a8eeb272b897a021d100d03f164736f6c634300080c0033

Deployed Bytecode

0x6080604052600436106102765760003560e01c8063715018a61161014f5780639b0e2e86116100c1578063d12a76881161007a578063d12a768814610978578063dc0aa9cf146109a3578063dcda6af3146109cc578063dd62ed3e146109f5578063e7dad4f914610a32578063f2fde38b14610a6f5761027d565b80639b0e2e861461086c578063a457c2d714610895578063a9059cbb146108d2578063ab0d8b851461090f578063b6a9987214610938578063c49b9a801461094f5761027d565b80637ca2ea44116101135780637ca2ea441461076e57806385141a771461079757806385d4787b146107c25780638da5cb5b146107eb5780638ea5220f1461081657806395d89b41146108415761027d565b8063715018a6146106af57806371b9189c146106c657806375cb1bd1146106ef57806375f0a874146107185780637b208769146107435761027d565b8063313ce567116101e857806349bd5a5e116101ac57806349bd5a5e146105885780634a74bb02146105b35780635342acb4146105de57806354ed2dc21461061b5780635ee58efc1461064457806370a08231146106725761027d565b8063313ce5671461048f578063317d9453146104ba57806339509351146104e55780633bd5d173146105225780634549b0391461054b5761027d565b80630fc709e51161023a5780630fc709e51461036b57806313114a9d146103945780631694505e146103bf57806318160ddd146103ea57806323b872dd146104155780632d838119146104525761027d565b8063024022f714610282578063035ae135146102ab57806306fdde03146102d4578063095ea7b3146102ff5780630ddc09761461033c5761027d565b3661027d57005b600080fd5b34801561028e57600080fd5b506102a960048036038101906102a49190613f3a565b610a98565b005b3480156102b757600080fd5b506102d260048036038101906102cd9190613f3a565b610b3d565b005b3480156102e057600080fd5b506102e9610be2565b6040516102f69190614020565b60405180910390f35b34801561030b57600080fd5b50610326600480360381019061032191906140d6565b610c74565b6040516103339190614131565b60405180910390f35b34801561034857600080fd5b50610351610c92565b60405161036295949392919061415b565b60405180910390f35b34801561037757600080fd5b50610392600480360381019061038d91906141ae565b610cb6565b005b3480156103a057600080fd5b506103a9610de0565b6040516103b69190614215565b60405180910390f35b3480156103cb57600080fd5b506103d4610dea565b6040516103e1919061428f565b60405180910390f35b3480156103f657600080fd5b506103ff610e10565b60405161040c9190614215565b60405180910390f35b34801561042157600080fd5b5061043c600480360381019061043791906142aa565b610e1a565b6040516104499190614131565b60405180910390f35b34801561045e57600080fd5b50610479600480360381019061047491906142fd565b610ef3565b6040516104869190614215565b60405180910390f35b34801561049b57600080fd5b506104a4610f61565b6040516104b19190614346565b60405180910390f35b3480156104c657600080fd5b506104cf610f78565b6040516104dc9190614215565b60405180910390f35b3480156104f157600080fd5b5061050c600480360381019061050791906140d6565b610f88565b6040516105199190614131565b60405180910390f35b34801561052e57600080fd5b50610549600480360381019061054491906142fd565b61103b565b005b34801561055757600080fd5b50610572600480360381019061056d919061438d565b611129565b60405161057f9190614215565b60405180910390f35b34801561059457600080fd5b5061059d6111ad565b6040516105aa91906143dc565b60405180910390f35b3480156105bf57600080fd5b506105c86111d3565b6040516105d59190614131565b60405180910390f35b3480156105ea57600080fd5b50610605600480360381019061060091906143f7565b6111e6565b6040516106129190614131565b60405180910390f35b34801561062757600080fd5b50610642600480360381019061063d91906142fd565b61123c565b005b34801561065057600080fd5b506106596112ea565b6040516106699493929190614424565b60405180910390f35b34801561067e57600080fd5b50610699600480360381019061069491906143f7565b611308565b6040516106a69190614215565b60405180910390f35b3480156106bb57600080fd5b506106c4611359565b005b3480156106d257600080fd5b506106ed60048036038101906106e89190613f3a565b6114ac565b005b3480156106fb57600080fd5b5061071660048036038101906107119190614469565b611551565b005b34801561072457600080fd5b5061072d6116ae565b60405161073a91906143dc565b60405180910390f35b34801561074f57600080fd5b506107586116d4565b60405161076591906143dc565b60405180910390f35b34801561077a57600080fd5b50610795600480360381019061079091906142fd565b6116fa565b005b3480156107a357600080fd5b506107ac6117a8565b6040516107b991906143dc565b60405180910390f35b3480156107ce57600080fd5b506107e960048036038101906107e491906145fa565b6117ce565b005b3480156107f757600080fd5b50610800611871565b60405161080d91906143dc565b60405180910390f35b34801561082257600080fd5b5061082b61189a565b60405161083891906143dc565b60405180910390f35b34801561084d57600080fd5b506108566118c0565b6040516108639190614020565b60405180910390f35b34801561087857600080fd5b50610893600480360381019061088e91906145fa565b611952565b005b3480156108a157600080fd5b506108bc60048036038101906108b791906140d6565b6119f5565b6040516108c99190614131565b60405180910390f35b3480156108de57600080fd5b506108f960048036038101906108f491906140d6565b611ac2565b6040516109069190614131565b60405180910390f35b34801561091b57600080fd5b5061093660048036038101906109319190613f3a565b611ae0565b005b34801561094457600080fd5b5061094d611b85565b005b34801561095b57600080fd5b5061097660048036038101906109719190614643565b611e8b565b005b34801561098457600080fd5b5061098d611f74565b60405161099a9190614215565b60405180910390f35b3480156109af57600080fd5b506109ca60048036038101906109c59190614670565b611f7a565b005b3480156109d857600080fd5b506109f360048036038101906109ee9190614741565b612048565b005b348015610a0157600080fd5b50610a1c6004803603810190610a1791906147c2565b6121b0565b604051610a299190614215565b60405180910390f35b348015610a3e57600080fd5b50610a596004803603810190610a5491906143f7565b612237565b604051610a669190614131565b60405180910390f35b348015610a7b57600080fd5b50610a966004803603810190610a9191906143f7565b61228d565b005b610aa061244f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b249061484e565b60405180910390fd5b610b3982826000612457565b5050565b610b4561244f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610bd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc99061484e565b60405180910390fd5b610bde82826001612502565b5050565b6060600a8054610bf19061489d565b80601f0160208091040260200160405190810160405280929190818152602001828054610c1d9061489d565b8015610c6a5780601f10610c3f57610100808354040283529160200191610c6a565b820191906000526020600020905b815481529060010190602001808311610c4d57829003601f168201915b5050505050905090565b6000610c88610c8161244f565b84846125ad565b6001905092915050565b60148060000154908060010154908060020154908060030154908060040154905085565b610cbe61244f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d429061484e565b60405180910390fd5b6064610d7283610d64868861277890919063ffffffff16565b61277890919063ffffffff16565b14610db2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da99061491b565b60405180910390fd5b8360196001018190555082601960020181905550816019600301819055508060196000018190555050505050565b6000600954905090565b600c60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600754905090565b6000610e278484846127d6565b610ee884610e3361244f565b610ee38560405180606001604052806028815260200161560160289139600360008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610e9961244f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612f499092919063ffffffff16565b6125ad565b600190509392505050565b6000600854821115610f3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f31906149ad565b60405180910390fd5b6000610f44612fad565b9050610f598184612fd890919063ffffffff16565b915050919050565b6000600c60009054906101000a900460ff16905090565b6000610f8330611308565b905090565b6000611031610f9561244f565b8461102c8560036000610fa661244f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461277890919063ffffffff16565b6125ad565b6001905092915050565b600061104561244f565b9050600061105283613022565b505050505090506110ab81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461307e90919063ffffffff16565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506111038160085461307e90919063ffffffff16565b60088190555061111e8360095461277890919063ffffffff16565b600981905550505050565b6000600754831115611170576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116790614a19565b60405180910390fd5b8161119057600061118084613022565b50505050509050809150506111a7565b600061119b84613022565b50505050915050809150505b92915050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d60159054906101000a900460ff1681565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b61124461244f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146112d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c89061484e565b60405180910390fd5b633b9aca00816112e19190614a68565b600f8190555050565b60198060000154908060010154908060020154908060030154905084565b6000611352600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610ef3565b9050919050565b61136161244f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146113ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e59061484e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6114b461244f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611541576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115389061484e565b60405180910390fd5b61154d82826001612457565b5050565b61155961244f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146115e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115dd9061484e565b60405180910390fd5b82601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61170261244f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461178f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117869061484e565b60405180910390fd5b633b9aca008161179f9190614a68565b600e8190555050565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6117d661244f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611863576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185a9061484e565b60405180910390fd5b61186e8160016130c8565b50565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600b80546118cf9061489d565b80601f01602080910402602001604051908101604052809291908181526020018280546118fb9061489d565b80156119485780601f1061191d57610100808354040283529160200191611948565b820191906000526020600020905b81548152906001019060200180831161192b57829003601f168201915b5050505050905090565b61195a61244f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146119e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119de9061484e565b60405180910390fd5b6119f28160006130c8565b50565b6000611ab8611a0261244f565b84611ab3856040518060600160405280602581526020016156296025913960036000611a2c61244f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612f499092919063ffffffff16565b6125ad565b6001905092915050565b6000611ad6611acf61244f565b84846127d6565b6001905092915050565b611ae861244f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611b75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6c9061484e565b60405180910390fd5b611b8182826000612502565b5050565b611b8d61244f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611c1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c119061484e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611cab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca290614b34565b60405180910390fd5b600c60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d3c9190614b69565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630600c60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611dc5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611de99190614b69565b6040518363ffffffff1660e01b8152600401611e06929190614b96565b6020604051808303816000875af1158015611e25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e499190614b69565b600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b611e9361244f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611f20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f179061484e565b60405180910390fd5b80600d60156101000a81548160ff0219169083151502179055507f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15981604051611f699190614131565b60405180910390a150565b600e5481565b611f8261244f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461200f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120069061484e565b60405180910390fd5b84601460000181905550836014600101819055508160146003018190555082601460020181905550806014600401819055505050505050565b60006005600061205661244f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166120dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d490614c31565b60405180910390fd5b828290508585905014612125576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211c90614cc3565b60405180910390fd5b5b848490508110156121a95761219561213c61244f565b86868481811061214f5761214e614ce3565b5b905060200201602081019061216491906143f7565b633b9aca0086868681811061217c5761217b614ce3565b5b9050602002013561218d9190614a68565b6000806131bf565b6001816121a29190614d12565b9050612126565b5050505050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b61229561244f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612322576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123199061484e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612392576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238990614dda565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600033905090565b60005b838390508110156124fc57600084848381811061247a57612479614ce3565b5b905060200201602081019061248f91906143f7565b905082600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505080806124f490614dfa565b91505061245a565b50505050565b60005b838390508110156125a757600084848381811061252557612524614ce3565b5b905060200201602081019061253a91906143f7565b905082600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050808061259f90614dfa565b915050612505565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561261d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261490614eb5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561268d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268490614f47565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161276b9190614215565b60405180910390a3505050565b60008082846127879190614d12565b9050838110156127cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c390614fb3565b60405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612846576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283d90615045565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ad906150d7565b60405180910390fd5b600081116128f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f090615169565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561298b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612982906151d5565b60405180910390fd5b6000612995611871565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614158015612a0357506129d3611871565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b8015612a5d5750601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b15612b4657600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612b065750600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b612b45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3c90615267565b60405180910390fd5b5b6000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612bec5750600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015612c2b5750612bfb611871565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b8015612c6a5750612c3a611871565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b9050600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614158015612d175750600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b80612dc15750600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612dc05750600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b5b15612dd35760019150612dd2613205565b5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614158015612e7f5750600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b8015612ed55750600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015612f2b5750600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612f3557600090505b612f4285858584866131bf565b5050505050565b6000838311158290612f91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f889190614020565b60405180910390fd5b5060008385612fa09190615287565b9050809150509392505050565b6000806000612fba6132b6565b91509150612fd18183612fd890919063ffffffff16565b9250505090565b600061301a83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613303565b905092915050565b60008060008060008060008060006130398a613366565b92509250925060008060006130578d8686613052612fad565b6133c0565b9250925092508282828888889b509b509b509b509b509b5050505050505091939550919395565b60006130c083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612f49565b905092915050565b60005b82518110156131ba5760008382815181106130e9576130e8614ce3565b5b602002602001015190508215613156576001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506131a6565b600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff02191690555b5080806131b290614dfa565b9150506130cb565b505050565b81601360146101000a81548160ff02191690831515021790555080601360156101000a81548160ff0219169083151502179055506131fe858585613449565b5050505050565b600061321030611308565b9050600e5481101580156132315750600d60149054906101000a900460ff16155b80156132495750600d60159054906101000a900460ff165b156132b357600061327b606461326d6019600001548561361490919063ffffffff16565b612fd890919063ffffffff16565b90506000613292828461307e90919063ffffffff16565b905060008111156132a7576132a68161368f565b5b6132b082613765565b50505b50565b60008060006008549050600060075490506132de600754600854612fd890919063ffffffff16565b8210156132f6576008546007549350935050506132ff565b81819350935050505b9091565b6000808311829061334a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133419190614020565b60405180910390fd5b506000838561335991906152ea565b9050809150509392505050565b60008060008061337585613978565b90506000613382866139fb565b905060006133ab8261339d858a61307e90919063ffffffff16565b61307e90919063ffffffff16565b90508083839550955095505050509193909250565b6000806000806133d9858961361490919063ffffffff16565b905060006133f0868961361490919063ffffffff16565b90506000613407878961361490919063ffffffff16565b9050600061343082613422858761307e90919063ffffffff16565b61307e90919063ffffffff16565b9050838184965096509650505050509450945094915050565b60008060008060008061345b87613022565b9550955095509550955095506134b986600160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461307e90919063ffffffff16565b600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061354e85600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461277890919063ffffffff16565b600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061359a81613aa2565b6135a48483613b5f565b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516136019190614215565b60405180910390a3505050505050505050565b6000808314156136275760009050613689565b600082846136359190614a68565b905082848261364491906152ea565b14613684576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161367b9061538d565b60405180910390fd5b809150505b92915050565b6001600d60146101000a81548160ff02191690831515021790555060006136c0600283612fd890919063ffffffff16565b905060006136d7828461307e90919063ffffffff16565b905060004790506136e783613b99565b60006136fc824761307e90919063ffffffff16565b90506137088382613ddc565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb56184828560405161373b939291906153ad565b60405180910390a1505050506000600d60146101000a81548160ff02191690831515021790555050565b6001600d60146101000a81548160ff02191690831515021790555061378981613b99565b600047905060006137bb60646137ad6019600101548561361490919063ffffffff16565b612fd890919063ffffffff16565b905060006137ea60646137dc6019600201548661361490919063ffffffff16565b612fd890919063ffffffff16565b90506000613819606461380b6019600301548761361490919063ffffffff16565b612fd890919063ffffffff16565b9050601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050158015613883573d6000803e3d6000fd5b50601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f193505050501580156138ec573d6000803e3d6000fd5b50601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015613955573d6000803e3d6000fd5b50505050506000600d60146101000a81548160ff02191690831515021790555050565b60008060009050601360149054906101000a900460ff16156139cd576014600001549050601360159054906101000a900460ff16156139cc576139c96014600201548261277890919063ffffffff16565b90505b5b6139f360646139e5838661361490919063ffffffff16565b612fd890919063ffffffff16565b915050919050565b60008060009050601360149054906101000a900460ff1615613a74576014600101549050601360159054906101000a900460ff1615613a7357613a4c6014600301548261277890919063ffffffff16565b9050600f548310613a7257613a6f6014600401548261277890919063ffffffff16565b90505b5b5b613a9a6064613a8c838661361490919063ffffffff16565b612fd890919063ffffffff16565b915050919050565b6000613aac612fad565b90506000613ac3828461361490919063ffffffff16565b9050613b1781600160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461277890919063ffffffff16565b600160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050565b613b748260085461307e90919063ffffffff16565b600881905550613b8f8160095461277890919063ffffffff16565b6009819055505050565b6000600267ffffffffffffffff811115613bb657613bb56144bc565b5b604051908082528060200260200182016040528015613be45781602001602082028036833780820191505090505b5090503081600081518110613bfc57613bfb614ce3565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600c60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613ca3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cc79190614b69565b81600181518110613cdb57613cda614ce3565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050613d4230600c60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846125ad565b600c60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401613da69594939291906154dd565b600060405180830381600087803b158015613dc057600080fd5b505af1158015613dd4573d6000803e3d6000fd5b505050505050565b613e0930600c60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846125ad565b600c60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080613e55611871565b426040518863ffffffff1660e01b8152600401613e7796959493929190615537565b60606040518083038185885af1158015613e95573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190613eba91906155ad565b5050505050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f840112613efa57613ef9613ed5565b5b8235905067ffffffffffffffff811115613f1757613f16613eda565b5b602083019150836020820283011115613f3357613f32613edf565b5b9250929050565b60008060208385031215613f5157613f50613ecb565b5b600083013567ffffffffffffffff811115613f6f57613f6e613ed0565b5b613f7b85828601613ee4565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613fc1578082015181840152602081019050613fa6565b83811115613fd0576000848401525b50505050565b6000601f19601f8301169050919050565b6000613ff282613f87565b613ffc8185613f92565b935061400c818560208601613fa3565b61401581613fd6565b840191505092915050565b6000602082019050818103600083015261403a8184613fe7565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061406d82614042565b9050919050565b61407d81614062565b811461408857600080fd5b50565b60008135905061409a81614074565b92915050565b6000819050919050565b6140b3816140a0565b81146140be57600080fd5b50565b6000813590506140d0816140aa565b92915050565b600080604083850312156140ed576140ec613ecb565b5b60006140fb8582860161408b565b925050602061410c858286016140c1565b9150509250929050565b60008115159050919050565b61412b81614116565b82525050565b60006020820190506141466000830184614122565b92915050565b614155816140a0565b82525050565b600060a082019050614170600083018861414c565b61417d602083018761414c565b61418a604083018661414c565b614197606083018561414c565b6141a4608083018461414c565b9695505050505050565b600080600080608085870312156141c8576141c7613ecb565b5b60006141d6878288016140c1565b94505060206141e7878288016140c1565b93505060406141f8878288016140c1565b9250506060614209878288016140c1565b91505092959194509250565b600060208201905061422a600083018461414c565b92915050565b6000819050919050565b600061425561425061424b84614042565b614230565b614042565b9050919050565b60006142678261423a565b9050919050565b60006142798261425c565b9050919050565b6142898161426e565b82525050565b60006020820190506142a46000830184614280565b92915050565b6000806000606084860312156142c3576142c2613ecb565b5b60006142d18682870161408b565b93505060206142e28682870161408b565b92505060406142f3868287016140c1565b9150509250925092565b60006020828403121561431357614312613ecb565b5b6000614321848285016140c1565b91505092915050565b600060ff82169050919050565b6143408161432a565b82525050565b600060208201905061435b6000830184614337565b92915050565b61436a81614116565b811461437557600080fd5b50565b60008135905061438781614361565b92915050565b600080604083850312156143a4576143a3613ecb565b5b60006143b2858286016140c1565b92505060206143c385828601614378565b9150509250929050565b6143d681614062565b82525050565b60006020820190506143f160008301846143cd565b92915050565b60006020828403121561440d5761440c613ecb565b5b600061441b8482850161408b565b91505092915050565b6000608082019050614439600083018761414c565b614446602083018661414c565b614453604083018561414c565b614460606083018461414c565b95945050505050565b60008060006060848603121561448257614481613ecb565b5b60006144908682870161408b565b93505060206144a18682870161408b565b92505060406144b28682870161408b565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6144f482613fd6565b810181811067ffffffffffffffff82111715614513576145126144bc565b5b80604052505050565b6000614526613ec1565b905061453282826144eb565b919050565b600067ffffffffffffffff821115614552576145516144bc565b5b602082029050602081019050919050565b600061457661457184614537565b61451c565b9050808382526020820190506020840283018581111561459957614598613edf565b5b835b818110156145c257806145ae888261408b565b84526020840193505060208101905061459b565b5050509392505050565b600082601f8301126145e1576145e0613ed5565b5b81356145f1848260208601614563565b91505092915050565b6000602082840312156146105761460f613ecb565b5b600082013567ffffffffffffffff81111561462e5761462d613ed0565b5b61463a848285016145cc565b91505092915050565b60006020828403121561465957614658613ecb565b5b600061466784828501614378565b91505092915050565b600080600080600060a0868803121561468c5761468b613ecb565b5b600061469a888289016140c1565b95505060206146ab888289016140c1565b94505060406146bc888289016140c1565b93505060606146cd888289016140c1565b92505060806146de888289016140c1565b9150509295509295909350565b60008083601f84011261470157614700613ed5565b5b8235905067ffffffffffffffff81111561471e5761471d613eda565b5b60208301915083602082028301111561473a57614739613edf565b5b9250929050565b6000806000806040858703121561475b5761475a613ecb565b5b600085013567ffffffffffffffff81111561477957614778613ed0565b5b61478587828801613ee4565b9450945050602085013567ffffffffffffffff8111156147a8576147a7613ed0565b5b6147b4878288016146eb565b925092505092959194509250565b600080604083850312156147d9576147d8613ecb565b5b60006147e78582860161408b565b92505060206147f88582860161408b565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614838602083613f92565b915061484382614802565b602082019050919050565b600060208201905081810360008301526148678161482b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806148b557607f821691505b602082108114156148c9576148c861486e565b5b50919050565b7f4665652070657263656e74616765206d75737420657175616c20313030000000600082015250565b6000614905601d83613f92565b9150614910826148cf565b602082019050919050565b60006020820190508181036000830152614934816148f8565b9050919050565b7f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260008201527f65666c656374696f6e7300000000000000000000000000000000000000000000602082015250565b6000614997602a83613f92565b91506149a28261493b565b604082019050919050565b600060208201905081810360008301526149c68161498a565b9050919050565b7f416d6f756e74206d757374206265206c657373207468616e20737570706c7900600082015250565b6000614a03601f83613f92565b9150614a0e826149cd565b602082019050919050565b60006020820190508181036000830152614a32816149f6565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614a73826140a0565b9150614a7e836140a0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614ab757614ab6614a39565b5b828202905092915050565b7f556e69737761705632506169722068617320616c7265616479206265656e207360008201527f6574000000000000000000000000000000000000000000000000000000000000602082015250565b6000614b1e602283613f92565b9150614b2982614ac2565b604082019050919050565b60006020820190508181036000830152614b4d81614b11565b9050919050565b600081519050614b6381614074565b92915050565b600060208284031215614b7f57614b7e613ecb565b5b6000614b8d84828501614b54565b91505092915050565b6000604082019050614bab60008301856143cd565b614bb860208301846143cd565b9392505050565b7f41697264726f702063616e206f6e6c7920626520646f6e65206279206578636c60008201527f756465642066726f6d2066656500000000000000000000000000000000000000602082015250565b6000614c1b602d83613f92565b9150614c2682614bbf565b604082019050919050565b60006020820190508181036000830152614c4a81614c0e565b9050919050565b7f486f6c6465727320616e6420616d6f756e74206c656e677468206d757374206260008201527f65207468652073616d6500000000000000000000000000000000000000000000602082015250565b6000614cad602a83613f92565b9150614cb882614c51565b604082019050919050565b60006020820190508181036000830152614cdc81614ca0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614d1d826140a0565b9150614d28836140a0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614d5d57614d5c614a39565b5b828201905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614dc4602683613f92565b9150614dcf82614d68565b604082019050919050565b60006020820190508181036000830152614df381614db7565b9050919050565b6000614e05826140a0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614e3857614e37614a39565b5b600182019050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614e9f602483613f92565b9150614eaa82614e43565b604082019050919050565b60006020820190508181036000830152614ece81614e92565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000614f31602283613f92565b9150614f3c82614ed5565b604082019050919050565b60006020820190508181036000830152614f6081614f24565b9050919050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b6000614f9d601b83613f92565b9150614fa882614f67565b602082019050919050565b60006020820190508181036000830152614fcc81614f90565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061502f602583613f92565b915061503a82614fd3565b604082019050919050565b6000602082019050818103600083015261505e81615022565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006150c1602383613f92565b91506150cc82615065565b604082019050919050565b600060208201905081810360008301526150f0816150b4565b9050919050565b7f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b6000615153602983613f92565b915061515e826150f7565b604082019050919050565b6000602082019050818103600083015261518281615146565b9050919050565b7f556e697377617056325061697220686173206e6f74206265656e207365740000600082015250565b60006151bf601e83613f92565b91506151ca82615189565b602082019050919050565b600060208201905081810360008301526151ee816151b2565b9050919050565b7f626f747320617265206e6f7420616c6c6f77656420746f2073656c6c206f722060008201527f7472616e7366657220746f6b656e730000000000000000000000000000000000602082015250565b6000615251602f83613f92565b915061525c826151f5565b604082019050919050565b6000602082019050818103600083015261528081615244565b9050919050565b6000615292826140a0565b915061529d836140a0565b9250828210156152b0576152af614a39565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006152f5826140a0565b9150615300836140a0565b9250826153105761530f6152bb565b5b828204905092915050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b6000615377602183613f92565b91506153828261531b565b604082019050919050565b600060208201905081810360008301526153a68161536a565b9050919050565b60006060820190506153c2600083018661414c565b6153cf602083018561414c565b6153dc604083018461414c565b949350505050565b6000819050919050565b60006154096154046153ff846153e4565b614230565b6140a0565b9050919050565b615419816153ee565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61545481614062565b82525050565b6000615466838361544b565b60208301905092915050565b6000602082019050919050565b600061548a8261541f565b615494818561542a565b935061549f8361543b565b8060005b838110156154d05781516154b7888261545a565b97506154c283615472565b9250506001810190506154a3565b5085935050505092915050565b600060a0820190506154f2600083018861414c565b6154ff6020830187615410565b8181036040830152615511818661547f565b905061552060608301856143cd565b61552d608083018461414c565b9695505050505050565b600060c08201905061554c60008301896143cd565b615559602083018861414c565b6155666040830187615410565b6155736060830186615410565b61558060808301856143cd565b61558d60a083018461414c565b979650505050505050565b6000815190506155a7816140aa565b92915050565b6000806000606084860312156155c6576155c5613ecb565b5b60006155d486828701615598565b93505060206155e586828701615598565b92505060406155f686828701615598565b915050925092509256fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220e559567d193cf723aaefd4d1968470262458c35a8eeb272b897a021d100d03f164736f6c634300080c0033

Deployed Bytecode Sourcemap

17513:19050:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23921:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24047:121;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20326:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21178:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19778:22;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;25657:558;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22171:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18636:106;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20603:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21347:313;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23533:253;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20512:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27397:115;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21668:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22792:289;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23089:436;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18749:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18825:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30745:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25062:153;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19807:32;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;20706:138;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16195:148;;;;;;;;;;;;;:::i;:::-;;23794:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26407:236;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19020:75;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19102:73;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26223:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19258:70;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26768:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15559:79;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19182:69;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20417:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26904:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21894:269;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20852:167;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24176:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24309:256;;;;;;;;;;;;;:::i;:::-;;27520:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18872:70;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25223:426;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22266:518;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21027:143;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26651:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16498:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23921:118;15781:12;:10;:12::i;:::-;15771:22;;:6;;;;;;;;;;:22;;;15763:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;24001:30:::1;24014:9;;24025:5;24001:12;:30::i;:::-;23921:118:::0;;:::o;24047:121::-;15781:12;:10;:12::i;:::-;15771:22;;:6;;;;;;;;;;:22;;;15763:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;24126:34:::1;24144:9;;24155:4;24126:17;:34::i;:::-;24047:121:::0;;:::o;20326:83::-;20363:13;20396:5;20389:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20326:83;:::o;21178:161::-;21253:4;21270:39;21279:12;:10;:12::i;:::-;21293:7;21302:6;21270:8;:39::i;:::-;21327:4;21320:11;;21178:161;;;;:::o;19778:22::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25657:558::-;15781:12;:10;:12::i;:::-;15771:22;;:6;;;;;;;;;;:22;;;15763:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;25916:3:::1;25842:70;25895:16;25842:48;25869:20;25842:22;:26;;:48;;;;:::i;:::-;:52;;:70;;;;:::i;:::-;:77;25834:119;;;;;;;;;;;;:::i;:::-;;;;;;;;;26002:22;25964:12;:35;;:60;;;;26071:20;26035:12;:33;;:56;;;;26134:16;26102:12;:29;;:48;;;;26192:15;26161:12;:28;;:46;;;;25657:558:::0;;;;:::o;22171:87::-;22213:7;22240:10;;22233:17;;22171:87;:::o;18636:106::-;;;;;;;;;;;;;:::o;20603:95::-;20656:7;20683;;20676:14;;20603:95;:::o;21347:313::-;21445:4;21462:36;21472:6;21480:9;21491:6;21462:9;:36::i;:::-;21509:121;21518:6;21526:12;:10;:12::i;:::-;21540:89;21578:6;21540:89;;;;;;;;;;;;;;;;;:11;:19;21552:6;21540:19;;;;;;;;;;;;;;;:33;21560:12;:10;:12::i;:::-;21540:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;21509:8;:121::i;:::-;21648:4;21641:11;;21347:313;;;;;:::o;23533:253::-;23599:7;23638;;23627;:18;;23619:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23703:19;23726:10;:8;:10::i;:::-;23703:33;;23754:24;23766:11;23754:7;:11;;:24;;;;:::i;:::-;23747:31;;;23533:253;;;:::o;20512:83::-;20553:5;20578:9;;;;;;;;;;;20571:16;;20512:83;:::o;27397:115::-;27453:7;27480:24;27498:4;27480:9;:24::i;:::-;27473:31;;27397:115;:::o;21668:218::-;21756:4;21773:83;21782:12;:10;:12::i;:::-;21796:7;21805:50;21844:10;21805:11;:25;21817:12;:10;:12::i;:::-;21805:25;;;;;;;;;;;;;;;:34;21831:7;21805:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;21773:8;:83::i;:::-;21874:4;21867:11;;21668:218;;;;:::o;22792:289::-;22844:14;22861:12;:10;:12::i;:::-;22844:29;;22885:15;22909:19;22920:7;22909:10;:19::i;:::-;22884:44;;;;;;;22957:28;22977:7;22957;:15;22965:6;22957:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;22939:7;:15;22947:6;22939:15;;;;;;;;;;;;;;;:46;;;;23006:20;23018:7;23006;;:11;;:20;;;;:::i;:::-;22996:7;:30;;;;23050:23;23065:7;23050:10;;:14;;:23;;;;:::i;:::-;23037:10;:36;;;;22833:248;;22792:289;:::o;23089:436::-;23179:7;23218;;23207;:18;;23199:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23277:17;23272:246;;23312:15;23336:19;23347:7;23336:10;:19::i;:::-;23311:44;;;;;;;23377:7;23370:14;;;;;23272:246;23419:23;23450:19;23461:7;23450:10;:19::i;:::-;23417:52;;;;;;;23491:15;23484:22;;;23089:436;;;;;:::o;18749:41::-;;;;;;;;;;;;;:::o;18825:40::-;;;;;;;;;;;;;:::o;30745:123::-;30809:4;30833:18;:27;30852:7;30833:27;;;;;;;;;;;;;;;;;;;;;;;;;30826:34;;30745:123;;;:::o;25062:153::-;15781:12;:10;:12::i;:::-;15771:22;;:6;;;;;;;;;;:22;;;15763:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;25202:5:::1;25179:20;:28;;;;:::i;:::-;25155:21;:52;;;;25062:153:::0;:::o;19807:32::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;20706:138::-;20772:7;20799:37;20819:7;:16;20827:7;20819:16;;;;;;;;;;;;;;;;20799:19;:37::i;:::-;20792:44;;20706:138;;;:::o;16195:148::-;15781:12;:10;:12::i;:::-;15771:22;;:6;;;;;;;;;;:22;;;15763:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;16302:1:::1;16265:40;;16286:6;::::0;::::1;;;;;;;;16265:40;;;;;;;;;;;;16333:1;16316:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;16195:148::o:0;23794:119::-;15781:12;:10;:12::i;:::-;15771:22;;:6;;;;;;;;;;:22;;;15763:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;23876:29:::1;23889:9;;23900:4;23876:12;:29::i;:::-;23794:119:::0;;:::o;26407:236::-;15781:12;:10;:12::i;:::-;15771:22;;:6;;;;;;;;;;:22;;;15763:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;26545:16:::1;26527:15;;:34;;;;;;;;;;;;;;;;;;26588:14;26572:13;;:30;;;;;;;;;;;;;;;;;;26625:10;26613:9;;:22;;;;;;;;;;;;;;;;;;26407:236:::0;;;:::o;19020:75::-;;;;;;;;;;;;;:::o;19102:73::-;;;;;;;;;;;;;:::o;26223:176::-;15781:12;:10;:12::i;:::-;15771:22;;:6;;;;;;;;;;:22;;;15763:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;26386:5:::1;26353:30;:38;;;;:::i;:::-;26321:29;:70;;;;26223:176:::0;:::o;19258:70::-;;;;;;;;;;;;;:::o;26768:128::-;15781:12;:10;:12::i;:::-;15771:22;;:6;;;;;;;;;;:22;;;15763:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;26852:36:::1;26872:9;26883:4;26852:19;:36::i;:::-;26768:128:::0;:::o;15559:79::-;15597:7;15624:6;;;;;;;;;;;15617:13;;15559:79;:::o;19182:69::-;;;;;;;;;;;;;:::o;20417:87::-;20456:13;20489:7;20482:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20417:87;:::o;26904:131::-;15781:12;:10;:12::i;:::-;15771:22;;:6;;;;;;;;;;:22;;;15763:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;26990:37:::1;27010:9;27021:5;26990:19;:37::i;:::-;26904:131:::0;:::o;21894:269::-;21987:4;22004:129;22013:12;:10;:12::i;:::-;22027:7;22036:96;22075:15;22036:96;;;;;;;;;;;;;;;;;:11;:25;22048:12;:10;:12::i;:::-;22036:25;;;;;;;;;;;;;;;:34;22062:7;22036:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;22004:8;:129::i;:::-;22151:4;22144:11;;21894:269;;;;:::o;20852:167::-;20930:4;20947:42;20957:12;:10;:12::i;:::-;20971:9;20982:6;20947:9;:42::i;:::-;21007:4;21000:11;;20852:167;;;;:::o;24176:125::-;15781:12;:10;:12::i;:::-;15771:22;;:6;;;;;;;;;;:22;;;15763:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;24258:35:::1;24276:9;;24287:5;24258:17;:35::i;:::-;24176:125:::0;;:::o;24309:256::-;15781:12;:10;:12::i;:::-;15771:22;;:6;;;;;;;;;;:22;;;15763:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;24396:1:::1;24371:27;;:13;;;;;;;;;;;:27;;;24363:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24481:15;;;;;;;;;;;:23;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24463:55;;;24527:4;24534:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24463:94;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24447:13;;:110;;;;;;;;;;;;;;;;;;24309:256::o:0;27520:171::-;15781:12;:10;:12::i;:::-;15771:22;;:6;;;;;;;;;;:22;;;15763:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;27621:8:::1;27597:21;;:32;;;;;;;;;;;;;;;;;;27645:38;27674:8;27645:38;;;;;;:::i;:::-;;;;;;;;27520:171:::0;:::o;18872:70::-;;;;:::o;25223:426::-;15781:12;:10;:12::i;:::-;15771:22;;:6;;;;;;;;;;:22;;;15763:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;25420:13:::1;25396:7;:21;;:37;;;;25467:12;25444:7;:20;;:35;;;;25517:16;25490:7;:24;;:43;;;;25572:17;25544:7;:25;;:45;;;;25626:15;25600:7;:23;;:41;;;;25223:426:::0;;;;;:::o;22266:518::-;22363:16;22402:18;:32;22421:12;:10;:12::i;:::-;22402:32;;;;;;;;;;;;;;;;;;;;;;;;;22394:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;22524:7;;:14;;22503:10;;:17;;:35;22495:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;22596:181;22613:10;;:17;;22602:8;:28;22596:181;;;22646:91;22661:12;:10;:12::i;:::-;22675:10;;22686:8;22675:20;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;22717:5;22697:7;;22705:8;22697:17;;;;;;;:::i;:::-;;;;;;;;:25;;;;:::i;:::-;22724:5;22731;22646:14;:91::i;:::-;22764:1;22752:13;;;;;:::i;:::-;;;22596:181;;;22352:432;22266:518;;;;:::o;21027:143::-;21108:7;21135:11;:18;21147:5;21135:18;;;;;;;;;;;;;;;:27;21154:7;21135:27;;;;;;;;;;;;;;;;21128:34;;21027:143;;;;:::o;26651:109::-;26712:4;26736:10;:16;26747:4;26736:16;;;;;;;;;;;;;;;;;;;;;;;;;26729:23;;26651:109;;;:::o;16498:244::-;15781:12;:10;:12::i;:::-;15771:22;;:6;;;;;;;;;;:22;;;15763:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;16607:1:::1;16587:22;;:8;:22;;;;16579:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;16697:8;16668:38;;16689:6;::::0;::::1;;;;;;;;16668:38;;;;;;;;;;;;16726:8;16717:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;16498:244:::0;:::o;8051:98::-;8104:7;8131:10;8124:17;;8051:98;:::o;24818:236::-;24905:9;24900:147;24924:9;;:16;;24920:1;:20;24900:147;;;24962:12;24977:9;;24987:1;24977:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;24962:27;;25031:4;25004:18;:24;25023:4;25004:24;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;24947:100;24942:3;;;;;:::i;:::-;;;;24900:147;;;;24818:236;;;:::o;24571:239::-;24663:9;24658:145;24682:9;;:16;;24678:1;:20;24658:145;;;24720:12;24735:9;;24745:1;24735:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;24720:27;;24787:4;24762:16;:22;24779:4;24762:22;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;24705:98;24700:3;;;;;:::i;:::-;;;;24658:145;;;;24571:239;;;:::o;30876:337::-;30986:1;30969:19;;:5;:19;;;;30961:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;31067:1;31048:21;;:7;:21;;;;31040:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;31151:6;31121:11;:18;31133:5;31121:18;;;;;;;;;;;;;;;:27;31140:7;31121:27;;;;;;;;;;;;;;;:36;;;;31189:7;31173:32;;31182:5;31173:32;;;31198:6;31173:32;;;;;;:::i;:::-;;;;;;;;30876:337;;;:::o;3479:181::-;3537:7;3557:9;3573:1;3569;:5;;;;:::i;:::-;3557:17;;3598:1;3593;:6;;3585:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;3651:1;3644:8;;;3479:181;;;;:::o;31221:1281::-;31325:1;31309:18;;:4;:18;;;;31301:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;31402:1;31388:16;;:2;:16;;;;31380:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;31472:1;31463:6;:10;31455:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;31563:1;31538:27;;:13;;;;;;;;;;;:27;;;;31530:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;31610:11;31742:7;:5;:7::i;:::-;31734:15;;:4;:15;;;;:32;;;;;31759:7;:5;:7::i;:::-;31753:13;;:2;:13;;;;31734:32;:52;;;;;31776:10;;;;;;;;;;;31770:16;;:2;:16;;;;31734:52;31731:180;;;31812:10;:16;31823:4;31812:16;;;;;;;;;;;;;;;;;;;;;;;;;31811:17;:36;;;;;31833:10;:14;31844:2;31833:14;;;;;;;;;;;;;;;;;;;;;;;;;31832:15;31811:36;31803:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;31731:180;31921:13;31938:18;:24;31957:4;31938:24;;;;;;;;;;;;;;;;;;;;;;;;;31937:25;:52;;;;;31967:18;:22;31986:2;31967:22;;;;;;;;;;;;;;;;;;;;;;;;;31966:23;31937:52;:71;;;;;32001:7;:5;:7::i;:::-;31993:15;;:4;:15;;;;31937:71;:88;;;;;32018:7;:5;:7::i;:::-;32012:13;;:2;:13;;;;31937:88;31921:104;;32049:13;;;;;;;;;;;32041:21;;:4;:21;;;;:44;;;;;32072:13;;;;;;;;;;;32066:19;;:2;:19;;;32041:44;:97;;;;32091:16;:22;32108:4;32091:22;;;;;;;;;;;;;;;;;;;;;;;;;32090:23;:47;;;;;32117:16;:20;32134:2;32117:20;;;;;;;;;;;;;;;;;;;;;;;;;32090:47;32041:97;32038:242;;;32234:4;32225:13;;32253:15;:13;:15::i;:::-;32038:242;32301:13;;;;;;;;;;;32293:21;;:4;:21;;;;:44;;;;;32324:13;;;;;;;;;;;32318:19;;:2;:19;;;;32293:44;:71;;;;;32342:16;:22;32359:4;32342:22;;;;;;;;;;;;;;;;;;;;;;;;;32341:23;32293:71;:96;;;;;32369:16;:20;32386:2;32369:20;;;;;;;;;;;;;;;;;;;;;;;;;32368:21;32293:96;32290:144;;;32417:5;32406:16;;32290:144;32444:50;32459:4;32465:2;32469:6;32477:8;32487:6;32444:14;:50::i;:::-;31290:1212;;31221:1281;;;:::o;4382:192::-;4468:7;4501:1;4496;:6;;4504:12;4488:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;4528:9;4544:1;4540;:5;;;;:::i;:::-;4528:17;;4565:1;4558:8;;;4382:192;;;;;:::o;29093:163::-;29134:7;29155:15;29172;29191:19;:17;:19::i;:::-;29154:56;;;;29228:20;29240:7;29228;:11;;:20;;;;:::i;:::-;29221:27;;;;29093:163;:::o;5780:132::-;5838:7;5865:39;5869:1;5872;5865:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;5858:46;;5780:132;;;;:::o;27891:419::-;27950:7;27959;27968;27977;27986;27995;28016:23;28041:12;28055:18;28077:20;28089:7;28077:11;:20::i;:::-;28015:82;;;;;;28109:15;28126:23;28151:12;28167:50;28179:7;28188:4;28194:10;28206;:8;:10::i;:::-;28167:11;:50::i;:::-;28108:109;;;;;;28236:7;28245:15;28262:4;28268:15;28285:4;28291:10;28228:74;;;;;;;;;;;;;;;;;;27891:419;;;;;;;:::o;3943:136::-;4001:7;4028:43;4032:1;4035;4028:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;4021:50;;3943:136;;;;:::o;27043:346::-;27138:9;27133:249;27157:9;:16;27153:1;:20;27133:249;;;27195:12;27210:9;27220:1;27210:12;;;;;;;;:::i;:::-;;;;;;;;27195:27;;27240:7;27237:134;;;27287:4;27268:10;:16;27279:4;27268:16;;;;;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;27237:134;;;27339:10;:16;27350:4;27339:16;;;;;;;;;;;;;;;;27332:23;;;;;;;;;;;27237:134;27180:202;27175:3;;;;;:::i;:::-;;;;27133:249;;;;27043:346;;:::o;35815:235::-;35950:8;35937:10;;:21;;;;;;;;;;;;;;;;;;35981:6;35969:9;;:18;;;;;;;;;;;;;;;;;;35998:44;36016:6;36024:9;36035:6;35998:17;:44::i;:::-;35815:235;;;;;:::o;32510:992::-;32554:28;32585:24;32603:4;32585:9;:24::i;:::-;32554:55;;32648:29;;32624:20;:53;;:74;;;;;32682:16;;;;;;;;;;;32681:17;32624:74;:99;;;;;32702:21;;;;;;;;;;;32624:99;32620:875;;;32906:28;32937:63;32996:3;32937:54;32962:12;:28;;;32937:20;:24;;:54;;;;:::i;:::-;:58;;:63;;;;:::i;:::-;32906:94;;33015:27;33045:46;33070:20;33045;:24;;:46;;;;:::i;:::-;33015:76;;33264:1;33242:19;:23;33239:131;;;33319:35;33334:19;33319:14;:35::i;:::-;33239:131;33445:38;33462:20;33445:16;:38::i;:::-;32725:770;;32620:875;32543:959;32510:992::o;29264:256::-;29314:7;29323;29343:15;29361:7;;29343:25;;29379:15;29397:7;;29379:25;;29429:20;29441:7;;29429;;:11;;:20;;;;:::i;:::-;29419:7;:30;29415:61;;;29459:7;;29468;;29451:25;;;;;;;;29415:61;29495:7;29504;29487:25;;;;;;29264:256;;;:::o;6408:278::-;6494:7;6526:1;6522;:5;6529:12;6514:28;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;6553:9;6569:1;6565;:5;;;;:::i;:::-;6553:17;;6677:1;6670:8;;;6408:278;;;;;:::o;28318:330::-;28378:7;28387;28396;28416:12;28431:24;28447:7;28431:15;:24::i;:::-;28416:39;;28466:18;28487:30;28509:7;28487:21;:30::i;:::-;28466:51;;28528:23;28554:33;28576:10;28554:17;28566:4;28554:7;:11;;:17;;;;:::i;:::-;:21;;:33;;;;:::i;:::-;28528:59;;28606:15;28623:4;28629:10;28598:42;;;;;;;;;28318:330;;;;;:::o;28656:429::-;28771:7;28780;28789;28809:15;28827:24;28839:11;28827:7;:11;;:24;;;;:::i;:::-;28809:42;;28862:12;28877:21;28886:11;28877:4;:8;;:21;;;;:::i;:::-;28862:36;;28909:18;28930:27;28945:11;28930:10;:14;;:27;;;;:::i;:::-;28909:48;;28968:23;28994:33;29016:10;28994:17;29006:4;28994:7;:11;;:17;;;;:::i;:::-;:21;;:33;;;;:::i;:::-;28968:59;;29046:7;29055:15;29072:4;29038:39;;;;;;;;;;28656:429;;;;;;;;:::o;36058:502::-;36157:15;36174:23;36199:12;36213:23;36238:12;36252:18;36274:19;36285:7;36274:10;:19::i;:::-;36156:137;;;;;;;;;;;;36322:28;36342:7;36322;:15;36330:6;36322:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;36304:7;:15;36312:6;36304:15;;;;;;;;;;;;;;;:46;;;;36382:39;36405:15;36382:7;:18;36390:9;36382:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;36361:7;:18;36369:9;36361:18;;;;;;;;;;;;;;;:60;;;;36432:26;36447:10;36432:14;:26::i;:::-;36469:23;36481:4;36487;36469:11;:23::i;:::-;36525:9;36508:44;;36517:6;36508:44;;;36536:15;36508:44;;;;;;:::i;:::-;;;;;;;;36145:415;;;;;;36058:502;;;:::o;4833:471::-;4891:7;5141:1;5136;:6;5132:47;;;5166:1;5159:8;;;;5132:47;5191:9;5207:1;5203;:5;;;;:::i;:::-;5191:17;;5236:1;5231;5227;:5;;;;:::i;:::-;:10;5219:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;5295:1;5288:8;;;4833:471;;;;;:::o;33510:464::-;17870:4;17851:16;;:23;;;;;;;;;;;;;;;;;;33595:12:::1;33610:27;33635:1;33610:20;:24;;:27;;;;:::i;:::-;33595:42;;33648:17;33668:30;33693:4;33668:20;:24;;:30;;;;:::i;:::-;33648:50;;33709:22;33734:21;33709:46;;33766:22;33783:4;33766:16;:22::i;:::-;33799:18;33820:41;33846:14;33820:21;:25;;:41;;;;:::i;:::-;33799:62;;33872:35;33885:9;33896:10;33872:12;:35::i;:::-;33923:43;33938:4;33944:10;33956:9;33923:43;;;;;;;;:::i;:::-;;;;;;;;33584:390;;;;17916:5:::0;17897:16;;:24;;;;;;;;;;;;;;;;;;33510:464;:::o;34501:640::-;17870:4;17851:16;;:23;;;;;;;;;;;;;;;;;;34588:38:::1;34605:20;34588:16;:38::i;:::-;34637:22;34662:21;34637:46;;34694:22;34719:64;34779:3;34719:55;34738:12;:35;;;34719:14;:18;;:55;;;;:::i;:::-;:59;;:64;;;;:::i;:::-;34694:89;;34794:20;34817:62;34875:3;34817:53;34836:12;:33;;;34817:14;:18;;:53;;;;:::i;:::-;:57;;:62;;;;:::i;:::-;34794:85;;34890:16;34909:58;34963:3;34909:49;34928:12;:29;;;34909:14;:18;;:49;;;;:::i;:::-;:53;;:58;;;;:::i;:::-;34890:77;;34986:15;;;;;;;;;;;34978:33;;:49;35012:14;34978:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;35046:13;;;;;;;;;;;35038:31;;:45;35070:12;35038:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;35102:9;;;;;;;;;;;35094:27;;:37;35122:8;35094:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;34577:564;;;;17916:5:::0;17897:16;;:24;;;;;;;;;;;;;;;;;;34501:640;:::o;29773:384::-;29837:7;29857:21;29881:1;29857:25;;29896:10;;;;;;;;;;;29893:202;;;29939:7;:21;;;29923:37;;29978:9;;;;;;;;;;;29975:109;;;30024:44;30042:7;:25;;;30024:13;:17;;:44;;;;:::i;:::-;30008:60;;29975:109;29893:202;30112:37;30143:5;30112:26;30124:13;30112:7;:11;;:26;;;;:::i;:::-;:30;;:37;;;;:::i;:::-;30105:44;;;29773:384;;;:::o;30165:572::-;30235:7;30255:25;30283:1;30255:29;;30298:10;;;;;;;;;;;30295:376;;;30345:7;:20;;;30325:40;;30383:9;;;;;;;;;;;30380:280;;;30433:47;30455:7;:24;;;30433:17;:21;;:47;;;;:::i;:::-;30413:67;;30513:21;;30502:7;:32;30499:146;;30579:46;30601:7;:23;;;30579:17;:21;;:46;;;;:::i;:::-;30559:66;;30499:146;30380:280;30295:376;30688:41;30723:5;30688:30;30700:17;30688:7;:11;;:30;;;;:::i;:::-;:34;;:41;;;;:::i;:::-;30681:48;;;30165:572;;;:::o;29528:237::-;29591:19;29614:10;:8;:10::i;:::-;29591:33;;29635:18;29656:27;29671:11;29656:10;:14;;:27;;;;:::i;:::-;29635:48;;29719:38;29746:10;29719:7;:22;29735:4;29719:22;;;;;;;;;;;;;;;;:26;;:38;;;;:::i;:::-;29694:7;:22;29710:4;29694:22;;;;;;;;;;;;;;;:63;;;;29580:185;;29528:237;:::o;27736:147::-;27814:17;27826:4;27814:7;;:11;;:17;;;;:::i;:::-;27804:7;:27;;;;27855:20;27870:4;27855:10;;:14;;:20;;;;:::i;:::-;27842:10;:33;;;;27736:147;;:::o;35149:585::-;35275:21;35313:1;35299:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35275:40;;35344:4;35326;35331:1;35326:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;35370:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35360:4;35365:1;35360:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;;;35403:62;35420:4;35435:15;;;;;;;;;;;35453:11;35403:8;:62::i;:::-;35502:15;;;;;;;;;;;:66;;;35583:11;35609:1;35653:4;35680;35700:15;35502:224;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35204:530;35149:585;:::o;33982:513::-;34130:62;34147:4;34162:15;;;;;;;;;;;34180:11;34130:8;:62::i;:::-;34235:15;;;;;;;;;;;:31;;;34274:9;34307:4;34327:11;34353:1;34396;34439:7;:5;:7::i;:::-;34461:15;34235:252;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;33982:513;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:117;443:1;440;433:12;457:117;566:1;563;556:12;580:117;689:1;686;679:12;720:568;793:8;803:6;853:3;846:4;838:6;834:17;830:27;820:122;;861:79;;:::i;:::-;820:122;974:6;961:20;951:30;;1004:18;996:6;993:30;990:117;;;1026:79;;:::i;:::-;990:117;1140:4;1132:6;1128:17;1116:29;;1194:3;1186:4;1178:6;1174:17;1164:8;1160:32;1157:41;1154:128;;;1201:79;;:::i;:::-;1154:128;720:568;;;;;:::o;1294:559::-;1380:6;1388;1437:2;1425:9;1416:7;1412:23;1408:32;1405:119;;;1443:79;;:::i;:::-;1405:119;1591:1;1580:9;1576:17;1563:31;1621:18;1613:6;1610:30;1607:117;;;1643:79;;:::i;:::-;1607:117;1756:80;1828:7;1819:6;1808:9;1804:22;1756:80;:::i;:::-;1738:98;;;;1534:312;1294:559;;;;;:::o;1859:99::-;1911:6;1945:5;1939:12;1929:22;;1859:99;;;:::o;1964:169::-;2048:11;2082:6;2077:3;2070:19;2122:4;2117:3;2113:14;2098:29;;1964:169;;;;:::o;2139:307::-;2207:1;2217:113;2231:6;2228:1;2225:13;2217:113;;;2316:1;2311:3;2307:11;2301:18;2297:1;2292:3;2288:11;2281:39;2253:2;2250:1;2246:10;2241:15;;2217:113;;;2348:6;2345:1;2342:13;2339:101;;;2428:1;2419:6;2414:3;2410:16;2403:27;2339:101;2188:258;2139:307;;;:::o;2452:102::-;2493:6;2544:2;2540:7;2535:2;2528:5;2524:14;2520:28;2510:38;;2452:102;;;:::o;2560:364::-;2648:3;2676:39;2709:5;2676:39;:::i;:::-;2731:71;2795:6;2790:3;2731:71;:::i;:::-;2724:78;;2811:52;2856:6;2851:3;2844:4;2837:5;2833:16;2811:52;:::i;:::-;2888:29;2910:6;2888:29;:::i;:::-;2883:3;2879:39;2872:46;;2652:272;2560:364;;;;:::o;2930:313::-;3043:4;3081:2;3070:9;3066:18;3058:26;;3130:9;3124:4;3120:20;3116:1;3105:9;3101:17;3094:47;3158:78;3231:4;3222:6;3158:78;:::i;:::-;3150:86;;2930:313;;;;:::o;3249:126::-;3286:7;3326:42;3319:5;3315:54;3304:65;;3249:126;;;:::o;3381:96::-;3418:7;3447:24;3465:5;3447:24;:::i;:::-;3436:35;;3381:96;;;:::o;3483:122::-;3556:24;3574:5;3556:24;:::i;:::-;3549:5;3546:35;3536:63;;3595:1;3592;3585:12;3536:63;3483:122;:::o;3611:139::-;3657:5;3695:6;3682:20;3673:29;;3711:33;3738:5;3711:33;:::i;:::-;3611:139;;;;:::o;3756:77::-;3793:7;3822:5;3811:16;;3756:77;;;:::o;3839:122::-;3912:24;3930:5;3912:24;:::i;:::-;3905:5;3902:35;3892:63;;3951:1;3948;3941:12;3892:63;3839:122;:::o;3967:139::-;4013:5;4051:6;4038:20;4029:29;;4067:33;4094:5;4067:33;:::i;:::-;3967:139;;;;:::o;4112:474::-;4180:6;4188;4237:2;4225:9;4216:7;4212:23;4208:32;4205:119;;;4243:79;;:::i;:::-;4205:119;4363:1;4388:53;4433:7;4424:6;4413:9;4409:22;4388:53;:::i;:::-;4378:63;;4334:117;4490:2;4516:53;4561:7;4552:6;4541:9;4537:22;4516:53;:::i;:::-;4506:63;;4461:118;4112:474;;;;;:::o;4592:90::-;4626:7;4669:5;4662:13;4655:21;4644:32;;4592:90;;;:::o;4688:109::-;4769:21;4784:5;4769:21;:::i;:::-;4764:3;4757:34;4688:109;;:::o;4803:210::-;4890:4;4928:2;4917:9;4913:18;4905:26;;4941:65;5003:1;4992:9;4988:17;4979:6;4941:65;:::i;:::-;4803:210;;;;:::o;5019:118::-;5106:24;5124:5;5106:24;:::i;:::-;5101:3;5094:37;5019:118;;:::o;5143:664::-;5348:4;5386:3;5375:9;5371:19;5363:27;;5400:71;5468:1;5457:9;5453:17;5444:6;5400:71;:::i;:::-;5481:72;5549:2;5538:9;5534:18;5525:6;5481:72;:::i;:::-;5563;5631:2;5620:9;5616:18;5607:6;5563:72;:::i;:::-;5645;5713:2;5702:9;5698:18;5689:6;5645:72;:::i;:::-;5727:73;5795:3;5784:9;5780:19;5771:6;5727:73;:::i;:::-;5143:664;;;;;;;;:::o;5813:765::-;5899:6;5907;5915;5923;5972:3;5960:9;5951:7;5947:23;5943:33;5940:120;;;5979:79;;:::i;:::-;5940:120;6099:1;6124:53;6169:7;6160:6;6149:9;6145:22;6124:53;:::i;:::-;6114:63;;6070:117;6226:2;6252:53;6297:7;6288:6;6277:9;6273:22;6252:53;:::i;:::-;6242:63;;6197:118;6354:2;6380:53;6425:7;6416:6;6405:9;6401:22;6380:53;:::i;:::-;6370:63;;6325:118;6482:2;6508:53;6553:7;6544:6;6533:9;6529:22;6508:53;:::i;:::-;6498:63;;6453:118;5813:765;;;;;;;:::o;6584:222::-;6677:4;6715:2;6704:9;6700:18;6692:26;;6728:71;6796:1;6785:9;6781:17;6772:6;6728:71;:::i;:::-;6584:222;;;;:::o;6812:60::-;6840:3;6861:5;6854:12;;6812:60;;;:::o;6878:142::-;6928:9;6961:53;6979:34;6988:24;7006:5;6988:24;:::i;:::-;6979:34;:::i;:::-;6961:53;:::i;:::-;6948:66;;6878:142;;;:::o;7026:126::-;7076:9;7109:37;7140:5;7109:37;:::i;:::-;7096:50;;7026:126;;;:::o;7158:152::-;7234:9;7267:37;7298:5;7267:37;:::i;:::-;7254:50;;7158:152;;;:::o;7316:183::-;7429:63;7486:5;7429:63;:::i;:::-;7424:3;7417:76;7316:183;;:::o;7505:274::-;7624:4;7662:2;7651:9;7647:18;7639:26;;7675:97;7769:1;7758:9;7754:17;7745:6;7675:97;:::i;:::-;7505:274;;;;:::o;7785:619::-;7862:6;7870;7878;7927:2;7915:9;7906:7;7902:23;7898:32;7895:119;;;7933:79;;:::i;:::-;7895:119;8053:1;8078:53;8123:7;8114:6;8103:9;8099:22;8078:53;:::i;:::-;8068:63;;8024:117;8180:2;8206:53;8251:7;8242:6;8231:9;8227:22;8206:53;:::i;:::-;8196:63;;8151:118;8308:2;8334:53;8379:7;8370:6;8359:9;8355:22;8334:53;:::i;:::-;8324:63;;8279:118;7785:619;;;;;:::o;8410:329::-;8469:6;8518:2;8506:9;8497:7;8493:23;8489:32;8486:119;;;8524:79;;:::i;:::-;8486:119;8644:1;8669:53;8714:7;8705:6;8694:9;8690:22;8669:53;:::i;:::-;8659:63;;8615:117;8410:329;;;;:::o;8745:86::-;8780:7;8820:4;8813:5;8809:16;8798:27;;8745:86;;;:::o;8837:112::-;8920:22;8936:5;8920:22;:::i;:::-;8915:3;8908:35;8837:112;;:::o;8955:214::-;9044:4;9082:2;9071:9;9067:18;9059:26;;9095:67;9159:1;9148:9;9144:17;9135:6;9095:67;:::i;:::-;8955:214;;;;:::o;9175:116::-;9245:21;9260:5;9245:21;:::i;:::-;9238:5;9235:32;9225:60;;9281:1;9278;9271:12;9225:60;9175:116;:::o;9297:133::-;9340:5;9378:6;9365:20;9356:29;;9394:30;9418:5;9394:30;:::i;:::-;9297:133;;;;:::o;9436:468::-;9501:6;9509;9558:2;9546:9;9537:7;9533:23;9529:32;9526:119;;;9564:79;;:::i;:::-;9526:119;9684:1;9709:53;9754:7;9745:6;9734:9;9730:22;9709:53;:::i;:::-;9699:63;;9655:117;9811:2;9837:50;9879:7;9870:6;9859:9;9855:22;9837:50;:::i;:::-;9827:60;;9782:115;9436:468;;;;;:::o;9910:118::-;9997:24;10015:5;9997:24;:::i;:::-;9992:3;9985:37;9910:118;;:::o;10034:222::-;10127:4;10165:2;10154:9;10150:18;10142:26;;10178:71;10246:1;10235:9;10231:17;10222:6;10178:71;:::i;:::-;10034:222;;;;:::o;10262:329::-;10321:6;10370:2;10358:9;10349:7;10345:23;10341:32;10338:119;;;10376:79;;:::i;:::-;10338:119;10496:1;10521:53;10566:7;10557:6;10546:9;10542:22;10521:53;:::i;:::-;10511:63;;10467:117;10262:329;;;;:::o;10597:553::-;10774:4;10812:3;10801:9;10797:19;10789:27;;10826:71;10894:1;10883:9;10879:17;10870:6;10826:71;:::i;:::-;10907:72;10975:2;10964:9;10960:18;10951:6;10907:72;:::i;:::-;10989;11057:2;11046:9;11042:18;11033:6;10989:72;:::i;:::-;11071;11139:2;11128:9;11124:18;11115:6;11071:72;:::i;:::-;10597:553;;;;;;;:::o;11156:619::-;11233:6;11241;11249;11298:2;11286:9;11277:7;11273:23;11269:32;11266:119;;;11304:79;;:::i;:::-;11266:119;11424:1;11449:53;11494:7;11485:6;11474:9;11470:22;11449:53;:::i;:::-;11439:63;;11395:117;11551:2;11577:53;11622:7;11613:6;11602:9;11598:22;11577:53;:::i;:::-;11567:63;;11522:118;11679:2;11705:53;11750:7;11741:6;11730:9;11726:22;11705:53;:::i;:::-;11695:63;;11650:118;11156:619;;;;;:::o;11781:180::-;11829:77;11826:1;11819:88;11926:4;11923:1;11916:15;11950:4;11947:1;11940:15;11967:281;12050:27;12072:4;12050:27;:::i;:::-;12042:6;12038:40;12180:6;12168:10;12165:22;12144:18;12132:10;12129:34;12126:62;12123:88;;;12191:18;;:::i;:::-;12123:88;12231:10;12227:2;12220:22;12010:238;11967:281;;:::o;12254:129::-;12288:6;12315:20;;:::i;:::-;12305:30;;12344:33;12372:4;12364:6;12344:33;:::i;:::-;12254:129;;;:::o;12389:311::-;12466:4;12556:18;12548:6;12545:30;12542:56;;;12578:18;;:::i;:::-;12542:56;12628:4;12620:6;12616:17;12608:25;;12688:4;12682;12678:15;12670:23;;12389:311;;;:::o;12723:710::-;12819:5;12844:81;12860:64;12917:6;12860:64;:::i;:::-;12844:81;:::i;:::-;12835:90;;12945:5;12974:6;12967:5;12960:21;13008:4;13001:5;12997:16;12990:23;;13061:4;13053:6;13049:17;13041:6;13037:30;13090:3;13082:6;13079:15;13076:122;;;13109:79;;:::i;:::-;13076:122;13224:6;13207:220;13241:6;13236:3;13233:15;13207:220;;;13316:3;13345:37;13378:3;13366:10;13345:37;:::i;:::-;13340:3;13333:50;13412:4;13407:3;13403:14;13396:21;;13283:144;13267:4;13262:3;13258:14;13251:21;;13207:220;;;13211:21;12825:608;;12723:710;;;;;:::o;13456:370::-;13527:5;13576:3;13569:4;13561:6;13557:17;13553:27;13543:122;;13584:79;;:::i;:::-;13543:122;13701:6;13688:20;13726:94;13816:3;13808:6;13801:4;13793:6;13789:17;13726:94;:::i;:::-;13717:103;;13533:293;13456:370;;;;:::o;13832:539::-;13916:6;13965:2;13953:9;13944:7;13940:23;13936:32;13933:119;;;13971:79;;:::i;:::-;13933:119;14119:1;14108:9;14104:17;14091:31;14149:18;14141:6;14138:30;14135:117;;;14171:79;;:::i;:::-;14135:117;14276:78;14346:7;14337:6;14326:9;14322:22;14276:78;:::i;:::-;14266:88;;14062:302;13832:539;;;;:::o;14377:323::-;14433:6;14482:2;14470:9;14461:7;14457:23;14453:32;14450:119;;;14488:79;;:::i;:::-;14450:119;14608:1;14633:50;14675:7;14666:6;14655:9;14651:22;14633:50;:::i;:::-;14623:60;;14579:114;14377:323;;;;:::o;14706:911::-;14801:6;14809;14817;14825;14833;14882:3;14870:9;14861:7;14857:23;14853:33;14850:120;;;14889:79;;:::i;:::-;14850:120;15009:1;15034:53;15079:7;15070:6;15059:9;15055:22;15034:53;:::i;:::-;15024:63;;14980:117;15136:2;15162:53;15207:7;15198:6;15187:9;15183:22;15162:53;:::i;:::-;15152:63;;15107:118;15264:2;15290:53;15335:7;15326:6;15315:9;15311:22;15290:53;:::i;:::-;15280:63;;15235:118;15392:2;15418:53;15463:7;15454:6;15443:9;15439:22;15418:53;:::i;:::-;15408:63;;15363:118;15520:3;15547:53;15592:7;15583:6;15572:9;15568:22;15547:53;:::i;:::-;15537:63;;15491:119;14706:911;;;;;;;;:::o;15640:568::-;15713:8;15723:6;15773:3;15766:4;15758:6;15754:17;15750:27;15740:122;;15781:79;;:::i;:::-;15740:122;15894:6;15881:20;15871:30;;15924:18;15916:6;15913:30;15910:117;;;15946:79;;:::i;:::-;15910:117;16060:4;16052:6;16048:17;16036:29;;16114:3;16106:4;16098:6;16094:17;16084:8;16080:32;16077:41;16074:128;;;16121:79;;:::i;:::-;16074:128;15640:568;;;;;:::o;16214:934::-;16336:6;16344;16352;16360;16409:2;16397:9;16388:7;16384:23;16380:32;16377:119;;;16415:79;;:::i;:::-;16377:119;16563:1;16552:9;16548:17;16535:31;16593:18;16585:6;16582:30;16579:117;;;16615:79;;:::i;:::-;16579:117;16728:80;16800:7;16791:6;16780:9;16776:22;16728:80;:::i;:::-;16710:98;;;;16506:312;16885:2;16874:9;16870:18;16857:32;16916:18;16908:6;16905:30;16902:117;;;16938:79;;:::i;:::-;16902:117;17051:80;17123:7;17114:6;17103:9;17099:22;17051:80;:::i;:::-;17033:98;;;;16828:313;16214:934;;;;;;;:::o;17154:474::-;17222:6;17230;17279:2;17267:9;17258:7;17254:23;17250:32;17247:119;;;17285:79;;:::i;:::-;17247:119;17405:1;17430:53;17475:7;17466:6;17455:9;17451:22;17430:53;:::i;:::-;17420:63;;17376:117;17532:2;17558:53;17603:7;17594:6;17583:9;17579:22;17558:53;:::i;:::-;17548:63;;17503:118;17154:474;;;;;:::o;17634:182::-;17774:34;17770:1;17762:6;17758:14;17751:58;17634:182;:::o;17822:366::-;17964:3;17985:67;18049:2;18044:3;17985:67;:::i;:::-;17978:74;;18061:93;18150:3;18061:93;:::i;:::-;18179:2;18174:3;18170:12;18163:19;;17822:366;;;:::o;18194:419::-;18360:4;18398:2;18387:9;18383:18;18375:26;;18447:9;18441:4;18437:20;18433:1;18422:9;18418:17;18411:47;18475:131;18601:4;18475:131;:::i;:::-;18467:139;;18194:419;;;:::o;18619:180::-;18667:77;18664:1;18657:88;18764:4;18761:1;18754:15;18788:4;18785:1;18778:15;18805:320;18849:6;18886:1;18880:4;18876:12;18866:22;;18933:1;18927:4;18923:12;18954:18;18944:81;;19010:4;19002:6;18998:17;18988:27;;18944:81;19072:2;19064:6;19061:14;19041:18;19038:38;19035:84;;;19091:18;;:::i;:::-;19035:84;18856:269;18805:320;;;:::o;19131:179::-;19271:31;19267:1;19259:6;19255:14;19248:55;19131:179;:::o;19316:366::-;19458:3;19479:67;19543:2;19538:3;19479:67;:::i;:::-;19472:74;;19555:93;19644:3;19555:93;:::i;:::-;19673:2;19668:3;19664:12;19657:19;;19316:366;;;:::o;19688:419::-;19854:4;19892:2;19881:9;19877:18;19869:26;;19941:9;19935:4;19931:20;19927:1;19916:9;19912:17;19905:47;19969:131;20095:4;19969:131;:::i;:::-;19961:139;;19688:419;;;:::o;20113:229::-;20253:34;20249:1;20241:6;20237:14;20230:58;20322:12;20317:2;20309:6;20305:15;20298:37;20113:229;:::o;20348:366::-;20490:3;20511:67;20575:2;20570:3;20511:67;:::i;:::-;20504:74;;20587:93;20676:3;20587:93;:::i;:::-;20705:2;20700:3;20696:12;20689:19;;20348:366;;;:::o;20720:419::-;20886:4;20924:2;20913:9;20909:18;20901:26;;20973:9;20967:4;20963:20;20959:1;20948:9;20944:17;20937:47;21001:131;21127:4;21001:131;:::i;:::-;20993:139;;20720:419;;;:::o;21145:181::-;21285:33;21281:1;21273:6;21269:14;21262:57;21145:181;:::o;21332:366::-;21474:3;21495:67;21559:2;21554:3;21495:67;:::i;:::-;21488:74;;21571:93;21660:3;21571:93;:::i;:::-;21689:2;21684:3;21680:12;21673:19;;21332:366;;;:::o;21704:419::-;21870:4;21908:2;21897:9;21893:18;21885:26;;21957:9;21951:4;21947:20;21943:1;21932:9;21928:17;21921:47;21985:131;22111:4;21985:131;:::i;:::-;21977:139;;21704:419;;;:::o;22129:180::-;22177:77;22174:1;22167:88;22274:4;22271:1;22264:15;22298:4;22295:1;22288:15;22315:348;22355:7;22378:20;22396:1;22378:20;:::i;:::-;22373:25;;22412:20;22430:1;22412:20;:::i;:::-;22407:25;;22600:1;22532:66;22528:74;22525:1;22522:81;22517:1;22510:9;22503:17;22499:105;22496:131;;;22607:18;;:::i;:::-;22496:131;22655:1;22652;22648:9;22637:20;;22315:348;;;;:::o;22669:221::-;22809:34;22805:1;22797:6;22793:14;22786:58;22878:4;22873:2;22865:6;22861:15;22854:29;22669:221;:::o;22896:366::-;23038:3;23059:67;23123:2;23118:3;23059:67;:::i;:::-;23052:74;;23135:93;23224:3;23135:93;:::i;:::-;23253:2;23248:3;23244:12;23237:19;;22896:366;;;:::o;23268:419::-;23434:4;23472:2;23461:9;23457:18;23449:26;;23521:9;23515:4;23511:20;23507:1;23496:9;23492:17;23485:47;23549:131;23675:4;23549:131;:::i;:::-;23541:139;;23268:419;;;:::o;23693:143::-;23750:5;23781:6;23775:13;23766:22;;23797:33;23824:5;23797:33;:::i;:::-;23693:143;;;;:::o;23842:351::-;23912:6;23961:2;23949:9;23940:7;23936:23;23932:32;23929:119;;;23967:79;;:::i;:::-;23929:119;24087:1;24112:64;24168:7;24159:6;24148:9;24144:22;24112:64;:::i;:::-;24102:74;;24058:128;23842:351;;;;:::o;24199:332::-;24320:4;24358:2;24347:9;24343:18;24335:26;;24371:71;24439:1;24428:9;24424:17;24415:6;24371:71;:::i;:::-;24452:72;24520:2;24509:9;24505:18;24496:6;24452:72;:::i;:::-;24199:332;;;;;:::o;24537:232::-;24677:34;24673:1;24665:6;24661:14;24654:58;24746:15;24741:2;24733:6;24729:15;24722:40;24537:232;:::o;24775:366::-;24917:3;24938:67;25002:2;24997:3;24938:67;:::i;:::-;24931:74;;25014:93;25103:3;25014:93;:::i;:::-;25132:2;25127:3;25123:12;25116:19;;24775:366;;;:::o;25147:419::-;25313:4;25351:2;25340:9;25336:18;25328:26;;25400:9;25394:4;25390:20;25386:1;25375:9;25371:17;25364:47;25428:131;25554:4;25428:131;:::i;:::-;25420:139;;25147:419;;;:::o;25572:229::-;25712:34;25708:1;25700:6;25696:14;25689:58;25781:12;25776:2;25768:6;25764:15;25757:37;25572:229;:::o;25807:366::-;25949:3;25970:67;26034:2;26029:3;25970:67;:::i;:::-;25963:74;;26046:93;26135:3;26046:93;:::i;:::-;26164:2;26159:3;26155:12;26148:19;;25807:366;;;:::o;26179:419::-;26345:4;26383:2;26372:9;26368:18;26360:26;;26432:9;26426:4;26422:20;26418:1;26407:9;26403:17;26396:47;26460:131;26586:4;26460:131;:::i;:::-;26452:139;;26179:419;;;:::o;26604:180::-;26652:77;26649:1;26642:88;26749:4;26746:1;26739:15;26773:4;26770:1;26763:15;26790:305;26830:3;26849:20;26867:1;26849:20;:::i;:::-;26844:25;;26883:20;26901:1;26883:20;:::i;:::-;26878:25;;27037:1;26969:66;26965:74;26962:1;26959:81;26956:107;;;27043:18;;:::i;:::-;26956:107;27087:1;27084;27080:9;27073:16;;26790:305;;;;:::o;27101:225::-;27241:34;27237:1;27229:6;27225:14;27218:58;27310:8;27305:2;27297:6;27293:15;27286:33;27101:225;:::o;27332:366::-;27474:3;27495:67;27559:2;27554:3;27495:67;:::i;:::-;27488:74;;27571:93;27660:3;27571:93;:::i;:::-;27689:2;27684:3;27680:12;27673:19;;27332:366;;;:::o;27704:419::-;27870:4;27908:2;27897:9;27893:18;27885:26;;27957:9;27951:4;27947:20;27943:1;27932:9;27928:17;27921:47;27985:131;28111:4;27985:131;:::i;:::-;27977:139;;27704:419;;;:::o;28129:233::-;28168:3;28191:24;28209:5;28191:24;:::i;:::-;28182:33;;28237:66;28230:5;28227:77;28224:103;;;28307:18;;:::i;:::-;28224:103;28354:1;28347:5;28343:13;28336:20;;28129:233;;;:::o;28368:223::-;28508:34;28504:1;28496:6;28492:14;28485:58;28577:6;28572:2;28564:6;28560:15;28553:31;28368:223;:::o;28597:366::-;28739:3;28760:67;28824:2;28819:3;28760:67;:::i;:::-;28753:74;;28836:93;28925:3;28836:93;:::i;:::-;28954:2;28949:3;28945:12;28938:19;;28597:366;;;:::o;28969:419::-;29135:4;29173:2;29162:9;29158:18;29150:26;;29222:9;29216:4;29212:20;29208:1;29197:9;29193:17;29186:47;29250:131;29376:4;29250:131;:::i;:::-;29242:139;;28969:419;;;:::o;29394:221::-;29534:34;29530:1;29522:6;29518:14;29511:58;29603:4;29598:2;29590:6;29586:15;29579:29;29394:221;:::o;29621:366::-;29763:3;29784:67;29848:2;29843:3;29784:67;:::i;:::-;29777:74;;29860:93;29949:3;29860:93;:::i;:::-;29978:2;29973:3;29969:12;29962:19;;29621:366;;;:::o;29993:419::-;30159:4;30197:2;30186:9;30182:18;30174:26;;30246:9;30240:4;30236:20;30232:1;30221:9;30217:17;30210:47;30274:131;30400:4;30274:131;:::i;:::-;30266:139;;29993:419;;;:::o;30418:177::-;30558:29;30554:1;30546:6;30542:14;30535:53;30418:177;:::o;30601:366::-;30743:3;30764:67;30828:2;30823:3;30764:67;:::i;:::-;30757:74;;30840:93;30929:3;30840:93;:::i;:::-;30958:2;30953:3;30949:12;30942:19;;30601:366;;;:::o;30973:419::-;31139:4;31177:2;31166:9;31162:18;31154:26;;31226:9;31220:4;31216:20;31212:1;31201:9;31197:17;31190:47;31254:131;31380:4;31254:131;:::i;:::-;31246:139;;30973:419;;;:::o;31398:224::-;31538:34;31534:1;31526:6;31522:14;31515:58;31607:7;31602:2;31594:6;31590:15;31583:32;31398:224;:::o;31628:366::-;31770:3;31791:67;31855:2;31850:3;31791:67;:::i;:::-;31784:74;;31867:93;31956:3;31867:93;:::i;:::-;31985:2;31980:3;31976:12;31969:19;;31628:366;;;:::o;32000:419::-;32166:4;32204:2;32193:9;32189:18;32181:26;;32253:9;32247:4;32243:20;32239:1;32228:9;32224:17;32217:47;32281:131;32407:4;32281:131;:::i;:::-;32273:139;;32000:419;;;:::o;32425:222::-;32565:34;32561:1;32553:6;32549:14;32542:58;32634:5;32629:2;32621:6;32617:15;32610:30;32425:222;:::o;32653:366::-;32795:3;32816:67;32880:2;32875:3;32816:67;:::i;:::-;32809:74;;32892:93;32981:3;32892:93;:::i;:::-;33010:2;33005:3;33001:12;32994:19;;32653:366;;;:::o;33025:419::-;33191:4;33229:2;33218:9;33214:18;33206:26;;33278:9;33272:4;33268:20;33264:1;33253:9;33249:17;33242:47;33306:131;33432:4;33306:131;:::i;:::-;33298:139;;33025:419;;;:::o;33450:228::-;33590:34;33586:1;33578:6;33574:14;33567:58;33659:11;33654:2;33646:6;33642:15;33635:36;33450:228;:::o;33684:366::-;33826:3;33847:67;33911:2;33906:3;33847:67;:::i;:::-;33840:74;;33923:93;34012:3;33923:93;:::i;:::-;34041:2;34036:3;34032:12;34025:19;;33684:366;;;:::o;34056:419::-;34222:4;34260:2;34249:9;34245:18;34237:26;;34309:9;34303:4;34299:20;34295:1;34284:9;34280:17;34273:47;34337:131;34463:4;34337:131;:::i;:::-;34329:139;;34056:419;;;:::o;34481:180::-;34621:32;34617:1;34609:6;34605:14;34598:56;34481:180;:::o;34667:366::-;34809:3;34830:67;34894:2;34889:3;34830:67;:::i;:::-;34823:74;;34906:93;34995:3;34906:93;:::i;:::-;35024:2;35019:3;35015:12;35008:19;;34667:366;;;:::o;35039:419::-;35205:4;35243:2;35232:9;35228:18;35220:26;;35292:9;35286:4;35282:20;35278:1;35267:9;35263:17;35256:47;35320:131;35446:4;35320:131;:::i;:::-;35312:139;;35039:419;;;:::o;35464:234::-;35604:34;35600:1;35592:6;35588:14;35581:58;35673:17;35668:2;35660:6;35656:15;35649:42;35464:234;:::o;35704:366::-;35846:3;35867:67;35931:2;35926:3;35867:67;:::i;:::-;35860:74;;35943:93;36032:3;35943:93;:::i;:::-;36061:2;36056:3;36052:12;36045:19;;35704:366;;;:::o;36076:419::-;36242:4;36280:2;36269:9;36265:18;36257:26;;36329:9;36323:4;36319:20;36315:1;36304:9;36300:17;36293:47;36357:131;36483:4;36357:131;:::i;:::-;36349:139;;36076:419;;;:::o;36501:191::-;36541:4;36561:20;36579:1;36561:20;:::i;:::-;36556:25;;36595:20;36613:1;36595:20;:::i;:::-;36590:25;;36634:1;36631;36628:8;36625:34;;;36639:18;;:::i;:::-;36625:34;36684:1;36681;36677:9;36669:17;;36501:191;;;;:::o;36698:180::-;36746:77;36743:1;36736:88;36843:4;36840:1;36833:15;36867:4;36864:1;36857:15;36884:185;36924:1;36941:20;36959:1;36941:20;:::i;:::-;36936:25;;36975:20;36993:1;36975:20;:::i;:::-;36970:25;;37014:1;37004:35;;37019:18;;:::i;:::-;37004:35;37061:1;37058;37054:9;37049:14;;36884:185;;;;:::o;37075:220::-;37215:34;37211:1;37203:6;37199:14;37192:58;37284:3;37279:2;37271:6;37267:15;37260:28;37075:220;:::o;37301:366::-;37443:3;37464:67;37528:2;37523:3;37464:67;:::i;:::-;37457:74;;37540:93;37629:3;37540:93;:::i;:::-;37658:2;37653:3;37649:12;37642:19;;37301:366;;;:::o;37673:419::-;37839:4;37877:2;37866:9;37862:18;37854:26;;37926:9;37920:4;37916:20;37912:1;37901:9;37897:17;37890:47;37954:131;38080:4;37954:131;:::i;:::-;37946:139;;37673:419;;;:::o;38098:442::-;38247:4;38285:2;38274:9;38270:18;38262:26;;38298:71;38366:1;38355:9;38351:17;38342:6;38298:71;:::i;:::-;38379:72;38447:2;38436:9;38432:18;38423:6;38379:72;:::i;:::-;38461;38529:2;38518:9;38514:18;38505:6;38461:72;:::i;:::-;38098:442;;;;;;:::o;38546:85::-;38591:7;38620:5;38609:16;;38546:85;;;:::o;38637:158::-;38695:9;38728:61;38746:42;38755:32;38781:5;38755:32;:::i;:::-;38746:42;:::i;:::-;38728:61;:::i;:::-;38715:74;;38637:158;;;:::o;38801:147::-;38896:45;38935:5;38896:45;:::i;:::-;38891:3;38884:58;38801:147;;:::o;38954:114::-;39021:6;39055:5;39049:12;39039:22;;38954:114;;;:::o;39074:184::-;39173:11;39207:6;39202:3;39195:19;39247:4;39242:3;39238:14;39223:29;;39074:184;;;;:::o;39264:132::-;39331:4;39354:3;39346:11;;39384:4;39379:3;39375:14;39367:22;;39264:132;;;:::o;39402:108::-;39479:24;39497:5;39479:24;:::i;:::-;39474:3;39467:37;39402:108;;:::o;39516:179::-;39585:10;39606:46;39648:3;39640:6;39606:46;:::i;:::-;39684:4;39679:3;39675:14;39661:28;;39516:179;;;;:::o;39701:113::-;39771:4;39803;39798:3;39794:14;39786:22;;39701:113;;;:::o;39850:732::-;39969:3;39998:54;40046:5;39998:54;:::i;:::-;40068:86;40147:6;40142:3;40068:86;:::i;:::-;40061:93;;40178:56;40228:5;40178:56;:::i;:::-;40257:7;40288:1;40273:284;40298:6;40295:1;40292:13;40273:284;;;40374:6;40368:13;40401:63;40460:3;40445:13;40401:63;:::i;:::-;40394:70;;40487:60;40540:6;40487:60;:::i;:::-;40477:70;;40333:224;40320:1;40317;40313:9;40308:14;;40273:284;;;40277:14;40573:3;40566:10;;39974:608;;;39850:732;;;;:::o;40588:831::-;40851:4;40889:3;40878:9;40874:19;40866:27;;40903:71;40971:1;40960:9;40956:17;40947:6;40903:71;:::i;:::-;40984:80;41060:2;41049:9;41045:18;41036:6;40984:80;:::i;:::-;41111:9;41105:4;41101:20;41096:2;41085:9;41081:18;41074:48;41139:108;41242:4;41233:6;41139:108;:::i;:::-;41131:116;;41257:72;41325:2;41314:9;41310:18;41301:6;41257:72;:::i;:::-;41339:73;41407:3;41396:9;41392:19;41383:6;41339:73;:::i;:::-;40588:831;;;;;;;;:::o;41425:807::-;41674:4;41712:3;41701:9;41697:19;41689:27;;41726:71;41794:1;41783:9;41779:17;41770:6;41726:71;:::i;:::-;41807:72;41875:2;41864:9;41860:18;41851:6;41807:72;:::i;:::-;41889:80;41965:2;41954:9;41950:18;41941:6;41889:80;:::i;:::-;41979;42055:2;42044:9;42040:18;42031:6;41979:80;:::i;:::-;42069:73;42137:3;42126:9;42122:19;42113:6;42069:73;:::i;:::-;42152;42220:3;42209:9;42205:19;42196:6;42152:73;:::i;:::-;41425:807;;;;;;;;;:::o;42238:143::-;42295:5;42326:6;42320:13;42311:22;;42342:33;42369:5;42342:33;:::i;:::-;42238:143;;;;:::o;42387:663::-;42475:6;42483;42491;42540:2;42528:9;42519:7;42515:23;42511:32;42508:119;;;42546:79;;:::i;:::-;42508:119;42666:1;42691:64;42747:7;42738:6;42727:9;42723:22;42691:64;:::i;:::-;42681:74;;42637:128;42804:2;42830:64;42886:7;42877:6;42866:9;42862:22;42830:64;:::i;:::-;42820:74;;42775:129;42943:2;42969:64;43025:7;43016:6;43005:9;43001:22;42969:64;:::i;:::-;42959:74;;42914:129;42387:663;;;;;:::o

Swarm Source

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