ETH Price: $2,460.07 (+3.99%)

Token

DCN Studios (DCNS)
 

Overview

Max Total Supply

100,000,000 DCNS

Holders

253

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
2,513.043370645 DCNS

Value
$0.00
0xad9cc1a85e74bd1300c57082ba86ed21e6aaa5e8
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

DCN Studio provides web3 information and content to its viewers and holders. We generate revenue through advertising and viewership to support the project with goals of becoming a 24hr broadcast.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
DCNStudios

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-03-20
*/

pragma solidity ^0.8.13;
// 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);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
}

contract DCNStudios 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 = 100000000 * 10 ** 9;
    uint256 private _rTotal = (MAX - (MAX % _tTotal));
    uint256 private _tFeeTotal;

    string private _name = "DCN Studios";
    string private _symbol = "DCNS";
    uint8 private _decimals = 9;
    IUniswapV2Router02 public uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
    address public uniswapV2Pair = address(0);
    bool inSwapAndLiquify;
    bool public swapAndLiquifyEnabled = true;
    uint256 public _maxBuyAmount = 250000 * 10**9;
    uint256 public numTokensSellToAddToLiquidity = 1000000 * 10**9;
    uint public ethSellAmount = 1000000000000000000;  //1 ETH
    address public devWallet = 0x3B0C70Ed03D3CF3571512b053f12Ad1f8f3E69FE;
    address public deadWallet = 0x000000000000000000000000000000000000dEaD;

    struct Distribution {
        uint256 sharePercentage;
        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[devWallet] = true;
        taxFees = TaxFees(2,2,1,3,8);
        distribution = Distribution(60, 100);
        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 setExtraSellEthAmount(uint ethPrice) external onlyOwner {
        ethSellAmount = ethPrice;
    }

    function setMaxBuyAmount(uint256 maxBuyAmount) external onlyOwner() {
        _maxBuyAmount = maxBuyAmount * 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 setDevSharePercentage(uint256 sharePercentage) external onlyOwner {
        distribution.sharePercentage = sharePercentage;
    }

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

    function setDevWallet(address _devWallet) external onlyOwner {
        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 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);
                uint ethPrice = getEthPrice(_amount);
                if(ethPrice >= ethSellAmount) {
                    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;
        bool takeFees = !_isExcludedFromFee[from] && !_isExcludedFromFee[to] && from != owner() && to != owner();
        //block the bots, but allow them to transfer to dead wallet if they are blocked
        if(from != owner() && to != owner() && to != deadWallet) {
            require(!botWallets[from] && !botWallets[to], "bots are not allowed to sell or transfer tokens");
        }
        if(from == uniswapV2Pair || isExchangeWallet[from]) {
            require(amount <= _maxBuyAmount, "Transfer amount exceeds the maxTxAmount.");
        }
        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 getEthPrice(uint tokenAmount) public view returns (uint)  {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
        return uniswapV2Router.getAmountsOut(tokenAmount, path)[1];
    }
    
    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 devFees = address(this).balance;
        payable(devWallet).transfer(devFees);
    }

    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":[],"name":"_maxBuyAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"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":"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":"devFeePercentage","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ethSellAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"getEthPrice","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":"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":"sharePercentage","type":"uint256"}],"name":"setDevSharePercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_devWallet","type":"address"}],"name":"setDevWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"ethPrice","type":"uint256"}],"name":"setExtraSellEthAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxBuyAmount","type":"uint256"}],"name":"setMaxBuyAmount","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":[],"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"}]

