ETH Price: $2,940.39 (-4.15%)
Gas: 1 Gwei

Token

SHINJIRO (SHOX)
 

Overview

Max Total Supply

1,000,000,000,000,000,000 SHOX

Holders

899 ( 0.111%)

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
254,108,991,296,826.08351312 SHOX

Value
$0.00
0x763507d9997030a52f0da5793f6f5abcf899cdea
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Shinjiro has come to build a bridge between children, adolescents, new investors, and many skeptics of the crypto world. The platform will educate users on elaborate NFT collection and a play-to-earn game utilizing the Shinjiro token within the platform.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Shinjiro

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-05-13
*/

/**
 *Submitted for verification at Etherscan.io on 2022-04-19
*/

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

    function totalSupply() external view returns (uint256);

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

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

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

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

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

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

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



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

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

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

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

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

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

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

library SafeMathUint {
    function toInt256Safe(uint256 a) internal pure returns (int256) {
        int256 b = int256(a);
        require(b >= 0);
        return b;
    }
}
/**
 * @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 getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
}

contract Shinjiro 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;
    }
    IUniswapV2Router02 public uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
    address public uniswapV2Pair = address(0);
    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 _isExcludedFromRewards;
    string private _name = "SHINJIRO";
    string private _symbol = "SHOX";
    uint8 private _decimals = 9;
    uint256 private constant MAX = ~uint256(0);
    uint256 private _tTotal = 1000000000000000000 * 10** _decimals;
    uint256 private _rTotal = (MAX - (MAX % _tTotal));
    uint256 private _tFeeTotal;
    bool inSwapAndLiquify;
    bool public swapAndLiquifyEnabled = true;
    bool isTaxFreeTransfer = false;
    uint256 public _maxBuyAmount = 1000000000000000000 * 10** _decimals;
    uint256 public ethPriceToSwap = 200000000000000000; //.2 ETH
    uint public ethSellAmount = 1000000000000000000;  //1 ETH
    address public marketingAddress = 0x376fF9F2fee139F5e0cb44b53aD97e07ED3c12E3;
    address public charityAddress = 0xB647dd7Bd8C2a18FF4a9c7497C185C8bb7b9c6F4;
    address public devAddress = 0x811D5D85EEcda2B9B5Ca6856B7a6C641Eb2542F4;
    address public deadWallet = 0x000000000000000000000000000000000000dEaD;
    uint256 public gasForProcessing = 50000;
    event ProcessedDividendTracker(uint256 iterations, uint256 claims, uint256 lastProcessedIndex, bool indexed automatic,uint256 gas, address indexed processor);
    event SendDividends(uint256 EthAmount);

    struct Distribution {
        uint256 devTeam;
        uint256 marketing;
        uint256 dividend;
        uint256 charity;
    }

    struct TaxFees {
        uint256 reflectionBuyFee;
        uint256 buyFee;
        uint256 sellReflectionFee;
        uint256 sellFee;
        uint256 largeSellFee;
    }

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

    constructor () {
        _rOwned[_msgSender()] = _rTotal;
        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[_msgSender()] = true;
        _isExcludedFromFee[charityAddress] = true;
        _isExcludedFromFee[marketingAddress] = true;
        _isExcludedFromFee[devAddress] = true;
        _isExcludedFromRewards[deadWallet] = true;
        taxFees = TaxFees(1,8,1,8,8);
        distribution = Distribution(30, 30, 30, 10);
        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 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, false);
            iterator += 1;
        }
    }

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

    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 excludeIncludeFromRewards(address[] calldata addresses, bool isExcluded) public onlyOwner {
        addRemoveRewards(addresses, isExcluded);
    }

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

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

    function setEthLargeSellAmount(uint ethSellAmount_) external onlyOwner {
        ethSellAmount = ethSellAmount_;
    }

    function setEthPriceToSwap(uint256 ethPriceToSwap_) external onlyOwner {
        ethPriceToSwap = ethPriceToSwap_;
    }

    function createV2Pair() external onlyOwner {
        require(uniswapV2Pair == address(0),"UniswapV2Pair has already been set");
        uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(address(this), uniswapV2Router.WETH());
        _isExcludedFromRewards[uniswapV2Pair] = true;
    }

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

    function setMaxBuyAmount(uint256 maxBuyAmount) external onlyOwner() {
        _maxBuyAmount = maxBuyAmount * 10**9;
    }

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

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

    function setWalletAddresses(address devAddr, address charity, address marketingAddr) external onlyOwner {
        devAddress = devAddr;
        charityAddress = charity;
        marketingAddress = marketingAddr;
    }

    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.reflectionBuyFee;
            if(isSellTxn) {
                reflectionFee = taxFees.sellReflectionFee;
            }
        }
        return _amount.mul(reflectionFee).div(10**2);
    }

    function calculateLiquidityFee(uint256 _amount) private view returns (uint256) {
        uint256 totalLiquidityFee = 0;
        if(doTakeFees) {
            totalLiquidityFee = taxFees.buyFee;
            if(isSellTxn) {
                totalLiquidityFee = taxFees.sellFee;
                uint ethPrice = getEthPrice(_amount);
                if(ethPrice >= ethSellAmount) {
                    totalLiquidityFee = taxFees.largeSellFee;
                }
            }
        }
        return _amount.mul(totalLiquidityFee).div(10**2);
    }

    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 isExcludedFromFee(address account) public view returns(bool) {
        return _isExcludedFromFee[account];
    }

    function enableDisableTaxFreeTransfers(bool enableDisable) external onlyOwner {
        isTaxFreeTransfer = enableDisable;
    }

    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) {
            require(amount <= _maxBuyAmount, "Transfer amount exceeds the maxTxAmount.");
        }
        if(from != uniswapV2Pair && to == uniswapV2Pair) { //if sell
            //only tax if tokens are going back to Uniswap
            isSell = true;
            swapTokensAndDistribute();
        }
        if(from != uniswapV2Pair && to != uniswapV2Pair) {
            takeFees = isTaxFreeTransfer ? false : true;
        }
        
        _tokenTransfer(from, to, amount, takeFees, isSell, true);
    }

    function swapTokensAndDistribute() private {
        uint256 contractTokenBalance = balanceOf(address(this));
        if(contractTokenBalance > 0) {
            uint ethPrice = getEthPrice(contractTokenBalance);
            if (ethPrice >= ethPriceToSwap && !inSwapAndLiquify && swapAndLiquifyEnabled) {
                //send eth to wallets marketing and dev
                distributeShares(contractTokenBalance);
            }
        }
    }

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

    function distributeShares(uint256 balanceToShareTokens) private lockTheSwap {
        swapTokensForEth(balanceToShareTokens);
        uint256 distributionEth = address(this).balance;
        uint256 marketingShare = distributionEth.mul(distribution.marketing).div(100);
        uint256 dividendShare = distributionEth.mul(distribution.dividend).div(100);
        uint256 devTeamShare = distributionEth.mul(distribution.devTeam).div(100);
        uint256 charityShare = distributionEth.mul(distribution.charity).div(100);
        if(marketingShare > 0){
            payable(marketingAddress).transfer(marketingShare);
        }
        if(dividendShare > 0){
            sendEthDividends(dividendShare);
        }
        if(devTeamShare > 0){
            payable(devAddress).transfer(devTeamShare);
        }
        if(charityShare > 0){
            payable(charityAddress).transfer(charityShare);
        }
    }

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

    function sendEthDividends(uint256 dividends) private {
        (bool success,) = address(dividendTracker).call{value : dividends}("");
        if (success) {
            emit SendDividends(dividends);
        }
    }

    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 tAmount, bool takeFees, bool isSell, bool doUpdateDividends) private {
        doTakeFees = takeFees;
        isSellTxn = isSell;
        (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);

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

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

    Map private map;

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

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

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

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

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

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

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

contract DividendTracker is IERC20, Context, Ownable {
    using SafeMath for uint256;
    using SafeMathUint for uint256;
    using SafeMathInt for int256;
    uint256 constant internal magnitude = 2 ** 128;
    uint256 internal magnifiedDividendPerShare;
    mapping(address => int256) internal magnifiedDividendCorrections;
    mapping(address => uint256) internal withdrawnDividends;
    mapping(address => uint256) internal claimedDividends;
    mapping(address => uint256) private _balances;
    mapping(address => mapping(address => uint256)) private _allowances;
    uint256 private _totalSupply;
    string private _name = "SHINJIRO TRACKER";
    string private _symbol = "SHOXT";
    uint8 private _decimals = 9;
    uint256 public totalDividendsDistributed;
    IterableMapping private tokenHoldersMap = new IterableMapping();
    uint256 public minimumTokenBalanceForDividends = 250000000000000 * 10 **  _decimals;
    Shinjiro private shinjiro;
    bool public doCalculation = false;
    event updateBalance(address addr, uint256 amount);
    event DividendsDistributed(address indexed from,uint256 weiAmount);
    event DividendWithdrawn(address indexed to,uint256 weiAmount);

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

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

    constructor() {
        emit Transfer(address(0), _msgSender(), 0);
    }

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

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

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

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

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

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

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

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

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

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

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

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

    function setTokenBalance(address account) external {
        uint256 balance = shinjiro.balanceOf(account);
        if(!shinjiro.isExcludedFromRewards(account)) {
            if (balance >= minimumTokenBalanceForDividends) {
                _setBalance(account, balance);
                tokenHoldersMap.set(account, balance);
            }
            else {
                _setBalance(account, 0);
                tokenHoldersMap.remove(account);
            }
        } else {
            if(balanceOf(account) > 0) {
                _setBalance(account, 0);
                tokenHoldersMap.remove(account);
            }
        }
        processAccount(payable(account), true);
    }

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

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

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

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

    receive() external payable {
        distributeDividends();
    }

    function setERC20Contract(address contractAddr) external onlyOwner {
        shinjiro = Shinjiro(payable(contractAddr));
    }

    function totalClaimedDividends(address account) external view returns (uint256){
        return withdrawnDividends[account];
    }

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

    function distributeDividends() public payable {
        require(totalSupply() > 0);

        if (msg.value > 0) {
            magnifiedDividendPerShare = magnifiedDividendPerShare.add(
                (msg.value).mul(magnitude) / totalSupply()
            );
            emit DividendsDistributed(msg.sender, msg.value);
            totalDividendsDistributed = totalDividendsDistributed.add(msg.value);
        }
    }

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

    function _withdrawDividendOfUser(address payable user) internal returns (uint256) {
        uint256 _withdrawableDividend = withdrawableDividendOf(user);
        if (_withdrawableDividend > 0) {
            withdrawnDividends[user] = withdrawnDividends[user].add(_withdrawableDividend);
            emit DividendWithdrawn(user, _withdrawableDividend);
            (bool success,) = user.call{value : _withdrawableDividend, gas : 3000}("");
            if (!success) {
                withdrawnDividends[user] = withdrawnDividends[user].sub(_withdrawableDividend);
                return 0;
            }
            return _withdrawableDividend;
        }
        return 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        }
    }

    //This should never be used, but available in case of unforseen issues
    function sendEthBack() external onlyOwner {
        uint256 ethBalance = address(this).balance;
        payable(owner()).transfer(ethBalance);
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"iterations","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"claims","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastProcessedIndex","type":"uint256"},{"indexed":true,"internalType":"bool","name":"automatic","type":"bool"},{"indexed":false,"internalType":"uint256","name":"gas","type":"uint256"},{"indexed":true,"internalType":"address","name":"processor","type":"address"}],"name":"ProcessedDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"EthAmount","type":"uint256"}],"name":"SendDividends","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"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":"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":"charityAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"createV2Pair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deadWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"distribution","outputs":[{"internalType":"uint256","name":"devTeam","type":"uint256"},{"internalType":"uint256","name":"marketing","type":"uint256"},{"internalType":"uint256","name":"dividend","type":"uint256"},{"internalType":"uint256","name":"charity","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"enableDisable","type":"bool"}],"name":"enableDisableTaxFreeTransfers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ethPriceToSwap","outputs":[{"internalType":"uint256","name":"","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[]"},{"internalType":"bool","name":"isExcludeFromFee","type":"bool"}],"name":"excludeIncludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"excludeIncludeFromRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gasForProcessing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"getEthPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isAddressBlocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isExcludedFromRewards","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"dividend","type":"uint256"},{"internalType":"uint256","name":"devTeam","type":"uint256"},{"internalType":"uint256","name":"marketing","type":"uint256"},{"internalType":"uint256","name":"charity","type":"uint256"}],"name":"setDistribution","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"dividendContractAddress","type":"address"}],"name":"setDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"ethSellAmount_","type":"uint256"}],"name":"setEthLargeSellAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"ethPriceToSwap_","type":"uint256"}],"name":"setEthPriceToSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxBuyAmount","type":"uint256"}],"name":"setMaxBuyAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"reflectionBuyFee","type":"uint256"},{"internalType":"uint256","name":"buyFee","type":"uint256"},{"internalType":"uint256","name":"sellReflectionFee","type":"uint256"},{"internalType":"uint256","name":"sellFee","type":"uint256"},{"internalType":"uint256","name":"largeSellFee","type":"uint256"}],"name":"setTaxFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"devAddr","type":"address"},{"internalType":"address","name":"charity","type":"address"},{"internalType":"address","name":"marketingAddr","type":"address"}],"name":"setWalletAddresses","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":"reflectionBuyFee","type":"uint256"},{"internalType":"uint256","name":"buyFee","type":"uint256"},{"internalType":"uint256","name":"sellReflectionFee","type":"uint256"},{"internalType":"uint256","name":"sellFee","type":"uint256"},{"internalType":"uint256","name":"largeSellFee","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":"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"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"updateGasForProcessing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052737a250d5630b4cf539739df2c5dacb4c659f2488d600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060400160405280600881526020017f5348494e4a49524f00000000000000000000000000000000000000000000000081525060099080519060200190620000e8929190620008a7565b506040518060400160405280600481526020017f53484f5800000000000000000000000000000000000000000000000000000000815250600a908051906020019062000136929190620008a7565b506009600b60006101000a81548160ff021916908360ff160217905550600b60009054906101000a900460ff16600a62000171919062000af1565b670de0b6b3a764000062000186919062000b42565b600c55600c546000196200019b919062000bd2565b600019620001aa919062000c0a565b600d556001600f60016101000a81548160ff0219169083151502179055506000600f60026101000a81548160ff021916908315150217905550600b60009054906101000a900460ff16600a62000201919062000af1565b670de0b6b3a764000062000216919062000b42565b6010556702c68af0bb140000601155670de0b6b3a764000060125573376ff9f2fee139f5e0cb44b53ad97e07ed3c12e3601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073b647dd7bd8c2a18ff4a9c7497c185c8bb7b9c6f4601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073811d5d85eecda2b9b5ca6856b7a6c641eb2542f4601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061dead601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061c3506017553480156200038657600080fd5b506000620003996200087660201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350600d54600360006200044e6200087660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600160076000620004a26200087e60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160076000620005096200087660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160076000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160076000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160076000601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160086000601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506040518060a00160405280600181526020016008815260200160018152602001600881526020016008815250601960008201518160000155602082015181600101556040820151816002015560608201518160030155608082015181600401559050506040518060800160405280601e8152602001601e8152602001601e8152602001600a815250601e60008201518160000155602082015181600101556040820151816002015560608201518160030155905050620008076200087660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600c5460405162000868919062000c56565b60405180910390a362000cd7565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620008b59062000ca2565b90600052602060002090601f016020900481019282620008d9576000855562000925565b82601f10620008f457805160ff191683800117855562000925565b8280016001018555821562000925579182015b828111156200092457825182559160200191906001019062000907565b5b50905062000934919062000938565b5090565b5b808211156200095357600081600090555060010162000939565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b6001851115620009e557808604811115620009bd57620009bc62000957565b5b6001851615620009cd5780820291505b8081029050620009dd8562000986565b94506200099d565b94509492505050565b60008262000a00576001905062000ad3565b8162000a10576000905062000ad3565b816001811462000a29576002811462000a345762000a6a565b600191505062000ad3565b60ff84111562000a495762000a4862000957565b5b8360020a91508482111562000a635762000a6262000957565b5b5062000ad3565b5060208310610133831016604e8410600b841016171562000aa45782820a90508381111562000a9e5762000a9d62000957565b5b62000ad3565b62000ab3848484600162000993565b9250905081840481111562000acd5762000acc62000957565b5b81810290505b9392505050565b6000819050919050565b600060ff82169050919050565b600062000afe8262000ada565b915062000b0b8362000ae4565b925062000b3a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484620009ee565b905092915050565b600062000b4f8262000ada565b915062000b5c8362000ada565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562000b985762000b9762000957565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600062000bdf8262000ada565b915062000bec8362000ada565b92508262000bff5762000bfe62000ba3565b5b828206905092915050565b600062000c178262000ada565b915062000c248362000ada565b92508282101562000c3a5762000c3962000957565b5b828203905092915050565b62000c508162000ada565b82525050565b600060208201905062000c6d600083018462000c45565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000cbb57607f821691505b60208210810362000cd15762000cd062000c73565b5b50919050565b615b9d8062000ce76000396000f3fe6080604052600436106102975760003560e01c806385d4787b1161015a578063afcf2fc4116100c1578063dd62ed3e1161007a578063dd62ed3e14610a2c578063e7dad4f914610a69578063f2fde38b14610aa6578063f34eb0b814610acf578063f959f81714610af8578063fb6287d214610b215761029e565b8063afcf2fc414610946578063b2abbbc414610971578063b6a998721461099a578063c49b9a80146109b1578063dc0aa9cf146109da578063dcda6af314610a035761029e565b806398acb5d81161011357806398acb5d8146108245780639b0e2e861461084d5780639c1b8af514610876578063a457c2d7146108a1578063a5ece941146108de578063a9059cbb146109095761029e565b806385d4787b14610714578063870d365d1461073d578063871c128d1461077a5780638da5cb5b146107a357806391142cb3146107ce57806395d89b41146107f95761029e565b80633ad10ef6116101fe57806354a5df1f116101b757806354a5df1f146106135780635ee58efc1461063e57806370a082311461066c578063715018a6146106a957806371cd56af146106c057806385141a77146106e95761029e565b80633ad10ef614610503578063441d801f1461052e57806349bd5a5e146105575780634a74bb02146105825780634e781233146105ad5780635342acb4146105d65761029e565b80631694505e116102505780631694505e146103cb57806318160ddd146103f657806323b872dd146104215780632d8381191461045e578063313ce5671461049b57806339509351146104c65761029e565b80630492f055146102a357806306fdde03146102ce578063095ea7b3146102f95780630ddc0976146103365780630e832273146103655780630fc709e5146103a25761029e565b3661029e57005b600080fd5b3480156102af57600080fd5b506102b8610b4a565b6040516102c591906142ed565b60405180910390f35b3480156102da57600080fd5b506102e3610b50565b6040516102f091906143a1565b60405180910390f35b34801561030557600080fd5b50610320600480360381019061031b9190614461565b610be2565b60405161032d91906144bc565b60405180910390f35b34801561034257600080fd5b5061034b610c00565b60405161035c9594939291906144d7565b60405180910390f35b34801561037157600080fd5b5061038c6004803603810190610387919061452a565b610c24565b60405161039991906144bc565b60405180910390f35b3480156103ae57600080fd5b506103c960048036038101906103c49190614557565b610c7a565b005b3480156103d757600080fd5b506103e0610d3d565b6040516103ed919061461d565b60405180910390f35b34801561040257600080fd5b5061040b610d63565b60405161041891906142ed565b60405180910390f35b34801561042d57600080fd5b5061044860048036038101906104439190614638565b610d6d565b60405161045591906144bc565b60405180910390f35b34801561046a57600080fd5b506104856004803603810190610480919061468b565b610e46565b60405161049291906142ed565b60405180910390f35b3480156104a757600080fd5b506104b0610eb4565b6040516104bd91906146d4565b60405180910390f35b3480156104d257600080fd5b506104ed60048036038101906104e89190614461565b610ecb565b6040516104fa91906144bc565b60405180910390f35b34801561050f57600080fd5b50610518610f7e565b60405161052591906146fe565b60405180910390f35b34801561053a57600080fd5b50610555600480360381019061055091906147aa565b610fa4565b005b34801561056357600080fd5b5061056c611049565b60405161057991906146fe565b60405180910390f35b34801561058e57600080fd5b5061059761106f565b6040516105a491906144bc565b60405180910390f35b3480156105b957600080fd5b506105d460048036038101906105cf919061480a565b611082565b005b3480156105e257600080fd5b506105fd60048036038101906105f8919061452a565b611134565b60405161060a91906144bc565b60405180910390f35b34801561061f57600080fd5b5061062861118a565b60405161063591906142ed565b60405180910390f35b34801561064a57600080fd5b50610653611190565b6040516106639493929190614837565b60405180910390f35b34801561067857600080fd5b50610693600480360381019061068e919061452a565b6111ae565b6040516106a091906142ed565b60405180910390f35b3480156106b557600080fd5b506106be6111ff565b005b3480156106cc57600080fd5b506106e760048036038101906106e291906147aa565b611352565b005b3480156106f557600080fd5b506106fe6113f7565b60405161070b91906146fe565b60405180910390f35b34801561072057600080fd5b5061073b600480360381019061073691906149ba565b61141d565b005b34801561074957600080fd5b50610764600480360381019061075f919061468b565b6114c0565b60405161077191906142ed565b60405180910390f35b34801561078657600080fd5b506107a1600480360381019061079c919061468b565b611703565b005b3480156107af57600080fd5b506107b86117e6565b6040516107c591906146fe565b60405180910390f35b3480156107da57600080fd5b506107e361180f565b6040516107f091906142ed565b60405180910390f35b34801561080557600080fd5b5061080e611815565b60405161081b91906143a1565b60405180910390f35b34801561083057600080fd5b5061084b6004803603810190610846919061452a565b6118a7565b005b34801561085957600080fd5b50610874600480360381019061086f91906149ba565b611980565b005b34801561088257600080fd5b5061088b611a23565b60405161089891906142ed565b60405180910390f35b3480156108ad57600080fd5b506108c860048036038101906108c39190614461565b611a29565b6040516108d591906144bc565b60405180910390f35b3480156108ea57600080fd5b506108f3611af6565b60405161090091906146fe565b60405180910390f35b34801561091557600080fd5b50610930600480360381019061092b9190614461565b611b1c565b60405161093d91906144bc565b60405180910390f35b34801561095257600080fd5b5061095b611b3a565b60405161096891906146fe565b60405180910390f35b34801561097d57600080fd5b506109986004803603810190610993919061468b565b611b60565b005b3480156109a657600080fd5b506109af611bff565b005b3480156109bd57600080fd5b506109d860048036038101906109d3919061480a565b611f7f565b005b3480156109e657600080fd5b50610a0160048036038101906109fc9190614a03565b612068565b005b348015610a0f57600080fd5b50610a2a6004803603810190610a259190614ad4565b612136565b005b348015610a3857600080fd5b50610a536004803603810190610a4e9190614b55565b6122a0565b604051610a6091906142ed565b60405180910390f35b348015610a7557600080fd5b50610a906004803603810190610a8b919061452a565b612327565b604051610a9d91906144bc565b60405180910390f35b348015610ab257600080fd5b50610acd6004803603810190610ac8919061452a565b61237d565b005b348015610adb57600080fd5b50610af66004803603810190610af1919061468b565b61253e565b005b348015610b0457600080fd5b50610b1f6004803603810190610b1a919061468b565b6125ec565b005b348015610b2d57600080fd5b50610b486004803603810190610b439190614b95565b61268b565b005b60105481565b606060098054610b5f90614c17565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8b90614c17565b8015610bd85780601f10610bad57610100808354040283529160200191610bd8565b820191906000526020600020905b815481529060010190602001808311610bbb57829003601f168201915b5050505050905090565b6000610bf6610bef6127e8565b84846127f0565b6001905092915050565b60198060000154908060010154908060020154908060030154908060040154905085565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b610c826127e8565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0690614c94565b60405180910390fd5b83601e6002018190555082601e6000018190555081601e6001018190555080601e6003018190555050505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600c54905090565b6000610d7a8484846129b9565b610e3b84610d866127e8565b610e3685604051806060016040528060288152602001615b1b60289139600560008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610dec6127e8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461308b9092919063ffffffff16565b6127f0565b600190509392505050565b6000600d54821115610e8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8490614d26565b60405180910390fd5b6000610e976130ef565b9050610eac818461311a90919063ffffffff16565b915050919050565b6000600b60009054906101000a900460ff16905090565b6000610f74610ed86127e8565b84610f6f8560056000610ee96127e8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461316490919063ffffffff16565b6127f0565b6001905092915050565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610fac6127e8565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611039576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103090614c94565b60405180910390fd5b6110448383836131c2565b505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600f60019054906101000a900460ff1681565b61108a6127e8565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611117576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110e90614c94565b60405180910390fd5b80600f60026101000a81548160ff02191690831515021790555050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60115481565b601e8060000154908060010154908060020154908060030154905084565b60006111f8600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610e46565b9050919050565b6112076127e8565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611294576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128b90614c94565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b61135a6127e8565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146113e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113de90614c94565b60405180910390fd5b6113f283838361326d565b505050565b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6114256127e8565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146114b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a990614c94565b60405180910390fd5b6114bd816001613318565b50565b600080600267ffffffffffffffff8111156114de576114dd61487c565b5b60405190808252806020026020018201604052801561150c5781602001602082028036833780820191505090505b509050308160008151811061152457611523614d46565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ef9190614d8a565b8160018151811061160357611602614d46565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d06ca61f84836040518363ffffffff1660e01b815260040161169a929190614e75565b600060405180830381865afa1580156116b7573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906116e09190614f7d565b6001815181106116f3576116f2614d46565b5b6020026020010151915050919050565b61170b6127e8565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611798576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178f90614c94565b60405180910390fd5b60175481036117dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d390615038565b60405180910390fd5b8060178190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60125481565b6060600a805461182490614c17565b80601f016020809104026020016040519081016040528092919081815260200182805461185090614c17565b801561189d5780601f106118725761010080835404028352916020019161189d565b820191906000526020600020905b81548152906001019060200180831161188057829003601f168201915b5050505050905090565b6118af6127e8565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461193c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193390614c94565b60405180910390fd5b80602260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6119886127e8565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611a15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0c90614c94565b60405180910390fd5b611a20816000613318565b50565b60175481565b6000611aec611a366127e8565b84611ae785604051806060016040528060258152602001615b436025913960056000611a606127e8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461308b9092919063ffffffff16565b6127f0565b6001905092915050565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000611b30611b296127e8565b84846129b9565b6001905092915050565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611b686127e8565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611bf5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bec90614c94565b60405180910390fd5b8060118190555050565b611c076127e8565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611c94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8b90614c94565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611d25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1c906150ca565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611db69190614d8a565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e639190614d8a565b6040518363ffffffff1660e01b8152600401611e809291906150ea565b6020604051808303816000875af1158015611e9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ec39190614d8a565b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160086000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550565b611f876127e8565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200b90614c94565b60405180910390fd5b80600f60016101000a81548160ff0219169083151502179055507f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc1598160405161205d91906144bc565b60405180910390a150565b6120706127e8565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146120fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f490614c94565b60405180910390fd5b84601960000181905550836019600101819055508260196002018190555081601960030181905550806019600401819055505050505050565b6000600760006121446127e8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166121cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c290615185565b60405180910390fd5b828290508585905014612213576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220a90615217565b60405180910390fd5b5b848490508110156122995761228561222a6127e8565b86868481811061223d5761223c614d46565b5b9050602002016020810190612252919061452a565b633b9aca0086868681811061226a57612269614d46565b5b9050602002013561227b9190615266565b600080600061340f565b60018161229291906152c0565b9050612214565b5050505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6123856127e8565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612412576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240990614c94565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612481576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247890615388565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6125466127e8565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146125d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ca90614c94565b60405180910390fd5b633b9aca00816125e39190615266565b60108190555050565b6125f46127e8565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612681576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267890614c94565b60405180910390fd5b8060128190555050565b6126936127e8565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612720576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271790614c94565b60405180910390fd5b82601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361285f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128569061541a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036128ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c5906154ac565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516129ac91906142ed565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612a28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a1f9061553e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612a97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8e906155d0565b60405180910390fd5b60008111612ada576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ad190615662565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612b6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b62906156ce565b60405180910390fd5b600080600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612c125750600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015612c515750612c216117e6565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b8015612c905750612c606117e6565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b9050612c9a6117e6565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614158015612d085750612cd86117e6565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b8015612d625750601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b15612e4b57600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612e0b5750600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b612e4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e4190615760565b60405180910390fd5b5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612ee657601054831115612ee5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612edc906157f2565b60405180910390fd5b5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614158015612f915750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b15612fa35760019150612fa2613833565b5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415801561304f5750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b1561307557600f60029054906101000a900460ff1661306f576001613072565b60005b90505b6130848585858486600161340f565b5050505050565b60008383111582906130d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130ca91906143a1565b60405180910390fd5b50600083856130e29190615812565b9050809150509392505050565b60008060006130fc6138a1565b91509150613113818361311a90919063ffffffff16565b9250505090565b600061315c83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506138ee565b905092915050565b600080828461317391906152c0565b9050838110156131b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131af90615892565b60405180910390fd5b8091505092915050565b60005b838390508110156132675760008484838181106131e5576131e4614d46565b5b90506020020160208101906131fa919061452a565b905082600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050808061325f906158b2565b9150506131c5565b50505050565b60005b838390508110156133125760008484838181106132905761328f614d46565b5b90506020020160208101906132a5919061452a565b905082600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050808061330a906158b2565b915050613270565b50505050565b60005b825181101561340a57600083828151811061333957613338614d46565b5b6020026020010151905082156133a6576001600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506133f6565b600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff02191690555b508080613402906158b2565b91505061331b565b505050565b82601860006101000a81548160ff02191690831515021790555081601860016101000a81548160ff0219169083151502179055506000806000806000806134558a613951565b9550955095509550955095506134b386600360008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546139ad90919063ffffffff16565b600360008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061354885600360008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461316490919063ffffffff16565b600360008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613594816139f7565b61359e8483613ab4565b8a73ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516135fb91906142ed565b60405180910390a386801561361557506000601e60020154115b1561382557602260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633974d3b18d6040518263ffffffff1660e01b815260040161367591906146fe565b600060405180830381600087803b15801561368f57600080fd5b505af19250505080156136a0575060015b50602260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633974d3b18c6040518263ffffffff1660e01b81526004016136fc91906146fe565b600060405180830381600087803b15801561371657600080fd5b505af1925050508015613727575060015b50602260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ffb2c4796017546040518263ffffffff1660e01b815260040161378591906142ed565b6060604051808303816000875af19250505080156137c157506040513d601f19601f820116820180604052508101906137be91906158fa565b60015b15613824573273ffffffffffffffffffffffffffffffffffffffff16600115157fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a988585856017546040516138189493929190614837565b60405180910390a35050505b5b505050505050505050505050565b600061383e306111ae565b9050600081111561389e576000613854826114c0565b905060115481101580156138755750600f60009054906101000a900460ff16155b801561388d5750600f60019054906101000a900460ff165b1561389c5761389b82613aee565b5b505b50565b6000806000600d5490506000600c5490506138c9600c54600d5461311a90919063ffffffff16565b8210156138e157600d54600c549350935050506138ea565b81819350935050505b9091565b60008083118290613935576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161392c91906143a1565b60405180910390fd5b5060008385613944919061597c565b9050809150509392505050565b60008060008060008060008060006139688a613d62565b92509250925060008060006139868d86866139816130ef565b613dbc565b9250925092508282828888889b509b509b509b509b509b5050505050505091939550919395565b60006139ef83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061308b565b905092915050565b6000613a016130ef565b90506000613a188284613e4590919063ffffffff16565b9050613a6c81600360003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461316490919063ffffffff16565b600360003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050565b613ac982600d546139ad90919063ffffffff16565b600d81905550613ae481600e5461316490919063ffffffff16565b600e819055505050565b6001600f60006101000a81548160ff021916908315150217905550613b1281613ebf565b60004790506000613b446064613b36601e6001015485613e4590919063ffffffff16565b61311a90919063ffffffff16565b90506000613b736064613b65601e6002015486613e4590919063ffffffff16565b61311a90919063ffffffff16565b90506000613ba26064613b94601e6000015487613e4590919063ffffffff16565b61311a90919063ffffffff16565b90506000613bd16064613bc3601e6003015488613e4590919063ffffffff16565b61311a90919063ffffffff16565b90506000841115613c4657601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc859081150290604051600060405180830381858888f19350505050158015613c44573d6000803e3d6000fd5b505b6000831115613c5957613c5883614102565b5b6000821115613ccc57601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015613cca573d6000803e3d6000fd5b505b6000811115613d3f57601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015613d3d573d6000803e3d6000fd5b505b50505050506000600f60006101000a81548160ff02191690831515021790555050565b600080600080613d71856141d2565b90506000613d7e86614243565b90506000613da782613d99858a6139ad90919063ffffffff16565b6139ad90919063ffffffff16565b90508083839550955095505050509193909250565b600080600080613dd58589613e4590919063ffffffff16565b90506000613dec8689613e4590919063ffffffff16565b90506000613e038789613e4590919063ffffffff16565b90506000613e2c82613e1e85876139ad90919063ffffffff16565b6139ad90919063ffffffff16565b9050838184965096509650505050509450945094915050565b6000808303613e575760009050613eb9565b60008284613e659190615266565b9050828482613e74919061597c565b14613eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613eab90615a1f565b60405180910390fd5b809150505b92915050565b6000600267ffffffffffffffff811115613edc57613edb61487c565b5b604051908082528060200260200182016040528015613f0a5781602001602082028036833780820191505090505b5090503081600081518110613f2257613f21614d46565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613fc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fed9190614d8a565b8160018151811061400157614000614d46565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061406830600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846127f0565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b81526004016140cc959493929190615a7a565b600060405180830381600087803b1580156140e657600080fd5b505af11580156140fa573d6000803e3d6000fd5b505050505050565b6000602260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168260405161414a90615b05565b60006040518083038185875af1925050503d8060008114614187576040519150601f19603f3d011682016040523d82523d6000602084013e61418c565b606091505b5050905080156141ce577fb0cc2628d6d644cf6be9d8110e142297ac910d6d8026d795a99f272fd9ad60b1826040516141c591906142ed565b60405180910390a15b5050565b60008060009050601860009054906101000a900460ff1615614215576019600001549050601860019054906101000a900460ff16156142145760196002015490505b5b61423b606461422d8386613e4590919063ffffffff16565b61311a90919063ffffffff16565b915050919050565b60008060009050601860009054906101000a900460ff16156142a6576019600101549050601860019054906101000a900460ff16156142a5576019600301549050600061428f846114c0565b905060125481106142a35760196004015491505b505b5b6142cc60646142be8386613e4590919063ffffffff16565b61311a90919063ffffffff16565b915050919050565b6000819050919050565b6142e7816142d4565b82525050565b600060208201905061430260008301846142de565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015614342578082015181840152602081019050614327565b83811115614351576000848401525b50505050565b6000601f19601f8301169050919050565b600061437382614308565b61437d8185614313565b935061438d818560208601614324565b61439681614357565b840191505092915050565b600060208201905081810360008301526143bb8184614368565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000614402826143d7565b9050919050565b614412816143f7565b811461441d57600080fd5b50565b60008135905061442f81614409565b92915050565b61443e816142d4565b811461444957600080fd5b50565b60008135905061445b81614435565b92915050565b60008060408385031215614478576144776143cd565b5b600061448685828601614420565b92505060206144978582860161444c565b9150509250929050565b60008115159050919050565b6144b6816144a1565b82525050565b60006020820190506144d160008301846144ad565b92915050565b600060a0820190506144ec60008301886142de565b6144f960208301876142de565b61450660408301866142de565b61451360608301856142de565b61452060808301846142de565b9695505050505050565b6000602082840312156145405761453f6143cd565b5b600061454e84828501614420565b91505092915050565b60008060008060808587031215614571576145706143cd565b5b600061457f8782880161444c565b94505060206145908782880161444c565b93505060406145a18782880161444c565b92505060606145b28782880161444c565b91505092959194509250565b6000819050919050565b60006145e36145de6145d9846143d7565b6145be565b6143d7565b9050919050565b60006145f5826145c8565b9050919050565b6000614607826145ea565b9050919050565b614617816145fc565b82525050565b6000602082019050614632600083018461460e565b92915050565b600080600060608486031215614651576146506143cd565b5b600061465f86828701614420565b935050602061467086828701614420565b92505060406146818682870161444c565b9150509250925092565b6000602082840312156146a1576146a06143cd565b5b60006146af8482850161444c565b91505092915050565b600060ff82169050919050565b6146ce816146b8565b82525050565b60006020820190506146e960008301846146c5565b92915050565b6146f8816143f7565b82525050565b600060208201905061471360008301846146ef565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261473e5761473d614719565b5b8235905067ffffffffffffffff81111561475b5761475a61471e565b5b60208301915083602082028301111561477757614776614723565b5b9250929050565b614787816144a1565b811461479257600080fd5b50565b6000813590506147a48161477e565b92915050565b6000806000604084860312156147c3576147c26143cd565b5b600084013567ffffffffffffffff8111156147e1576147e06143d2565b5b6147ed86828701614728565b9350935050602061480086828701614795565b9150509250925092565b6000602082840312156148205761481f6143cd565b5b600061482e84828501614795565b91505092915050565b600060808201905061484c60008301876142de565b61485960208301866142de565b61486660408301856142de565b61487360608301846142de565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6148b482614357565b810181811067ffffffffffffffff821117156148d3576148d261487c565b5b80604052505050565b60006148e66143c3565b90506148f282826148ab565b919050565b600067ffffffffffffffff8211156149125761491161487c565b5b602082029050602081019050919050565b6000614936614931846148f7565b6148dc565b9050808382526020820190506020840283018581111561495957614958614723565b5b835b81811015614982578061496e8882614420565b84526020840193505060208101905061495b565b5050509392505050565b600082601f8301126149a1576149a0614719565b5b81356149b1848260208601614923565b91505092915050565b6000602082840312156149d0576149cf6143cd565b5b600082013567ffffffffffffffff8111156149ee576149ed6143d2565b5b6149fa8482850161498c565b91505092915050565b600080600080600060a08688031215614a1f57614a1e6143cd565b5b6000614a2d8882890161444c565b9550506020614a3e8882890161444c565b9450506040614a4f8882890161444c565b9350506060614a608882890161444c565b9250506080614a718882890161444c565b9150509295509295909350565b60008083601f840112614a9457614a93614719565b5b8235905067ffffffffffffffff811115614ab157614ab061471e565b5b602083019150836020820283011115614acd57614acc614723565b5b9250929050565b60008060008060408587031215614aee57614aed6143cd565b5b600085013567ffffffffffffffff811115614b0c57614b0b6143d2565b5b614b1887828801614728565b9450945050602085013567ffffffffffffffff811115614b3b57614b3a6143d2565b5b614b4787828801614a7e565b925092505092959194509250565b60008060408385031215614b6c57614b6b6143cd565b5b6000614b7a85828601614420565b9250506020614b8b85828601614420565b9150509250929050565b600080600060608486031215614bae57614bad6143cd565b5b6000614bbc86828701614420565b9350506020614bcd86828701614420565b9250506040614bde86828701614420565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614c2f57607f821691505b602082108103614c4257614c41614be8565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614c7e602083614313565b9150614c8982614c48565b602082019050919050565b60006020820190508181036000830152614cad81614c71565b9050919050565b7f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260008201527f65666c656374696f6e7300000000000000000000000000000000000000000000602082015250565b6000614d10602a83614313565b9150614d1b82614cb4565b604082019050919050565b60006020820190508181036000830152614d3f81614d03565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050614d8481614409565b92915050565b600060208284031215614da057614d9f6143cd565b5b6000614dae84828501614d75565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614dec816143f7565b82525050565b6000614dfe8383614de3565b60208301905092915050565b6000602082019050919050565b6000614e2282614db7565b614e2c8185614dc2565b9350614e3783614dd3565b8060005b83811015614e68578151614e4f8882614df2565b9750614e5a83614e0a565b925050600181019050614e3b565b5085935050505092915050565b6000604082019050614e8a60008301856142de565b8181036020830152614e9c8184614e17565b90509392505050565b600067ffffffffffffffff821115614ec057614ebf61487c565b5b602082029050602081019050919050565b600081519050614ee081614435565b92915050565b6000614ef9614ef484614ea5565b6148dc565b90508083825260208201905060208402830185811115614f1c57614f1b614723565b5b835b81811015614f455780614f318882614ed1565b845260208401935050602081019050614f1e565b5050509392505050565b600082601f830112614f6457614f63614719565b5b8151614f74848260208601614ee6565b91505092915050565b600060208284031215614f9357614f926143cd565b5b600082015167ffffffffffffffff811115614fb157614fb06143d2565b5b614fbd84828501614f4f565b91505092915050565b7f43616e6e6f742075706461746520676173466f7250726f63657373696e67207460008201527f6f2073616d652076616c75650000000000000000000000000000000000000000602082015250565b6000615022602c83614313565b915061502d82614fc6565b604082019050919050565b6000602082019050818103600083015261505181615015565b9050919050565b7f556e69737761705632506169722068617320616c7265616479206265656e207360008201527f6574000000000000000000000000000000000000000000000000000000000000602082015250565b60006150b4602283614313565b91506150bf82615058565b604082019050919050565b600060208201905081810360008301526150e3816150a7565b9050919050565b60006040820190506150ff60008301856146ef565b61510c60208301846146ef565b9392505050565b7f41697264726f702063616e206f6e6c7920626520646f6e65206279206578636c60008201527f756465642066726f6d2066656500000000000000000000000000000000000000602082015250565b600061516f602d83614313565b915061517a82615113565b604082019050919050565b6000602082019050818103600083015261519e81615162565b9050919050565b7f486f6c6465727320616e6420616d6f756e74206c656e677468206d757374206260008201527f65207468652073616d6500000000000000000000000000000000000000000000602082015250565b6000615201602a83614313565b915061520c826151a5565b604082019050919050565b60006020820190508181036000830152615230816151f4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000615271826142d4565b915061527c836142d4565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156152b5576152b4615237565b5b828202905092915050565b60006152cb826142d4565b91506152d6836142d4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561530b5761530a615237565b5b828201905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615372602683614313565b915061537d82615316565b604082019050919050565b600060208201905081810360008301526153a181615365565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000615404602483614313565b915061540f826153a8565b604082019050919050565b60006020820190508181036000830152615433816153f7565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000615496602283614313565b91506154a18261543a565b604082019050919050565b600060208201905081810360008301526154c581615489565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000615528602583614313565b9150615533826154cc565b604082019050919050565b600060208201905081810360008301526155578161551b565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006155ba602383614313565b91506155c58261555e565b604082019050919050565b600060208201905081810360008301526155e9816155ad565b9050919050565b7f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b600061564c602983614313565b9150615657826155f0565b604082019050919050565b6000602082019050818103600083015261567b8161563f565b9050919050565b7f556e697377617056325061697220686173206e6f74206265656e207365740000600082015250565b60006156b8601e83614313565b91506156c382615682565b602082019050919050565b600060208201905081810360008301526156e7816156ab565b9050919050565b7f626f747320617265206e6f7420616c6c6f77656420746f2073656c6c206f722060008201527f7472616e7366657220746f6b656e730000000000000000000000000000000000602082015250565b600061574a602f83614313565b9150615755826156ee565b604082019050919050565b600060208201905081810360008301526157798161573d565b9050919050565b7f5472616e7366657220616d6f756e74206578636565647320746865206d61785460008201527f78416d6f756e742e000000000000000000000000000000000000000000000000602082015250565b60006157dc602883614313565b91506157e782615780565b604082019050919050565b6000602082019050818103600083015261580b816157cf565b9050919050565b600061581d826142d4565b9150615828836142d4565b92508282101561583b5761583a615237565b5b828203905092915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b600061587c601b83614313565b915061588782615846565b602082019050919050565b600060208201905081810360008301526158ab8161586f565b9050919050565b60006158bd826142d4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036158ef576158ee615237565b5b600182019050919050565b600080600060608486031215615913576159126143cd565b5b600061592186828701614ed1565b935050602061593286828701614ed1565b925050604061594386828701614ed1565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000615987826142d4565b9150615992836142d4565b9250826159a2576159a161594d565b5b828204905092915050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b6000615a09602183614313565b9150615a14826159ad565b604082019050919050565b60006020820190508181036000830152615a38816159fc565b9050919050565b6000819050919050565b6000615a64615a5f615a5a84615a3f565b6145be565b6142d4565b9050919050565b615a7481615a49565b82525050565b600060a082019050615a8f60008301886142de565b615a9c6020830187615a6b565b8181036040830152615aae8186614e17565b9050615abd60608301856146ef565b615aca60808301846142de565b9695505050505050565b600081905092915050565b50565b6000615aef600083615ad4565b9150615afa82615adf565b600082019050919050565b6000615b1082615ae2565b915081905091905056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122044c02c8a607e790a032431d1df1f1d0a3441a18494379604e2f1609591faff4464736f6c634300080d0033

Deployed Bytecode

0x6080604052600436106102975760003560e01c806385d4787b1161015a578063afcf2fc4116100c1578063dd62ed3e1161007a578063dd62ed3e14610a2c578063e7dad4f914610a69578063f2fde38b14610aa6578063f34eb0b814610acf578063f959f81714610af8578063fb6287d214610b215761029e565b8063afcf2fc414610946578063b2abbbc414610971578063b6a998721461099a578063c49b9a80146109b1578063dc0aa9cf146109da578063dcda6af314610a035761029e565b806398acb5d81161011357806398acb5d8146108245780639b0e2e861461084d5780639c1b8af514610876578063a457c2d7146108a1578063a5ece941146108de578063a9059cbb146109095761029e565b806385d4787b14610714578063870d365d1461073d578063871c128d1461077a5780638da5cb5b146107a357806391142cb3146107ce57806395d89b41146107f95761029e565b80633ad10ef6116101fe57806354a5df1f116101b757806354a5df1f146106135780635ee58efc1461063e57806370a082311461066c578063715018a6146106a957806371cd56af146106c057806385141a77146106e95761029e565b80633ad10ef614610503578063441d801f1461052e57806349bd5a5e146105575780634a74bb02146105825780634e781233146105ad5780635342acb4146105d65761029e565b80631694505e116102505780631694505e146103cb57806318160ddd146103f657806323b872dd146104215780632d8381191461045e578063313ce5671461049b57806339509351146104c65761029e565b80630492f055146102a357806306fdde03146102ce578063095ea7b3146102f95780630ddc0976146103365780630e832273146103655780630fc709e5146103a25761029e565b3661029e57005b600080fd5b3480156102af57600080fd5b506102b8610b4a565b6040516102c591906142ed565b60405180910390f35b3480156102da57600080fd5b506102e3610b50565b6040516102f091906143a1565b60405180910390f35b34801561030557600080fd5b50610320600480360381019061031b9190614461565b610be2565b60405161032d91906144bc565b60405180910390f35b34801561034257600080fd5b5061034b610c00565b60405161035c9594939291906144d7565b60405180910390f35b34801561037157600080fd5b5061038c6004803603810190610387919061452a565b610c24565b60405161039991906144bc565b60405180910390f35b3480156103ae57600080fd5b506103c960048036038101906103c49190614557565b610c7a565b005b3480156103d757600080fd5b506103e0610d3d565b6040516103ed919061461d565b60405180910390f35b34801561040257600080fd5b5061040b610d63565b60405161041891906142ed565b60405180910390f35b34801561042d57600080fd5b5061044860048036038101906104439190614638565b610d6d565b60405161045591906144bc565b60405180910390f35b34801561046a57600080fd5b506104856004803603810190610480919061468b565b610e46565b60405161049291906142ed565b60405180910390f35b3480156104a757600080fd5b506104b0610eb4565b6040516104bd91906146d4565b60405180910390f35b3480156104d257600080fd5b506104ed60048036038101906104e89190614461565b610ecb565b6040516104fa91906144bc565b60405180910390f35b34801561050f57600080fd5b50610518610f7e565b60405161052591906146fe565b60405180910390f35b34801561053a57600080fd5b50610555600480360381019061055091906147aa565b610fa4565b005b34801561056357600080fd5b5061056c611049565b60405161057991906146fe565b60405180910390f35b34801561058e57600080fd5b5061059761106f565b6040516105a491906144bc565b60405180910390f35b3480156105b957600080fd5b506105d460048036038101906105cf919061480a565b611082565b005b3480156105e257600080fd5b506105fd60048036038101906105f8919061452a565b611134565b60405161060a91906144bc565b60405180910390f35b34801561061f57600080fd5b5061062861118a565b60405161063591906142ed565b60405180910390f35b34801561064a57600080fd5b50610653611190565b6040516106639493929190614837565b60405180910390f35b34801561067857600080fd5b50610693600480360381019061068e919061452a565b6111ae565b6040516106a091906142ed565b60405180910390f35b3480156106b557600080fd5b506106be6111ff565b005b3480156106cc57600080fd5b506106e760048036038101906106e291906147aa565b611352565b005b3480156106f557600080fd5b506106fe6113f7565b60405161070b91906146fe565b60405180910390f35b34801561072057600080fd5b5061073b600480360381019061073691906149ba565b61141d565b005b34801561074957600080fd5b50610764600480360381019061075f919061468b565b6114c0565b60405161077191906142ed565b60405180910390f35b34801561078657600080fd5b506107a1600480360381019061079c919061468b565b611703565b005b3480156107af57600080fd5b506107b86117e6565b6040516107c591906146fe565b60405180910390f35b3480156107da57600080fd5b506107e361180f565b6040516107f091906142ed565b60405180910390f35b34801561080557600080fd5b5061080e611815565b60405161081b91906143a1565b60405180910390f35b34801561083057600080fd5b5061084b6004803603810190610846919061452a565b6118a7565b005b34801561085957600080fd5b50610874600480360381019061086f91906149ba565b611980565b005b34801561088257600080fd5b5061088b611a23565b60405161089891906142ed565b60405180910390f35b3480156108ad57600080fd5b506108c860048036038101906108c39190614461565b611a29565b6040516108d591906144bc565b60405180910390f35b3480156108ea57600080fd5b506108f3611af6565b60405161090091906146fe565b60405180910390f35b34801561091557600080fd5b50610930600480360381019061092b9190614461565b611b1c565b60405161093d91906144bc565b60405180910390f35b34801561095257600080fd5b5061095b611b3a565b60405161096891906146fe565b60405180910390f35b34801561097d57600080fd5b506109986004803603810190610993919061468b565b611b60565b005b3480156109a657600080fd5b506109af611bff565b005b3480156109bd57600080fd5b506109d860048036038101906109d3919061480a565b611f7f565b005b3480156109e657600080fd5b50610a0160048036038101906109fc9190614a03565b612068565b005b348015610a0f57600080fd5b50610a2a6004803603810190610a259190614ad4565b612136565b005b348015610a3857600080fd5b50610a536004803603810190610a4e9190614b55565b6122a0565b604051610a6091906142ed565b60405180910390f35b348015610a7557600080fd5b50610a906004803603810190610a8b919061452a565b612327565b604051610a9d91906144bc565b60405180910390f35b348015610ab257600080fd5b50610acd6004803603810190610ac8919061452a565b61237d565b005b348015610adb57600080fd5b50610af66004803603810190610af1919061468b565b61253e565b005b348015610b0457600080fd5b50610b1f6004803603810190610b1a919061468b565b6125ec565b005b348015610b2d57600080fd5b50610b486004803603810190610b439190614b95565b61268b565b005b60105481565b606060098054610b5f90614c17565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8b90614c17565b8015610bd85780601f10610bad57610100808354040283529160200191610bd8565b820191906000526020600020905b815481529060010190602001808311610bbb57829003601f168201915b5050505050905090565b6000610bf6610bef6127e8565b84846127f0565b6001905092915050565b60198060000154908060010154908060020154908060030154908060040154905085565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b610c826127e8565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0690614c94565b60405180910390fd5b83601e6002018190555082601e6000018190555081601e6001018190555080601e6003018190555050505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600c54905090565b6000610d7a8484846129b9565b610e3b84610d866127e8565b610e3685604051806060016040528060288152602001615b1b60289139600560008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610dec6127e8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461308b9092919063ffffffff16565b6127f0565b600190509392505050565b6000600d54821115610e8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8490614d26565b60405180910390fd5b6000610e976130ef565b9050610eac818461311a90919063ffffffff16565b915050919050565b6000600b60009054906101000a900460ff16905090565b6000610f74610ed86127e8565b84610f6f8560056000610ee96127e8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461316490919063ffffffff16565b6127f0565b6001905092915050565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610fac6127e8565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611039576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103090614c94565b60405180910390fd5b6110448383836131c2565b505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600f60019054906101000a900460ff1681565b61108a6127e8565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611117576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110e90614c94565b60405180910390fd5b80600f60026101000a81548160ff02191690831515021790555050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60115481565b601e8060000154908060010154908060020154908060030154905084565b60006111f8600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610e46565b9050919050565b6112076127e8565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611294576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128b90614c94565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b61135a6127e8565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146113e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113de90614c94565b60405180910390fd5b6113f283838361326d565b505050565b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6114256127e8565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146114b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a990614c94565b60405180910390fd5b6114bd816001613318565b50565b600080600267ffffffffffffffff8111156114de576114dd61487c565b5b60405190808252806020026020018201604052801561150c5781602001602082028036833780820191505090505b509050308160008151811061152457611523614d46565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ef9190614d8a565b8160018151811061160357611602614d46565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d06ca61f84836040518363ffffffff1660e01b815260040161169a929190614e75565b600060405180830381865afa1580156116b7573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906116e09190614f7d565b6001815181106116f3576116f2614d46565b5b6020026020010151915050919050565b61170b6127e8565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611798576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178f90614c94565b60405180910390fd5b60175481036117dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d390615038565b60405180910390fd5b8060178190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60125481565b6060600a805461182490614c17565b80601f016020809104026020016040519081016040528092919081815260200182805461185090614c17565b801561189d5780601f106118725761010080835404028352916020019161189d565b820191906000526020600020905b81548152906001019060200180831161188057829003601f168201915b5050505050905090565b6118af6127e8565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461193c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193390614c94565b60405180910390fd5b80602260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6119886127e8565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611a15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0c90614c94565b60405180910390fd5b611a20816000613318565b50565b60175481565b6000611aec611a366127e8565b84611ae785604051806060016040528060258152602001615b436025913960056000611a606127e8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461308b9092919063ffffffff16565b6127f0565b6001905092915050565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000611b30611b296127e8565b84846129b9565b6001905092915050565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611b686127e8565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611bf5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bec90614c94565b60405180910390fd5b8060118190555050565b611c076127e8565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611c94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8b90614c94565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611d25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1c906150ca565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611db69190614d8a565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e639190614d8a565b6040518363ffffffff1660e01b8152600401611e809291906150ea565b6020604051808303816000875af1158015611e9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ec39190614d8a565b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160086000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550565b611f876127e8565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200b90614c94565b60405180910390fd5b80600f60016101000a81548160ff0219169083151502179055507f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc1598160405161205d91906144bc565b60405180910390a150565b6120706127e8565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146120fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f490614c94565b60405180910390fd5b84601960000181905550836019600101819055508260196002018190555081601960030181905550806019600401819055505050505050565b6000600760006121446127e8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166121cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c290615185565b60405180910390fd5b828290508585905014612213576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220a90615217565b60405180910390fd5b5b848490508110156122995761228561222a6127e8565b86868481811061223d5761223c614d46565b5b9050602002016020810190612252919061452a565b633b9aca0086868681811061226a57612269614d46565b5b9050602002013561227b9190615266565b600080600061340f565b60018161229291906152c0565b9050612214565b5050505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6123856127e8565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612412576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240990614c94565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612481576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247890615388565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6125466127e8565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146125d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ca90614c94565b60405180910390fd5b633b9aca00816125e39190615266565b60108190555050565b6125f46127e8565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612681576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267890614c94565b60405180910390fd5b8060128190555050565b6126936127e8565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612720576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271790614c94565b60405180910390fd5b82601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361285f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128569061541a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036128ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c5906154ac565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516129ac91906142ed565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612a28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a1f9061553e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612a97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8e906155d0565b60405180910390fd5b60008111612ada576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ad190615662565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612b6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b62906156ce565b60405180910390fd5b600080600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612c125750600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015612c515750612c216117e6565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b8015612c905750612c606117e6565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b9050612c9a6117e6565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614158015612d085750612cd86117e6565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b8015612d625750601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b15612e4b57600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612e0b5750600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b612e4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e4190615760565b60405180910390fd5b5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612ee657601054831115612ee5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612edc906157f2565b60405180910390fd5b5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614158015612f915750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b15612fa35760019150612fa2613833565b5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415801561304f5750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b1561307557600f60029054906101000a900460ff1661306f576001613072565b60005b90505b6130848585858486600161340f565b5050505050565b60008383111582906130d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130ca91906143a1565b60405180910390fd5b50600083856130e29190615812565b9050809150509392505050565b60008060006130fc6138a1565b91509150613113818361311a90919063ffffffff16565b9250505090565b600061315c83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506138ee565b905092915050565b600080828461317391906152c0565b9050838110156131b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131af90615892565b60405180910390fd5b8091505092915050565b60005b838390508110156132675760008484838181106131e5576131e4614d46565b5b90506020020160208101906131fa919061452a565b905082600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050808061325f906158b2565b9150506131c5565b50505050565b60005b838390508110156133125760008484838181106132905761328f614d46565b5b90506020020160208101906132a5919061452a565b905082600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050808061330a906158b2565b915050613270565b50505050565b60005b825181101561340a57600083828151811061333957613338614d46565b5b6020026020010151905082156133a6576001600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506133f6565b600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff02191690555b508080613402906158b2565b91505061331b565b505050565b82601860006101000a81548160ff02191690831515021790555081601860016101000a81548160ff0219169083151502179055506000806000806000806134558a613951565b9550955095509550955095506134b386600360008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546139ad90919063ffffffff16565b600360008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061354885600360008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461316490919063ffffffff16565b600360008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613594816139f7565b61359e8483613ab4565b8a73ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516135fb91906142ed565b60405180910390a386801561361557506000601e60020154115b1561382557602260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633974d3b18d6040518263ffffffff1660e01b815260040161367591906146fe565b600060405180830381600087803b15801561368f57600080fd5b505af19250505080156136a0575060015b50602260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633974d3b18c6040518263ffffffff1660e01b81526004016136fc91906146fe565b600060405180830381600087803b15801561371657600080fd5b505af1925050508015613727575060015b50602260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ffb2c4796017546040518263ffffffff1660e01b815260040161378591906142ed565b6060604051808303816000875af19250505080156137c157506040513d601f19601f820116820180604052508101906137be91906158fa565b60015b15613824573273ffffffffffffffffffffffffffffffffffffffff16600115157fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a988585856017546040516138189493929190614837565b60405180910390a35050505b5b505050505050505050505050565b600061383e306111ae565b9050600081111561389e576000613854826114c0565b905060115481101580156138755750600f60009054906101000a900460ff16155b801561388d5750600f60019054906101000a900460ff165b1561389c5761389b82613aee565b5b505b50565b6000806000600d5490506000600c5490506138c9600c54600d5461311a90919063ffffffff16565b8210156138e157600d54600c549350935050506138ea565b81819350935050505b9091565b60008083118290613935576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161392c91906143a1565b60405180910390fd5b5060008385613944919061597c565b9050809150509392505050565b60008060008060008060008060006139688a613d62565b92509250925060008060006139868d86866139816130ef565b613dbc565b9250925092508282828888889b509b509b509b509b509b5050505050505091939550919395565b60006139ef83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061308b565b905092915050565b6000613a016130ef565b90506000613a188284613e4590919063ffffffff16565b9050613a6c81600360003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461316490919063ffffffff16565b600360003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050565b613ac982600d546139ad90919063ffffffff16565b600d81905550613ae481600e5461316490919063ffffffff16565b600e819055505050565b6001600f60006101000a81548160ff021916908315150217905550613b1281613ebf565b60004790506000613b446064613b36601e6001015485613e4590919063ffffffff16565b61311a90919063ffffffff16565b90506000613b736064613b65601e6002015486613e4590919063ffffffff16565b61311a90919063ffffffff16565b90506000613ba26064613b94601e6000015487613e4590919063ffffffff16565b61311a90919063ffffffff16565b90506000613bd16064613bc3601e6003015488613e4590919063ffffffff16565b61311a90919063ffffffff16565b90506000841115613c4657601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc859081150290604051600060405180830381858888f19350505050158015613c44573d6000803e3d6000fd5b505b6000831115613c5957613c5883614102565b5b6000821115613ccc57601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015613cca573d6000803e3d6000fd5b505b6000811115613d3f57601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015613d3d573d6000803e3d6000fd5b505b50505050506000600f60006101000a81548160ff02191690831515021790555050565b600080600080613d71856141d2565b90506000613d7e86614243565b90506000613da782613d99858a6139ad90919063ffffffff16565b6139ad90919063ffffffff16565b90508083839550955095505050509193909250565b600080600080613dd58589613e4590919063ffffffff16565b90506000613dec8689613e4590919063ffffffff16565b90506000613e038789613e4590919063ffffffff16565b90506000613e2c82613e1e85876139ad90919063ffffffff16565b6139ad90919063ffffffff16565b9050838184965096509650505050509450945094915050565b6000808303613e575760009050613eb9565b60008284613e659190615266565b9050828482613e74919061597c565b14613eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613eab90615a1f565b60405180910390fd5b809150505b92915050565b6000600267ffffffffffffffff811115613edc57613edb61487c565b5b604051908082528060200260200182016040528015613f0a5781602001602082028036833780820191505090505b5090503081600081518110613f2257613f21614d46565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613fc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fed9190614d8a565b8160018151811061400157614000614d46565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061406830600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846127f0565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b81526004016140cc959493929190615a7a565b600060405180830381600087803b1580156140e657600080fd5b505af11580156140fa573d6000803e3d6000fd5b505050505050565b6000602260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168260405161414a90615b05565b60006040518083038185875af1925050503d8060008114614187576040519150601f19603f3d011682016040523d82523d6000602084013e61418c565b606091505b5050905080156141ce577fb0cc2628d6d644cf6be9d8110e142297ac910d6d8026d795a99f272fd9ad60b1826040516141c591906142ed565b60405180910390a15b5050565b60008060009050601860009054906101000a900460ff1615614215576019600001549050601860019054906101000a900460ff16156142145760196002015490505b5b61423b606461422d8386613e4590919063ffffffff16565b61311a90919063ffffffff16565b915050919050565b60008060009050601860009054906101000a900460ff16156142a6576019600101549050601860019054906101000a900460ff16156142a5576019600301549050600061428f846114c0565b905060125481106142a35760196004015491505b505b5b6142cc60646142be8386613e4590919063ffffffff16565b61311a90919063ffffffff16565b915050919050565b6000819050919050565b6142e7816142d4565b82525050565b600060208201905061430260008301846142de565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015614342578082015181840152602081019050614327565b83811115614351576000848401525b50505050565b6000601f19601f8301169050919050565b600061437382614308565b61437d8185614313565b935061438d818560208601614324565b61439681614357565b840191505092915050565b600060208201905081810360008301526143bb8184614368565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000614402826143d7565b9050919050565b614412816143f7565b811461441d57600080fd5b50565b60008135905061442f81614409565b92915050565b61443e816142d4565b811461444957600080fd5b50565b60008135905061445b81614435565b92915050565b60008060408385031215614478576144776143cd565b5b600061448685828601614420565b92505060206144978582860161444c565b9150509250929050565b60008115159050919050565b6144b6816144a1565b82525050565b60006020820190506144d160008301846144ad565b92915050565b600060a0820190506144ec60008301886142de565b6144f960208301876142de565b61450660408301866142de565b61451360608301856142de565b61452060808301846142de565b9695505050505050565b6000602082840312156145405761453f6143cd565b5b600061454e84828501614420565b91505092915050565b60008060008060808587031215614571576145706143cd565b5b600061457f8782880161444c565b94505060206145908782880161444c565b93505060406145a18782880161444c565b92505060606145b28782880161444c565b91505092959194509250565b6000819050919050565b60006145e36145de6145d9846143d7565b6145be565b6143d7565b9050919050565b60006145f5826145c8565b9050919050565b6000614607826145ea565b9050919050565b614617816145fc565b82525050565b6000602082019050614632600083018461460e565b92915050565b600080600060608486031215614651576146506143cd565b5b600061465f86828701614420565b935050602061467086828701614420565b92505060406146818682870161444c565b9150509250925092565b6000602082840312156146a1576146a06143cd565b5b60006146af8482850161444c565b91505092915050565b600060ff82169050919050565b6146ce816146b8565b82525050565b60006020820190506146e960008301846146c5565b92915050565b6146f8816143f7565b82525050565b600060208201905061471360008301846146ef565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261473e5761473d614719565b5b8235905067ffffffffffffffff81111561475b5761475a61471e565b5b60208301915083602082028301111561477757614776614723565b5b9250929050565b614787816144a1565b811461479257600080fd5b50565b6000813590506147a48161477e565b92915050565b6000806000604084860312156147c3576147c26143cd565b5b600084013567ffffffffffffffff8111156147e1576147e06143d2565b5b6147ed86828701614728565b9350935050602061480086828701614795565b9150509250925092565b6000602082840312156148205761481f6143cd565b5b600061482e84828501614795565b91505092915050565b600060808201905061484c60008301876142de565b61485960208301866142de565b61486660408301856142de565b61487360608301846142de565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6148b482614357565b810181811067ffffffffffffffff821117156148d3576148d261487c565b5b80604052505050565b60006148e66143c3565b90506148f282826148ab565b919050565b600067ffffffffffffffff8211156149125761491161487c565b5b602082029050602081019050919050565b6000614936614931846148f7565b6148dc565b9050808382526020820190506020840283018581111561495957614958614723565b5b835b81811015614982578061496e8882614420565b84526020840193505060208101905061495b565b5050509392505050565b600082601f8301126149a1576149a0614719565b5b81356149b1848260208601614923565b91505092915050565b6000602082840312156149d0576149cf6143cd565b5b600082013567ffffffffffffffff8111156149ee576149ed6143d2565b5b6149fa8482850161498c565b91505092915050565b600080600080600060a08688031215614a1f57614a1e6143cd565b5b6000614a2d8882890161444c565b9550506020614a3e8882890161444c565b9450506040614a4f8882890161444c565b9350506060614a608882890161444c565b9250506080614a718882890161444c565b9150509295509295909350565b60008083601f840112614a9457614a93614719565b5b8235905067ffffffffffffffff811115614ab157614ab061471e565b5b602083019150836020820283011115614acd57614acc614723565b5b9250929050565b60008060008060408587031215614aee57614aed6143cd565b5b600085013567ffffffffffffffff811115614b0c57614b0b6143d2565b5b614b1887828801614728565b9450945050602085013567ffffffffffffffff811115614b3b57614b3a6143d2565b5b614b4787828801614a7e565b925092505092959194509250565b60008060408385031215614b6c57614b6b6143cd565b5b6000614b7a85828601614420565b9250506020614b8b85828601614420565b9150509250929050565b600080600060608486031215614bae57614bad6143cd565b5b6000614bbc86828701614420565b9350506020614bcd86828701614420565b9250506040614bde86828701614420565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614c2f57607f821691505b602082108103614c4257614c41614be8565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614c7e602083614313565b9150614c8982614c48565b602082019050919050565b60006020820190508181036000830152614cad81614c71565b9050919050565b7f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260008201527f65666c656374696f6e7300000000000000000000000000000000000000000000602082015250565b6000614d10602a83614313565b9150614d1b82614cb4565b604082019050919050565b60006020820190508181036000830152614d3f81614d03565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050614d8481614409565b92915050565b600060208284031215614da057614d9f6143cd565b5b6000614dae84828501614d75565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614dec816143f7565b82525050565b6000614dfe8383614de3565b60208301905092915050565b6000602082019050919050565b6000614e2282614db7565b614e2c8185614dc2565b9350614e3783614dd3565b8060005b83811015614e68578151614e4f8882614df2565b9750614e5a83614e0a565b925050600181019050614e3b565b5085935050505092915050565b6000604082019050614e8a60008301856142de565b8181036020830152614e9c8184614e17565b90509392505050565b600067ffffffffffffffff821115614ec057614ebf61487c565b5b602082029050602081019050919050565b600081519050614ee081614435565b92915050565b6000614ef9614ef484614ea5565b6148dc565b90508083825260208201905060208402830185811115614f1c57614f1b614723565b5b835b81811015614f455780614f318882614ed1565b845260208401935050602081019050614f1e565b5050509392505050565b600082601f830112614f6457614f63614719565b5b8151614f74848260208601614ee6565b91505092915050565b600060208284031215614f9357614f926143cd565b5b600082015167ffffffffffffffff811115614fb157614fb06143d2565b5b614fbd84828501614f4f565b91505092915050565b7f43616e6e6f742075706461746520676173466f7250726f63657373696e67207460008201527f6f2073616d652076616c75650000000000000000000000000000000000000000602082015250565b6000615022602c83614313565b915061502d82614fc6565b604082019050919050565b6000602082019050818103600083015261505181615015565b9050919050565b7f556e69737761705632506169722068617320616c7265616479206265656e207360008201527f6574000000000000000000000000000000000000000000000000000000000000602082015250565b60006150b4602283614313565b91506150bf82615058565b604082019050919050565b600060208201905081810360008301526150e3816150a7565b9050919050565b60006040820190506150ff60008301856146ef565b61510c60208301846146ef565b9392505050565b7f41697264726f702063616e206f6e6c7920626520646f6e65206279206578636c60008201527f756465642066726f6d2066656500000000000000000000000000000000000000602082015250565b600061516f602d83614313565b915061517a82615113565b604082019050919050565b6000602082019050818103600083015261519e81615162565b9050919050565b7f486f6c6465727320616e6420616d6f756e74206c656e677468206d757374206260008201527f65207468652073616d6500000000000000000000000000000000000000000000602082015250565b6000615201602a83614313565b915061520c826151a5565b604082019050919050565b60006020820190508181036000830152615230816151f4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000615271826142d4565b915061527c836142d4565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156152b5576152b4615237565b5b828202905092915050565b60006152cb826142d4565b91506152d6836142d4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561530b5761530a615237565b5b828201905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615372602683614313565b915061537d82615316565b604082019050919050565b600060208201905081810360008301526153a181615365565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000615404602483614313565b915061540f826153a8565b604082019050919050565b60006020820190508181036000830152615433816153f7565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000615496602283614313565b91506154a18261543a565b604082019050919050565b600060208201905081810360008301526154c581615489565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000615528602583614313565b9150615533826154cc565b604082019050919050565b600060208201905081810360008301526155578161551b565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006155ba602383614313565b91506155c58261555e565b604082019050919050565b600060208201905081810360008301526155e9816155ad565b9050919050565b7f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b600061564c602983614313565b9150615657826155f0565b604082019050919050565b6000602082019050818103600083015261567b8161563f565b9050919050565b7f556e697377617056325061697220686173206e6f74206265656e207365740000600082015250565b60006156b8601e83614313565b91506156c382615682565b602082019050919050565b600060208201905081810360008301526156e7816156ab565b9050919050565b7f626f747320617265206e6f7420616c6c6f77656420746f2073656c6c206f722060008201527f7472616e7366657220746f6b656e730000000000000000000000000000000000602082015250565b600061574a602f83614313565b9150615755826156ee565b604082019050919050565b600060208201905081810360008301526157798161573d565b9050919050565b7f5472616e7366657220616d6f756e74206578636565647320746865206d61785460008201527f78416d6f756e742e000000000000000000000000000000000000000000000000602082015250565b60006157dc602883614313565b91506157e782615780565b604082019050919050565b6000602082019050818103600083015261580b816157cf565b9050919050565b600061581d826142d4565b9150615828836142d4565b92508282101561583b5761583a615237565b5b828203905092915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b600061587c601b83614313565b915061588782615846565b602082019050919050565b600060208201905081810360008301526158ab8161586f565b9050919050565b60006158bd826142d4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036158ef576158ee615237565b5b600182019050919050565b600080600060608486031215615913576159126143cd565b5b600061592186828701614ed1565b935050602061593286828701614ed1565b925050604061594386828701614ed1565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000615987826142d4565b9150615992836142d4565b9250826159a2576159a161594d565b5b828204905092915050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b6000615a09602183614313565b9150615a14826159ad565b604082019050919050565b60006020820190508181036000830152615a38816159fc565b9050919050565b6000819050919050565b6000615a64615a5f615a5a84615a3f565b6145be565b6142d4565b9050919050565b615a7481615a49565b82525050565b600060a082019050615a8f60008301886142de565b615a9c6020830187615a6b565b8181036040830152615aae8186614e17565b9050615abd60608301856146ef565b615aca60808301846142de565b9695505050505050565b600081905092915050565b50565b6000615aef600083615ad4565b9150615afa82615adf565b600082019050919050565b6000615b1082615ae2565b915081905091905056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122044c02c8a607e790a032431d1df1f1d0a3441a18494379604e2f1609591faff4464736f6c634300080d0033

Deployed Bytecode Sourcemap

18972:18407:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20341:67;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22147:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22999:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21505:22;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;25120:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26846:293;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19398:106;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22424:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23168:313;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24694:253;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22333:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23489:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20708:70;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24525:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19511:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20257:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31726:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31595:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20415:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21534:32;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;22527:138;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17814:148;;;;;;;;;;;;;:::i;:::-;;24955:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20785:70;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27493:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31315:272;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34043:209;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17178:79;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20481:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22238:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35201:166;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27629:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20862:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23715:269;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20544:76;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22673:167;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20627:74;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25633:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25763:311;;;;;;;;;;;;;:::i;:::-;;28122:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26457:381;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23992:525;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22848:143;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27376:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18117:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26326:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25505:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27147:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20341:67;;;;:::o;22147:83::-;22184:13;22217:5;22210:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22147:83;:::o;22999:161::-;23074:4;23091:39;23100:12;:10;:12::i;:::-;23114:7;23123:6;23091:8;:39::i;:::-;23148:4;23141:11;;22999:161;;;;:::o;21505:22::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25120:125::-;25185:4;25209:22;:28;25232:4;25209:28;;;;;;;;;;;;;;;;;;;;;;;;;25202:35;;25120:125;;;:::o;26846:293::-;17400:12;:10;:12::i;:::-;17390:22;;:6;;;;;;;;;;:22;;;17382:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;26996:8:::1;26972:12;:21;;:32;;;;27038:7;27015:12;:20;;:30;;;;27081:9;27056:12;:22;;:34;;;;27124:7;27101:12;:20;;:30;;;;26846:293:::0;;;;:::o;19398:106::-;;;;;;;;;;;;;:::o;22424:95::-;22477:7;22504;;22497:14;;22424:95;:::o;23168:313::-;23266:4;23283:36;23293:6;23301:9;23312:6;23283:9;:36::i;:::-;23330:121;23339:6;23347:12;:10;:12::i;:::-;23361:89;23399:6;23361:89;;;;;;;;;;;;;;;;;:11;:19;23373:6;23361:19;;;;;;;;;;;;;;;:33;23381:12;:10;:12::i;:::-;23361:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;23330:8;:121::i;:::-;23469:4;23462:11;;23168:313;;;;;:::o;24694:253::-;24760:7;24799;;24788;:18;;24780:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24864:19;24887:10;:8;:10::i;:::-;24864:33;;24915:24;24927:11;24915:7;:11;;:24;;;;:::i;:::-;24908:31;;;24694:253;;;:::o;22333:83::-;22374:5;22399:9;;;;;;;;;;;22392:16;;22333:83;:::o;23489:218::-;23577:4;23594:83;23603:12;:10;:12::i;:::-;23617:7;23626:50;23665:10;23626:11;:25;23638:12;:10;:12::i;:::-;23626:25;;;;;;;;;;;;;;;:34;23652:7;23626:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;23594:8;:83::i;:::-;23695:4;23688:11;;23489:218;;;;:::o;20708:70::-;;;;;;;;;;;;;:::o;24525:161::-;17400:12;:10;:12::i;:::-;17390:22;;:6;;;;;;;;;;:22;;;17382:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;24637:41:::1;24650:9;;24661:16;24637:12;:41::i;:::-;24525:161:::0;;;:::o;19511:41::-;;;;;;;;;;;;;:::o;20257:40::-;;;;;;;;;;;;;:::o;31726:130::-;17400:12;:10;:12::i;:::-;17390:22;;:6;;;;;;;;;;:22;;;17382:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;31835:13:::1;31815:17;;:33;;;;;;;;;;;;;;;;;;31726:130:::0;:::o;31595:123::-;31659:4;31683:18;:27;31702:7;31683:27;;;;;;;;;;;;;;;;;;;;;;;;;31676:34;;31595:123;;;:::o;20415:50::-;;;;:::o;21534:32::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;22527:138::-;22593:7;22620:37;22640:7;:16;22648:7;22640:16;;;;;;;;;;;;;;;;22620:19;:37::i;:::-;22613:44;;22527:138;;;:::o;17814:148::-;17400:12;:10;:12::i;:::-;17390:22;;:6;;;;;;;;;;:22;;;17382:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;17921:1:::1;17884:40;;17905:6;::::0;::::1;;;;;;;;17884:40;;;;;;;;;;;;17952:1;17935:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;17814:148::o:0;24955:157::-;17400:12;:10;:12::i;:::-;17390:22;;:6;;;;;;;;;;:22;;;17382:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;25065:39:::1;25082:9;;25093:10;25065:16;:39::i;:::-;24955:157:::0;;;:::o;20785:70::-;;;;;;;;;;;;;:::o;27493:128::-;17400:12;:10;:12::i;:::-;17390:22;;:6;;;;;;;;;;:22;;;17382:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;27577:36:::1;27597:9;27608:4;27577:19;:36::i;:::-;27493:128:::0;:::o;31315:272::-;31375:4;31393:21;31431:1;31417:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31393:40;;31462:4;31444;31449:1;31444:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;31488:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31478:4;31483:1;31478:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;;;31528:15;;;;;;;;;;;:29;;;31558:11;31571:4;31528:48;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31577:1;31528:51;;;;;;;;:::i;:::-;;;;;;;;31521:58;;;31315:272;;;:::o;34043:209::-;17400:12;:10;:12::i;:::-;17390:22;;:6;;;;;;;;;;:22;;;17382:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;34141:16:::1;;34129:8;:28:::0;34121:85:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;34236:8;34217:16;:27;;;;34043:209:::0;:::o;17178:79::-;17216:7;17243:6;;;;;;;;;;;17236:13;;17178:79;:::o;20481:47::-;;;;:::o;22238:87::-;22277:13;22310:7;22303:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22238:87;:::o;35201:166::-;17400:12;:10;:12::i;:::-;17390:22;;:6;;;;;;;;;;:22;;;17382:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;35334:23:::1;35292:15;;:67;;;;;;;;;;;;;;;;;;35201:166:::0;:::o;27629:131::-;17400:12;:10;:12::i;:::-;17390:22;;:6;;;;;;;;;;:22;;;17382:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;27715:37:::1;27735:9;27746:5;27715:19;:37::i;:::-;27629:131:::0;:::o;20862:39::-;;;;:::o;23715:269::-;23808:4;23825:129;23834:12;:10;:12::i;:::-;23848:7;23857:96;23896:15;23857:96;;;;;;;;;;;;;;;;;:11;:25;23869:12;:10;:12::i;:::-;23857:25;;;;;;;;;;;;;;;:34;23883:7;23857:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;23825:8;:129::i;:::-;23972:4;23965:11;;23715:269;;;;:::o;20544:76::-;;;;;;;;;;;;;:::o;22673:167::-;22751:4;22768:42;22778:12;:10;:12::i;:::-;22792:9;22803:6;22768:9;:42::i;:::-;22828:4;22821:11;;22673:167;;;;:::o;20627:74::-;;;;;;;;;;;;;:::o;25633:122::-;17400:12;:10;:12::i;:::-;17390:22;;:6;;;;;;;;;;:22;;;17382:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;25732:15:::1;25715:14;:32;;;;25633:122:::0;:::o;25763:311::-;17400:12;:10;:12::i;:::-;17390:22;;:6;;;;;;;;;;:22;;;17382:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;25850:1:::1;25825:27;;:13;;;;;;;;;;;:27;;;25817:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25935:15;;;;;;;;;;;:23;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25917:55;;;25981:4;25988:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25917:94;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25901:13;;:110;;;;;;;;;;;;;;;;;;26062:4;26022:22;:37;26045:13;;;;;;;;;;;26022:37;;;;;;;;;;;;;;;;:44;;;;;;;;;;;;;;;;;;25763:311::o:0;28122:171::-;17400:12;:10;:12::i;:::-;17390:22;;:6;;;;;;;;;;:22;;;17382:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;28223:8:::1;28199:21;;:32;;;;;;;;;;;;;;;;;;28247:38;28276:8;28247:38;;;;;;:::i;:::-;;;;;;;;28122:171:::0;:::o;26457:381::-;17400:12;:10;:12::i;:::-;17390:22;;:6;;;;;;;;;;:22;;;17382:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;26642:16:::1;26615:7;:24;;:43;;;;26686:6;26669:7;:14;;:23;;;;26731:17;26703:7;:25;;:45;;;;26777:7;26759;:15;;:25;;;;26818:12;26795:7;:20;;:35;;;;26457:381:::0;;;;;:::o;23992:525::-;24089:16;24128:18;:32;24147:12;:10;:12::i;:::-;24128:32;;;;;;;;;;;;;;;;;;;;;;;;;24120:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;24250:7;;:14;;24229:10;;:17;;:35;24221:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;24322:188;24339:10;;:17;;24328:8;:28;24322:188;;;24372:98;24387:12;:10;:12::i;:::-;24401:10;;24412:8;24401:20;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;24443:5;24423:7;;24431:8;24423:17;;;;;;;:::i;:::-;;;;;;;;:25;;;;:::i;:::-;24450:5;24457;24464;24372:14;:98::i;:::-;24497:1;24485:13;;;;;:::i;:::-;;;24322:188;;;24078:439;23992:525;;;;:::o;22848:143::-;22929:7;22956:11;:18;22968:5;22956:18;;;;;;;;;;;;;;;:27;22975:7;22956:27;;;;;;;;;;;;;;;;22949:34;;22848:143;;;;:::o;27376:109::-;27437:4;27461:10;:16;27472:4;27461:16;;;;;;;;;;;;;;;;;;;;;;;;;27454:23;;27376:109;;;:::o;18117:244::-;17400:12;:10;:12::i;:::-;17390:22;;:6;;;;;;;;;;:22;;;17382:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;18226:1:::1;18206:22;;:8;:22;;::::0;18198:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;18316:8;18287:38;;18308:6;::::0;::::1;;;;;;;;18287:38;;;;;;;;;;;;18345:8;18336:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;18117:244:::0;:::o;26326:123::-;17400:12;:10;:12::i;:::-;17390:22;;:6;;;;;;;;;;:22;;;17382:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;26436:5:::1;26421:12;:20;;;;:::i;:::-;26405:13;:36;;;;26326:123:::0;:::o;25505:120::-;17400:12;:10;:12::i;:::-;17390:22;;:6;;;;;;;;;;:22;;;17382:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;25603:14:::1;25587:13;:30;;;;25505:120:::0;:::o;27147:221::-;17400:12;:10;:12::i;:::-;17390:22;;:6;;;;;;;;;;:22;;;17382:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;27275:7:::1;27262:10;;:20;;;;;;;;;;;;;;;;;;27310:7;27293:14;;:24;;;;;;;;;;;;;;;;;;27347:13;27328:16;;:32;;;;;;;;;;;;;;;;;;27147:221:::0;;;:::o;9670:98::-;9723:7;9750:10;9743:17;;9670:98;:::o;31864:337::-;31974:1;31957:19;;:5;:19;;;31949:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;32055:1;32036:21;;:7;:21;;;32028:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;32139:6;32109:11;:18;32121:5;32109:18;;;;;;;;;;;;;;;:27;32128:7;32109:27;;;;;;;;;;;;;;;:36;;;;32177:7;32161:32;;32170:5;32161:32;;;32186:6;32161:32;;;;;;:::i;:::-;;;;;;;;31864:337;;;:::o;32209:1364::-;32313:1;32297:18;;:4;:18;;;32289:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;32390:1;32376:16;;:2;:16;;;32368:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;32460:1;32451:6;:10;32443:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;32551:1;32526:27;;:13;;;;;;;;;;;:27;;;32518:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;32598:11;32628:13;32645:18;:24;32664:4;32645:24;;;;;;;;;;;;;;;;;;;;;;;;;32644:25;:52;;;;;32674:18;:22;32693:2;32674:22;;;;;;;;;;;;;;;;;;;;;;;;;32673:23;32644:52;:71;;;;;32708:7;:5;:7::i;:::-;32700:15;;:4;:15;;;;32644:71;:88;;;;;32725:7;:5;:7::i;:::-;32719:13;;:2;:13;;;;32644:88;32628:104;;32843:7;:5;:7::i;:::-;32835:15;;:4;:15;;;;:32;;;;;32860:7;:5;:7::i;:::-;32854:13;;:2;:13;;;;32835:32;:52;;;;;32877:10;;;;;;;;;;;32871:16;;:2;:16;;;;32835:52;32832:180;;;32913:10;:16;32924:4;32913:16;;;;;;;;;;;;;;;;;;;;;;;;;32912:17;:36;;;;;32934:10;:14;32945:2;32934:14;;;;;;;;;;;;;;;;;;;;;;;;;32933:15;32912:36;32904:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;32832:180;33033:13;;;;;;;;;;;33025:21;;:4;:21;;;33022:129;;33081:13;;33071:6;:23;;33063:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;33022:129;33172:13;;;;;;;;;;;33164:21;;:4;:21;;;;:44;;;;;33195:13;;;;;;;;;;;33189:19;;:2;:19;;;33164:44;33161:199;;;33304:4;33295:13;;33323:25;:23;:25::i;:::-;33161:199;33381:13;;;;;;;;;;;33373:21;;:4;:21;;;;:44;;;;;33404:13;;;;;;;;;;;33398:19;;:2;:19;;;;33373:44;33370:119;;;33445:17;;;;;;;;;;;:32;;33473:4;33445:32;;;33465:5;33445:32;33434:43;;33370:119;33509:56;33524:4;33530:2;33534:6;33542:8;33552:6;33560:4;33509:14;:56::i;:::-;32278:1295;;32209:1364;;;:::o;6001:192::-;6087:7;6120:1;6115;:6;;6123:12;6107:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;6147:9;6163:1;6159;:5;;;;:::i;:::-;6147:17;;6184:1;6177:8;;;6001:192;;;;;:::o;29695:163::-;29736:7;29757:15;29774;29793:19;:17;:19::i;:::-;29756:56;;;;29830:20;29842:7;29830;:11;;:20;;;;:::i;:::-;29823:27;;;;29695:163;:::o;7399:132::-;7457:7;7484:39;7488:1;7491;7484:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;7477:46;;7399:132;;;;:::o;5098:181::-;5156:7;5176:9;5192:1;5188;:5;;;;:::i;:::-;5176:17;;5217:1;5212;:6;;5204:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;5270:1;5263:8;;;5098:181;;;;:::o;26082:236::-;26169:9;26164:147;26188:9;;:16;;26184:1;:20;26164:147;;;26226:12;26241:9;;26251:1;26241:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;26226:27;;26295:4;26268:18;:24;26287:4;26268:24;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;26211:100;26206:3;;;;;:::i;:::-;;;;26164:147;;;;26082:236;;;:::o;25253:244::-;25344:9;25339:151;25363:9;;:16;;25359:1;:20;25339:151;;;25401:12;25416:9;;25426:1;25416:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;25401:27;;25474:4;25443:22;:28;25466:4;25443:28;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;25386:104;25381:3;;;;;:::i;:::-;;;;25339:151;;;;25253:244;;;:::o;27768:346::-;27863:9;27858:249;27882:9;:16;27878:1;:20;27858:249;;;27920:12;27935:9;27945:1;27935:12;;;;;;;;:::i;:::-;;;;;;;;27920:27;;27965:7;27962:134;;;28012:4;27993:10;:16;28004:4;27993:16;;;;;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;27962:134;;;28064:10;:16;28075:4;28064:16;;;;;;;;;;;;;;;;28057:23;;;;;;;;;;;27962:134;27905:202;27900:3;;;;;:::i;:::-;;;;27858:249;;;;27768:346;;:::o;36270:1106::-;36430:8;36417:10;;:21;;;;;;;;;;;;;;;;;;36461:6;36449:9;;:18;;;;;;;;;;;;;;;;;;36479:15;36496:23;36521:12;36535:23;36560:12;36574:18;36596:19;36607:7;36596:10;:19::i;:::-;36478:137;;;;;;;;;;;;36644:28;36664:7;36644;:15;36652:6;36644:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;36626:7;:15;36634:6;36626:15;;;;;;;;;;;;;;;:46;;;;36704:39;36727:15;36704:7;:18;36712:9;36704:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;36683:7;:18;36691:9;36683:18;;;;;;;;;;;;;;;:60;;;;36754:26;36769:10;36754:14;:26::i;:::-;36791:23;36803:4;36809;36791:11;:23::i;:::-;36847:9;36830:44;;36839:6;36830:44;;;36858:15;36830:44;;;;;;:::i;:::-;;;;;;;;36890:17;:46;;;;;36935:1;36911:12;:21;;;:25;36890:46;36887:482;;;36957:15;;;;;;;;;;;:31;;;36989:6;36957:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36953:54;37025:15;;;;;;;;;;;:31;;;37057:9;37025:42;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37021:57;37096:15;;;;;;;;;;;:23;;;37120:16;;37096:41;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;37092:266;;;37324:9;37235:99;;37300:4;37235:99;;;37260:10;37272:6;37280:18;37306:16;;37235:99;;;;;;;;;:::i;:::-;;;;;;;;37138:212;;;37092:266;36887:482;36406:970;;;;;;36270:1106;;;;;;:::o;33581:454::-;33635:28;33666:24;33684:4;33666:9;:24::i;:::-;33635:55;;33727:1;33704:20;:24;33701:327;;;33745:13;33761:33;33773:20;33761:11;:33::i;:::-;33745:49;;33825:14;;33813:8;:26;;:47;;;;;33844:16;;;;;;;;;;;33843:17;33813:47;:72;;;;;33864:21;;;;;;;;;;;33813:72;33809:208;;;33963:38;33980:20;33963:16;:38::i;:::-;33809:208;33730:298;33701:327;33624:411;33581:454::o;29866:256::-;29916:7;29925;29945:15;29963:7;;29945:25;;29981:15;29999:7;;29981:25;;30031:20;30043:7;;30031;;:11;;:20;;;;:::i;:::-;30021:7;:30;30017:61;;;30061:7;;30070;;30053:25;;;;;;;;30017:61;30097:7;30106;30089:25;;;;;;29866:256;;;:::o;8027:278::-;8113:7;8145:1;8141;:5;8148:12;8133:28;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;8172:9;8188:1;8184;:5;;;;:::i;:::-;8172:17;;8296:1;8289:8;;;8027:278;;;;;:::o;28493:419::-;28552:7;28561;28570;28579;28588;28597;28618:23;28643:12;28657:18;28679:20;28691:7;28679:11;:20::i;:::-;28617:82;;;;;;28711:15;28728:23;28753:12;28769:50;28781:7;28790:4;28796:10;28808;:8;:10::i;:::-;28769:11;:50::i;:::-;28710:109;;;;;;28838:7;28847:15;28864:4;28870:15;28887:4;28893:10;28830:74;;;;;;;;;;;;;;;;;;28493:419;;;;;;;:::o;5562:136::-;5620:7;5647:43;5651:1;5654;5647:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;5640:50;;5562:136;;;;:::o;30130:237::-;30193:19;30216:10;:8;:10::i;:::-;30193:33;;30237:18;30258:27;30273:11;30258:10;:14;;:27;;;;:::i;:::-;30237:48;;30321:38;30348:10;30321:7;:22;30337:4;30321:22;;;;;;;;;;;;;;;;:26;;:38;;;;:::i;:::-;30296:7;:22;30312:4;30296:22;;;;;;;;;;;;;;;:63;;;;30182:185;;30130:237;:::o;28338:147::-;28416:17;28428:4;28416:7;;:11;;:17;;;;:::i;:::-;28406:7;:27;;;;28457:20;28472:4;28457:10;;:14;;:20;;;;:::i;:::-;28444:10;:33;;;;28338:147;;:::o;34260:933::-;19333:4;19314:16;;:23;;;;;;;;;;;;;;;;;;34347:38:::1;34364:20;34347:16;:38::i;:::-;34396:23;34422:21;34396:47;;34454:22;34479:52;34527:3;34479:43;34499:12;:22;;;34479:15;:19;;:43;;;;:::i;:::-;:47;;:52;;;;:::i;:::-;34454:77;;34542:21;34566:51;34613:3;34566:42;34586:12;:21;;;34566:15;:19;;:42;;;;:::i;:::-;:46;;:51;;;;:::i;:::-;34542:75;;34628:20;34651:50;34697:3;34651:41;34671:12;:20;;;34651:15;:19;;:41;;;;:::i;:::-;:45;;:50;;;;:::i;:::-;34628:73;;34712:20;34735:50;34781:3;34735:41;34755:12;:20;;;34735:15;:19;;:41;;;;:::i;:::-;:45;;:50;;;;:::i;:::-;34712:73;;34816:1;34799:14;:18;34796:99;;;34841:16;;;;;;;;;;;34833:34;;:50;34868:14;34833:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;34796:99;34924:1;34908:13;:17;34905:79;;;34941:31;34958:13;34941:16;:31::i;:::-;34905:79;35012:1;34997:12;:16;34994:89;;;35037:10;;;;;;;;;;;35029:28;;:42;35058:12;35029:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;34994:89;35111:1;35096:12;:16;35093:93;;;35136:14;;;;;;;;;;;35128:32;;:46;35161:12;35128:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;35093:93;34336:857;;;;;19379:5:::0;19360:16;;:24;;;;;;;;;;;;;;;;;;34260:933;:::o;28920:330::-;28980:7;28989;28998;29018:12;29033:24;29049:7;29033:15;:24::i;:::-;29018:39;;29068:18;29089:30;29111:7;29089:21;:30::i;:::-;29068:51;;29130:23;29156:33;29178:10;29156:17;29168:4;29156:7;:11;;:17;;;;:::i;:::-;:21;;:33;;;;:::i;:::-;29130:59;;29208:15;29225:4;29231:10;29200:42;;;;;;;;;28920:330;;;;;:::o;29258:429::-;29373:7;29382;29391;29411:15;29429:24;29441:11;29429:7;:11;;:24;;;;:::i;:::-;29411:42;;29464:12;29479:21;29488:11;29479:4;:8;;:21;;;;:::i;:::-;29464:36;;29511:18;29532:27;29547:11;29532:10;:14;;:27;;;;:::i;:::-;29511:48;;29570:23;29596:33;29618:10;29596:17;29608:4;29596:7;:11;;:17;;;;:::i;:::-;:21;;:33;;;;:::i;:::-;29570:59;;29648:7;29657:15;29674:4;29640:39;;;;;;;;;;29258:429;;;;;;;;:::o;6452:471::-;6510:7;6760:1;6755;:6;6751:47;;6785:1;6778:8;;;;6751:47;6810:9;6826:1;6822;:5;;;;:::i;:::-;6810:17;;6855:1;6850;6846;:5;;;;:::i;:::-;:10;6838:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;6914:1;6907:8;;;6452:471;;;;;:::o;35604:585::-;35730:21;35768:1;35754:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35730:40;;35799:4;35781;35786:1;35781:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;35825:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35815:4;35820:1;35815:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;;;35858:62;35875:4;35890:15;;;;;;;;;;;35908:11;35858:8;:62::i;:::-;35957:15;;;;;;;;;;;:66;;;36038:11;36064:1;36108:4;36135;36155:15;35957:224;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35659:530;35604:585;:::o;35375:221::-;35440:12;35465:15;;;;;;;;;;;35457:29;;35495:9;35457:52;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35439:70;;;35524:7;35520:69;;;35553:24;35567:9;35553:24;;;;;;:::i;:::-;;;;;;;;35520:69;35428:168;35375:221;:::o;30375:368::-;30439:7;30459:21;30483:1;30459:25;;30498:10;;;;;;;;;;;30495:186;;;30541:7;:24;;;30525:40;;30583:9;;;;;;;;;;;30580:90;;;30629:7;:25;;;30613:41;;30580:90;30495:186;30698:37;30729:5;30698:26;30710:13;30698:7;:11;;:26;;;;:::i;:::-;:30;;:37;;;;:::i;:::-;30691:44;;;30375:368;;;:::o;30751:556::-;30821:7;30841:25;30869:1;30841:29;;30884:10;;;;;;;;;;;30881:360;;;30931:7;:14;;;30911:34;;30963:9;;;;;;;;;;;30960:270;;;31013:7;:15;;;30993:35;;31047:13;31063:20;31075:7;31063:11;:20::i;:::-;31047:36;;31117:13;;31105:8;:25;31102:113;;31175:7;:20;;;31155:40;;31102:113;30974:256;30960:270;30881:360;31258:41;31293:5;31258:30;31270:17;31258:7;:11;;:30;;;;:::i;:::-;:34;;:41;;;;:::i;:::-;31251:48;;;30751:556;;;:::o;7:77:1:-;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o;442:99::-;494:6;528:5;522:12;512:22;;442:99;;;:::o;547:169::-;631:11;665:6;660:3;653:19;705:4;700:3;696:14;681:29;;547:169;;;;:::o;722:307::-;790:1;800:113;814:6;811:1;808:13;800:113;;;899:1;894:3;890:11;884:18;880:1;875:3;871:11;864:39;836:2;833:1;829:10;824:15;;800:113;;;931:6;928:1;925:13;922:101;;;1011:1;1002:6;997:3;993:16;986:27;922:101;771:258;722:307;;;:::o;1035:102::-;1076:6;1127:2;1123:7;1118:2;1111:5;1107:14;1103:28;1093:38;;1035:102;;;:::o;1143:364::-;1231:3;1259:39;1292:5;1259:39;:::i;:::-;1314:71;1378:6;1373:3;1314:71;:::i;:::-;1307:78;;1394:52;1439:6;1434:3;1427:4;1420:5;1416:16;1394:52;:::i;:::-;1471:29;1493:6;1471:29;:::i;:::-;1466:3;1462:39;1455:46;;1235:272;1143:364;;;;:::o;1513:313::-;1626:4;1664:2;1653:9;1649:18;1641:26;;1713:9;1707:4;1703:20;1699:1;1688:9;1684:17;1677:47;1741:78;1814:4;1805:6;1741:78;:::i;:::-;1733:86;;1513:313;;;;:::o;1832:75::-;1865:6;1898:2;1892:9;1882:19;;1832:75;:::o;1913:117::-;2022:1;2019;2012:12;2036:117;2145:1;2142;2135:12;2159:126;2196:7;2236:42;2229:5;2225:54;2214:65;;2159:126;;;:::o;2291:96::-;2328:7;2357:24;2375:5;2357:24;:::i;:::-;2346:35;;2291:96;;;:::o;2393:122::-;2466:24;2484:5;2466:24;:::i;:::-;2459:5;2456:35;2446:63;;2505:1;2502;2495:12;2446:63;2393:122;:::o;2521:139::-;2567:5;2605:6;2592:20;2583:29;;2621:33;2648:5;2621:33;:::i;:::-;2521:139;;;;:::o;2666:122::-;2739:24;2757:5;2739:24;:::i;:::-;2732:5;2729:35;2719:63;;2778:1;2775;2768:12;2719:63;2666:122;:::o;2794:139::-;2840:5;2878:6;2865:20;2856:29;;2894:33;2921:5;2894:33;:::i;:::-;2794:139;;;;:::o;2939:474::-;3007:6;3015;3064:2;3052:9;3043:7;3039:23;3035:32;3032:119;;;3070:79;;:::i;:::-;3032:119;3190:1;3215:53;3260:7;3251:6;3240:9;3236:22;3215:53;:::i;:::-;3205:63;;3161:117;3317:2;3343:53;3388:7;3379:6;3368:9;3364:22;3343:53;:::i;:::-;3333:63;;3288:118;2939:474;;;;;:::o;3419:90::-;3453:7;3496:5;3489:13;3482:21;3471:32;;3419:90;;;:::o;3515:109::-;3596:21;3611:5;3596:21;:::i;:::-;3591:3;3584:34;3515:109;;:::o;3630:210::-;3717:4;3755:2;3744:9;3740:18;3732:26;;3768:65;3830:1;3819:9;3815:17;3806:6;3768:65;:::i;:::-;3630:210;;;;:::o;3846:664::-;4051:4;4089:3;4078:9;4074:19;4066:27;;4103:71;4171:1;4160:9;4156:17;4147:6;4103:71;:::i;:::-;4184:72;4252:2;4241:9;4237:18;4228:6;4184:72;:::i;:::-;4266;4334:2;4323:9;4319:18;4310:6;4266:72;:::i;:::-;4348;4416:2;4405:9;4401:18;4392:6;4348:72;:::i;:::-;4430:73;4498:3;4487:9;4483:19;4474:6;4430:73;:::i;:::-;3846:664;;;;;;;;:::o;4516:329::-;4575:6;4624:2;4612:9;4603:7;4599:23;4595:32;4592:119;;;4630:79;;:::i;:::-;4592:119;4750:1;4775:53;4820:7;4811:6;4800:9;4796:22;4775:53;:::i;:::-;4765:63;;4721:117;4516:329;;;;:::o;4851:765::-;4937:6;4945;4953;4961;5010:3;4998:9;4989:7;4985:23;4981:33;4978:120;;;5017:79;;:::i;:::-;4978:120;5137:1;5162:53;5207:7;5198:6;5187:9;5183:22;5162:53;:::i;:::-;5152:63;;5108:117;5264:2;5290:53;5335:7;5326:6;5315:9;5311:22;5290:53;:::i;:::-;5280:63;;5235:118;5392:2;5418:53;5463:7;5454:6;5443:9;5439:22;5418:53;:::i;:::-;5408:63;;5363:118;5520:2;5546:53;5591:7;5582:6;5571:9;5567:22;5546:53;:::i;:::-;5536:63;;5491:118;4851:765;;;;;;;:::o;5622:60::-;5650:3;5671:5;5664:12;;5622:60;;;:::o;5688:142::-;5738:9;5771:53;5789:34;5798:24;5816:5;5798:24;:::i;:::-;5789:34;:::i;:::-;5771:53;:::i;:::-;5758:66;;5688:142;;;:::o;5836:126::-;5886:9;5919:37;5950:5;5919:37;:::i;:::-;5906:50;;5836:126;;;:::o;5968:152::-;6044:9;6077:37;6108:5;6077:37;:::i;:::-;6064:50;;5968:152;;;:::o;6126:183::-;6239:63;6296:5;6239:63;:::i;:::-;6234:3;6227:76;6126:183;;:::o;6315:274::-;6434:4;6472:2;6461:9;6457:18;6449:26;;6485:97;6579:1;6568:9;6564:17;6555:6;6485:97;:::i;:::-;6315:274;;;;:::o;6595:619::-;6672:6;6680;6688;6737:2;6725:9;6716:7;6712:23;6708:32;6705:119;;;6743:79;;:::i;:::-;6705:119;6863:1;6888:53;6933:7;6924:6;6913:9;6909:22;6888:53;:::i;:::-;6878:63;;6834:117;6990:2;7016:53;7061:7;7052:6;7041:9;7037:22;7016:53;:::i;:::-;7006:63;;6961:118;7118:2;7144:53;7189:7;7180:6;7169:9;7165:22;7144:53;:::i;:::-;7134:63;;7089:118;6595:619;;;;;:::o;7220:329::-;7279:6;7328:2;7316:9;7307:7;7303:23;7299:32;7296:119;;;7334:79;;:::i;:::-;7296:119;7454:1;7479:53;7524:7;7515:6;7504:9;7500:22;7479:53;:::i;:::-;7469:63;;7425:117;7220:329;;;;:::o;7555:86::-;7590:7;7630:4;7623:5;7619:16;7608:27;;7555:86;;;:::o;7647:112::-;7730:22;7746:5;7730:22;:::i;:::-;7725:3;7718:35;7647:112;;:::o;7765:214::-;7854:4;7892:2;7881:9;7877:18;7869:26;;7905:67;7969:1;7958:9;7954:17;7945:6;7905:67;:::i;:::-;7765:214;;;;:::o;7985:118::-;8072:24;8090:5;8072:24;:::i;:::-;8067:3;8060:37;7985:118;;:::o;8109:222::-;8202:4;8240:2;8229:9;8225:18;8217:26;;8253:71;8321:1;8310:9;8306:17;8297:6;8253:71;:::i;:::-;8109:222;;;;:::o;8337:117::-;8446:1;8443;8436:12;8460:117;8569:1;8566;8559:12;8583:117;8692:1;8689;8682:12;8723:568;8796:8;8806:6;8856:3;8849:4;8841:6;8837:17;8833:27;8823:122;;8864:79;;:::i;:::-;8823:122;8977:6;8964:20;8954:30;;9007:18;8999:6;8996:30;8993:117;;;9029:79;;:::i;:::-;8993:117;9143:4;9135:6;9131:17;9119:29;;9197:3;9189:4;9181:6;9177:17;9167:8;9163:32;9160:41;9157:128;;;9204:79;;:::i;:::-;9157:128;8723:568;;;;;:::o;9297:116::-;9367:21;9382:5;9367:21;:::i;:::-;9360:5;9357:32;9347:60;;9403:1;9400;9393:12;9347:60;9297:116;:::o;9419:133::-;9462:5;9500:6;9487:20;9478:29;;9516:30;9540:5;9516:30;:::i;:::-;9419:133;;;;:::o;9558:698::-;9650:6;9658;9666;9715:2;9703:9;9694:7;9690:23;9686:32;9683:119;;;9721:79;;:::i;:::-;9683:119;9869:1;9858:9;9854:17;9841:31;9899:18;9891:6;9888:30;9885:117;;;9921:79;;:::i;:::-;9885:117;10034:80;10106:7;10097:6;10086:9;10082:22;10034:80;:::i;:::-;10016:98;;;;9812:312;10163:2;10189:50;10231:7;10222:6;10211:9;10207:22;10189:50;:::i;:::-;10179:60;;10134:115;9558:698;;;;;:::o;10262:323::-;10318:6;10367:2;10355:9;10346:7;10342:23;10338:32;10335:119;;;10373:79;;:::i;:::-;10335:119;10493:1;10518:50;10560:7;10551:6;10540:9;10536:22;10518:50;:::i;:::-;10508:60;;10464:114;10262:323;;;;:::o;10591:553::-;10768:4;10806:3;10795:9;10791:19;10783:27;;10820:71;10888:1;10877:9;10873:17;10864:6;10820:71;:::i;:::-;10901:72;10969:2;10958:9;10954:18;10945:6;10901:72;:::i;:::-;10983;11051:2;11040:9;11036:18;11027:6;10983:72;:::i;:::-;11065;11133:2;11122:9;11118:18;11109:6;11065:72;:::i;:::-;10591:553;;;;;;;:::o;11150:180::-;11198:77;11195:1;11188:88;11295:4;11292:1;11285:15;11319:4;11316:1;11309:15;11336:281;11419:27;11441:4;11419:27;:::i;:::-;11411:6;11407:40;11549:6;11537:10;11534:22;11513:18;11501:10;11498:34;11495:62;11492:88;;;11560:18;;:::i;:::-;11492:88;11600:10;11596:2;11589:22;11379:238;11336:281;;:::o;11623:129::-;11657:6;11684:20;;:::i;:::-;11674:30;;11713:33;11741:4;11733:6;11713:33;:::i;:::-;11623:129;;;:::o;11758:311::-;11835:4;11925:18;11917:6;11914:30;11911:56;;;11947:18;;:::i;:::-;11911:56;11997:4;11989:6;11985:17;11977:25;;12057:4;12051;12047:15;12039:23;;11758:311;;;:::o;12092:710::-;12188:5;12213:81;12229:64;12286:6;12229:64;:::i;:::-;12213:81;:::i;:::-;12204:90;;12314:5;12343:6;12336:5;12329:21;12377:4;12370:5;12366:16;12359:23;;12430:4;12422:6;12418:17;12410:6;12406:30;12459:3;12451:6;12448:15;12445:122;;;12478:79;;:::i;:::-;12445:122;12593:6;12576:220;12610:6;12605:3;12602:15;12576:220;;;12685:3;12714:37;12747:3;12735:10;12714:37;:::i;:::-;12709:3;12702:50;12781:4;12776:3;12772:14;12765:21;;12652:144;12636:4;12631:3;12627:14;12620:21;;12576:220;;;12580:21;12194:608;;12092:710;;;;;:::o;12825:370::-;12896:5;12945:3;12938:4;12930:6;12926:17;12922:27;12912:122;;12953:79;;:::i;:::-;12912:122;13070:6;13057:20;13095:94;13185:3;13177:6;13170:4;13162:6;13158:17;13095:94;:::i;:::-;13086:103;;12902:293;12825:370;;;;:::o;13201:539::-;13285:6;13334:2;13322:9;13313:7;13309:23;13305:32;13302:119;;;13340:79;;:::i;:::-;13302:119;13488:1;13477:9;13473:17;13460:31;13518:18;13510:6;13507:30;13504:117;;;13540:79;;:::i;:::-;13504:117;13645:78;13715:7;13706:6;13695:9;13691:22;13645:78;:::i;:::-;13635:88;;13431:302;13201:539;;;;:::o;13746:911::-;13841:6;13849;13857;13865;13873;13922:3;13910:9;13901:7;13897:23;13893:33;13890:120;;;13929:79;;:::i;:::-;13890:120;14049:1;14074:53;14119:7;14110:6;14099:9;14095:22;14074:53;:::i;:::-;14064:63;;14020:117;14176:2;14202:53;14247:7;14238:6;14227:9;14223:22;14202:53;:::i;:::-;14192:63;;14147:118;14304:2;14330:53;14375:7;14366:6;14355:9;14351:22;14330:53;:::i;:::-;14320:63;;14275:118;14432:2;14458:53;14503:7;14494:6;14483:9;14479:22;14458:53;:::i;:::-;14448:63;;14403:118;14560:3;14587:53;14632:7;14623:6;14612:9;14608:22;14587:53;:::i;:::-;14577:63;;14531:119;13746:911;;;;;;;;:::o;14680:568::-;14753:8;14763:6;14813:3;14806:4;14798:6;14794:17;14790:27;14780:122;;14821:79;;:::i;:::-;14780:122;14934:6;14921:20;14911:30;;14964:18;14956:6;14953:30;14950:117;;;14986:79;;:::i;:::-;14950:117;15100:4;15092:6;15088:17;15076:29;;15154:3;15146:4;15138:6;15134:17;15124:8;15120:32;15117:41;15114:128;;;15161:79;;:::i;:::-;15114:128;14680:568;;;;;:::o;15254:934::-;15376:6;15384;15392;15400;15449:2;15437:9;15428:7;15424:23;15420:32;15417:119;;;15455:79;;:::i;:::-;15417:119;15603:1;15592:9;15588:17;15575:31;15633:18;15625:6;15622:30;15619:117;;;15655:79;;:::i;:::-;15619:117;15768:80;15840:7;15831:6;15820:9;15816:22;15768:80;:::i;:::-;15750:98;;;;15546:312;15925:2;15914:9;15910:18;15897:32;15956:18;15948:6;15945:30;15942:117;;;15978:79;;:::i;:::-;15942:117;16091:80;16163:7;16154:6;16143:9;16139:22;16091:80;:::i;:::-;16073:98;;;;15868:313;15254:934;;;;;;;:::o;16194:474::-;16262:6;16270;16319:2;16307:9;16298:7;16294:23;16290:32;16287:119;;;16325:79;;:::i;:::-;16287:119;16445:1;16470:53;16515:7;16506:6;16495:9;16491:22;16470:53;:::i;:::-;16460:63;;16416:117;16572:2;16598:53;16643:7;16634:6;16623:9;16619:22;16598:53;:::i;:::-;16588:63;;16543:118;16194:474;;;;;:::o;16674:619::-;16751:6;16759;16767;16816:2;16804:9;16795:7;16791:23;16787:32;16784:119;;;16822:79;;:::i;:::-;16784:119;16942:1;16967:53;17012:7;17003:6;16992:9;16988:22;16967:53;:::i;:::-;16957:63;;16913:117;17069:2;17095:53;17140:7;17131:6;17120:9;17116:22;17095:53;:::i;:::-;17085:63;;17040:118;17197:2;17223:53;17268:7;17259:6;17248:9;17244:22;17223:53;:::i;:::-;17213:63;;17168:118;16674:619;;;;;:::o;17299:180::-;17347:77;17344:1;17337:88;17444:4;17441:1;17434:15;17468:4;17465:1;17458:15;17485:320;17529:6;17566:1;17560:4;17556:12;17546:22;;17613:1;17607:4;17603:12;17634:18;17624:81;;17690:4;17682:6;17678:17;17668:27;;17624:81;17752:2;17744:6;17741:14;17721:18;17718:38;17715:84;;17771:18;;:::i;:::-;17715:84;17536:269;17485:320;;;:::o;17811:182::-;17951:34;17947:1;17939:6;17935:14;17928:58;17811:182;:::o;17999:366::-;18141:3;18162:67;18226:2;18221:3;18162:67;:::i;:::-;18155:74;;18238:93;18327:3;18238:93;:::i;:::-;18356:2;18351:3;18347:12;18340:19;;17999:366;;;:::o;18371:419::-;18537:4;18575:2;18564:9;18560:18;18552:26;;18624:9;18618:4;18614:20;18610:1;18599:9;18595:17;18588:47;18652:131;18778:4;18652:131;:::i;:::-;18644:139;;18371:419;;;:::o;18796:229::-;18936:34;18932:1;18924:6;18920:14;18913:58;19005:12;19000:2;18992:6;18988:15;18981:37;18796:229;:::o;19031:366::-;19173:3;19194:67;19258:2;19253:3;19194:67;:::i;:::-;19187:74;;19270:93;19359:3;19270:93;:::i;:::-;19388:2;19383:3;19379:12;19372:19;;19031:366;;;:::o;19403:419::-;19569:4;19607:2;19596:9;19592:18;19584:26;;19656:9;19650:4;19646:20;19642:1;19631:9;19627:17;19620:47;19684:131;19810:4;19684:131;:::i;:::-;19676:139;;19403:419;;;:::o;19828:180::-;19876:77;19873:1;19866:88;19973:4;19970:1;19963:15;19997:4;19994:1;19987:15;20014:143;20071:5;20102:6;20096:13;20087:22;;20118:33;20145:5;20118:33;:::i;:::-;20014:143;;;;:::o;20163:351::-;20233:6;20282:2;20270:9;20261:7;20257:23;20253:32;20250:119;;;20288:79;;:::i;:::-;20250:119;20408:1;20433:64;20489:7;20480:6;20469:9;20465:22;20433:64;:::i;:::-;20423:74;;20379:128;20163:351;;;;:::o;20520:114::-;20587:6;20621:5;20615:12;20605:22;;20520:114;;;:::o;20640:184::-;20739:11;20773:6;20768:3;20761:19;20813:4;20808:3;20804:14;20789:29;;20640:184;;;;:::o;20830:132::-;20897:4;20920:3;20912:11;;20950:4;20945:3;20941:14;20933:22;;20830:132;;;:::o;20968:108::-;21045:24;21063:5;21045:24;:::i;:::-;21040:3;21033:37;20968:108;;:::o;21082:179::-;21151:10;21172:46;21214:3;21206:6;21172:46;:::i;:::-;21250:4;21245:3;21241:14;21227:28;;21082:179;;;;:::o;21267:113::-;21337:4;21369;21364:3;21360:14;21352:22;;21267:113;;;:::o;21416:732::-;21535:3;21564:54;21612:5;21564:54;:::i;:::-;21634:86;21713:6;21708:3;21634:86;:::i;:::-;21627:93;;21744:56;21794:5;21744:56;:::i;:::-;21823:7;21854:1;21839:284;21864:6;21861:1;21858:13;21839:284;;;21940:6;21934:13;21967:63;22026:3;22011:13;21967:63;:::i;:::-;21960:70;;22053:60;22106:6;22053:60;:::i;:::-;22043:70;;21899:224;21886:1;21883;21879:9;21874:14;;21839:284;;;21843:14;22139:3;22132:10;;21540:608;;;21416:732;;;;:::o;22154:483::-;22325:4;22363:2;22352:9;22348:18;22340:26;;22376:71;22444:1;22433:9;22429:17;22420:6;22376:71;:::i;:::-;22494:9;22488:4;22484:20;22479:2;22468:9;22464:18;22457:48;22522:108;22625:4;22616:6;22522:108;:::i;:::-;22514:116;;22154:483;;;;;:::o;22643:311::-;22720:4;22810:18;22802:6;22799:30;22796:56;;;22832:18;;:::i;:::-;22796:56;22882:4;22874:6;22870:17;22862:25;;22942:4;22936;22932:15;22924:23;;22643:311;;;:::o;22960:143::-;23017:5;23048:6;23042:13;23033:22;;23064:33;23091:5;23064:33;:::i;:::-;22960:143;;;;:::o;23126:732::-;23233:5;23258:81;23274:64;23331:6;23274:64;:::i;:::-;23258:81;:::i;:::-;23249:90;;23359:5;23388:6;23381:5;23374:21;23422:4;23415:5;23411:16;23404:23;;23475:4;23467:6;23463:17;23455:6;23451:30;23504:3;23496:6;23493:15;23490:122;;;23523:79;;:::i;:::-;23490:122;23638:6;23621:231;23655:6;23650:3;23647:15;23621:231;;;23730:3;23759:48;23803:3;23791:10;23759:48;:::i;:::-;23754:3;23747:61;23837:4;23832:3;23828:14;23821:21;;23697:155;23681:4;23676:3;23672:14;23665:21;;23621:231;;;23625:21;23239:619;;23126:732;;;;;:::o;23881:385::-;23963:5;24012:3;24005:4;23997:6;23993:17;23989:27;23979:122;;24020:79;;:::i;:::-;23979:122;24130:6;24124:13;24155:105;24256:3;24248:6;24241:4;24233:6;24229:17;24155:105;:::i;:::-;24146:114;;23969:297;23881:385;;;;:::o;24272:554::-;24367:6;24416:2;24404:9;24395:7;24391:23;24387:32;24384:119;;;24422:79;;:::i;:::-;24384:119;24563:1;24552:9;24548:17;24542:24;24593:18;24585:6;24582:30;24579:117;;;24615:79;;:::i;:::-;24579:117;24720:89;24801:7;24792:6;24781:9;24777:22;24720:89;:::i;:::-;24710:99;;24513:306;24272:554;;;;:::o;24832:231::-;24972:34;24968:1;24960:6;24956:14;24949:58;25041:14;25036:2;25028:6;25024:15;25017:39;24832:231;:::o;25069:366::-;25211:3;25232:67;25296:2;25291:3;25232:67;:::i;:::-;25225:74;;25308:93;25397:3;25308:93;:::i;:::-;25426:2;25421:3;25417:12;25410:19;;25069:366;;;:::o;25441:419::-;25607:4;25645:2;25634:9;25630:18;25622:26;;25694:9;25688:4;25684:20;25680:1;25669:9;25665:17;25658:47;25722:131;25848:4;25722:131;:::i;:::-;25714:139;;25441:419;;;:::o;25866:221::-;26006:34;26002:1;25994:6;25990:14;25983:58;26075:4;26070:2;26062:6;26058:15;26051:29;25866:221;:::o;26093:366::-;26235:3;26256:67;26320:2;26315:3;26256:67;:::i;:::-;26249:74;;26332:93;26421:3;26332:93;:::i;:::-;26450:2;26445:3;26441:12;26434:19;;26093:366;;;:::o;26465:419::-;26631:4;26669:2;26658:9;26654:18;26646:26;;26718:9;26712:4;26708:20;26704:1;26693:9;26689:17;26682:47;26746:131;26872:4;26746:131;:::i;:::-;26738:139;;26465:419;;;:::o;26890:332::-;27011:4;27049:2;27038:9;27034:18;27026:26;;27062:71;27130:1;27119:9;27115:17;27106:6;27062:71;:::i;:::-;27143:72;27211:2;27200:9;27196:18;27187:6;27143:72;:::i;:::-;26890:332;;;;;:::o;27228:232::-;27368:34;27364:1;27356:6;27352:14;27345:58;27437:15;27432:2;27424:6;27420:15;27413:40;27228:232;:::o;27466:366::-;27608:3;27629:67;27693:2;27688:3;27629:67;:::i;:::-;27622:74;;27705:93;27794:3;27705:93;:::i;:::-;27823:2;27818:3;27814:12;27807:19;;27466:366;;;:::o;27838:419::-;28004:4;28042:2;28031:9;28027:18;28019:26;;28091:9;28085:4;28081:20;28077:1;28066:9;28062:17;28055:47;28119:131;28245:4;28119:131;:::i;:::-;28111:139;;27838:419;;;:::o;28263:229::-;28403:34;28399:1;28391:6;28387:14;28380:58;28472:12;28467:2;28459:6;28455:15;28448:37;28263:229;:::o;28498:366::-;28640:3;28661:67;28725:2;28720:3;28661:67;:::i;:::-;28654:74;;28737:93;28826:3;28737:93;:::i;:::-;28855:2;28850:3;28846:12;28839:19;;28498:366;;;:::o;28870:419::-;29036:4;29074:2;29063:9;29059:18;29051:26;;29123:9;29117:4;29113:20;29109:1;29098:9;29094:17;29087:47;29151:131;29277:4;29151:131;:::i;:::-;29143:139;;28870:419;;;:::o;29295:180::-;29343:77;29340:1;29333:88;29440:4;29437:1;29430:15;29464:4;29461:1;29454:15;29481:348;29521:7;29544:20;29562:1;29544:20;:::i;:::-;29539:25;;29578:20;29596:1;29578:20;:::i;:::-;29573:25;;29766:1;29698:66;29694:74;29691:1;29688:81;29683:1;29676:9;29669:17;29665:105;29662:131;;;29773:18;;:::i;:::-;29662:131;29821:1;29818;29814:9;29803:20;;29481:348;;;;:::o;29835:305::-;29875:3;29894:20;29912:1;29894:20;:::i;:::-;29889:25;;29928:20;29946:1;29928:20;:::i;:::-;29923:25;;30082:1;30014:66;30010:74;30007:1;30004:81;30001:107;;;30088:18;;:::i;:::-;30001:107;30132:1;30129;30125:9;30118:16;;29835:305;;;;:::o;30146:225::-;30286:34;30282:1;30274:6;30270:14;30263:58;30355:8;30350:2;30342:6;30338:15;30331:33;30146:225;:::o;30377:366::-;30519:3;30540:67;30604:2;30599:3;30540:67;:::i;:::-;30533:74;;30616:93;30705:3;30616:93;:::i;:::-;30734:2;30729:3;30725:12;30718:19;;30377:366;;;:::o;30749:419::-;30915:4;30953:2;30942:9;30938:18;30930:26;;31002:9;30996:4;30992:20;30988:1;30977:9;30973:17;30966:47;31030:131;31156:4;31030:131;:::i;:::-;31022:139;;30749:419;;;:::o;31174:223::-;31314:34;31310:1;31302:6;31298:14;31291:58;31383:6;31378:2;31370:6;31366:15;31359:31;31174:223;:::o;31403:366::-;31545:3;31566:67;31630:2;31625:3;31566:67;:::i;:::-;31559:74;;31642:93;31731:3;31642:93;:::i;:::-;31760:2;31755:3;31751:12;31744:19;;31403:366;;;:::o;31775:419::-;31941:4;31979:2;31968:9;31964:18;31956:26;;32028:9;32022:4;32018:20;32014:1;32003:9;31999:17;31992:47;32056:131;32182:4;32056:131;:::i;:::-;32048:139;;31775:419;;;:::o;32200:221::-;32340:34;32336:1;32328:6;32324:14;32317:58;32409:4;32404:2;32396:6;32392:15;32385:29;32200:221;:::o;32427:366::-;32569:3;32590:67;32654:2;32649:3;32590:67;:::i;:::-;32583:74;;32666:93;32755:3;32666:93;:::i;:::-;32784:2;32779:3;32775:12;32768:19;;32427:366;;;:::o;32799:419::-;32965:4;33003:2;32992:9;32988:18;32980:26;;33052:9;33046:4;33042:20;33038:1;33027:9;33023:17;33016:47;33080:131;33206:4;33080:131;:::i;:::-;33072:139;;32799:419;;;:::o;33224:224::-;33364:34;33360:1;33352:6;33348:14;33341:58;33433:7;33428:2;33420:6;33416:15;33409:32;33224:224;:::o;33454:366::-;33596:3;33617:67;33681:2;33676:3;33617:67;:::i;:::-;33610:74;;33693:93;33782:3;33693:93;:::i;:::-;33811:2;33806:3;33802:12;33795:19;;33454:366;;;:::o;33826:419::-;33992:4;34030:2;34019:9;34015:18;34007:26;;34079:9;34073:4;34069:20;34065:1;34054:9;34050:17;34043:47;34107:131;34233:4;34107:131;:::i;:::-;34099:139;;33826:419;;;:::o;34251:222::-;34391:34;34387:1;34379:6;34375:14;34368:58;34460:5;34455:2;34447:6;34443:15;34436:30;34251:222;:::o;34479:366::-;34621:3;34642:67;34706:2;34701:3;34642:67;:::i;:::-;34635:74;;34718:93;34807:3;34718:93;:::i;:::-;34836:2;34831:3;34827:12;34820:19;;34479:366;;;:::o;34851:419::-;35017:4;35055:2;35044:9;35040:18;35032:26;;35104:9;35098:4;35094:20;35090:1;35079:9;35075:17;35068:47;35132:131;35258:4;35132:131;:::i;:::-;35124:139;;34851:419;;;:::o;35276:228::-;35416:34;35412:1;35404:6;35400:14;35393:58;35485:11;35480:2;35472:6;35468:15;35461:36;35276:228;:::o;35510:366::-;35652:3;35673:67;35737:2;35732:3;35673:67;:::i;:::-;35666:74;;35749:93;35838:3;35749:93;:::i;:::-;35867:2;35862:3;35858:12;35851:19;;35510:366;;;:::o;35882:419::-;36048:4;36086:2;36075:9;36071:18;36063:26;;36135:9;36129:4;36125:20;36121:1;36110:9;36106:17;36099:47;36163:131;36289:4;36163:131;:::i;:::-;36155:139;;35882:419;;;:::o;36307:180::-;36447:32;36443:1;36435:6;36431:14;36424:56;36307:180;:::o;36493:366::-;36635:3;36656:67;36720:2;36715:3;36656:67;:::i;:::-;36649:74;;36732:93;36821:3;36732:93;:::i;:::-;36850:2;36845:3;36841:12;36834:19;;36493:366;;;:::o;36865:419::-;37031:4;37069:2;37058:9;37054:18;37046:26;;37118:9;37112:4;37108:20;37104:1;37093:9;37089:17;37082:47;37146:131;37272:4;37146:131;:::i;:::-;37138:139;;36865:419;;;:::o;37290:234::-;37430:34;37426:1;37418:6;37414:14;37407:58;37499:17;37494:2;37486:6;37482:15;37475:42;37290:234;:::o;37530:366::-;37672:3;37693:67;37757:2;37752:3;37693:67;:::i;:::-;37686:74;;37769:93;37858:3;37769:93;:::i;:::-;37887:2;37882:3;37878:12;37871:19;;37530:366;;;:::o;37902:419::-;38068:4;38106:2;38095:9;38091:18;38083:26;;38155:9;38149:4;38145:20;38141:1;38130:9;38126:17;38119:47;38183:131;38309:4;38183:131;:::i;:::-;38175:139;;37902:419;;;:::o;38327:227::-;38467:34;38463:1;38455:6;38451:14;38444:58;38536:10;38531:2;38523:6;38519:15;38512:35;38327:227;:::o;38560:366::-;38702:3;38723:67;38787:2;38782:3;38723:67;:::i;:::-;38716:74;;38799:93;38888:3;38799:93;:::i;:::-;38917:2;38912:3;38908:12;38901:19;;38560:366;;;:::o;38932:419::-;39098:4;39136:2;39125:9;39121:18;39113:26;;39185:9;39179:4;39175:20;39171:1;39160:9;39156:17;39149:47;39213:131;39339:4;39213:131;:::i;:::-;39205:139;;38932:419;;;:::o;39357:191::-;39397:4;39417:20;39435:1;39417:20;:::i;:::-;39412:25;;39451:20;39469:1;39451:20;:::i;:::-;39446:25;;39490:1;39487;39484:8;39481:34;;;39495:18;;:::i;:::-;39481:34;39540:1;39537;39533:9;39525:17;;39357:191;;;;:::o;39554:177::-;39694:29;39690:1;39682:6;39678:14;39671:53;39554:177;:::o;39737:366::-;39879:3;39900:67;39964:2;39959:3;39900:67;:::i;:::-;39893:74;;39976:93;40065:3;39976:93;:::i;:::-;40094:2;40089:3;40085:12;40078:19;;39737:366;;;:::o;40109:419::-;40275:4;40313:2;40302:9;40298:18;40290:26;;40362:9;40356:4;40352:20;40348:1;40337:9;40333:17;40326:47;40390:131;40516:4;40390:131;:::i;:::-;40382:139;;40109:419;;;:::o;40534:233::-;40573:3;40596:24;40614:5;40596:24;:::i;:::-;40587:33;;40642:66;40635:5;40632:77;40629:103;;40712:18;;:::i;:::-;40629:103;40759:1;40752:5;40748:13;40741:20;;40534:233;;;:::o;40773:663::-;40861:6;40869;40877;40926:2;40914:9;40905:7;40901:23;40897:32;40894:119;;;40932:79;;:::i;:::-;40894:119;41052:1;41077:64;41133:7;41124:6;41113:9;41109:22;41077:64;:::i;:::-;41067:74;;41023:128;41190:2;41216:64;41272:7;41263:6;41252:9;41248:22;41216:64;:::i;:::-;41206:74;;41161:129;41329:2;41355:64;41411:7;41402:6;41391:9;41387:22;41355:64;:::i;:::-;41345:74;;41300:129;40773:663;;;;;:::o;41442:180::-;41490:77;41487:1;41480:88;41587:4;41584:1;41577:15;41611:4;41608:1;41601:15;41628:185;41668:1;41685:20;41703:1;41685:20;:::i;:::-;41680:25;;41719:20;41737:1;41719:20;:::i;:::-;41714:25;;41758:1;41748:35;;41763:18;;:::i;:::-;41748:35;41805:1;41802;41798:9;41793:14;;41628:185;;;;:::o;41819:220::-;41959:34;41955:1;41947:6;41943:14;41936:58;42028:3;42023:2;42015:6;42011:15;42004:28;41819:220;:::o;42045:366::-;42187:3;42208:67;42272:2;42267:3;42208:67;:::i;:::-;42201:74;;42284:93;42373:3;42284:93;:::i;:::-;42402:2;42397:3;42393:12;42386:19;;42045:366;;;:::o;42417:419::-;42583:4;42621:2;42610:9;42606:18;42598:26;;42670:9;42664:4;42660:20;42656:1;42645:9;42641:17;42634:47;42698:131;42824:4;42698:131;:::i;:::-;42690:139;;42417:419;;;:::o;42842:85::-;42887:7;42916:5;42905:16;;42842:85;;;:::o;42933:158::-;42991:9;43024:61;43042:42;43051:32;43077:5;43051:32;:::i;:::-;43042:42;:::i;:::-;43024:61;:::i;:::-;43011:74;;42933:158;;;:::o;43097:147::-;43192:45;43231:5;43192:45;:::i;:::-;43187:3;43180:58;43097:147;;:::o;43250:831::-;43513:4;43551:3;43540:9;43536:19;43528:27;;43565:71;43633:1;43622:9;43618:17;43609:6;43565:71;:::i;:::-;43646:80;43722:2;43711:9;43707:18;43698:6;43646:80;:::i;:::-;43773:9;43767:4;43763:20;43758:2;43747:9;43743:18;43736:48;43801:108;43904:4;43895:6;43801:108;:::i;:::-;43793:116;;43919:72;43987:2;43976:9;43972:18;43963:6;43919:72;:::i;:::-;44001:73;44069:3;44058:9;44054:19;44045:6;44001:73;:::i;:::-;43250:831;;;;;;;;:::o;44087:147::-;44188:11;44225:3;44210:18;;44087:147;;;;:::o;44240:114::-;;:::o;44360:398::-;44519:3;44540:83;44621:1;44616:3;44540:83;:::i;:::-;44533:90;;44632:93;44721:3;44632:93;:::i;:::-;44750:1;44745:3;44741:11;44734:18;;44360:398;;;:::o;44764:379::-;44948:3;44970:147;45113:3;44970:147;:::i;:::-;44963:154;;45134:3;45127:10;;44764:379;;;:::o

Swarm Source

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