608060405267016345785d8a0000600755600754600019620000229190620006de565b60001962000031919062000745565b6008556040518060400160405280600b81526020017f44434e2053747564696f73000000000000000000000000000000000000000000815250600a908051906020019062000081929190620005f5565b506040518060400160405280600481526020017f44434e5300000000000000000000000000000000000000000000000000000000815250600b9080519060200190620000cf929190620005f5565b506009600c60006101000a81548160ff021916908360ff160217905550737a250d5630b4cf539739df2c5dacb4c659f2488d600c60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600d60156101000a81548160ff02191690831515021790555065e35fa931a000600e5566038d7ea4c68000600f55670de0b6b3a7640000601055733b0c70ed03d3cf3571512b053f12ad1f8f3e69fe601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061dead601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200026457600080fd5b50600062000277620005c460201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350600854600160006200032c620005c460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060016005600062000380620005cc60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160056000620003e7620005c460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160056000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506040518060a00160405280600281526020016002815260200160018152602001600381526020016008815250601360008201518160000155602082015181600101556040820151816002015560608201518160030155608082015181600401559050506040518060400160405280603c815260200160648152506018600082015181600001556020820151816001015590505062000555620005c460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600754604051620005b6919062000791565b60405180910390a362000812565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8280546200060390620007dd565b90600052602060002090601f01602090048101928262000627576000855562000673565b82601f106200064257805160ff191683800117855562000673565b8280016001018555821562000673579182015b828111156200067257825182559160200191906001019062000655565b5b50905062000682919062000686565b5090565b5b80821115620006a157600081600090555060010162000687565b5090565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000620006eb82620006a5565b9150620006f883620006a5565b9250826200070b576200070a620006af565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200075282620006a5565b91506200075f83620006a5565b92508282101562000775576200077462000716565b5b828203905092915050565b6200078b81620006a5565b82525050565b6000602082019050620007a8600083018462000780565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620007f657607f821691505b6020821081036200080c576200080b620007ae565b5b50919050565b61585f80620008226000396000f3fe6080604052600436106102815760003560e01c80637ca2ea441161014f578063a457c2d7116100c1578063dc0aa9cf1161007a578063dc0aa9cf146109be578063dcda6af3146109e7578063dd62ed3e14610a10578063e7dad4f914610a4d578063f2fde38b14610a8a578063f34eb0b814610ab357610288565b8063a457c2d7146108b0578063a9059cbb146108ed578063ab0d8b851461092a578063b6a9987214610953578063c49b9a801461096a578063d12a76881461099357610288565b80638da5cb5b116101135780638da5cb5b146107b25780638ea5220f146107dd57806391142cb3146108085780639355e6db1461083357806395d89b411461085c5780639b0e2e861461088757610288565b80637ca2ea44146106cf57806385141a77146106f857806385d4787b14610723578063870d365d1461074c5780638a5c50851461078957610288565b80632d838119116101f35780634a74bb02116101ac5780634a74bb02146105be5780635342acb4146105e95780635ee58efc1461062657806370a0823114610652578063715018a61461068f57806371b9189c146106a657610288565b80632d83811914610488578063313ce567146104c557806339509351146104f05780633bd5d1731461052d5780634549b0391461055657806349bd5a5e1461059357610288565b80630ddc0976116102455780630ddc09761461037257806313114a9d146103a15780631694505e146103cc57806318160ddd146103f75780631f53ac021461042257806323b872dd1461044b57610288565b8063024022f71461028d578063035ae135146102b65780630492f055146102df57806306fdde031461030a578063095ea7b31461033557610288565b3661028857005b600080fd5b34801561029957600080fd5b506102b460048036038101906102af919061408c565b610adc565b005b3480156102c257600080fd5b506102dd60048036038101906102d8919061408c565b610b81565b005b3480156102eb57600080fd5b506102f4610c26565b60405161030191906140f2565b60405180910390f35b34801561031657600080fd5b5061031f610c2c565b60405161032c91906141a6565b60405180910390f35b34801561034157600080fd5b5061035c60048036038101906103579190614252565b610cbe565b60405161036991906142ad565b60405180910390f35b34801561037e57600080fd5b50610387610cdc565b6040516103989594939291906142c8565b60405180910390f35b3480156103ad57600080fd5b506103b6610d00565b6040516103c391906140f2565b60405180910390f35b3480156103d857600080fd5b506103e1610d0a565b6040516103ee919061437a565b60405180910390f35b34801561040357600080fd5b5061040c610d30565b60405161041991906140f2565b60405180910390f35b34801561042e57600080fd5b5061044960048036038101906104449190614395565b610d3a565b005b34801561045757600080fd5b50610472600480360381019061046d91906143c2565b610e13565b60405161047f91906142ad565b60405180910390f35b34801561049457600080fd5b506104af60048036038101906104aa9190614415565b610eec565b6040516104bc91906140f2565b60405180910390f35b3480156104d157600080fd5b506104da610f5a565b6040516104e7919061445e565b60405180910390f35b3480156104fc57600080fd5b5061051760048036038101906105129190614252565b610f71565b60405161052491906142ad565b60405180910390f35b34801561053957600080fd5b50610554600480360381019061054f9190614415565b611024565b005b34801561056257600080fd5b5061057d600480360381019061057891906144a5565b611112565b60405161058a91906140f2565b60405180910390f35b34801561059f57600080fd5b506105a8611196565b6040516105b591906144f4565b60405180910390f35b3480156105ca57600080fd5b506105d36111bc565b6040516105e091906142ad565b60405180910390f35b3480156105f557600080fd5b50610610600480360381019061060b9190614395565b6111cf565b60405161061d91906142ad565b60405180910390f35b34801561063257600080fd5b5061063b611225565b60405161064992919061450f565b60405180910390f35b34801561065e57600080fd5b5061067960048036038101906106749190614395565b611237565b60405161068691906140f2565b60405180910390f35b34801561069b57600080fd5b506106a4611288565b005b3480156106b257600080fd5b506106cd60048036038101906106c8919061408c565b6113db565b005b3480156106db57600080fd5b506106f660048036038101906106f19190614415565b611480565b005b34801561070457600080fd5b5061070d61152e565b60405161071a91906144f4565b60405180910390f35b34801561072f57600080fd5b5061074a60048036038101906107459190614676565b611554565b005b34801561075857600080fd5b50610773600480360381019061076e9190614415565b6115f7565b60405161078091906140f2565b60405180910390f35b34801561079557600080fd5b506107b060048036038101906107ab9190614415565b61183a565b005b3480156107be57600080fd5b506107c76118d9565b6040516107d491906144f4565b60405180910390f35b3480156107e957600080fd5b506107f2611902565b6040516107ff91906144f4565b60405180910390f35b34801561081457600080fd5b5061081d611928565b60405161082a91906140f2565b60405180910390f35b34801561083f57600080fd5b5061085a60048036038101906108559190614415565b61192e565b005b34801561086857600080fd5b506108716119d0565b60405161087e91906141a6565b60405180910390f35b34801561089357600080fd5b506108ae60048036038101906108a99190614676565b611a62565b005b3480156108bc57600080fd5b506108d760048036038101906108d29190614252565b611b05565b6040516108e491906142ad565b60405180910390f35b3480156108f957600080fd5b50610914600480360381019061090f9190614252565b611bd2565b60405161092191906142ad565b60405180910390f35b34801561093657600080fd5b50610951600480360381019061094c919061408c565b611bf0565b005b34801561095f57600080fd5b50610968611c95565b005b34801561097657600080fd5b50610991600480360381019061098c91906146bf565b611f9b565b005b34801561099f57600080fd5b506109a8612084565b6040516109b591906140f2565b60405180910390f35b3480156109ca57600080fd5b506109e560048036038101906109e091906146ec565b61208a565b005b3480156109f357600080fd5b50610a0e6004803603810190610a0991906147bd565b612158565b005b348015610a1c57600080fd5b50610a376004803603810190610a32919061483e565b6122c0565b604051610a4491906140f2565b60405180910390f35b348015610a5957600080fd5b50610a746004803603810190610a6f9190614395565b612347565b604051610a8191906142ad565b60405180910390f35b348015610a9657600080fd5b50610ab16004803603810190610aac9190614395565b61239d565b005b348015610abf57600080fd5b50610ada6004803603810190610ad59190614415565b61255e565b005b610ae461260c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b68906148ca565b60405180910390fd5b610b7d82826000612614565b5050565b610b8961260c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0d906148ca565b60405180910390fd5b610c22828260016126bf565b5050565b600e5481565b6060600a8054610c3b90614919565b80601f0160208091040260200160405190810160405280929190818152602001828054610c6790614919565b8015610cb45780601f10610c8957610100808354040283529160200191610cb4565b820191906000526020600020905b815481529060010190602001808311610c9757829003601f168201915b5050505050905090565b6000610cd2610ccb61260c565b848461276a565b6001905092915050565b60138060000154908060010154908060020154908060030154908060040154905085565b6000600954905090565b600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600754905090565b610d4261260c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610dcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc6906148ca565b60405180910390fd5b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000610e20848484612933565b610ee184610e2c61260c565b610edc856040518060600160405280602881526020016157dd60289139600360008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610e9261260c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546131929092919063ffffffff16565b61276a565b600190509392505050565b6000600854821115610f33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2a906149bc565b60405180910390fd5b6000610f3d6131f6565b9050610f52818461322190919063ffffffff16565b915050919050565b6000600c60009054906101000a900460ff16905090565b600061101a610f7e61260c565b846110158560036000610f8f61260c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461326b90919063ffffffff16565b61276a565b6001905092915050565b600061102e61260c565b9050600061103b836132c9565b5050505050905061109481600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461332590919063ffffffff16565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506110ec8160085461332590919063ffffffff16565b6008819055506111078360095461326b90919063ffffffff16565b600981905550505050565b6000600754831115611159576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115090614a28565b60405180910390fd5b81611179576000611169846132c9565b5050505050905080915050611190565b6000611184846132c9565b50505050915050809150505b92915050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d60159054906101000a900460ff1681565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60188060000154908060010154905082565b6000611281600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610eec565b9050919050565b61129061260c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461131d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611314906148ca565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6113e361260c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611470576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611467906148ca565b60405180910390fd5b61147c82826001612614565b5050565b61148861260c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611515576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150c906148ca565b60405180910390fd5b633b9aca00816115259190614a77565b600f8190555050565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61155c61260c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146115e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e0906148ca565b60405180910390fd5b6115f481600161336f565b50565b600080600267ffffffffffffffff81111561161557611614614538565b5b6040519080825280602002602001820160405280156116435781602001602082028036833780820191505090505b509050308160008151811061165b5761165a614ad1565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611702573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117269190614b15565b8160018151811061173a57611739614ad1565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d06ca61f84836040518363ffffffff1660e01b81526004016117d1929190614c00565b600060405180830381865afa1580156117ee573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906118179190614d08565b60018151811061182a57611829614ad1565b5b6020026020010151915050919050565b61184261260c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146118cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c6906148ca565b60405180910390fd5b8060108190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60105481565b61193661260c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146119c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ba906148ca565b60405180910390fd5b8060186000018190555050565b6060600b80546119df90614919565b80601f0160208091040260200160405190810160405280929190818152602001828054611a0b90614919565b8015611a585780601f10611a2d57610100808354040283529160200191611a58565b820191906000526020600020905b815481529060010190602001808311611a3b57829003601f168201915b5050505050905090565b611a6a61260c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611af7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aee906148ca565b60405180910390fd5b611b0281600061336f565b50565b6000611bc8611b1261260c565b84611bc3856040518060600160405280602581526020016158056025913960036000611b3c61260c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546131929092919063ffffffff16565b61276a565b6001905092915050565b6000611be6611bdf61260c565b8484612933565b6001905092915050565b611bf861260c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611c85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7c906148ca565b60405180910390fd5b611c91828260006126bf565b5050565b611c9d61260c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611d2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d21906148ca565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611dbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db290614dc3565b60405180910390fd5b600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e4c9190614b15565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ed5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ef99190614b15565b6040518363ffffffff1660e01b8152600401611f16929190614de3565b6020604051808303816000875af1158015611f35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f599190614b15565b600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b611fa361260c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612030576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612027906148ca565b60405180910390fd5b80600d60156101000a81548160ff0219169083151502179055507f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc1598160405161207991906142ad565b60405180910390a150565b600f5481565b61209261260c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461211f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612116906148ca565b60405180910390fd5b84601360000181905550836013600101819055508160136003018190555082601360020181905550806013600401819055505050505050565b60006005600061216661260c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166121ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e490614e7e565b60405180910390fd5b828290508585905014612235576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222c90614f10565b60405180910390fd5b5b848490508110156122b9576122a561224c61260c565b86868481811061225f5761225e614ad1565b5b90506020020160208101906122749190614395565b633b9aca0086868681811061228c5761228b614ad1565b5b9050602002013561229d9190614a77565b600080613466565b6001816122b29190614f30565b9050612236565b5050505050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6123a561260c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612432576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612429906148ca565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036124a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249890614ff8565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61256661260c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146125f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ea906148ca565b60405180910390fd5b633b9aca00816126039190614a77565b600e8190555050565b600033905090565b60005b838390508110156126b957600084848381811061263757612636614ad1565b5b905060200201602081019061264c9190614395565b905082600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505080806126b190615018565b915050612617565b50505050565b60005b838390508110156127645760008484838181106126e2576126e1614ad1565b5b90506020020160208101906126f79190614395565b905082600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050808061275c90615018565b9150506126c2565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036127d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127d0906150d2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612848576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283f90615164565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161292691906140f2565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036129a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612999906151f6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612a11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0890615288565b60405180910390fd5b60008111612a54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4b9061531a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612ae5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612adc90615386565b60405180910390fd5b600080600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612b8c5750600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015612bcb5750612b9b6118d9565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b8015612c0a5750612bda6118d9565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b9050612c146118d9565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614158015612c825750612c526118d9565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b8015612cdc5750601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b15612dc557600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612d855750600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b612dc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dbb90615418565b60405180910390fd5b5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480612e6a5750600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15612eb557600e54831115612eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eab906154aa565b60405180910390fd5b5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614158015612f605750600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b8061300a5750600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156130095750600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b5b1561301c576001915061301b6134ac565b5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141580156130c85750600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b801561311e5750600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156131745750600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561317e57600090505b61318b8585858486613466565b5050505050565b60008383111582906131da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131d191906141a6565b60405180910390fd5b50600083856131e991906154ca565b9050809150509392505050565b600080600061320361355d565b9150915061321a818361322190919063ffffffff16565b9250505090565b600061326383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506135aa565b905092915050565b600080828461327a9190614f30565b9050838110156132bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132b69061554a565b60405180910390fd5b8091505092915050565b60008060008060008060008060006132e08a61360d565b92509250925060008060006132fe8d86866132f96131f6565b613667565b9250925092508282828888889b509b509b509b509b509b5050505050505091939550919395565b600061336783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613192565b905092915050565b60005b82518110156134615760008382815181106133905761338f614ad1565b5b6020026020010151905082156133fd576001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061344d565b600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff02191690555b50808061345990615018565b915050613372565b505050565b81601260146101000a81548160ff02191690831515021790555080601260156101000a81548160ff0219169083151502179055506134a58585856136f0565b5050505050565b60006134b730611237565b9050600f5481101580156134d85750600d60149054906101000a900460ff16155b80156134f05750600d60159054906101000a900460ff165b1561355a5760006135226064613514601860000154856138bb90919063ffffffff16565b61322190919063ffffffff16565b90506000613539828461332590919063ffffffff16565b9050600081111561354e5761354d81613935565b5b61355782613a0b565b50505b50565b600080600060085490506000600754905061358560075460085461322190919063ffffffff16565b82101561359d576008546007549350935050506135a6565b81819350935050505b9091565b600080831182906135f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135e891906141a6565b60405180910390fd5b50600083856136009190615599565b9050809150509392505050565b60008060008061361c85613abc565b9050600061362986613b3f565b9050600061365282613644858a61332590919063ffffffff16565b61332590919063ffffffff16565b90508083839550955095505050509193909250565b60008060008061368085896138bb90919063ffffffff16565b9050600061369786896138bb90919063ffffffff16565b905060006136ae87896138bb90919063ffffffff16565b905060006136d7826136c9858761332590919063ffffffff16565b61332590919063ffffffff16565b9050838184965096509650505050509450945094915050565b600080600080600080613702876132c9565b95509550955095509550955061376086600160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461332590919063ffffffff16565b600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506137f585600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461326b90919063ffffffff16565b600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061384181613bf4565b61384b8483613cb1565b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516138a891906140f2565b60405180910390a3505050505050505050565b60008083036138cd576000905061392f565b600082846138db9190614a77565b90508284826138ea9190615599565b1461392a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139219061563c565b60405180910390fd5b809150505b92915050565b6001600d60146101000a81548160ff021916908315150217905550600061396660028361322190919063ffffffff16565b9050600061397d828461332590919063ffffffff16565b9050600047905061398d83613ceb565b60006139a2824761332590919063ffffffff16565b90506139ae8382613f2e565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5618482856040516139e19392919061565c565b60405180910390a1505050506000600d60146101000a81548160ff02191690831515021790555050565b6001600d60146101000a81548160ff021916908315150217905550613a2f81613ceb565b6000479050601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015613a9c573d6000803e3d6000fd5b50506000600d60146101000a81548160ff02191690831515021790555050565b60008060009050601260149054906101000a900460ff1615613b11576013600001549050601260159054906101000a900460ff1615613b1057613b0d6013600201548261326b90919063ffffffff16565b90505b5b613b376064613b2983866138bb90919063ffffffff16565b61322190919063ffffffff16565b915050919050565b60008060009050601260149054906101000a900460ff1615613bc6576013600101549050601260159054906101000a900460ff1615613bc557613b906013600301548261326b90919063ffffffff16565b90506000613b9d846115f7565b90506010548110613bc357613bc06013600401548361326b90919063ffffffff16565b91505b505b5b613bec6064613bde83866138bb90919063ffffffff16565b61322190919063ffffffff16565b915050919050565b6000613bfe6131f6565b90506000613c1582846138bb90919063ffffffff16565b9050613c6981600160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461326b90919063ffffffff16565b600160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050565b613cc68260085461332590919063ffffffff16565b600881905550613ce18160095461326b90919063ffffffff16565b6009819055505050565b6000600267ffffffffffffffff811115613d0857613d07614538565b5b604051908082528060200260200182016040528015613d365781602001602082028036833780820191505090505b5090503081600081518110613d4e57613d4d614ad1565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613df5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e199190614b15565b81600181518110613e2d57613e2c614ad1565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050613e9430600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff168461276a565b600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401613ef89594939291906156ce565b600060405180830381600087803b158015613f1257600080fd5b505af1158015613f26573d6000803e3d6000fd5b505050505050565b613f5b30600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff168461276a565b600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080613fa76118d9565b426040518863ffffffff1660e01b8152600401613fc996959493929190615728565b60606040518083038185885af1158015613fe7573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061400c9190615789565b5050505050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f84011261404c5761404b614027565b5b8235905067ffffffffffffffff8111156140695761406861402c565b5b60208301915083602082028301111561408557614084614031565b5b9250929050565b600080602083850312156140a3576140a261401d565b5b600083013567ffffffffffffffff8111156140c1576140c0614022565b5b6140cd85828601614036565b92509250509250929050565b6000819050919050565b6140ec816140d9565b82525050565b600060208201905061410760008301846140e3565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561414757808201518184015260208101905061412c565b83811115614156576000848401525b50505050565b6000601f19601f8301169050919050565b60006141788261410d565b6141828185614118565b9350614192818560208601614129565b61419b8161415c565b840191505092915050565b600060208201905081810360008301526141c0818461416d565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006141f3826141c8565b9050919050565b614203816141e8565b811461420e57600080fd5b50565b600081359050614220816141fa565b92915050565b61422f816140d9565b811461423a57600080fd5b50565b60008135905061424c81614226565b92915050565b600080604083850312156142695761426861401d565b5b600061427785828601614211565b92505060206142888582860161423d565b9150509250929050565b60008115159050919050565b6142a781614292565b82525050565b60006020820190506142c2600083018461429e565b92915050565b600060a0820190506142dd60008301886140e3565b6142ea60208301876140e3565b6142f760408301866140e3565b61430460608301856140e3565b61431160808301846140e3565b9695505050505050565b6000819050919050565b600061434061433b614336846141c8565b61431b565b6141c8565b9050919050565b600061435282614325565b9050919050565b600061436482614347565b9050919050565b61437481614359565b82525050565b600060208201905061438f600083018461436b565b92915050565b6000602082840312156143ab576143aa61401d565b5b60006143b984828501614211565b91505092915050565b6000806000606084860312156143db576143da61401d565b5b60006143e986828701614211565b93505060206143fa86828701614211565b925050604061440b8682870161423d565b9150509250925092565b60006020828403121561442b5761442a61401d565b5b60006144398482850161423d565b91505092915050565b600060ff82169050919050565b61445881614442565b82525050565b6000602082019050614473600083018461444f565b92915050565b61448281614292565b811461448d57600080fd5b50565b60008135905061449f81614479565b92915050565b600080604083850312156144bc576144bb61401d565b5b60006144ca8582860161423d565b92505060206144db85828601614490565b9150509250929050565b6144ee816141e8565b82525050565b600060208201905061450960008301846144e5565b92915050565b600060408201905061452460008301856140e3565b61453160208301846140e3565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6145708261415c565b810181811067ffffffffffffffff8211171561458f5761458e614538565b5b80604052505050565b60006145a2614013565b90506145ae8282614567565b919050565b600067ffffffffffffffff8211156145ce576145cd614538565b5b602082029050602081019050919050565b60006145f26145ed846145b3565b614598565b9050808382526020820190506020840283018581111561461557614614614031565b5b835b8181101561463e578061462a8882614211565b845260208401935050602081019050614617565b5050509392505050565b600082601f83011261465d5761465c614027565b5b813561466d8482602086016145df565b91505092915050565b60006020828403121561468c5761468b61401d565b5b600082013567ffffffffffffffff8111156146aa576146a9614022565b5b6146b684828501614648565b91505092915050565b6000602082840312156146d5576146d461401d565b5b60006146e384828501614490565b91505092915050565b600080600080600060a086880312156147085761470761401d565b5b60006147168882890161423d565b95505060206147278882890161423d565b94505060406147388882890161423d565b93505060606147498882890161423d565b925050608061475a8882890161423d565b9150509295509295909350565b60008083601f84011261477d5761477c614027565b5b8235905067ffffffffffffffff81111561479a5761479961402c565b5b6020830191508360208202830111156147b6576147b5614031565b5b9250929050565b600080600080604085870312156147d7576147d661401d565b5b600085013567ffffffffffffffff8111156147f5576147f4614022565b5b61480187828801614036565b9450945050602085013567ffffffffffffffff81111561482457614823614022565b5b61483087828801614767565b925092505092959194509250565b600080604083850312156148555761485461401d565b5b600061486385828601614211565b925050602061487485828601614211565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006148b4602083614118565b91506148bf8261487e565b602082019050919050565b600060208201905081810360008301526148e3816148a7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061493157607f821691505b602082108103614944576149436148ea565b5b50919050565b7f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260008201527f65666c656374696f6e7300000000000000000000000000000000000000000000602082015250565b60006149a6602a83614118565b91506149b18261494a565b604082019050919050565b600060208201905081810360008301526149d581614999565b9050919050565b7f416d6f756e74206d757374206265206c657373207468616e20737570706c7900600082015250565b6000614a12601f83614118565b9150614a1d826149dc565b602082019050919050565b60006020820190508181036000830152614a4181614a05565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614a82826140d9565b9150614a8d836140d9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614ac657614ac5614a48565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050614b0f816141fa565b92915050565b600060208284031215614b2b57614b2a61401d565b5b6000614b3984828501614b00565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614b77816141e8565b82525050565b6000614b898383614b6e565b60208301905092915050565b6000602082019050919050565b6000614bad82614b42565b614bb78185614b4d565b9350614bc283614b5e565b8060005b83811015614bf3578151614bda8882614b7d565b9750614be583614b95565b925050600181019050614bc6565b5085935050505092915050565b6000604082019050614c1560008301856140e3565b8181036020830152614c278184614ba2565b90509392505050565b600067ffffffffffffffff821115614c4b57614c4a614538565b5b602082029050602081019050919050565b600081519050614c6b81614226565b92915050565b6000614c84614c7f84614c30565b614598565b90508083825260208201905060208402830185811115614ca757614ca6614031565b5b835b81811015614cd05780614cbc8882614c5c565b845260208401935050602081019050614ca9565b5050509392505050565b600082601f830112614cef57614cee614027565b5b8151614cff848260208601614c71565b91505092915050565b600060208284031215614d1e57614d1d61401d565b5b600082015167ffffffffffffffff811115614d3c57614d3b614022565b5b614d4884828501614cda565b91505092915050565b7f556e69737761705632506169722068617320616c7265616479206265656e207360008201527f6574000000000000000000000000000000000000000000000000000000000000602082015250565b6000614dad602283614118565b9150614db882614d51565b604082019050919050565b60006020820190508181036000830152614ddc81614da0565b9050919050565b6000604082019050614df860008301856144e5565b614e0560208301846144e5565b9392505050565b7f41697264726f702063616e206f6e6c7920626520646f6e65206279206578636c60008201527f756465642066726f6d2066656500000000000000000000000000000000000000602082015250565b6000614e68602d83614118565b9150614e7382614e0c565b604082019050919050565b60006020820190508181036000830152614e9781614e5b565b9050919050565b7f486f6c6465727320616e6420616d6f756e74206c656e677468206d757374206260008201527f65207468652073616d6500000000000000000000000000000000000000000000602082015250565b6000614efa602a83614118565b9150614f0582614e9e565b604082019050919050565b60006020820190508181036000830152614f2981614eed565b9050919050565b6000614f3b826140d9565b9150614f46836140d9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614f7b57614f7a614a48565b5b828201905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614fe2602683614118565b9150614fed82614f86565b604082019050919050565b6000602082019050818103600083015261501181614fd5565b9050919050565b6000615023826140d9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361505557615054614a48565b5b600182019050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006150bc602483614118565b91506150c782615060565b604082019050919050565b600060208201905081810360008301526150eb816150af565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b600061514e602283614118565b9150615159826150f2565b604082019050919050565b6000602082019050818103600083015261517d81615141565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006151e0602583614118565b91506151eb82615184565b604082019050919050565b6000602082019050818103600083015261520f816151d3565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000615272602383614118565b915061527d82615216565b604082019050919050565b600060208201905081810360008301526152a181615265565b9050919050565b7f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b6000615304602983614118565b915061530f826152a8565b604082019050919050565b60006020820190508181036000830152615333816152f7565b9050919050565b7f556e697377617056325061697220686173206e6f74206265656e207365740000600082015250565b6000615370601e83614118565b915061537b8261533a565b602082019050919050565b6000602082019050818103600083015261539f81615363565b9050919050565b7f626f747320617265206e6f7420616c6c6f77656420746f2073656c6c206f722060008201527f7472616e7366657220746f6b656e730000000000000000000000000000000000602082015250565b6000615402602f83614118565b915061540d826153a6565b604082019050919050565b60006020820190508181036000830152615431816153f5565b9050919050565b7f5472616e7366657220616d6f756e74206578636565647320746865206d61785460008201527f78416d6f756e742e000000000000000000000000000000000000000000000000602082015250565b6000615494602883614118565b915061549f82615438565b604082019050919050565b600060208201905081810360008301526154c381615487565b9050919050565b60006154d5826140d9565b91506154e0836140d9565b9250828210156154f3576154f2614a48565b5b828203905092915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b6000615534601b83614118565b915061553f826154fe565b602082019050919050565b6000602082019050818103600083015261556381615527565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006155a4826140d9565b91506155af836140d9565b9250826155bf576155be61556a565b5b828204905092915050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b6000615626602183614118565b9150615631826155ca565b604082019050919050565b6000602082019050818103600083015261565581615619565b9050919050565b600060608201905061567160008301866140e3565b61567e60208301856140e3565b61568b60408301846140e3565b949350505050565b6000819050919050565b60006156b86156b36156ae84615693565b61431b565b6140d9565b9050919050565b6156c88161569d565b82525050565b600060a0820190506156e360008301886140e3565b6156f060208301876156bf565b81810360408301526157028186614ba2565b905061571160608301856144e5565b61571e60808301846140e3565b9695505050505050565b600060c08201905061573d60008301896144e5565b61574a60208301886140e3565b61575760408301876156bf565b61576460608301866156bf565b61577160808301856144e5565b61577e60a08301846140e3565b979650505050505050565b6000806000606084860312156157a2576157a161401d565b5b60006157b086828701614c5c565b93505060206157c186828701614c5c565b92505060406157d286828701614c5c565b915050925092509256fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122016f5e6c5215240aac09f1a62ea489e5cde01fa71a69d2031c9963413107fa79864736f6c634300080d0033

Deployed Bytecode

0x6080604052600436106102815760003560e01c80637ca2ea441161014f578063a457c2d7116100c1578063dc0aa9cf1161007a578063dc0aa9cf146109be578063dcda6af3146109e7578063dd62ed3e14610a10578063e7dad4f914610a4d578063f2fde38b14610a8a578063f34eb0b814610ab357610288565b8063a457c2d7146108b0578063a9059cbb146108ed578063ab0d8b851461092a578063b6a9987214610953578063c49b9a801461096a578063d12a76881461099357610288565b80638da5cb5b116101135780638da5cb5b146107b25780638ea5220f146107dd57806391142cb3146108085780639355e6db1461083357806395d89b411461085c5780639b0e2e861461088757610288565b80637ca2ea44146106cf57806385141a77146106f857806385d4787b14610723578063870d365d1461074c5780638a5c50851461078957610288565b80632d838119116101f35780634a74bb02116101ac5780634a74bb02146105be5780635342acb4146105e95780635ee58efc1461062657806370a0823114610652578063715018a61461068f57806371b9189c146106a657610288565b80632d83811914610488578063313ce567146104c557806339509351146104f05780633bd5d1731461052d5780634549b0391461055657806349bd5a5e1461059357610288565b80630ddc0976116102455780630ddc09761461037257806313114a9d146103a15780631694505e146103cc57806318160ddd146103f75780631f53ac021461042257806323b872dd1461044b57610288565b8063024022f71461028d578063035ae135146102b65780630492f055146102df57806306fdde031461030a578063095ea7b31461033557610288565b3661028857005b600080fd5b34801561029957600080fd5b506102b460048036038101906102af919061408c565b610adc565b005b3480156102c257600080fd5b506102dd60048036038101906102d8919061408c565b610b81565b005b3480156102eb57600080fd5b506102f4610c26565b60405161030191906140f2565b60405180910390f35b34801561031657600080fd5b5061031f610c2c565b60405161032c91906141a6565b60405180910390f35b34801561034157600080fd5b5061035c60048036038101906103579190614252565b610cbe565b60405161036991906142ad565b60405180910390f35b34801561037e57600080fd5b50610387610cdc565b6040516103989594939291906142c8565b60405180910390f35b3480156103ad57600080fd5b506103b6610d00565b6040516103c391906140f2565b60405180910390f35b3480156103d857600080fd5b506103e1610d0a565b6040516103ee919061437a565b60405180910390f35b34801561040357600080fd5b5061040c610d30565b60405161041991906140f2565b60405180910390f35b34801561042e57600080fd5b5061044960048036038101906104449190614395565b610d3a565b005b34801561045757600080fd5b50610472600480360381019061046d91906143c2565b610e13565b60405161047f91906142ad565b60405180910390f35b34801561049457600080fd5b506104af60048036038101906104aa9190614415565b610eec565b6040516104bc91906140f2565b60405180910390f35b3480156104d157600080fd5b506104da610f5a565b6040516104e7919061445e565b60405180910390f35b3480156104fc57600080fd5b5061051760048036038101906105129190614252565b610f71565b60405161052491906142ad565b60405180910390f35b34801561053957600080fd5b50610554600480360381019061054f9190614415565b611024565b005b34801561056257600080fd5b5061057d600480360381019061057891906144a5565b611112565b60405161058a91906140f2565b60405180910390f35b34801561059f57600080fd5b506105a8611196565b6040516105b591906144f4565b60405180910390f35b3480156105ca57600080fd5b506105d36111bc565b6040516105e091906142ad565b60405180910390f35b3480156105f557600080fd5b50610610600480360381019061060b9190614395565b6111cf565b60405161061d91906142ad565b60405180910390f35b34801561063257600080fd5b5061063b611225565b60405161064992919061450f565b60405180910390f35b34801561065e57600080fd5b5061067960048036038101906106749190614395565b611237565b60405161068691906140f2565b60405180910390f35b34801561069b57600080fd5b506106a4611288565b005b3480156106b257600080fd5b506106cd60048036038101906106c8919061408c565b6113db565b005b3480156106db57600080fd5b506106f660048036038101906106f19190614415565b611480565b005b34801561070457600080fd5b5061070d61152e565b60405161071a91906144f4565b60405180910390f35b34801561072f57600080fd5b5061074a60048036038101906107459190614676565b611554565b005b34801561075857600080fd5b50610773600480360381019061076e9190614415565b6115f7565b60405161078091906140f2565b60405180910390f35b34801561079557600080fd5b506107b060048036038101906107ab9190614415565b61183a565b005b3480156107be57600080fd5b506107c76118d9565b6040516107d491906144f4565b60405180910390f35b3480156107e957600080fd5b506107f2611902565b6040516107ff91906144f4565b60405180910390f35b34801561081457600080fd5b5061081d611928565b60405161082a91906140f2565b60405180910390f35b34801561083f57600080fd5b5061085a60048036038101906108559190614415565b61192e565b005b34801561086857600080fd5b506108716119d0565b60405161087e91906141a6565b60405180910390f35b34801561089357600080fd5b506108ae60048036038101906108a99190614676565b611a62565b005b3480156108bc57600080fd5b506108d760048036038101906108d29190614252565b611b05565b6040516108e491906142ad565b60405180910390f35b3480156108f957600080fd5b50610914600480360381019061090f9190614252565b611bd2565b60405161092191906142ad565b60405180910390f35b34801561093657600080fd5b50610951600480360381019061094c919061408c565b611bf0565b005b34801561095f57600080fd5b50610968611c95565b005b34801561097657600080fd5b50610991600480360381019061098c91906146bf565b611f9b565b005b34801561099f57600080fd5b506109a8612084565b6040516109b591906140f2565b60405180910390f35b3480156109ca57600080fd5b506109e560048036038101906109e091906146ec565b61208a565b005b3480156109f357600080fd5b50610a0e6004803603810190610a0991906147bd565b612158565b005b348015610a1c57600080fd5b50610a376004803603810190610a32919061483e565b6122c0565b604051610a4491906140f2565b60405180910390f35b348015610a5957600080fd5b50610a746004803603810190610a6f9190614395565b612347565b604051610a8191906142ad565b60405180910390f35b348015610a9657600080fd5b50610ab16004803603810190610aac9190614395565b61239d565b005b348015610abf57600080fd5b50610ada6004803603810190610ad59190614415565b61255e565b005b610ae461260c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b68906148ca565b60405180910390fd5b610b7d82826000612614565b5050565b610b8961260c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0d906148ca565b60405180910390fd5b610c22828260016126bf565b5050565b600e5481565b6060600a8054610c3b90614919565b80601f0160208091040260200160405190810160405280929190818152602001828054610c6790614919565b8015610cb45780601f10610c8957610100808354040283529160200191610cb4565b820191906000526020600020905b815481529060010190602001808311610c9757829003601f168201915b5050505050905090565b6000610cd2610ccb61260c565b848461276a565b6001905092915050565b60138060000154908060010154908060020154908060030154908060040154905085565b6000600954905090565b600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600754905090565b610d4261260c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610dcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc6906148ca565b60405180910390fd5b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000610e20848484612933565b610ee184610e2c61260c565b610edc856040518060600160405280602881526020016157dd60289139600360008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610e9261260c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546131929092919063ffffffff16565b61276a565b600190509392505050565b6000600854821115610f33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2a906149bc565b60405180910390fd5b6000610f3d6131f6565b9050610f52818461322190919063ffffffff16565b915050919050565b6000600c60009054906101000a900460ff16905090565b600061101a610f7e61260c565b846110158560036000610f8f61260c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461326b90919063ffffffff16565b61276a565b6001905092915050565b600061102e61260c565b9050600061103b836132c9565b5050505050905061109481600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461332590919063ffffffff16565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506110ec8160085461332590919063ffffffff16565b6008819055506111078360095461326b90919063ffffffff16565b600981905550505050565b6000600754831115611159576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115090614a28565b60405180910390fd5b81611179576000611169846132c9565b5050505050905080915050611190565b6000611184846132c9565b50505050915050809150505b92915050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d60159054906101000a900460ff1681565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60188060000154908060010154905082565b6000611281600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610eec565b9050919050565b61129061260c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461131d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611314906148ca565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6113e361260c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611470576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611467906148ca565b60405180910390fd5b61147c82826001612614565b5050565b61148861260c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611515576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150c906148ca565b60405180910390fd5b633b9aca00816115259190614a77565b600f8190555050565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61155c61260c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146115e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e0906148ca565b60405180910390fd5b6115f481600161336f565b50565b600080600267ffffffffffffffff81111561161557611614614538565b5b6040519080825280602002602001820160405280156116435781602001602082028036833780820191505090505b509050308160008151811061165b5761165a614ad1565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611702573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117269190614b15565b8160018151811061173a57611739614ad1565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d06ca61f84836040518363ffffffff1660e01b81526004016117d1929190614c00565b600060405180830381865afa1580156117ee573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906118179190614d08565b60018151811061182a57611829614ad1565b5b6020026020010151915050919050565b61184261260c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146118cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c6906148ca565b60405180910390fd5b8060108190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60105481565b61193661260c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146119c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ba906148ca565b60405180910390fd5b8060186000018190555050565b6060600b80546119df90614919565b80601f0160208091040260200160405190810160405280929190818152602001828054611a0b90614919565b8015611a585780601f10611a2d57610100808354040283529160200191611a58565b820191906000526020600020905b815481529060010190602001808311611a3b57829003601f168201915b5050505050905090565b611a6a61260c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611af7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aee906148ca565b60405180910390fd5b611b0281600061336f565b50565b6000611bc8611b1261260c565b84611bc3856040518060600160405280602581526020016158056025913960036000611b3c61260c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546131929092919063ffffffff16565b61276a565b6001905092915050565b6000611be6611bdf61260c565b8484612933565b6001905092915050565b611bf861260c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611c85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7c906148ca565b60405180910390fd5b611c91828260006126bf565b5050565b611c9d61260c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611d2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d21906148ca565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611dbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db290614dc3565b60405180910390fd5b600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e4c9190614b15565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ed5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ef99190614b15565b6040518363ffffffff1660e01b8152600401611f16929190614de3565b6020604051808303816000875af1158015611f35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f599190614b15565b600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b611fa361260c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612030576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612027906148ca565b60405180910390fd5b80600d60156101000a81548160ff0219169083151502179055507f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc1598160405161207991906142ad565b60405180910390a150565b600f5481565b61209261260c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461211f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612116906148ca565b60405180910390fd5b84601360000181905550836013600101819055508160136003018190555082601360020181905550806013600401819055505050505050565b60006005600061216661260c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166121ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e490614e7e565b60405180910390fd5b828290508585905014612235576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222c90614f10565b60405180910390fd5b5b848490508110156122b9576122a561224c61260c565b86868481811061225f5761225e614ad1565b5b90506020020160208101906122749190614395565b633b9aca0086868681811061228c5761228b614ad1565b5b9050602002013561229d9190614a77565b600080613466565b6001816122b29190614f30565b9050612236565b5050505050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6123a561260c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612432576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612429906148ca565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036124a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249890614ff8565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61256661260c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146125f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ea906148ca565b60405180910390fd5b633b9aca00816126039190614a77565b600e8190555050565b600033905090565b60005b838390508110156126b957600084848381811061263757612636614ad1565b5b905060200201602081019061264c9190614395565b905082600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505080806126b190615018565b915050612617565b50505050565b60005b838390508110156127645760008484838181106126e2576126e1614ad1565b5b90506020020160208101906126f79190614395565b905082600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050808061275c90615018565b9150506126c2565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036127d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127d0906150d2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612848576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283f90615164565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161292691906140f2565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036129a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612999906151f6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612a11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0890615288565b60405180910390fd5b60008111612a54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4b9061531a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612ae5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612adc90615386565b60405180910390fd5b600080600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612b8c5750600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015612bcb5750612b9b6118d9565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b8015612c0a5750612bda6118d9565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b9050612c146118d9565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614158015612c825750612c526118d9565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b8015612cdc5750601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b15612dc557600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612d855750600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b612dc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dbb90615418565b60405180910390fd5b5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480612e6a5750600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15612eb557600e54831115612eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eab906154aa565b60405180910390fd5b5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614158015612f605750600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b8061300a5750600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156130095750600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b5b1561301c576001915061301b6134ac565b5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141580156130c85750600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b801561311e5750600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156131745750600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561317e57600090505b61318b8585858486613466565b5050505050565b60008383111582906131da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131d191906141a6565b60405180910390fd5b50600083856131e991906154ca565b9050809150509392505050565b600080600061320361355d565b9150915061321a818361322190919063ffffffff16565b9250505090565b600061326383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506135aa565b905092915050565b600080828461327a9190614f30565b9050838110156132bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132b69061554a565b60405180910390fd5b8091505092915050565b60008060008060008060008060006132e08a61360d565b92509250925060008060006132fe8d86866132f96131f6565b613667565b9250925092508282828888889b509b509b509b509b509b5050505050505091939550919395565b600061336783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613192565b905092915050565b60005b82518110156134615760008382815181106133905761338f614ad1565b5b6020026020010151905082156133fd576001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061344d565b600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff02191690555b50808061345990615018565b915050613372565b505050565b81601260146101000a81548160ff02191690831515021790555080601260156101000a81548160ff0219169083151502179055506134a58585856136f0565b5050505050565b60006134b730611237565b9050600f5481101580156134d85750600d60149054906101000a900460ff16155b80156134f05750600d60159054906101000a900460ff165b1561355a5760006135226064613514601860000154856138bb90919063ffffffff16565b61322190919063ffffffff16565b90506000613539828461332590919063ffffffff16565b9050600081111561354e5761354d81613935565b5b61355782613a0b565b50505b50565b600080600060085490506000600754905061358560075460085461322190919063ffffffff16565b82101561359d576008546007549350935050506135a6565b81819350935050505b9091565b600080831182906135f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135e891906141a6565b60405180910390fd5b50600083856136009190615599565b9050809150509392505050565b60008060008061361c85613abc565b9050600061362986613b3f565b9050600061365282613644858a61332590919063ffffffff16565b61332590919063ffffffff16565b90508083839550955095505050509193909250565b60008060008061368085896138bb90919063ffffffff16565b9050600061369786896138bb90919063ffffffff16565b905060006136ae87896138bb90919063ffffffff16565b905060006136d7826136c9858761332590919063ffffffff16565b61332590919063ffffffff16565b9050838184965096509650505050509450945094915050565b600080600080600080613702876132c9565b95509550955095509550955061376086600160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461332590919063ffffffff16565b600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506137f585600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461326b90919063ffffffff16565b600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061384181613bf4565b61384b8483613cb1565b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516138a891906140f2565b60405180910390a3505050505050505050565b60008083036138cd576000905061392f565b600082846138db9190614a77565b90508284826138ea9190615599565b1461392a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139219061563c565b60405180910390fd5b809150505b92915050565b6001600d60146101000a81548160ff021916908315150217905550600061396660028361322190919063ffffffff16565b9050600061397d828461332590919063ffffffff16565b9050600047905061398d83613ceb565b60006139a2824761332590919063ffffffff16565b90506139ae8382613f2e565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5618482856040516139e19392919061565c565b60405180910390a1505050506000600d60146101000a81548160ff02191690831515021790555050565b6001600d60146101000a81548160ff021916908315150217905550613a2f81613ceb565b6000479050601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015613a9c573d6000803e3d6000fd5b50506000600d60146101000a81548160ff02191690831515021790555050565b60008060009050601260149054906101000a900460ff1615613b11576013600001549050601260159054906101000a900460ff1615613b1057613b0d6013600201548261326b90919063ffffffff16565b90505b5b613b376064613b2983866138bb90919063ffffffff16565b61322190919063ffffffff16565b915050919050565b60008060009050601260149054906101000a900460ff1615613bc6576013600101549050601260159054906101000a900460ff1615613bc557613b906013600301548261326b90919063ffffffff16565b90506000613b9d846115f7565b90506010548110613bc357613bc06013600401548361326b90919063ffffffff16565b91505b505b5b613bec6064613bde83866138bb90919063ffffffff16565b61322190919063ffffffff16565b915050919050565b6000613bfe6131f6565b90506000613c1582846138bb90919063ffffffff16565b9050613c6981600160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461326b90919063ffffffff16565b600160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050565b613cc68260085461332590919063ffffffff16565b600881905550613ce18160095461326b90919063ffffffff16565b6009819055505050565b6000600267ffffffffffffffff811115613d0857613d07614538565b5b604051908082528060200260200182016040528015613d365781602001602082028036833780820191505090505b5090503081600081518110613d4e57613d4d614ad1565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613df5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e199190614b15565b81600181518110613e2d57613e2c614ad1565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050613e9430600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff168461276a565b600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401613ef89594939291906156ce565b600060405180830381600087803b158015613f1257600080fd5b505af1158015613f26573d6000803e3d6000fd5b505050505050565b613f5b30600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff168461276a565b600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080613fa76118d9565b426040518863ffffffff1660e01b8152600401613fc996959493929190615728565b60606040518083038185885af1158015613fe7573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061400c9190615789565b5050505050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f84011261404c5761404b614027565b5b8235905067ffffffffffffffff8111156140695761406861402c565b5b60208301915083602082028301111561408557614084614031565b5b9250929050565b600080602083850312156140a3576140a261401d565b5b600083013567ffffffffffffffff8111156140c1576140c0614022565b5b6140cd85828601614036565b92509250509250929050565b6000819050919050565b6140ec816140d9565b82525050565b600060208201905061410760008301846140e3565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561414757808201518184015260208101905061412c565b83811115614156576000848401525b50505050565b6000601f19601f8301169050919050565b60006141788261410d565b6141828185614118565b9350614192818560208601614129565b61419b8161415c565b840191505092915050565b600060208201905081810360008301526141c0818461416d565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006141f3826141c8565b9050919050565b614203816141e8565b811461420e57600080fd5b50565b600081359050614220816141fa565b92915050565b61422f816140d9565b811461423a57600080fd5b50565b60008135905061424c81614226565b92915050565b600080604083850312156142695761426861401d565b5b600061427785828601614211565b92505060206142888582860161423d565b9150509250929050565b60008115159050919050565b6142a781614292565b82525050565b60006020820190506142c2600083018461429e565b92915050565b600060a0820190506142dd60008301886140e3565b6142ea60208301876140e3565b6142f760408301866140e3565b61430460608301856140e3565b61431160808301846140e3565b9695505050505050565b6000819050919050565b600061434061433b614336846141c8565b61431b565b6141c8565b9050919050565b600061435282614325565b9050919050565b600061436482614347565b9050919050565b61437481614359565b82525050565b600060208201905061438f600083018461436b565b92915050565b6000602082840312156143ab576143aa61401d565b5b60006143b984828501614211565b91505092915050565b6000806000606084860312156143db576143da61401d565b5b60006143e986828701614211565b93505060206143fa86828701614211565b925050604061440b8682870161423d565b9150509250925092565b60006020828403121561442b5761442a61401d565b5b60006144398482850161423d565b91505092915050565b600060ff82169050919050565b61445881614442565b82525050565b6000602082019050614473600083018461444f565b92915050565b61448281614292565b811461448d57600080fd5b50565b60008135905061449f81614479565b92915050565b600080604083850312156144bc576144bb61401d565b5b60006144ca8582860161423d565b92505060206144db85828601614490565b9150509250929050565b6144ee816141e8565b82525050565b600060208201905061450960008301846144e5565b92915050565b600060408201905061452460008301856140e3565b61453160208301846140e3565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6145708261415c565b810181811067ffffffffffffffff8211171561458f5761458e614538565b5b80604052505050565b60006145a2614013565b90506145ae8282614567565b919050565b600067ffffffffffffffff8211156145ce576145cd614538565b5b602082029050602081019050919050565b60006145f26145ed846145b3565b614598565b9050808382526020820190506020840283018581111561461557614614614031565b5b835b8181101561463e578061462a8882614211565b845260208401935050602081019050614617565b5050509392505050565b600082601f83011261465d5761465c614027565b5b813561466d8482602086016145df565b91505092915050565b60006020828403121561468c5761468b61401d565b5b600082013567ffffffffffffffff8111156146aa576146a9614022565b5b6146b684828501614648565b91505092915050565b6000602082840312156146d5576146d461401d565b5b60006146e384828501614490565b91505092915050565b600080600080600060a086880312156147085761470761401d565b5b60006147168882890161423d565b95505060206147278882890161423d565b94505060406147388882890161423d565b93505060606147498882890161423d565b925050608061475a8882890161423d565b9150509295509295909350565b60008083601f84011261477d5761477c614027565b5b8235905067ffffffffffffffff81111561479a5761479961402c565b5b6020830191508360208202830111156147b6576147b5614031565b5b9250929050565b600080600080604085870312156147d7576147d661401d565b5b600085013567ffffffffffffffff8111156147f5576147f4614022565b5b61480187828801614036565b9450945050602085013567ffffffffffffffff81111561482457614823614022565b5b61483087828801614767565b925092505092959194509250565b600080604083850312156148555761485461401d565b5b600061486385828601614211565b925050602061487485828601614211565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006148b4602083614118565b91506148bf8261487e565b602082019050919050565b600060208201905081810360008301526148e3816148a7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061493157607f821691505b602082108103614944576149436148ea565b5b50919050565b7f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260008201527f65666c656374696f6e7300000000000000000000000000000000000000000000602082015250565b60006149a6602a83614118565b91506149b18261494a565b604082019050919050565b600060208201905081810360008301526149d581614999565b9050919050565b7f416d6f756e74206d757374206265206c657373207468616e20737570706c7900600082015250565b6000614a12601f83614118565b9150614a1d826149dc565b602082019050919050565b60006020820190508181036000830152614a4181614a05565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614a82826140d9565b9150614a8d836140d9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614ac657614ac5614a48565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050614b0f816141fa565b92915050565b600060208284031215614b2b57614b2a61401d565b5b6000614b3984828501614b00565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614b77816141e8565b82525050565b6000614b898383614b6e565b60208301905092915050565b6000602082019050919050565b6000614bad82614b42565b614bb78185614b4d565b9350614bc283614b5e565b8060005b83811015614bf3578151614bda8882614b7d565b9750614be583614b95565b925050600181019050614bc6565b5085935050505092915050565b6000604082019050614c1560008301856140e3565b8181036020830152614c278184614ba2565b90509392505050565b600067ffffffffffffffff821115614c4b57614c4a614538565b5b602082029050602081019050919050565b600081519050614c6b81614226565b92915050565b6000614c84614c7f84614c30565b614598565b90508083825260208201905060208402830185811115614ca757614ca6614031565b5b835b81811015614cd05780614cbc8882614c5c565b845260208401935050602081019050614ca9565b5050509392505050565b600082601f830112614cef57614cee614027565b5b8151614cff848260208601614c71565b91505092915050565b600060208284031215614d1e57614d1d61401d565b5b600082015167ffffffffffffffff811115614d3c57614d3b614022565b5b614d4884828501614cda565b91505092915050565b7f556e69737761705632506169722068617320616c7265616479206265656e207360008201527f6574000000000000000000000000000000000000000000000000000000000000602082015250565b6000614dad602283614118565b9150614db882614d51565b604082019050919050565b60006020820190508181036000830152614ddc81614da0565b9050919050565b6000604082019050614df860008301856144e5565b614e0560208301846144e5565b9392505050565b7f41697264726f702063616e206f6e6c7920626520646f6e65206279206578636c60008201527f756465642066726f6d2066656500000000000000000000000000000000000000602082015250565b6000614e68602d83614118565b9150614e7382614e0c565b604082019050919050565b60006020820190508181036000830152614e9781614e5b565b9050919050565b7f486f6c6465727320616e6420616d6f756e74206c656e677468206d757374206260008201527f65207468652073616d6500000000000000000000000000000000000000000000602082015250565b6000614efa602a83614118565b9150614f0582614e9e565b604082019050919050565b60006020820190508181036000830152614f2981614eed565b9050919050565b6000614f3b826140d9565b9150614f46836140d9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614f7b57614f7a614a48565b5b828201905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614fe2602683614118565b9150614fed82614f86565b604082019050919050565b6000602082019050818103600083015261501181614fd5565b9050919050565b6000615023826140d9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361505557615054614a48565b5b600182019050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006150bc602483614118565b91506150c782615060565b604082019050919050565b600060208201905081810360008301526150eb816150af565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b600061514e602283614118565b9150615159826150f2565b604082019050919050565b6000602082019050818103600083015261517d81615141565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006151e0602583614118565b91506151eb82615184565b604082019050919050565b6000602082019050818103600083015261520f816151d3565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000615272602383614118565b915061527d82615216565b604082019050919050565b600060208201905081810360008301526152a181615265565b9050919050565b7f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b6000615304602983614118565b915061530f826152a8565b604082019050919050565b60006020820190508181036000830152615333816152f7565b9050919050565b7f556e697377617056325061697220686173206e6f74206265656e207365740000600082015250565b6000615370601e83614118565b915061537b8261533a565b602082019050919050565b6000602082019050818103600083015261539f81615363565b9050919050565b7f626f747320617265206e6f7420616c6c6f77656420746f2073656c6c206f722060008201527f7472616e7366657220746f6b656e730000000000000000000000000000000000602082015250565b6000615402602f83614118565b915061540d826153a6565b604082019050919050565b60006020820190508181036000830152615431816153f5565b9050919050565b7f5472616e7366657220616d6f756e74206578636565647320746865206d61785460008201527f78416d6f756e742e000000000000000000000000000000000000000000000000602082015250565b6000615494602883614118565b915061549f82615438565b604082019050919050565b600060208201905081810360008301526154c381615487565b9050919050565b60006154d5826140d9565b91506154e0836140d9565b9250828210156154f3576154f2614a48565b5b828203905092915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b6000615534601b83614118565b915061553f826154fe565b602082019050919050565b6000602082019050818103600083015261556381615527565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006155a4826140d9565b91506155af836140d9565b9250826155bf576155be61556a565b5b828204905092915050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b6000615626602183614118565b9150615631826155ca565b604082019050919050565b6000602082019050818103600083015261565581615619565b9050919050565b600060608201905061567160008301866140e3565b61567e60208301856140e3565b61568b60408301846140e3565b949350505050565b6000819050919050565b60006156b86156b36156ae84615693565b61431b565b6140d9565b9050919050565b6156c88161569d565b82525050565b600060a0820190506156e360008301886140e3565b6156f060208301876156bf565b81810360408301526157028186614ba2565b905061571160608301856144e5565b61571e60808301846140e3565b9695505050505050565b600060c08201905061573d60008301896144e5565b61574a60208301886140e3565b61575760408301876156bf565b61576460608301866156bf565b61577160808301856144e5565b61577e60a08301846140e3565b979650505050505050565b6000806000606084860312156157a2576157a161401d565b5b60006157b086828701614c5c565b93505060206157c186828701614c5c565b92505060406157d286828701614c5c565b915050925092509256fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122016f5e6c5215240aac09f1a62ea489e5cde01fa71a69d2031c9963413107fa79864736f6c634300080d0033

Deployed Bytecode Sourcemap

17628:18185:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23677:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23803:121;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18948:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20082:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20934:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19648:22;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;21927:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18712:106;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20359:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25831:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21103:313;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23289:253;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20268:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21424:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22548:289;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22845:436;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18825:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18901:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29960:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19677:32;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;20462:138;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16195:148;;;;;;;;;;;;;:::i;:::-;;23550:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25647:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19208:70;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26058:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33358:272;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24818:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15559:79;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19132:69;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19069:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25499:140;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20173:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26194:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21650:269;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20608:167;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23932:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24065:256;;;;;;;;;;;;;:::i;:::-;;26687:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19000:62;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25065:426;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22022:518;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20783:143;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25941:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16498:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24934:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23677:118;15781:12;:10;:12::i;:::-;15771:22;;:6;;;;;;;;;;:22;;;15763:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;23757:30:::1;23770:9;;23781:5;23757:12;:30::i;:::-;23677:118:::0;;:::o;23803:121::-;15781:12;:10;:12::i;:::-;15771:22;;:6;;;;;;;;;;:22;;;15763:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;23882:34:::1;23900:9;;23911:4;23882:17;:34::i;:::-;23803:121:::0;;:::o;18948:45::-;;;;:::o;20082:83::-;20119:13;20152:5;20145:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20082:83;:::o;20934:161::-;21009:4;21026:39;21035:12;:10;:12::i;:::-;21049:7;21058:6;21026:8;:39::i;:::-;21083:4;21076:11;;20934:161;;;;:::o;19648:22::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;21927:87::-;21969:7;21996:10;;21989:17;;21927:87;:::o;18712:106::-;;;;;;;;;;;;;:::o;20359:95::-;20412:7;20439;;20432:14;;20359:95;:::o;25831:102::-;15781:12;:10;:12::i;:::-;15771:22;;:6;;;;;;;;;;:22;;;15763:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;25915:10:::1;25903:9;;:22;;;;;;;;;;;;;;;;;;25831:102:::0;:::o;21103:313::-;21201:4;21218:36;21228:6;21236:9;21247:6;21218:9;:36::i;:::-;21265:121;21274:6;21282:12;:10;:12::i;:::-;21296:89;21334:6;21296:89;;;;;;;;;;;;;;;;;:11;:19;21308:6;21296:19;;;;;;;;;;;;;;;:33;21316:12;:10;:12::i;:::-;21296:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;21265:8;:121::i;:::-;21404:4;21397:11;;21103:313;;;;;:::o;23289:253::-;23355:7;23394;;23383;:18;;23375:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23459:19;23482:10;:8;:10::i;:::-;23459:33;;23510:24;23522:11;23510:7;:11;;:24;;;;:::i;:::-;23503:31;;;23289:253;;;:::o;20268:83::-;20309:5;20334:9;;;;;;;;;;;20327:16;;20268:83;:::o;21424:218::-;21512:4;21529:83;21538:12;:10;:12::i;:::-;21552:7;21561:50;21600:10;21561:11;:25;21573:12;:10;:12::i;:::-;21561:25;;;;;;;;;;;;;;;:34;21587:7;21561:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;21529:8;:83::i;:::-;21630:4;21623:11;;21424:218;;;;:::o;22548:289::-;22600:14;22617:12;:10;:12::i;:::-;22600:29;;22641:15;22665:19;22676:7;22665:10;:19::i;:::-;22640:44;;;;;;;22713:28;22733:7;22713;:15;22721:6;22713:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;22695:7;:15;22703:6;22695:15;;;;;;;;;;;;;;;:46;;;;22762:20;22774:7;22762;;:11;;:20;;;;:::i;:::-;22752:7;:30;;;;22806:23;22821:7;22806:10;;:14;;:23;;;;:::i;:::-;22793:10;:36;;;;22589:248;;22548:289;:::o;22845:436::-;22935:7;22974;;22963;:18;;22955:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23033:17;23028:246;;23068:15;23092:19;23103:7;23092:10;:19::i;:::-;23067:44;;;;;;;23133:7;23126:14;;;;;23028:246;23175:23;23206:19;23217:7;23206:10;:19::i;:::-;23173:52;;;;;;;23247:15;23240:22;;;22845:436;;;;;:::o;18825:41::-;;;;;;;;;;;;;:::o;18901:40::-;;;;;;;;;;;;;:::o;29960:123::-;30024:4;30048:18;:27;30067:7;30048:27;;;;;;;;;;;;;;;;;;;;;;;;;30041:34;;29960:123;;;:::o;19677:32::-;;;;;;;;;;;;;;:::o;20462:138::-;20528:7;20555:37;20575:7;:16;20583:7;20575:16;;;;;;;;;;;;;;;;20555:19;:37::i;:::-;20548:44;;20462: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;23550:119::-;15781:12;:10;:12::i;:::-;15771:22;;:6;;;;;;;;;;:22;;;15763:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;23632:29:::1;23645:9;;23656:4;23632:12;:29::i;:::-;23550:119:::0;;:::o;25647:176::-;15781:12;:10;:12::i;:::-;15771:22;;:6;;;;;;;;;;:22;;;15763:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;25810:5:::1;25777:30;:38;;;;:::i;:::-;25745:29;:70;;;;25647:176:::0;:::o;19208:70::-;;;;;;;;;;;;;:::o;26058:128::-;15781:12;:10;:12::i;:::-;15771:22;;:6;;;;;;;;;;:22;;;15763:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;26142:36:::1;26162:9;26173:4;26142:19;:36::i;:::-;26058:128:::0;:::o;33358:272::-;33418:4;33436:21;33474:1;33460:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33436:40;;33505:4;33487;33492:1;33487:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;33531:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33521:4;33526:1;33521:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;;;33571:15;;;;;;;;;;;:29;;;33601:11;33614:4;33571:48;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33620:1;33571:51;;;;;;;;:::i;:::-;;;;;;;;33564:58;;;33358:272;;;:::o;24818:108::-;15781:12;:10;:12::i;:::-;15771:22;;:6;;;;;;;;;;:22;;;15763:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;24910:8:::1;24894:13;:24;;;;24818:108:::0;:::o;15559:79::-;15597:7;15624:6;;;;;;;;;;;15617:13;;15559:79;:::o;19132:69::-;;;;;;;;;;;;;:::o;19069:47::-;;;;:::o;25499:140::-;15781:12;:10;:12::i;:::-;15771:22;;:6;;;;;;;;;;:22;;;15763:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;25616:15:::1;25585:12;:28;;:46;;;;25499:140:::0;:::o;20173:87::-;20212:13;20245:7;20238:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20173:87;:::o;26194:131::-;15781:12;:10;:12::i;:::-;15771:22;;:6;;;;;;;;;;:22;;;15763:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;26280:37:::1;26300:9;26311:5;26280:19;:37::i;:::-;26194:131:::0;:::o;21650:269::-;21743:4;21760:129;21769:12;:10;:12::i;:::-;21783:7;21792:96;21831:15;21792:96;;;;;;;;;;;;;;;;;:11;:25;21804:12;:10;:12::i;:::-;21792:25;;;;;;;;;;;;;;;:34;21818:7;21792:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;21760:8;:129::i;:::-;21907:4;21900:11;;21650:269;;;;:::o;20608:167::-;20686:4;20703:42;20713:12;:10;:12::i;:::-;20727:9;20738:6;20703:9;:42::i;:::-;20763:4;20756:11;;20608:167;;;;:::o;23932:125::-;15781:12;:10;:12::i;:::-;15771:22;;:6;;;;;;;;;;:22;;;15763:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;24014:35:::1;24032:9;;24043:5;24014:17;:35::i;:::-;23932:125:::0;;:::o;24065:256::-;15781:12;:10;:12::i;:::-;15771:22;;:6;;;;;;;;;;:22;;;15763:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;24152:1:::1;24127:27;;:13;;;;;;;;;;;:27;;;24119:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24237:15;;;;;;;;;;;:23;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24219:55;;;24283:4;24290:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24219:94;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24203:13;;:110;;;;;;;;;;;;;;;;;;24065:256::o:0;26687:171::-;15781:12;:10;:12::i;:::-;15771:22;;:6;;;;;;;;;;:22;;;15763:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;26788:8:::1;26764:21;;:32;;;;;;;;;;;;;;;;;;26812:38;26841:8;26812:38;;;;;;:::i;:::-;;;;;;;;26687:171:::0;:::o;19000:62::-;;;;:::o;25065:426::-;15781:12;:10;:12::i;:::-;15771:22;;:6;;;;;;;;;;:22;;;15763:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;25262:13:::1;25238:7;:21;;:37;;;;25309:12;25286:7;:20;;:35;;;;25359:16;25332:7;:24;;:43;;;;25414:17;25386:7;:25;;:45;;;;25468:15;25442:7;:23;;:41;;;;25065:426:::0;;;;;:::o;22022:518::-;22119:16;22158:18;:32;22177:12;:10;:12::i;:::-;22158:32;;;;;;;;;;;;;;;;;;;;;;;;;22150:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;22280:7;;:14;;22259:10;;:17;;:35;22251:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;22352:181;22369:10;;:17;;22358:8;:28;22352:181;;;22402:91;22417:12;:10;:12::i;:::-;22431:10;;22442:8;22431:20;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;22473:5;22453:7;;22461:8;22453:17;;;;;;;:::i;:::-;;;;;;;;:25;;;;:::i;:::-;22480:5;22487;22402:14;:91::i;:::-;22520:1;22508:13;;;;;:::i;:::-;;;22352:181;;;22108:432;22022:518;;;;:::o;20783:143::-;20864:7;20891:11;:18;20903:5;20891:18;;;;;;;;;;;;;;;:27;20910:7;20891:27;;;;;;;;;;;;;;;;20884:34;;20783:143;;;;:::o;25941:109::-;26002:4;26026:10;:16;26037:4;26026:16;;;;;;;;;;;;;;;;;;;;;;;;;26019:23;;25941:109;;;:::o;16498:244::-;15781:12;:10;:12::i;:::-;15771:22;;:6;;;;;;;;;;:22;;;15763:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;16607:1:::1;16587:22;;:8;:22;;::::0;16579:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;16697:8;16668:38;;16689:6;::::0;::::1;;;;;;;;16668:38;;;;;;;;;;;;16726:8;16717:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;16498:244:::0;:::o;24934:123::-;15781:12;:10;:12::i;:::-;15771:22;;:6;;;;;;;;;;:22;;;15763:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;25044:5:::1;25029:12;:20;;;;:::i;:::-;25013:13;:36;;;;24934:123:::0;:::o;8051:98::-;8104:7;8131:10;8124:17;;8051:98;:::o;24574:236::-;24661:9;24656:147;24680:9;;:16;;24676:1;:20;24656:147;;;24718:12;24733:9;;24743:1;24733:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;24718:27;;24787:4;24760:18;:24;24779:4;24760:24;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;24703:100;24698:3;;;;;:::i;:::-;;;;24656:147;;;;24574:236;;;:::o;24327:239::-;24419:9;24414:145;24438:9;;:16;;24434:1;:20;24414:145;;;24476:12;24491:9;;24501:1;24491:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;24476:27;;24543:4;24518:16;:22;24535:4;24518:22;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;24461:98;24456:3;;;;;:::i;:::-;;;;24414:145;;;;24327:239;;;:::o;30091:337::-;30201:1;30184:19;;:5;:19;;;30176:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;30282:1;30263:21;;:7;:21;;;30255:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;30366:6;30336:11;:18;30348:5;30336:18;;;;;;;;;;;;;;;:27;30355:7;30336:27;;;;;;;;;;;;;;;:36;;;;30404:7;30388:32;;30397:5;30388:32;;;30413:6;30388:32;;;;;;:::i;:::-;;;;;;;;30091:337;;;:::o;30436:1442::-;30540:1;30524:18;;:4;:18;;;30516:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;30617:1;30603:16;;:2;:16;;;30595:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;30687:1;30678:6;:10;30670:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;30778:1;30753:27;;:13;;;;;;;;;;;:27;;;30745:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;30825:11;30855:13;30872:18;:24;30891:4;30872:24;;;;;;;;;;;;;;;;;;;;;;;;;30871:25;:52;;;;;30901:18;:22;30920:2;30901:22;;;;;;;;;;;;;;;;;;;;;;;;;30900:23;30871:52;:71;;;;;30935:7;:5;:7::i;:::-;30927:15;;:4;:15;;;;30871:71;:88;;;;;30952:7;:5;:7::i;:::-;30946:13;;:2;:13;;;;30871:88;30855:104;;31070:7;:5;:7::i;:::-;31062:15;;:4;:15;;;;:32;;;;;31087:7;:5;:7::i;:::-;31081:13;;:2;:13;;;;31062:32;:52;;;;;31104:10;;;;;;;;;;;31098:16;;:2;:16;;;;31062:52;31059:180;;;31140:10;:16;31151:4;31140:16;;;;;;;;;;;;;;;;;;;;;;;;;31139:17;:36;;;;;31161:10;:14;31172:2;31161:14;;;;;;;;;;;;;;;;;;;;;;;;;31160:15;31139:36;31131:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;31059:180;31260:13;;;;;;;;;;;31252:21;;:4;:21;;;:47;;;;31277:16;:22;31294:4;31277:22;;;;;;;;;;;;;;;;;;;;;;;;;31252:47;31249:155;;;31334:13;;31324:6;:23;;31316:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;31249:155;31425:13;;;;;;;;;;;31417:21;;:4;:21;;;;:44;;;;;31448:13;;;;;;;;;;;31442:19;;:2;:19;;;31417:44;:97;;;;31467:16;:22;31484:4;31467:22;;;;;;;;;;;;;;;;;;;;;;;;;31466:23;:47;;;;;31493:16;:20;31510:2;31493:20;;;;;;;;;;;;;;;;;;;;;;;;;31466:47;31417:97;31414:242;;;31610:4;31601:13;;31629:15;:13;:15::i;:::-;31414:242;31677:13;;;;;;;;;;;31669:21;;:4;:21;;;;:44;;;;;31700:13;;;;;;;;;;;31694:19;;:2;:19;;;;31669:44;:71;;;;;31718:16;:22;31735:4;31718:22;;;;;;;;;;;;;;;;;;;;;;;;;31717:23;31669:71;:96;;;;;31745:16;:20;31762:2;31745:20;;;;;;;;;;;;;;;;;;;;;;;;;31744:21;31669:96;31666:144;;;31793:5;31782:16;;31666:144;31820:50;31835:4;31841:2;31845:6;31853:8;31863:6;31820:14;:50::i;:::-;30505:1373;;30436:1442;;;:::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;28260:163::-;28301:7;28322:15;28339;28358:19;:17;:19::i;:::-;28321:56;;;;28395:20;28407:7;28395;:11;;:20;;;;:::i;:::-;28388:27;;;;28260:163;:::o;5780:132::-;5838:7;5865:39;5869:1;5872;5865:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;5858:46;;5780:132;;;;:::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;27058:419::-;27117:7;27126;27135;27144;27153;27162;27183:23;27208:12;27222:18;27244:20;27256:7;27244:11;:20::i;:::-;27182:82;;;;;;27276:15;27293:23;27318:12;27334:50;27346:7;27355:4;27361:10;27373;:8;:10::i;:::-;27334:11;:50::i;:::-;27275:109;;;;;;27403:7;27412:15;27429:4;27435:15;27452:4;27458:10;27395:74;;;;;;;;;;;;;;;;;;27058:419;;;;;;;:::o;3943:136::-;4001:7;4028:43;4032:1;4035;4028:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;4021:50;;3943:136;;;;:::o;26333:346::-;26428:9;26423:249;26447:9;:16;26443:1;:20;26423:249;;;26485:12;26500:9;26510:1;26500:12;;;;;;;;:::i;:::-;;;;;;;;26485:27;;26530:7;26527:134;;;26577:4;26558:10;:16;26569:4;26558:16;;;;;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;26527:134;;;26629:10;:16;26640:4;26629:16;;;;;;;;;;;;;;;;26622:23;;;;;;;;;;;26527:134;26470:202;26465:3;;;;;:::i;:::-;;;;26423:249;;;;26333:346;;:::o;35065:235::-;35200:8;35187:10;;:21;;;;;;;;;;;;;;;;;;35231:6;35219:9;;:18;;;;;;;;;;;;;;;;;;35248:44;35266:6;35274:9;35285:6;35248:17;:44::i;:::-;35065:235;;;;;:::o;31886:992::-;31930:28;31961:24;31979:4;31961:9;:24::i;:::-;31930:55;;32024:29;;32000:20;:53;;:74;;;;;32058:16;;;;;;;;;;;32057:17;32000:74;:99;;;;;32078:21;;;;;;;;;;;32000:99;31996:875;;;32282:28;32313:63;32372:3;32313:54;32338:12;:28;;;32313:20;:24;;:54;;;;:::i;:::-;:58;;:63;;;;:::i;:::-;32282:94;;32391:27;32421:46;32446:20;32421;:24;;:46;;;;:::i;:::-;32391:76;;32640:1;32618:19;:23;32615:131;;;32695:35;32710:19;32695:14;:35::i;:::-;32615:131;32821:38;32838:20;32821:16;:38::i;:::-;32101:770;;31996:875;31919:959;31886:992::o;28431:256::-;28481:7;28490;28510:15;28528:7;;28510:25;;28546:15;28564:7;;28546:25;;28596:20;28608:7;;28596;;:11;;:20;;;;:::i;:::-;28586:7;:30;28582:61;;;28626:7;;28635;;28618:25;;;;;;;;28582:61;28662:7;28671;28654:25;;;;;;28431: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;27485:330::-;27545:7;27554;27563;27583:12;27598:24;27614:7;27598:15;:24::i;:::-;27583:39;;27633:18;27654:30;27676:7;27654:21;:30::i;:::-;27633:51;;27695:23;27721:33;27743:10;27721:17;27733:4;27721:7;:11;;:17;;;;:::i;:::-;:21;;:33;;;;:::i;:::-;27695:59;;27773:15;27790:4;27796:10;27765:42;;;;;;;;;27485:330;;;;;:::o;27823:429::-;27938:7;27947;27956;27976:15;27994:24;28006:11;27994:7;:11;;:24;;;;:::i;:::-;27976:42;;28029:12;28044:21;28053:11;28044:4;:8;;:21;;;;:::i;:::-;28029:36;;28076:18;28097:27;28112:11;28097:10;:14;;:27;;;;:::i;:::-;28076:48;;28135:23;28161:33;28183:10;28161:17;28173:4;28161:7;:11;;:17;;;;:::i;:::-;:21;;:33;;;;:::i;:::-;28135:59;;28213:7;28222:15;28239:4;28205:39;;;;;;;;;;27823:429;;;;;;;;:::o;35308:502::-;35407:15;35424:23;35449:12;35463:23;35488:12;35502:18;35524:19;35535:7;35524:10;:19::i;:::-;35406:137;;;;;;;;;;;;35572:28;35592:7;35572;:15;35580:6;35572:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;35554:7;:15;35562:6;35554:15;;;;;;;;;;;;;;;:46;;;;35632:39;35655:15;35632:7;:18;35640:9;35632:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;35611:7;:18;35619:9;35611:18;;;;;;;;;;;;;;;:60;;;;35682:26;35697:10;35682:14;:26::i;:::-;35719:23;35731:4;35737;35719:11;:23::i;:::-;35775:9;35758:44;;35767:6;35758:44;;;35786:15;35758:44;;;;;;:::i;:::-;;;;;;;;35395:415;;;;;;35308: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;32886:464::-;17991:4;17972:16;;:23;;;;;;;;;;;;;;;;;;32971:12:::1;32986:27;33011:1;32986:20;:24;;:27;;;;:::i;:::-;32971:42;;33024:17;33044:30;33069:4;33044:20;:24;;:30;;;;:::i;:::-;33024:50;;33085:22;33110:21;33085:46;;33142:22;33159:4;33142:16;:22::i;:::-;33175:18;33196:41;33222:14;33196:21;:25;;:41;;;;:::i;:::-;33175:62;;33248:35;33261:9;33272:10;33248:12;:35::i;:::-;33299:43;33314:4;33320:10;33332:9;33299:43;;;;;;;;:::i;:::-;;;;;;;;32960:390;;;;18037:5:::0;18018:16;;:24;;;;;;;;;;;;;;;;;;32886:464;:::o;34161:230::-;17991:4;17972:16;;:23;;;;;;;;;;;;;;;;;;34248:38:::1;34265:20;34248:16;:38::i;:::-;34297:15;34315:21;34297:39;;34355:9;;;;;;;;;;;34347:27;;:36;34375:7;34347:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;34237:154;18037:5:::0;18018:16;;:24;;;;;;;;;;;;;;;;;;34161:230;:::o;28940:384::-;29004:7;29024:21;29048:1;29024:25;;29063:10;;;;;;;;;;;29060:202;;;29106:7;:21;;;29090:37;;29145:9;;;;;;;;;;;29142:109;;;29191:44;29209:7;:25;;;29191:13;:17;;:44;;;;:::i;:::-;29175:60;;29142:109;29060:202;29279:37;29310:5;29279:26;29291:13;29279:7;:11;;:26;;;;:::i;:::-;:30;;:37;;;;:::i;:::-;29272:44;;;28940:384;;;:::o;29332:620::-;29402:7;29422:25;29450:1;29422:29;;29465:10;;;;;;;;;;;29462:424;;;29512:7;:20;;;29492:40;;29550:9;;;;;;;;;;;29547:328;;;29600:47;29622:7;:24;;;29600:17;:21;;:47;;;;:::i;:::-;29580:67;;29666:13;29682:20;29694:7;29682:11;:20::i;:::-;29666:36;;29736:13;;29724:8;:25;29721:139;;29794:46;29816:7;:23;;;29794:17;:21;;:46;;;;:::i;:::-;29774:66;;29721:139;29561:314;29547:328;29462:424;29903:41;29938:5;29903:30;29915:17;29903:7;:11;;:30;;;;:::i;:::-;:34;;:41;;;;:::i;:::-;29896:48;;;29332:620;;;:::o;28695:237::-;28758:19;28781:10;:8;:10::i;:::-;28758:33;;28802:18;28823:27;28838:11;28823:10;:14;;:27;;;;:::i;:::-;28802:48;;28886:38;28913:10;28886:7;:22;28902:4;28886:22;;;;;;;;;;;;;;;;:26;;:38;;;;:::i;:::-;28861:7;:22;28877:4;28861:22;;;;;;;;;;;;;;;:63;;;;28747:185;;28695:237;:::o;26903:147::-;26981:17;26993:4;26981:7;;:11;;:17;;;;:::i;:::-;26971:7;:27;;;;27022:20;27037:4;27022:10;;:14;;:20;;;;:::i;:::-;27009:10;:33;;;;26903:147;;:::o;34399:585::-;34525:21;34563:1;34549:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34525:40;;34594:4;34576;34581:1;34576:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;34620:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34610:4;34615:1;34610:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;;;34653:62;34670:4;34685:15;;;;;;;;;;;34703:11;34653:8;:62::i;:::-;34752:15;;;;;;;;;;;:66;;;34833:11;34859:1;34903:4;34930;34950:15;34752:224;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34454:530;34399:585;:::o;33642:513::-;33790:62;33807:4;33822:15;;;;;;;;;;;33840:11;33790:8;:62::i;:::-;33895:15;;;;;;;;;;;:31;;;33934:9;33967:4;33987:11;34013:1;34056;34099:7;:5;:7::i;:::-;34121:15;33895:252;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;33642: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:77::-;1896:7;1925:5;1914:16;;1859:77;;;:::o;1942:118::-;2029:24;2047:5;2029:24;:::i;:::-;2024:3;2017:37;1942:118;;:::o;2066:222::-;2159:4;2197:2;2186:9;2182:18;2174:26;;2210:71;2278:1;2267:9;2263:17;2254:6;2210:71;:::i;:::-;2066:222;;;;:::o;2294:99::-;2346:6;2380:5;2374:12;2364:22;;2294:99;;;:::o;2399:169::-;2483:11;2517:6;2512:3;2505:19;2557:4;2552:3;2548:14;2533:29;;2399:169;;;;:::o;2574:307::-;2642:1;2652:113;2666:6;2663:1;2660:13;2652:113;;;2751:1;2746:3;2742:11;2736:18;2732:1;2727:3;2723:11;2716:39;2688:2;2685:1;2681:10;2676:15;;2652:113;;;2783:6;2780:1;2777:13;2774:101;;;2863:1;2854:6;2849:3;2845:16;2838:27;2774:101;2623:258;2574:307;;;:::o;2887:102::-;2928:6;2979:2;2975:7;2970:2;2963:5;2959:14;2955:28;2945:38;;2887:102;;;:::o;2995:364::-;3083:3;3111:39;3144:5;3111:39;:::i;:::-;3166:71;3230:6;3225:3;3166:71;:::i;:::-;3159:78;;3246:52;3291:6;3286:3;3279:4;3272:5;3268:16;3246:52;:::i;:::-;3323:29;3345:6;3323:29;:::i;:::-;3318:3;3314:39;3307:46;;3087:272;2995:364;;;;:::o;3365:313::-;3478:4;3516:2;3505:9;3501:18;3493:26;;3565:9;3559:4;3555:20;3551:1;3540:9;3536:17;3529:47;3593:78;3666:4;3657:6;3593:78;:::i;:::-;3585:86;;3365:313;;;;:::o;3684:126::-;3721:7;3761:42;3754:5;3750:54;3739:65;;3684:126;;;:::o;3816:96::-;3853:7;3882:24;3900:5;3882:24;:::i;:::-;3871:35;;3816:96;;;:::o;3918:122::-;3991:24;4009:5;3991:24;:::i;:::-;3984:5;3981:35;3971:63;;4030:1;4027;4020:12;3971:63;3918:122;:::o;4046:139::-;4092:5;4130:6;4117:20;4108:29;;4146:33;4173:5;4146:33;:::i;:::-;4046:139;;;;:::o;4191:122::-;4264:24;4282:5;4264:24;:::i;:::-;4257:5;4254:35;4244:63;;4303:1;4300;4293:12;4244:63;4191:122;:::o;4319:139::-;4365:5;4403:6;4390:20;4381:29;;4419:33;4446:5;4419:33;:::i;:::-;4319:139;;;;:::o;4464:474::-;4532:6;4540;4589:2;4577:9;4568:7;4564:23;4560:32;4557:119;;;4595:79;;:::i;:::-;4557:119;4715:1;4740:53;4785:7;4776:6;4765:9;4761:22;4740:53;:::i;:::-;4730:63;;4686:117;4842:2;4868:53;4913:7;4904:6;4893:9;4889:22;4868:53;:::i;:::-;4858:63;;4813:118;4464:474;;;;;:::o;4944:90::-;4978:7;5021:5;5014:13;5007:21;4996:32;;4944:90;;;:::o;5040:109::-;5121:21;5136:5;5121:21;:::i;:::-;5116:3;5109:34;5040:109;;:::o;5155:210::-;5242:4;5280:2;5269:9;5265:18;5257:26;;5293:65;5355:1;5344:9;5340:17;5331:6;5293:65;:::i;:::-;5155:210;;;;:::o;5371:664::-;5576:4;5614:3;5603:9;5599:19;5591:27;;5628:71;5696:1;5685:9;5681:17;5672:6;5628:71;:::i;:::-;5709:72;5777:2;5766:9;5762:18;5753:6;5709:72;:::i;:::-;5791;5859:2;5848:9;5844:18;5835:6;5791:72;:::i;:::-;5873;5941:2;5930:9;5926:18;5917:6;5873:72;:::i;:::-;5955:73;6023:3;6012:9;6008:19;5999:6;5955:73;:::i;:::-;5371:664;;;;;;;;:::o;6041:60::-;6069:3;6090:5;6083:12;;6041:60;;;:::o;6107:142::-;6157:9;6190:53;6208:34;6217:24;6235:5;6217:24;:::i;:::-;6208:34;:::i;:::-;6190:53;:::i;:::-;6177:66;;6107:142;;;:::o;6255:126::-;6305:9;6338:37;6369:5;6338:37;:::i;:::-;6325:50;;6255:126;;;:::o;6387:152::-;6463:9;6496:37;6527:5;6496:37;:::i;:::-;6483:50;;6387:152;;;:::o;6545:183::-;6658:63;6715:5;6658:63;:::i;:::-;6653:3;6646:76;6545:183;;:::o;6734:274::-;6853:4;6891:2;6880:9;6876:18;6868:26;;6904:97;6998:1;6987:9;6983:17;6974:6;6904:97;:::i;:::-;6734:274;;;;:::o;7014:329::-;7073:6;7122:2;7110:9;7101:7;7097:23;7093:32;7090:119;;;7128:79;;:::i;:::-;7090:119;7248:1;7273:53;7318:7;7309:6;7298:9;7294:22;7273:53;:::i;:::-;7263:63;;7219:117;7014:329;;;;:::o;7349:619::-;7426:6;7434;7442;7491:2;7479:9;7470:7;7466:23;7462:32;7459:119;;;7497:79;;:::i;:::-;7459:119;7617:1;7642:53;7687:7;7678:6;7667:9;7663:22;7642:53;:::i;:::-;7632:63;;7588:117;7744:2;7770:53;7815:7;7806:6;7795:9;7791:22;7770:53;:::i;:::-;7760:63;;7715:118;7872:2;7898:53;7943:7;7934:6;7923:9;7919:22;7898:53;:::i;:::-;7888:63;;7843:118;7349:619;;;;;:::o;7974:329::-;8033:6;8082:2;8070:9;8061:7;8057:23;8053:32;8050:119;;;8088:79;;:::i;:::-;8050:119;8208:1;8233:53;8278:7;8269:6;8258:9;8254:22;8233:53;:::i;:::-;8223:63;;8179:117;7974:329;;;;:::o;8309:86::-;8344:7;8384:4;8377:5;8373:16;8362:27;;8309:86;;;:::o;8401:112::-;8484:22;8500:5;8484:22;:::i;:::-;8479:3;8472:35;8401:112;;:::o;8519:214::-;8608:4;8646:2;8635:9;8631:18;8623:26;;8659:67;8723:1;8712:9;8708:17;8699:6;8659:67;:::i;:::-;8519:214;;;;:::o;8739:116::-;8809:21;8824:5;8809:21;:::i;:::-;8802:5;8799:32;8789:60;;8845:1;8842;8835:12;8789:60;8739:116;:::o;8861:133::-;8904:5;8942:6;8929:20;8920:29;;8958:30;8982:5;8958:30;:::i;:::-;8861:133;;;;:::o;9000:468::-;9065:6;9073;9122:2;9110:9;9101:7;9097:23;9093:32;9090:119;;;9128:79;;:::i;:::-;9090:119;9248:1;9273:53;9318:7;9309:6;9298:9;9294:22;9273:53;:::i;:::-;9263:63;;9219:117;9375:2;9401:50;9443:7;9434:6;9423:9;9419:22;9401:50;:::i;:::-;9391:60;;9346:115;9000:468;;;;;:::o;9474:118::-;9561:24;9579:5;9561:24;:::i;:::-;9556:3;9549:37;9474:118;;:::o;9598:222::-;9691:4;9729:2;9718:9;9714:18;9706:26;;9742:71;9810:1;9799:9;9795:17;9786:6;9742:71;:::i;:::-;9598:222;;;;:::o;9826:332::-;9947:4;9985:2;9974:9;9970:18;9962:26;;9998:71;10066:1;10055:9;10051:17;10042:6;9998:71;:::i;:::-;10079:72;10147:2;10136:9;10132:18;10123:6;10079:72;:::i;:::-;9826:332;;;;;:::o;10164:180::-;10212:77;10209:1;10202:88;10309:4;10306:1;10299:15;10333:4;10330:1;10323:15;10350:281;10433:27;10455:4;10433:27;:::i;:::-;10425:6;10421:40;10563:6;10551:10;10548:22;10527:18;10515:10;10512:34;10509:62;10506:88;;;10574:18;;:::i;:::-;10506:88;10614:10;10610:2;10603:22;10393:238;10350:281;;:::o;10637:129::-;10671:6;10698:20;;:::i;:::-;10688:30;;10727:33;10755:4;10747:6;10727:33;:::i;:::-;10637:129;;;:::o;10772:311::-;10849:4;10939:18;10931:6;10928:30;10925:56;;;10961:18;;:::i;:::-;10925:56;11011:4;11003:6;10999:17;10991:25;;11071:4;11065;11061:15;11053:23;;10772:311;;;:::o;11106:710::-;11202:5;11227:81;11243:64;11300:6;11243:64;:::i;:::-;11227:81;:::i;:::-;11218:90;;11328:5;11357:6;11350:5;11343:21;11391:4;11384:5;11380:16;11373:23;;11444:4;11436:6;11432:17;11424:6;11420:30;11473:3;11465:6;11462:15;11459:122;;;11492:79;;:::i;:::-;11459:122;11607:6;11590:220;11624:6;11619:3;11616:15;11590:220;;;11699:3;11728:37;11761:3;11749:10;11728:37;:::i;:::-;11723:3;11716:50;11795:4;11790:3;11786:14;11779:21;;11666:144;11650:4;11645:3;11641:14;11634:21;;11590:220;;;11594:21;11208:608;;11106:710;;;;;:::o;11839:370::-;11910:5;11959:3;11952:4;11944:6;11940:17;11936:27;11926:122;;11967:79;;:::i;:::-;11926:122;12084:6;12071:20;12109:94;12199:3;12191:6;12184:4;12176:6;12172:17;12109:94;:::i;:::-;12100:103;;11916:293;11839:370;;;;:::o;12215:539::-;12299:6;12348:2;12336:9;12327:7;12323:23;12319:32;12316:119;;;12354:79;;:::i;:::-;12316:119;12502:1;12491:9;12487:17;12474:31;12532:18;12524:6;12521:30;12518:117;;;12554:79;;:::i;:::-;12518:117;12659:78;12729:7;12720:6;12709:9;12705:22;12659:78;:::i;:::-;12649:88;;12445:302;12215:539;;;;:::o;12760:323::-;12816:6;12865:2;12853:9;12844:7;12840:23;12836:32;12833:119;;;12871:79;;:::i;:::-;12833:119;12991:1;13016:50;13058:7;13049:6;13038:9;13034:22;13016:50;:::i;:::-;13006:60;;12962:114;12760:323;;;;:::o;13089:911::-;13184:6;13192;13200;13208;13216;13265:3;13253:9;13244:7;13240:23;13236:33;13233:120;;;13272:79;;:::i;:::-;13233:120;13392:1;13417:53;13462:7;13453:6;13442:9;13438:22;13417:53;:::i;:::-;13407:63;;13363:117;13519:2;13545:53;13590:7;13581:6;13570:9;13566:22;13545:53;:::i;:::-;13535:63;;13490:118;13647:2;13673:53;13718:7;13709:6;13698:9;13694:22;13673:53;:::i;:::-;13663:63;;13618:118;13775:2;13801:53;13846:7;13837:6;13826:9;13822:22;13801:53;:::i;:::-;13791:63;;13746:118;13903:3;13930:53;13975:7;13966:6;13955:9;13951:22;13930:53;:::i;:::-;13920:63;;13874:119;13089:911;;;;;;;;:::o;14023:568::-;14096:8;14106:6;14156:3;14149:4;14141:6;14137:17;14133:27;14123:122;;14164:79;;:::i;:::-;14123:122;14277:6;14264:20;14254:30;;14307:18;14299:6;14296:30;14293:117;;;14329:79;;:::i;:::-;14293:117;14443:4;14435:6;14431:17;14419:29;;14497:3;14489:4;14481:6;14477:17;14467:8;14463:32;14460:41;14457:128;;;14504:79;;:::i;:::-;14457:128;14023:568;;;;;:::o;14597:934::-;14719:6;14727;14735;14743;14792:2;14780:9;14771:7;14767:23;14763:32;14760:119;;;14798:79;;:::i;:::-;14760:119;14946:1;14935:9;14931:17;14918:31;14976:18;14968:6;14965:30;14962:117;;;14998:79;;:::i;:::-;14962:117;15111:80;15183:7;15174:6;15163:9;15159:22;15111:80;:::i;:::-;15093:98;;;;14889:312;15268:2;15257:9;15253:18;15240:32;15299:18;15291:6;15288:30;15285:117;;;15321:79;;:::i;:::-;15285:117;15434:80;15506:7;15497:6;15486:9;15482:22;15434:80;:::i;:::-;15416:98;;;;15211:313;14597:934;;;;;;;:::o;15537:474::-;15605:6;15613;15662:2;15650:9;15641:7;15637:23;15633:32;15630:119;;;15668:79;;:::i;:::-;15630:119;15788:1;15813:53;15858:7;15849:6;15838:9;15834:22;15813:53;:::i;:::-;15803:63;;15759:117;15915:2;15941:53;15986:7;15977:6;15966:9;15962:22;15941:53;:::i;:::-;15931:63;;15886:118;15537:474;;;;;:::o;16017:182::-;16157:34;16153:1;16145:6;16141:14;16134:58;16017:182;:::o;16205:366::-;16347:3;16368:67;16432:2;16427:3;16368:67;:::i;:::-;16361:74;;16444:93;16533:3;16444:93;:::i;:::-;16562:2;16557:3;16553:12;16546:19;;16205:366;;;:::o;16577:419::-;16743:4;16781:2;16770:9;16766:18;16758:26;;16830:9;16824:4;16820:20;16816:1;16805:9;16801:17;16794:47;16858:131;16984:4;16858:131;:::i;:::-;16850:139;;16577:419;;;:::o;17002:180::-;17050:77;17047:1;17040:88;17147:4;17144:1;17137:15;17171:4;17168:1;17161:15;17188:320;17232:6;17269:1;17263:4;17259:12;17249:22;;17316:1;17310:4;17306:12;17337:18;17327:81;;17393:4;17385:6;17381:17;17371:27;;17327:81;17455:2;17447:6;17444:14;17424:18;17421:38;17418:84;;17474:18;;:::i;:::-;17418:84;17239:269;17188:320;;;:::o;17514:229::-;17654:34;17650:1;17642:6;17638:14;17631:58;17723:12;17718:2;17710:6;17706:15;17699:37;17514:229;:::o;17749:366::-;17891:3;17912:67;17976:2;17971:3;17912:67;:::i;:::-;17905:74;;17988:93;18077:3;17988:93;:::i;:::-;18106:2;18101:3;18097:12;18090:19;;17749:366;;;:::o;18121:419::-;18287:4;18325:2;18314:9;18310:18;18302:26;;18374:9;18368:4;18364:20;18360:1;18349:9;18345:17;18338:47;18402:131;18528:4;18402:131;:::i;:::-;18394:139;;18121:419;;;:::o;18546:181::-;18686:33;18682:1;18674:6;18670:14;18663:57;18546:181;:::o;18733:366::-;18875:3;18896:67;18960:2;18955:3;18896:67;:::i;:::-;18889:74;;18972:93;19061:3;18972:93;:::i;:::-;19090:2;19085:3;19081:12;19074:19;;18733:366;;;:::o;19105:419::-;19271:4;19309:2;19298:9;19294:18;19286:26;;19358:9;19352:4;19348:20;19344:1;19333:9;19329:17;19322:47;19386:131;19512:4;19386:131;:::i;:::-;19378:139;;19105:419;;;:::o;19530:180::-;19578:77;19575:1;19568:88;19675:4;19672:1;19665:15;19699:4;19696:1;19689:15;19716:348;19756:7;19779:20;19797:1;19779:20;:::i;:::-;19774:25;;19813:20;19831:1;19813:20;:::i;:::-;19808:25;;20001:1;19933:66;19929:74;19926:1;19923:81;19918:1;19911:9;19904:17;19900:105;19897:131;;;20008:18;;:::i;:::-;19897:131;20056:1;20053;20049:9;20038:20;;19716:348;;;;:::o;20070:180::-;20118:77;20115:1;20108:88;20215:4;20212:1;20205:15;20239:4;20236:1;20229:15;20256:143;20313:5;20344:6;20338:13;20329:22;;20360:33;20387:5;20360:33;:::i;:::-;20256:143;;;;:::o;20405:351::-;20475:6;20524:2;20512:9;20503:7;20499:23;20495:32;20492:119;;;20530:79;;:::i;:::-;20492:119;20650:1;20675:64;20731:7;20722:6;20711:9;20707:22;20675:64;:::i;:::-;20665:74;;20621:128;20405:351;;;;:::o;20762:114::-;20829:6;20863:5;20857:12;20847:22;;20762:114;;;:::o;20882:184::-;20981:11;21015:6;21010:3;21003:19;21055:4;21050:3;21046:14;21031:29;;20882:184;;;;:::o;21072:132::-;21139:4;21162:3;21154:11;;21192:4;21187:3;21183:14;21175:22;;21072:132;;;:::o;21210:108::-;21287:24;21305:5;21287:24;:::i;:::-;21282:3;21275:37;21210:108;;:::o;21324:179::-;21393:10;21414:46;21456:3;21448:6;21414:46;:::i;:::-;21492:4;21487:3;21483:14;21469:28;;21324:179;;;;:::o;21509:113::-;21579:4;21611;21606:3;21602:14;21594:22;;21509:113;;;:::o;21658:732::-;21777:3;21806:54;21854:5;21806:54;:::i;:::-;21876:86;21955:6;21950:3;21876:86;:::i;:::-;21869:93;;21986:56;22036:5;21986:56;:::i;:::-;22065:7;22096:1;22081:284;22106:6;22103:1;22100:13;22081:284;;;22182:6;22176:13;22209:63;22268:3;22253:13;22209:63;:::i;:::-;22202:70;;22295:60;22348:6;22295:60;:::i;:::-;22285:70;;22141:224;22128:1;22125;22121:9;22116:14;;22081:284;;;22085:14;22381:3;22374:10;;21782:608;;;21658:732;;;;:::o;22396:483::-;22567:4;22605:2;22594:9;22590:18;22582:26;;22618:71;22686:1;22675:9;22671:17;22662:6;22618:71;:::i;:::-;22736:9;22730:4;22726:20;22721:2;22710:9;22706:18;22699:48;22764:108;22867:4;22858:6;22764:108;:::i;:::-;22756:116;;22396:483;;;;;:::o;22885:311::-;22962:4;23052:18;23044:6;23041:30;23038:56;;;23074:18;;:::i;:::-;23038:56;23124:4;23116:6;23112:17;23104:25;;23184:4;23178;23174:15;23166:23;;22885:311;;;:::o;23202:143::-;23259:5;23290:6;23284:13;23275:22;;23306:33;23333:5;23306:33;:::i;:::-;23202:143;;;;:::o;23368:732::-;23475:5;23500:81;23516:64;23573:6;23516:64;:::i;:::-;23500:81;:::i;:::-;23491:90;;23601:5;23630:6;23623:5;23616:21;23664:4;23657:5;23653:16;23646:23;;23717:4;23709:6;23705:17;23697:6;23693:30;23746:3;23738:6;23735:15;23732:122;;;23765:79;;:::i;:::-;23732:122;23880:6;23863:231;23897:6;23892:3;23889:15;23863:231;;;23972:3;24001:48;24045:3;24033:10;24001:48;:::i;:::-;23996:3;23989:61;24079:4;24074:3;24070:14;24063:21;;23939:155;23923:4;23918:3;23914:14;23907:21;;23863:231;;;23867:21;23481:619;;23368:732;;;;;:::o;24123:385::-;24205:5;24254:3;24247:4;24239:6;24235:17;24231:27;24221:122;;24262:79;;:::i;:::-;24221:122;24372:6;24366:13;24397:105;24498:3;24490:6;24483:4;24475:6;24471:17;24397:105;:::i;:::-;24388:114;;24211:297;24123:385;;;;:::o;24514:554::-;24609:6;24658:2;24646:9;24637:7;24633:23;24629:32;24626:119;;;24664:79;;:::i;:::-;24626:119;24805:1;24794:9;24790:17;24784:24;24835:18;24827:6;24824:30;24821:117;;;24857:79;;:::i;:::-;24821:117;24962:89;25043:7;25034:6;25023:9;25019:22;24962:89;:::i;:::-;24952:99;;24755:306;24514:554;;;;:::o;25074:221::-;25214:34;25210:1;25202:6;25198:14;25191:58;25283:4;25278:2;25270:6;25266:15;25259:29;25074:221;:::o;25301:366::-;25443:3;25464:67;25528:2;25523:3;25464:67;:::i;:::-;25457:74;;25540:93;25629:3;25540:93;:::i;:::-;25658:2;25653:3;25649:12;25642:19;;25301:366;;;:::o;25673:419::-;25839:4;25877:2;25866:9;25862:18;25854:26;;25926:9;25920:4;25916:20;25912:1;25901:9;25897:17;25890:47;25954:131;26080:4;25954:131;:::i;:::-;25946:139;;25673:419;;;:::o;26098:332::-;26219:4;26257:2;26246:9;26242:18;26234:26;;26270:71;26338:1;26327:9;26323:17;26314:6;26270:71;:::i;:::-;26351:72;26419:2;26408:9;26404:18;26395:6;26351:72;:::i;:::-;26098:332;;;;;:::o;26436:232::-;26576:34;26572:1;26564:6;26560:14;26553:58;26645:15;26640:2;26632:6;26628:15;26621:40;26436:232;:::o;26674:366::-;26816:3;26837:67;26901:2;26896:3;26837:67;:::i;:::-;26830:74;;26913:93;27002:3;26913:93;:::i;:::-;27031:2;27026:3;27022:12;27015:19;;26674:366;;;:::o;27046:419::-;27212:4;27250:2;27239:9;27235:18;27227:26;;27299:9;27293:4;27289:20;27285:1;27274:9;27270:17;27263:47;27327:131;27453:4;27327:131;:::i;:::-;27319:139;;27046:419;;;:::o;27471:229::-;27611:34;27607:1;27599:6;27595:14;27588:58;27680:12;27675:2;27667:6;27663:15;27656:37;27471:229;:::o;27706:366::-;27848:3;27869:67;27933:2;27928:3;27869:67;:::i;:::-;27862:74;;27945:93;28034:3;27945:93;:::i;:::-;28063:2;28058:3;28054:12;28047:19;;27706:366;;;:::o;28078:419::-;28244:4;28282:2;28271:9;28267:18;28259:26;;28331:9;28325:4;28321:20;28317:1;28306:9;28302:17;28295:47;28359:131;28485:4;28359:131;:::i;:::-;28351:139;;28078:419;;;:::o;28503:305::-;28543:3;28562:20;28580:1;28562:20;:::i;:::-;28557:25;;28596:20;28614:1;28596:20;:::i;:::-;28591:25;;28750:1;28682:66;28678:74;28675:1;28672:81;28669:107;;;28756:18;;:::i;:::-;28669:107;28800:1;28797;28793:9;28786:16;;28503:305;;;;:::o;28814:225::-;28954:34;28950:1;28942:6;28938:14;28931:58;29023:8;29018:2;29010:6;29006:15;28999:33;28814:225;:::o;29045:366::-;29187:3;29208:67;29272:2;29267:3;29208:67;:::i;:::-;29201:74;;29284:93;29373:3;29284:93;:::i;:::-;29402:2;29397:3;29393:12;29386:19;;29045:366;;;:::o;29417:419::-;29583:4;29621:2;29610:9;29606:18;29598:26;;29670:9;29664:4;29660:20;29656:1;29645:9;29641:17;29634:47;29698:131;29824:4;29698:131;:::i;:::-;29690:139;;29417:419;;;:::o;29842:233::-;29881:3;29904:24;29922:5;29904:24;:::i;:::-;29895:33;;29950:66;29943:5;29940:77;29937:103;;30020:18;;:::i;:::-;29937:103;30067:1;30060:5;30056:13;30049:20;;29842:233;;;:::o;30081:223::-;30221:34;30217:1;30209:6;30205:14;30198:58;30290:6;30285:2;30277:6;30273:15;30266:31;30081:223;:::o;30310:366::-;30452:3;30473:67;30537:2;30532:3;30473:67;:::i;:::-;30466:74;;30549:93;30638:3;30549:93;:::i;:::-;30667:2;30662:3;30658:12;30651:19;;30310:366;;;:::o;30682:419::-;30848:4;30886:2;30875:9;30871:18;30863:26;;30935:9;30929:4;30925:20;30921:1;30910:9;30906:17;30899:47;30963:131;31089:4;30963:131;:::i;:::-;30955:139;;30682:419;;;:::o;31107:221::-;31247:34;31243:1;31235:6;31231:14;31224:58;31316:4;31311:2;31303:6;31299:15;31292:29;31107:221;:::o;31334:366::-;31476:3;31497:67;31561:2;31556:3;31497:67;:::i;:::-;31490:74;;31573:93;31662:3;31573:93;:::i;:::-;31691:2;31686:3;31682:12;31675:19;;31334:366;;;:::o;31706:419::-;31872:4;31910:2;31899:9;31895:18;31887:26;;31959:9;31953:4;31949:20;31945:1;31934:9;31930:17;31923:47;31987:131;32113:4;31987:131;:::i;:::-;31979:139;;31706:419;;;:::o;32131:224::-;32271:34;32267:1;32259:6;32255:14;32248:58;32340:7;32335:2;32327:6;32323:15;32316:32;32131:224;:::o;32361:366::-;32503:3;32524:67;32588:2;32583:3;32524:67;:::i;:::-;32517:74;;32600:93;32689:3;32600:93;:::i;:::-;32718:2;32713:3;32709:12;32702:19;;32361:366;;;:::o;32733:419::-;32899:4;32937:2;32926:9;32922:18;32914:26;;32986:9;32980:4;32976:20;32972:1;32961:9;32957:17;32950:47;33014:131;33140:4;33014:131;:::i;:::-;33006:139;;32733:419;;;:::o;33158:222::-;33298:34;33294:1;33286:6;33282:14;33275:58;33367:5;33362:2;33354:6;33350:15;33343:30;33158:222;:::o;33386:366::-;33528:3;33549:67;33613:2;33608:3;33549:67;:::i;:::-;33542:74;;33625:93;33714:3;33625:93;:::i;:::-;33743:2;33738:3;33734:12;33727:19;;33386:366;;;:::o;33758:419::-;33924:4;33962:2;33951:9;33947:18;33939:26;;34011:9;34005:4;34001:20;33997:1;33986:9;33982:17;33975:47;34039:131;34165:4;34039:131;:::i;:::-;34031:139;;33758:419;;;:::o;34183:228::-;34323:34;34319:1;34311:6;34307:14;34300:58;34392:11;34387:2;34379:6;34375:15;34368:36;34183:228;:::o;34417:366::-;34559:3;34580:67;34644:2;34639:3;34580:67;:::i;:::-;34573:74;;34656:93;34745:3;34656:93;:::i;:::-;34774:2;34769:3;34765:12;34758:19;;34417:366;;;:::o;34789:419::-;34955:4;34993:2;34982:9;34978:18;34970:26;;35042:9;35036:4;35032:20;35028:1;35017:9;35013:17;35006:47;35070:131;35196:4;35070:131;:::i;:::-;35062:139;;34789:419;;;:::o;35214:180::-;35354:32;35350:1;35342:6;35338:14;35331:56;35214:180;:::o;35400:366::-;35542:3;35563:67;35627:2;35622:3;35563:67;:::i;:::-;35556:74;;35639:93;35728:3;35639:93;:::i;:::-;35757:2;35752:3;35748:12;35741:19;;35400:366;;;:::o;35772:419::-;35938:4;35976:2;35965:9;35961:18;35953:26;;36025:9;36019:4;36015:20;36011:1;36000:9;35996:17;35989:47;36053:131;36179:4;36053:131;:::i;:::-;36045:139;;35772:419;;;:::o;36197:234::-;36337:34;36333:1;36325:6;36321:14;36314:58;36406:17;36401:2;36393:6;36389:15;36382:42;36197:234;:::o;36437:366::-;36579:3;36600:67;36664:2;36659:3;36600:67;:::i;:::-;36593:74;;36676:93;36765:3;36676:93;:::i;:::-;36794:2;36789:3;36785:12;36778:19;;36437:366;;;:::o;36809:419::-;36975:4;37013:2;37002:9;36998:18;36990:26;;37062:9;37056:4;37052:20;37048:1;37037:9;37033:17;37026:47;37090:131;37216:4;37090:131;:::i;:::-;37082:139;;36809:419;;;:::o;37234:227::-;37374:34;37370:1;37362:6;37358:14;37351:58;37443:10;37438:2;37430:6;37426:15;37419:35;37234:227;:::o;37467:366::-;37609:3;37630:67;37694:2;37689:3;37630:67;:::i;:::-;37623:74;;37706:93;37795:3;37706:93;:::i;:::-;37824:2;37819:3;37815:12;37808:19;;37467:366;;;:::o;37839:419::-;38005:4;38043:2;38032:9;38028:18;38020:26;;38092:9;38086:4;38082:20;38078:1;38067:9;38063:17;38056:47;38120:131;38246:4;38120:131;:::i;:::-;38112:139;;37839:419;;;:::o;38264:191::-;38304:4;38324:20;38342:1;38324:20;:::i;:::-;38319:25;;38358:20;38376:1;38358:20;:::i;:::-;38353:25;;38397:1;38394;38391:8;38388:34;;;38402:18;;:::i;:::-;38388:34;38447:1;38444;38440:9;38432:17;;38264:191;;;;:::o;38461:177::-;38601:29;38597:1;38589:6;38585:14;38578:53;38461:177;:::o;38644:366::-;38786:3;38807:67;38871:2;38866:3;38807:67;:::i;:::-;38800:74;;38883:93;38972:3;38883:93;:::i;:::-;39001:2;38996:3;38992:12;38985:19;;38644:366;;;:::o;39016:419::-;39182:4;39220:2;39209:9;39205:18;39197:26;;39269:9;39263:4;39259:20;39255:1;39244:9;39240:17;39233:47;39297:131;39423:4;39297:131;:::i;:::-;39289:139;;39016:419;;;:::o;39441:180::-;39489:77;39486:1;39479:88;39586:4;39583:1;39576:15;39610:4;39607:1;39600:15;39627:185;39667:1;39684:20;39702:1;39684:20;:::i;:::-;39679:25;;39718:20;39736:1;39718:20;:::i;:::-;39713:25;;39757:1;39747:35;;39762:18;;:::i;:::-;39747:35;39804:1;39801;39797:9;39792:14;;39627:185;;;;:::o;39818:220::-;39958:34;39954:1;39946:6;39942:14;39935:58;40027:3;40022:2;40014:6;40010:15;40003:28;39818:220;:::o;40044:366::-;40186:3;40207:67;40271:2;40266:3;40207:67;:::i;:::-;40200:74;;40283:93;40372:3;40283:93;:::i;:::-;40401:2;40396:3;40392:12;40385:19;;40044:366;;;:::o;40416:419::-;40582:4;40620:2;40609:9;40605:18;40597:26;;40669:9;40663:4;40659:20;40655:1;40644:9;40640:17;40633:47;40697:131;40823:4;40697:131;:::i;:::-;40689:139;;40416:419;;;:::o;40841:442::-;40990:4;41028:2;41017:9;41013:18;41005:26;;41041:71;41109:1;41098:9;41094:17;41085:6;41041:71;:::i;:::-;41122:72;41190:2;41179:9;41175:18;41166:6;41122:72;:::i;:::-;41204;41272:2;41261:9;41257:18;41248:6;41204:72;:::i;:::-;40841:442;;;;;;:::o;41289:85::-;41334:7;41363:5;41352:16;;41289:85;;;:::o;41380:158::-;41438:9;41471:61;41489:42;41498:32;41524:5;41498:32;:::i;:::-;41489:42;:::i;:::-;41471:61;:::i;:::-;41458:74;;41380:158;;;:::o;41544:147::-;41639:45;41678:5;41639:45;:::i;:::-;41634:3;41627:58;41544:147;;:::o;41697:831::-;41960:4;41998:3;41987:9;41983:19;41975:27;;42012:71;42080:1;42069:9;42065:17;42056:6;42012:71;:::i;:::-;42093:80;42169:2;42158:9;42154:18;42145:6;42093:80;:::i;:::-;42220:9;42214:4;42210:20;42205:2;42194:9;42190:18;42183:48;42248:108;42351:4;42342:6;42248:108;:::i;:::-;42240:116;;42366:72;42434:2;42423:9;42419:18;42410:6;42366:72;:::i;:::-;42448:73;42516:3;42505:9;42501:19;42492:6;42448:73;:::i;:::-;41697:831;;;;;;;;:::o;42534:807::-;42783:4;42821:3;42810:9;42806:19;42798:27;;42835:71;42903:1;42892:9;42888:17;42879:6;42835:71;:::i;:::-;42916:72;42984:2;42973:9;42969:18;42960:6;42916:72;:::i;:::-;42998:80;43074:2;43063:9;43059:18;43050:6;42998:80;:::i;:::-;43088;43164:2;43153:9;43149:18;43140:6;43088:80;:::i;:::-;43178:73;43246:3;43235:9;43231:19;43222:6;43178:73;:::i;:::-;43261;43329:3;43318:9;43314:19;43305:6;43261:73;:::i;:::-;42534:807;;;;;;;;;:::o;43347:663::-;43435:6;43443;43451;43500:2;43488:9;43479:7;43475:23;43471:32;43468:119;;;43506:79;;:::i;:::-;43468:119;43626:1;43651:64;43707:7;43698:6;43687:9;43683:22;43651:64;:::i;:::-;43641:74;;43597:128;43764:2;43790:64;43846:7;43837:6;43826:9;43822:22;43790:64;:::i;:::-;43780:74;;43735:129;43903:2;43929:64;43985:7;43976:6;43965:9;43961:22;43929:64;:::i;:::-;43919:74;;43874:129;43347:663;;;;;:::o

Swarm Source

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