ETH Price: $3,375.33 (+3.07%)
Gas: 2 Gwei

Token

MUSKITO Token (MUSKITO)
 

Overview

Max Total Supply

1,000,000,000 MUSKITO

Holders

90

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
1,900,196.849744154721726667 MUSKITO

Value
$0.00
0x055062dfca63c09b8dcbe019abe3c028811c1ed4
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
MUSKITO

Compiler Version
v0.8.3+commit.8d00100c

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-04-24
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

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) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

    /**
     * @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");
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        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);
            }
        }
    }
}

library EnumerableSet {

    struct Set {

        bytes32[] _values;
        mapping (bytes32 => uint256) _indexes;
    }

    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) { // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            bytes32 lastvalue = set._values[lastIndex];

            // Move the last value to the index where the value to delete is
            set._values[toDeleteIndex] = lastvalue;
            // Update the index for the moved value
            set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        require(set._values.length > index, "EnumerableSet: index out of bounds");
        return set._values[index];
    }

    struct Bytes32Set {
        Set _inner;
    }

    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    struct AddressSet {
        Set _inner;
    }

    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    struct UintSet {
        Set _inner;
    }

    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }
}

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

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

contract Owned is Context {
    address private _owner;
    address private _operator;
    address private _pendingOwner;

    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 ownerOnly {
        require(_owner == _msgSender() || _msgSender() == _operator, "not allowed");
        _;
    }


    modifier pendingOnly {
        require (_pendingOwner == msg.sender, "cannot claim");
        _;
    }

    function pendingOwner() public view returns (address) {
        return _pendingOwner;
    }

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

    function transferOwnership(address newOwner) public ownerOnly {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _pendingOwner = newOwner;
    }

    function cancelTransfer() public ownerOnly {
        require(_pendingOwner != address(0), "no pending owner");
        _pendingOwner = address(0);
    }

    function claimOwnership() public pendingOnly {
        _pendingOwner = address(0);
        emit OwnershipTransferred(_owner, _msgSender());
        _owner = _msgSender();
    }


}

interface IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);
    function migrator() external view returns (address);

    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

    function createPair(address tokenA, address tokenB) external returns (address pair);

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
    function setMigrator(address) external;
}

interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

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

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

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;

    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

interface ITValues {
    struct TxValue {
        uint256 amount;
        uint256 transferAmount;
        uint256 fee;
        uint256 buyFee;
        uint256 sellFee;
        uint256 buyBonus;
        uint256 donationFee;
        uint256 burnFee;
        uint256 farmFee;
        uint256 lpFee;
        uint256 nftFee;
    }
    enum TxType { FromExcluded, ToExcluded, BothExcluded, Standard }
    enum TState { Buy, Sell, Normal }
}

interface IStates {

    struct Balances {
        uint256 tokenSupply;
        uint256 networkSupply;
        uint256 targetSupply;
        uint256 pairSupply;
        uint256 lpSupply;
        uint256 fees;
    }

    struct Divisors {
        uint256 buy;
        uint256 sell;
        uint256 burn;
        uint256 tx;
        uint256 donate;
    }

    struct Account {
        bool feeless;
        bool transferPair;
        bool excluded;
        uint256 tTotal;
        uint256 nTotal;
    }
}

contract MUSKITO is IERC20, Owned {

    using Address for address;

    string private _name;
    string private _symbol;
    uint8 private _decimals;

    IStates.Balances balances;
    IStates.Divisors divisors;
    ITValues.TState lastTState;

    EnumerableSet.AddressSet excludedAccounts;
    EnumerableSet.AddressSet blackListedBots;


    address private _op;
    address private _donations;
    address private _router;
    address public  _pool;
    address private _pair;

    uint256 private _lastFee;
    uint256 public buys;
    uint256 public burns;


    bool private _paused;
    bool private _lpAdded;

    mapping(address => IStates.Account) accounts;
    mapping(address => mapping(address => uint256)) allowances;

    constructor() {

        _name = "MUSKITO Token";
        _symbol = "MUSKITO";
        _decimals = 18;

        balances.tokenSupply = 1_000_000_000 ether;
        balances.networkSupply = (~uint256(0) - (~uint256(0) % balances.tokenSupply));

        divisors.tx = 50;    // 2%
        divisors.sell = 100;  // 1%
        divisors.buy = 100;   // 1%
        divisors.burn = 100; // 1%
        divisors.donate = 100;   // 1%

        _router = address(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        _op = address(0x9C5142ca89EAC453C1Eb9EF8d5E854ca01743F6e);
        _donations = address(0x9C5142ca89EAC453C1Eb9EF8d5E854ca01743F6e);
        _pair = IUniswapV2Router02(_router).WETH();
        _pool = IUniswapV2Factory(IUniswapV2Router02(_router).factory()).createPair(address(this), _pair);
        _paused = true;

        EnumerableSet.add(blackListedBots, address(0xE031b36b53E53a292a20c5F08fd1658CDdf74fce));
        EnumerableSet.add(blackListedBots, address(0x000000000000084e91743124a982076C59f10084));
        EnumerableSet.add(blackListedBots, address(0x000000917de6037d52b1F0a306eeCD208405f7cd));
        EnumerableSet.add(blackListedBots, address(0x1d6E8BAC6EA3730825bde4B005ed7B2B39A2932d));
        EnumerableSet.add(blackListedBots, address(0x7100e690554B1c2FD01E8648db88bE235C1E6514));
        EnumerableSet.add(blackListedBots, address(0x72b30cDc1583224381132D379A052A6B10725415));
        EnumerableSet.add(blackListedBots, address(0x9282dc5c422FA91Ff2F6fF3a0b45B7BF97CF78E7));
        EnumerableSet.add(blackListedBots, address(0x9eDD647D7d6Eceae6bB61D7785Ef66c5055A9bEE));
        EnumerableSet.add(blackListedBots, address(0xfad95B6089c53A0D1d861eabFaadd8901b0F8533));

        accounts[_msgSender()].feeless = true;
        accounts[_donations].feeless = true;
        accounts[_pool].transferPair = true;
        accounts[_msgSender()].nTotal = balances.networkSupply / 2;
        accounts[address(0)].nTotal = balances.networkSupply / 2;

        _approve(_msgSender(), _router, balances.tokenSupply);

    }

    //------ ERC20 Functions -----

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

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

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

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

    // This is important to show the rebalanced values.
    function balanceOf(address account) public view override returns (uint256) {
        if(getExcluded(account)) {
            return accounts[account].tTotal;
        }
        return accounts[account].nTotal / ratio();
    }

    function approve(address spender, uint256 amount) public override returns (bool) {
        _approve(_msgSender(), spender, amount);
        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 increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, allowances[_msgSender()][spender] + addedValue);
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, allowances[_msgSender()][spender] - (subtractedValue));
        return true;
    }

    function totalSupply() public view override returns (uint256) {
        return balances.tokenSupply;
    }

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

    function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
        _rTransfer(sender, recipient, amount);
        _approve(sender, _msgSender(), allowances[sender][_msgSender()] - amount);
        return true;
    }


    function whaleCheck(uint256 amount, address account) internal view {
        if(_paused) {
            require(amount <= (balances.tokenSupply / 2) / 100, "whale limit on");
            require(balanceOf(account) <= (balances.tokenSupply / 2) / 100, "already bought 500, wait till check off");
        }
    }

    // one way function, once called it will always be false.
    function enableTrading() external ownerOnly {
        _paused = false;
    }

    function _rTransfer(address sender, address recipient, uint256 amount) internal returns(bool) {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
        require(!EnumerableSet.contains(blackListedBots, recipient), "fuck you bot");
        require(!EnumerableSet.contains(blackListedBots, msg.sender), "fuck you bot");
        if(sender == _pool) {
            whaleCheck(amount, recipient);
        }
        if(_paused){
            require(sender == owner() || recipient != _pool, "still paused");
        }
        uint256 rate = ratio();
        uint256 lpAmount = getCurrentLPBal();
        bool isFeeless = isFeelessTx(sender, recipient);
        (ITValues.TxValue memory t, ITValues.TState ts, ITValues.TxType txType) = calcT(sender, recipient, amount, isFeeless, lpAmount);
        balances.lpSupply = lpAmount;
        if(!isFeeless) {
            accounts[_donations].nTotal += (t.donationFee * rate);
            accounts[address(0)].nTotal += (t.burnFee) * rate;
            accounts[address(0)].tTotal += (t.burnFee);
            if(ts == ITValues.TState.Sell) {
                accounts[_donations].nTotal += (_lastFee) * rate;
                accounts[_donations].tTotal += (_lastFee);
                _lastFee = 0;
            } else if(ts == ITValues.TState.Buy) {
                accounts[recipient].nTotal += _lastFee * rate;
                buys++;
                _lastFee = 0;
            } else { // liq transfers
                accounts[address(0)].nTotal += (_lastFee * rate);
                _lastFee = 0;
            }
            _lastFee = t.sellFee + t.buyFee;
            balances.fees += t.fee;
            balances.networkSupply -= t.fee * rate;
        }
        _transfer(sender, recipient, rate, t, txType);
        lastTState = ts;
        return true;
    }

    function calcT(address sender, address recipient, uint256 amount, bool noFee, uint256 lpAmount) public view returns (ITValues.TxValue memory t, ITValues.TState ts, ITValues.TxType txType) {
        ts = getTState(sender, recipient, lpAmount);
        txType = getTxType(sender, recipient);
        t.amount = amount;
        if(!noFee) {
            if(!_paused) {
                t.fee = amount / divisors.tx;
                t.donationFee = amount / divisors.donate;
                t.burnFee = amount / divisors.burn;
                if(ts == ITValues.TState.Sell) {
                    t.sellFee = amount / divisors.sell;
                }
                if(ts == ITValues.TState.Buy) {
                    t.buyFee = amount / divisors.buy;
                }
            }
        }
        t.transferAmount = t.amount - t.fee - t.sellFee - t.buyFee - t.donationFee - t.burnFee;
        return (t, ts, txType);
    }

    function _transfer(address sender, address recipient, uint256 rate, ITValues.TxValue memory t, ITValues.TxType txType) internal {
        if (txType == ITValues.TxType.ToExcluded) {
            accounts[sender].nTotal         -= t.amount * rate;
            accounts[recipient].tTotal      += (t.transferAmount);
            accounts[recipient].nTotal      += t.transferAmount * rate;
        } else if (txType == ITValues.TxType.FromExcluded) {
            accounts[sender].tTotal         -= t.amount;
            accounts[sender].nTotal         -= t.amount * rate;
            accounts[recipient].nTotal      += t.transferAmount * rate;
        } else if (txType == ITValues.TxType.BothExcluded) {
            accounts[sender].tTotal         -= t.amount;
            accounts[sender].nTotal         -= (t.amount * rate);
            accounts[recipient].tTotal      += t.transferAmount;
            accounts[recipient].nTotal      += (t.transferAmount * rate);
        } else {
            accounts[sender].nTotal         -= (t.amount * rate);
            accounts[recipient].nTotal      += (t.transferAmount * rate);
        }
        emit Transfer(sender, recipient, t.transferAmount);
    }

    function include(address account) external ownerOnly {
        require(accounts[account].excluded, "Account is already excluded");
        require(accounts[account].nTotal > 3 ether * ratio(), "not enough to include yourself");
        accounts[account].tTotal = 0;
        EnumerableSet.remove(excludedAccounts, account);
    }

    function exclude(address account) external ownerOnly {
        require(!accounts[account].excluded, "Account is already excluded");
        accounts[account].excluded = true;
        if(accounts[account].nTotal > 0) {
            accounts[account].tTotal = accounts[account].nTotal / ratio();
        }
        accounts[account].excluded = true;
        EnumerableSet.add(excludedAccounts, account);
    }

    function donate(uint256 amount) external {
        address sender = _msgSender();
        uint256 rate = ratio();
        require(!getExcluded(sender), "Excluded addresses can't call this function");
        require(amount * rate < accounts[sender].nTotal, "too much");
        accounts[sender].nTotal -= (amount * rate);
        accounts[_donations].nTotal -= (amount * rate);
        emit Transfer(msg.sender, _donations, amount);
    }

    function burn() external {
        require(buys >= 5000 * burns, "can't call yet");
        uint256 r = accounts[_pool].nTotal;
        uint256 rTarget = (r / 5); // 20%
        uint256 t = rTarget / ratio();
        accounts[_pool].nTotal -= rTarget;
        accounts[address(0)].nTotal += rTarget;
        emit Transfer(_pool, address(0), t);
        burns++;
        syncPool();
    }

    function burned() public view returns(uint256) {
        return balanceOf(address(0));
    }

    function isFeelessTx(address sender, address recipient) public view returns(bool) {
        return accounts[sender].feeless || accounts[recipient].feeless;
    }

    function getAccount(address account) external view returns(IStates.Account memory) {
        return accounts[account];
    }

    function getDivisors() external view returns(IStates.Divisors memory) {
        return divisors;
    }

    function getBalances() external view returns(IStates.Balances memory) {
        return balances;
    }

    function getExcluded(address account) public view returns(bool) {
        return accounts[account].excluded;
    }

    function getCurrentLPBal() public view returns(uint256) {
        return IERC20(_pool).totalSupply();
    }

    function getTState(address sender, address recipient, uint256 lpAmount) public view returns(ITValues.TState) {
        ITValues.TState t;
        if(sender == _router) {
            t = ITValues.TState.Normal;
        } else if(accounts[sender].transferPair) {
            if(balances.lpSupply != lpAmount) { // withdraw vs buy
                t = ITValues.TState.Normal;
            }
            t = ITValues.TState.Buy;
        } else if(accounts[recipient].transferPair) {
            t = ITValues.TState.Sell;
        } else {
            t = ITValues.TState.Normal;
        }
        return t;
    }

    function getCirculatingSupply() public view returns(uint256, uint256) {
        uint256 rSupply = balances.networkSupply;
        uint256 tSupply = balances.tokenSupply;
        for (uint256 i = 0; i < EnumerableSet.length(excludedAccounts); i++) {
            address account = EnumerableSet.at(excludedAccounts, i);
            uint256 rBalance = accounts[account].nTotal;
            uint256 tBalance = accounts[account].tTotal;
            if (rBalance > rSupply || tBalance > tSupply) return (balances.networkSupply, balances.tokenSupply);
            rSupply -= rBalance;
            tSupply -= tBalance;
        }
        if (rSupply < balances.networkSupply / balances.tokenSupply) return (balances.networkSupply, balances.tokenSupply);
        return (rSupply, tSupply);
    }

    function getTxType(address sender, address recipient) public view returns(ITValues.TxType t) {
        bool isSenderExcluded = accounts[sender].excluded;
        bool isRecipientExcluded = accounts[recipient].excluded;
        if (isSenderExcluded && !isRecipientExcluded) {
            t = ITValues.TxType.FromExcluded;
        } else if (!isSenderExcluded && isRecipientExcluded) {
            t = ITValues.TxType.ToExcluded;
        } else if (!isSenderExcluded && !isRecipientExcluded) {
            t = ITValues.TxType.Standard;
        } else if (isSenderExcluded && isRecipientExcluded) {
            t = ITValues.TxType.BothExcluded;
        } else {
            t = ITValues.TxType.Standard;
        }
        return t;
    }

    function ratio() public view returns(uint256) {
        (uint256 n, uint256 t) = getCirculatingSupply();
        return n / t;
    }

    function syncPool() public  {
        IUniswapV2Pair(_pool).sync();
    }

}

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":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":"_pool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":[],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burns","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buys","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"noFee","type":"bool"},{"internalType":"uint256","name":"lpAmount","type":"uint256"}],"name":"calcT","outputs":[{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"transferAmount","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"uint256","name":"buyFee","type":"uint256"},{"internalType":"uint256","name":"sellFee","type":"uint256"},{"internalType":"uint256","name":"buyBonus","type":"uint256"},{"internalType":"uint256","name":"donationFee","type":"uint256"},{"internalType":"uint256","name":"burnFee","type":"uint256"},{"internalType":"uint256","name":"farmFee","type":"uint256"},{"internalType":"uint256","name":"lpFee","type":"uint256"},{"internalType":"uint256","name":"nftFee","type":"uint256"}],"internalType":"struct ITValues.TxValue","name":"t","type":"tuple"},{"internalType":"enum ITValues.TState","name":"ts","type":"uint8"},{"internalType":"enum ITValues.TxType","name":"txType","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cancelTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"donate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"exclude","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAccount","outputs":[{"components":[{"internalType":"bool","name":"feeless","type":"bool"},{"internalType":"bool","name":"transferPair","type":"bool"},{"internalType":"bool","name":"excluded","type":"bool"},{"internalType":"uint256","name":"tTotal","type":"uint256"},{"internalType":"uint256","name":"nTotal","type":"uint256"}],"internalType":"struct IStates.Account","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBalances","outputs":[{"components":[{"internalType":"uint256","name":"tokenSupply","type":"uint256"},{"internalType":"uint256","name":"networkSupply","type":"uint256"},{"internalType":"uint256","name":"targetSupply","type":"uint256"},{"internalType":"uint256","name":"pairSupply","type":"uint256"},{"internalType":"uint256","name":"lpSupply","type":"uint256"},{"internalType":"uint256","name":"fees","type":"uint256"}],"internalType":"struct IStates.Balances","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCirculatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentLPBal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDivisors","outputs":[{"components":[{"internalType":"uint256","name":"buy","type":"uint256"},{"internalType":"uint256","name":"sell","type":"uint256"},{"internalType":"uint256","name":"burn","type":"uint256"},{"internalType":"uint256","name":"tx","type":"uint256"},{"internalType":"uint256","name":"donate","type":"uint256"}],"internalType":"struct IStates.Divisors","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getExcluded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"lpAmount","type":"uint256"}],"name":"getTState","outputs":[{"internalType":"enum ITValues.TState","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"}],"name":"getTxType","outputs":[{"internalType":"enum ITValues.TxType","name":"t","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"include","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"}],"name":"isFeelessTx","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ratio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"syncPool","outputs":[],"stateMutability":"nonpayable","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"}]

60806040523480156200001157600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35060408051808201909152600d8082526c26aaa9a5a4aa27902a37b5b2b760991b6020909201918252620000899160039162000723565b50604080518082019091526007808252664d55534b49544f60c81b6020909201918252620000ba9160049162000723565b506005805460ff191660121790556b033b2e3c9fd0803ce80000006006819055620000e89060001962000871565b620000f69060001962000810565b6007556032600f556064600d819055600c819055600e81905560105560188054737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0319918216811790925560168054739c5142ca89eac453c1eb9ef8d5e854ca01743f6e908316811790915560178054909216179055604080516315ab88c960e31b8152905163ad5c464891600480820192602092909190829003018186803b1580156200019e57600080fd5b505afa158015620001b3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001d99190620007c9565b601a80546001600160a01b0319166001600160a01b039283161790556018546040805163c45a015560e01b81529051919092169163c45a0155916004808301926020929190829003018186803b1580156200023357600080fd5b505afa15801562000248573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200026e9190620007c9565b601a546040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c6539690604401602060405180830381600087803b158015620002bb57600080fd5b505af1158015620002d0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002f69190620007c9565b601980546001600160a01b0319166001600160a01b0392909216919091179055601e805460ff1916600117905562000350601473e031b36b53e53a292a20c5f08fd1658cddf74fce62000587602090811b6200172817901c565b506200037760146d084e91743124a982076c59f100846200058760201b620017281760201c565b50620003a1601470917de6037d52b1f0a306eecd208405f7cd6200058760201b620017281760201c565b50620003ce6014731d6e8bac6ea3730825bde4b005ed7b2b39a2932d6200058760201b620017281760201c565b50620003fb6014737100e690554b1c2fd01e8648db88be235c1e65146200058760201b620017281760201c565b506200042860147372b30cdc1583224381132d379a052a6b107254156200058760201b620017281760201c565b50620004556014739282dc5c422fa91ff2f6ff3a0b45b7bf97cf78e76200058760201b620017281760201c565b50620004826014739edd647d7d6eceae6bb61d7785ef66c5055a9bee6200058760201b620017281760201c565b50620004af601473fad95b6089c53a0d1d861eabfaadd8901b0f85336200058760201b620017281760201c565b50336000908152601f60205260408082208054600160ff1991821681179092556017546001600160a01b039081168552838520805490921690921790556019541682529020805461ff0019166101001790556007546200051290600290620007f9565b336000908152601f60205260409020600290810191909155600754620005399190620007f9565b60008052601f6020527f8c60882dec3cf54096060609fdd16c336781b436ca34f3f27a220dfcfa1d48575562000581336018546006546001600160a01b0390911690620005a7565b6200089e565b60006200059e836001600160a01b038416620006d1565b90505b92915050565b6001600160a01b0383166200060f5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084015b60405180910390fd5b6001600160a01b038216620006725760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840162000606565b6001600160a01b038381166000818152602080805260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60008181526001830160205260408120546200071a57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155620005a1565b506000620005a1565b828054620007319062000834565b90600052602060002090601f016020900481019282620007555760008555620007a0565b82601f106200077057805160ff1916838001178555620007a0565b82800160010185558215620007a0579182015b82811115620007a057825182559160200191906001019062000783565b50620007ae929150620007b2565b5090565b5b80821115620007ae5760008155600101620007b3565b600060208284031215620007db578081fd5b81516001600160a01b0381168114620007f2578182fd5b9392505050565b6000826200080b576200080b62000888565b500490565b6000828210156200082f57634e487b7160e01b81526011600452602481fd5b500390565b600181811c908216806200084957607f821691505b602082108114156200086b57634e487b7160e01b600052602260045260246000fd5b50919050565b60008262000883576200088362000888565b500690565b634e487b7160e01b600052601260045260246000fd5b61277f80620008ae6000396000f3fe608060405234801561001057600080fd5b50600436106102315760003560e01c806373f4256111610130578063b4a64966116100b8578063e30c39781161007c578063e30c39781461051f578063f14faf6f14610530578063f2fde38b14610543578063f6b3a7c114610556578063fbcbc0f11461057857610231565b8063b4a6496614610462578063b524c66314610482578063bccb4687146104cc578063c8673928146104d5578063dd62ed3e146104e857610231565b806395d89b41116100ff57806395d89b4114610423578063a1abd39b1461042b578063a457c2d714610434578063a9059cbb14610447578063ad7e01be1461045a57610231565b806373f42561146103fa5780638a8c523c146104025780638b5298541461040a5780638da5cb5b1461041257610231565b806339509351116101be57806359ef07811161018257806359ef078114610399578063636fc28b146103ac57806370a08231146103d7578063715018a6146103ea57806371ca337d146103f257610231565b80633950935114610341578063412800081461035457806344df8e70146103745780634e71e0c81461037e5780634febf53d1461038657610231565b806318160ddd1161020557806318160ddd146102e157806321965351146102e957806323b872dd146102fc5780632b112e491461030f578063313ce5671461032c57610231565b8062113e081461023657806306fdde0314610293578063095ea7b3146102a85780630c3d29a2146102cb575b600080fd5b61023e610662565b60405161028a9190600060c082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015292915050565b60405180910390f35b61029b6106d8565b60405161028a919061254e565b6102bb6102b63660046124b5565b61076a565b604051901515815260200161028a565b6102d3610781565b60405190815260200161028a565b6006546102d3565b6102bb6102f73660046123d4565b610803565b6102bb61030a366004612420565b61082b565b61031761087c565b6040805192835260208301919091520161028a565b60055460405160ff909116815260200161028a565b6102bb61034f3660046124b5565b610959565b6103676103623660046123ee565b61098e565b60405161028a9190612540565b61037c610a36565b005b61037c610ba8565b61037c6103943660046123d4565b610c4d565b6102bb6103a73660046123ee565b610db5565b6019546103bf906001600160a01b031681565b6040516001600160a01b03909116815260200161028a565b6102d36103e53660046123d4565b610dfb565b61037c610e5b565b6102d3610eed565b6102d3610f10565b61037c610f1c565b61037c610f70565b6000546001600160a01b03166103bf565b61029b611015565b6102d3601d5481565b6102bb6104423660046124b5565b611024565b6102bb6104553660046124b5565b611059565b61037c611066565b610475610470366004612420565b6110d0565b60405161028a9190612532565b61048a611168565b60405161028a9190600060a082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015292915050565b6102d3601c5481565b61037c6104e33660046123d4565b6111cf565b6102d36104f63660046123ee565b6001600160a01b0391821660009081526020808052604080832093909416825291909152205490565b6002546001600160a01b03166103bf565b61037c61053e3660046124de565b61132f565b61037c6105513660046123d4565b6114c5565b61056961056436600461245b565b611594565b60405161028a939291906125c6565b61061a6105863660046123d4565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152506001600160a01b03166000908152601f6020908152604091829020825160a081018452815460ff808216151583526101008204811615159483019490945262010000900490921615159282019290925260018201546060820152600290910154608082015290565b60405161028a9190600060a082019050825115158252602083015115156020830152604083015115156040830152606083015160608301526080830151608083015292915050565b61069b6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b506040805160c08101825260065481526007546020820152600854918101919091526009546060820152600a546080820152600b5460a082015290565b6060600380546106e7906126c7565b80601f0160208091040260200160405190810160405280929190818152602001828054610713906126c7565b80156107605780601f1061073557610100808354040283529160200191610760565b820191906000526020600020905b81548152906001019060200180831161074357829003601f168201915b5050505050905090565b600061077733848461173d565b5060015b92915050565b601954604080516318160ddd60e01b815290516000926001600160a01b0316916318160ddd916004808301926020929190829003018186803b1580156107c657600080fd5b505afa1580156107da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107fe91906124f6565b905090565b6001600160a01b0381166000908152601f602052604090205462010000900460ff165b919050565b6000610838848484611857565b506001600160a01b0384166000908152602080805260408083203380855292529091205461087291869161086d9086906126b0565b61173d565b5060019392505050565b6007546006546000918291825b6108936012611ddb565b8110156109255760006108a7601283611de5565b6001600160a01b0381166000908152601f60205260409020600281015460019091015491925090858211806108db57508481115b156108f757505060075460065490965094506109559350505050565b61090182876126b0565b955061090d81866126b0565b9450505050808061091d90612702565b915050610889565b506006546007546109369190612671565b82101561094f5750506007546006549092509050610955565b90925090505b9091565b336000818152602080805260408083206001600160a01b0387168452909152812054909161077791859061086d908690612659565b6001600160a01b038083166000908152601f6020526040808220549284168252812054909160ff620100009182900481169291909104168180156109d0575080155b156109de5760009250610a2e565b811580156109e95750805b156109f75760019250610a2e565b81158015610a03575080155b15610a115760039250610a2e565b818015610a1b5750805b15610a295760029250610a2e565b600392505b505092915050565b601d54610a4590611388612691565b601c541015610a8c5760405162461bcd60e51b815260206004820152600e60248201526d18d85b89dd0818d85b1b081e595d60921b60448201526064015b60405180910390fd5b6019546001600160a01b03166000908152601f602052604081206002015490610ab6600583612671565b90506000610ac2610eed565b610acc9083612671565b6019546001600160a01b03166000908152601f6020526040812060020180549293508492909190610afe9084906126b0565b90915550506000808052601f6020527f8c60882dec3cf54096060609fdd16c336781b436ca34f3f27a220dfcfa1d48578054849290610b3e908490612659565b90915550506019546040518281526000916001600160a01b0316907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3601d8054906000610b9683612702565b9190505550610ba3611066565b505050565b6002546001600160a01b03163314610bf15760405162461bcd60e51b815260206004820152600c60248201526b63616e6e6f7420636c61696d60a01b6044820152606401610a83565b600280546001600160a01b03191690556000805460405133926001600160a01b03909216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b03191633179055565b6000546001600160a01b0316331480610c7957506001546001600160a01b0316336001600160a01b0316145b610c955760405162461bcd60e51b8152600401610a83906125a1565b6001600160a01b0381166000908152601f602052604090205462010000900460ff1615610d045760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610a83565b6001600160a01b0381166000908152601f60205260409020805462ff00001916620100001781556002015415610d7f57610d3c610eed565b6001600160a01b0382166000908152601f6020526040902060020154610d629190612671565b6001600160a01b0382166000908152601f60205260409020600101555b6001600160a01b0381166000908152601f60205260409020805462ff0000191662010000179055610db1601282611728565b5050565b6001600160a01b0382166000908152601f602052604081205460ff1680610df457506001600160a01b0382166000908152601f602052604090205460ff165b9392505050565b6000610e0682610803565b15610e2d57506001600160a01b0381166000908152601f6020526040902060010154610826565b610e35610eed565b6001600160a01b0383166000908152601f602052604090206002015461077b9190612671565b6000546001600160a01b0316331480610e8757506001546001600160a01b0316336001600160a01b0316145b610ea35760405162461bcd60e51b8152600401610a83906125a1565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000806000610efa61087c565b9092509050610f098183612671565b9250505090565b60006107fe6000610dfb565b6000546001600160a01b0316331480610f4857506001546001600160a01b0316336001600160a01b0316145b610f645760405162461bcd60e51b8152600401610a83906125a1565b601e805460ff19169055565b6000546001600160a01b0316331480610f9c57506001546001600160a01b0316336001600160a01b0316145b610fb85760405162461bcd60e51b8152600401610a83906125a1565b6002546001600160a01b03166110035760405162461bcd60e51b815260206004820152601060248201526f3737903832b73234b7339037bbb732b960811b6044820152606401610a83565b600280546001600160a01b0319169055565b6060600480546106e7906126c7565b336000818152602080805260408083206001600160a01b0387168452909152812054909161077791859061086d9086906126b0565b6000610872338484611857565b601960009054906101000a90046001600160a01b03166001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156110b657600080fd5b505af11580156110ca573d6000803e3d6000fd5b50505050565b60185460009081906001600160a01b03868116911614156110f357506002611160565b6001600160a01b0385166000908152601f6020526040902054610100900460ff161561112e57600a548314611126575060025b506000611160565b6001600160a01b0384166000908152601f6020526040902054610100900460ff161561115c57506001611160565b5060025b949350505050565b61119a6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b506040805160a081018252600c548152600d546020820152600e5491810191909152600f546060820152601054608082015290565b6000546001600160a01b03163314806111fb57506001546001600160a01b0316336001600160a01b0316145b6112175760405162461bcd60e51b8152600401610a83906125a1565b6001600160a01b0381166000908152601f602052604090205462010000900460ff166112855760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610a83565b61128d610eed565b61129f906729a2241af62c0000612691565b6001600160a01b0382166000908152601f6020526040902060020154116113085760405162461bcd60e51b815260206004820152601e60248201527f6e6f7420656e6f75676820746f20696e636c75646520796f757273656c6600006044820152606401610a83565b6001600160a01b0381166000908152601f6020526040812060010155610db1601282611df1565b33600061133a610eed565b905061134582610803565b156113a65760405162461bcd60e51b815260206004820152602b60248201527f4578636c75646564206164647265737365732063616e27742063616c6c20746860448201526a34b990333ab731ba34b7b760a91b6064820152608401610a83565b6001600160a01b0382166000908152601f60205260409020600201546113cc8285612691565b106114045760405162461bcd60e51b81526020600482015260086024820152670e8dede40daeac6d60c31b6044820152606401610a83565b61140e8184612691565b6001600160a01b0383166000908152601f6020526040812060020180549091906114399084906126b0565b9091555061144990508184612691565b6017546001600160a01b03166000908152601f6020526040812060020180549091906114769084906126b0565b90915550506017546040518481526001600160a01b039091169033907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a3505050565b6000546001600160a01b03163314806114f157506001546001600160a01b0316336001600160a01b0316145b61150d5760405162461bcd60e51b8152600401610a83906125a1565b6001600160a01b0381166115725760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a83565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6115f160405180610160016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6000806115ff8888866110d0565b915061160b888861098e565b8684529050846116cb57601e5460ff166116cb57600f5461162c9087612671565b604084015260105461163e9087612671565b60c0840152600e546116509087612671565b60e0840152600182600281111561167757634e487b7160e01b600052602160045260246000fd5b141561169057600d5461168a9087612671565b60808401525b60008260028111156116b257634e487b7160e01b600052602160045260246000fd5b14156116cb57600c546116c59087612671565b60608401525b60e083015160c084015160608501516080860151604087015187516116f091906126b0565b6116fa91906126b0565b61170491906126b0565b61170e91906126b0565b61171891906126b0565b6020840152955095509592505050565b6000610df4836001600160a01b038416611e06565b6001600160a01b03831661179f5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a83565b6001600160a01b0382166118005760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a83565b6001600160a01b038381166000818152602080805260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591016114b8565b60006001600160a01b0384166118bd5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610a83565b6001600160a01b03831661191f5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610a83565b600082116119815760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610a83565b61198c601484611e55565b156119c85760405162461bcd60e51b815260206004820152600c60248201526b199d58dac81e5bdd48189bdd60a21b6044820152606401610a83565b6119d3601433611e55565b15611a0f5760405162461bcd60e51b815260206004820152600c60248201526b199d58dac81e5bdd48189bdd60a21b6044820152606401610a83565b6019546001600160a01b0385811691161415611a2f57611a2f8284611e77565b601e5460ff1615611a9f576000546001600160a01b0385811691161480611a6457506019546001600160a01b03848116911614155b611a9f5760405162461bcd60e51b815260206004820152600c60248201526b1cdd1a5b1b081c185d5cd95960a21b6044820152606401610a83565b6000611aa9610eed565b90506000611ab5610781565b90506000611ac38787610db5565b90506000806000611ad78a8a8a8789611594565b600a8890559194509250905083611d8c57858360c00151611af89190612691565b6017546001600160a01b03166000908152601f602052604081206002018054909190611b25908490612659565b909155505060e0830151611b3a908790612691565b6000808052601f6020527f8c60882dec3cf54096060609fdd16c336781b436ca34f3f27a220dfcfa1d48578054909190611b75908490612659565b909155505060e08301516000808052601f6020527f8c60882dec3cf54096060609fdd16c336781b436ca34f3f27a220dfcfa1d48568054909190611bba908490612659565b9091555060019050826002811115611be257634e487b7160e01b600052602160045260246000fd5b1415611c675785601b54611bf69190612691565b6017546001600160a01b03166000908152601f602052604081206002018054909190611c23908490612659565b9091555050601b546017546001600160a01b03166000908152601f602052604081206001018054909190611c58908490612659565b90915550506000601b55611d31565b6000826002811115611c8957634e487b7160e01b600052602160045260246000fd5b1415611cdd5785601b54611c9d9190612691565b6001600160a01b038a166000908152601f602052604081206002018054909190611cc8908490612659565b9091555050601c8054906000611c5883612702565b85601b54611ceb9190612691565b6000808052601f6020527f8c60882dec3cf54096060609fdd16c336781b436ca34f3f27a220dfcfa1d48578054909190611d26908490612659565b90915550506000601b555b82606001518360800151611d459190612659565b601b556040830151600b8054600090611d5f908490612659565b90915550506040830151611d74908790612691565b60078054600090611d869084906126b0565b90915550505b611d998a8a888685611f61565b6011805483919060ff19166001836002811115611dc657634e487b7160e01b600052602160045260246000fd5b021790555060019a9950505050505050505050565b600061077b825490565b6000610df48383612212565b6000610df4836001600160a01b0384166122a6565b6000818152600183016020526040812054611e4d5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561077b565b50600061077b565b6001600160a01b03811660009081526001830160205260408120541515610df4565b601e5460ff1615610db157600654606490611e9490600290612671565b611e9e9190612671565b821115611ede5760405162461bcd60e51b815260206004820152600e60248201526d3bb430b632903634b6b4ba1037b760911b6044820152606401610a83565b600654606490611ef090600290612671565b611efa9190612671565b611f0382610dfb565b1115610db15760405162461bcd60e51b815260206004820152602760248201527f616c726561647920626f75676874203530302c20776169742074696c6c20636860448201526632b1b59037b33360c91b6064820152608401610a83565b6001816003811115611f8357634e487b7160e01b600052602160045260246000fd5b1415612043578151611f96908490612691565b6001600160a01b0386166000908152601f602052604081206002018054909190611fc19084906126b0565b90915550506020808301516001600160a01b0386166000908152601f90925260408220600101805491929091611ff8908490612659565b9091555050602082015161200d908490612691565b6001600160a01b0385166000908152601f602052604081206002018054909190612038908490612659565b909155506121ba9050565b600081600381111561206557634e487b7160e01b600052602160045260246000fd5b14156120d55781516001600160a01b0386166000908152601f6020526040812060010180549091906120989084906126b0565b909155505081516120aa908490612691565b6001600160a01b0386166000908152601f602052604081206002018054909190611ff89084906126b0565b60028160038111156120f757634e487b7160e01b600052602160045260246000fd5b141561213c5781516001600160a01b0386166000908152601f60205260408120600101805490919061212a9084906126b0565b90915550508151611f96908490612691565b8151612149908490612691565b6001600160a01b0386166000908152601f6020526040812060020180549091906121749084906126b0565b90915550506020820151612189908490612691565b6001600160a01b0385166000908152601f6020526040812060020180549091906121b4908490612659565b90915550505b836001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846020015160405161220391815260200190565b60405180910390a35050505050565b815460009082106122705760405162461bcd60e51b815260206004820152602260248201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610a83565b82600001828154811061229357634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b600081815260018301602052604081205480156123b35760006122ca6001836126b0565b85549091506000906122de906001906126b0565b9050600086600001828154811061230557634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508087600001848154811061233657634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101929092558281526001890190915260409020849055865487908061237757634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905586600101600087815260200190815260200160002060009055600194505050505061077b565b600091505061077b565b80356001600160a01b038116811461082657600080fd5b6000602082840312156123e5578081fd5b610df4826123bd565b60008060408385031215612400578081fd5b612409836123bd565b9150612417602084016123bd565b90509250929050565b600080600060608486031215612434578081fd5b61243d846123bd565b925061244b602085016123bd565b9150604084013590509250925092565b600080600080600060a08688031215612472578081fd5b61247b866123bd565b9450612489602087016123bd565b935060408601359250606086013580151581146124a4578182fd5b949793965091946080013592915050565b600080604083850312156124c7578182fd5b6124d0836123bd565b946020939093013593505050565b6000602082840312156124ef578081fd5b5035919050565b600060208284031215612507578081fd5b5051919050565b6003811061251e5761251e612733565b9052565b6004811061251e5761251e612733565b6020810161077b828461250e565b6020810161077b8284612522565b6000602080835283518082850152825b8181101561257a5785810183015185820160400152820161255e565b8181111561258b5783604083870101525b50601f01601f1916929092016040019392505050565b6020808252600b908201526a1b9bdd08185b1b1bddd95960aa1b604082015260600190565b60006101a082019050845182526020850151602083015260408501516040830152606085015160608301526080850151608083015260a085015160a083015260c085015160c083015260e085015160e083015261010080860151818401525061012080860151818401525061014080860151818401525061264b61016083018561250e565b611160610180830184612522565b6000821982111561266c5761266c61271d565b500190565b60008261268c57634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156126ab576126ab61271d565b500290565b6000828210156126c2576126c261271d565b500390565b600181811c908216806126db57607f821691505b602082108114156126fc57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156127165761271661271d565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052602160045260246000fdfea2646970667358221220ed3937010f8170d81109ef7b74ab314be502efec7c1fcdca5d85966310969f0c64736f6c63430008030033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102315760003560e01c806373f4256111610130578063b4a64966116100b8578063e30c39781161007c578063e30c39781461051f578063f14faf6f14610530578063f2fde38b14610543578063f6b3a7c114610556578063fbcbc0f11461057857610231565b8063b4a6496614610462578063b524c66314610482578063bccb4687146104cc578063c8673928146104d5578063dd62ed3e146104e857610231565b806395d89b41116100ff57806395d89b4114610423578063a1abd39b1461042b578063a457c2d714610434578063a9059cbb14610447578063ad7e01be1461045a57610231565b806373f42561146103fa5780638a8c523c146104025780638b5298541461040a5780638da5cb5b1461041257610231565b806339509351116101be57806359ef07811161018257806359ef078114610399578063636fc28b146103ac57806370a08231146103d7578063715018a6146103ea57806371ca337d146103f257610231565b80633950935114610341578063412800081461035457806344df8e70146103745780634e71e0c81461037e5780634febf53d1461038657610231565b806318160ddd1161020557806318160ddd146102e157806321965351146102e957806323b872dd146102fc5780632b112e491461030f578063313ce5671461032c57610231565b8062113e081461023657806306fdde0314610293578063095ea7b3146102a85780630c3d29a2146102cb575b600080fd5b61023e610662565b60405161028a9190600060c082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015292915050565b60405180910390f35b61029b6106d8565b60405161028a919061254e565b6102bb6102b63660046124b5565b61076a565b604051901515815260200161028a565b6102d3610781565b60405190815260200161028a565b6006546102d3565b6102bb6102f73660046123d4565b610803565b6102bb61030a366004612420565b61082b565b61031761087c565b6040805192835260208301919091520161028a565b60055460405160ff909116815260200161028a565b6102bb61034f3660046124b5565b610959565b6103676103623660046123ee565b61098e565b60405161028a9190612540565b61037c610a36565b005b61037c610ba8565b61037c6103943660046123d4565b610c4d565b6102bb6103a73660046123ee565b610db5565b6019546103bf906001600160a01b031681565b6040516001600160a01b03909116815260200161028a565b6102d36103e53660046123d4565b610dfb565b61037c610e5b565b6102d3610eed565b6102d3610f10565b61037c610f1c565b61037c610f70565b6000546001600160a01b03166103bf565b61029b611015565b6102d3601d5481565b6102bb6104423660046124b5565b611024565b6102bb6104553660046124b5565b611059565b61037c611066565b610475610470366004612420565b6110d0565b60405161028a9190612532565b61048a611168565b60405161028a9190600060a082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015292915050565b6102d3601c5481565b61037c6104e33660046123d4565b6111cf565b6102d36104f63660046123ee565b6001600160a01b0391821660009081526020808052604080832093909416825291909152205490565b6002546001600160a01b03166103bf565b61037c61053e3660046124de565b61132f565b61037c6105513660046123d4565b6114c5565b61056961056436600461245b565b611594565b60405161028a939291906125c6565b61061a6105863660046123d4565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152506001600160a01b03166000908152601f6020908152604091829020825160a081018452815460ff808216151583526101008204811615159483019490945262010000900490921615159282019290925260018201546060820152600290910154608082015290565b60405161028a9190600060a082019050825115158252602083015115156020830152604083015115156040830152606083015160608301526080830151608083015292915050565b61069b6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b506040805160c08101825260065481526007546020820152600854918101919091526009546060820152600a546080820152600b5460a082015290565b6060600380546106e7906126c7565b80601f0160208091040260200160405190810160405280929190818152602001828054610713906126c7565b80156107605780601f1061073557610100808354040283529160200191610760565b820191906000526020600020905b81548152906001019060200180831161074357829003601f168201915b5050505050905090565b600061077733848461173d565b5060015b92915050565b601954604080516318160ddd60e01b815290516000926001600160a01b0316916318160ddd916004808301926020929190829003018186803b1580156107c657600080fd5b505afa1580156107da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107fe91906124f6565b905090565b6001600160a01b0381166000908152601f602052604090205462010000900460ff165b919050565b6000610838848484611857565b506001600160a01b0384166000908152602080805260408083203380855292529091205461087291869161086d9086906126b0565b61173d565b5060019392505050565b6007546006546000918291825b6108936012611ddb565b8110156109255760006108a7601283611de5565b6001600160a01b0381166000908152601f60205260409020600281015460019091015491925090858211806108db57508481115b156108f757505060075460065490965094506109559350505050565b61090182876126b0565b955061090d81866126b0565b9450505050808061091d90612702565b915050610889565b506006546007546109369190612671565b82101561094f5750506007546006549092509050610955565b90925090505b9091565b336000818152602080805260408083206001600160a01b0387168452909152812054909161077791859061086d908690612659565b6001600160a01b038083166000908152601f6020526040808220549284168252812054909160ff620100009182900481169291909104168180156109d0575080155b156109de5760009250610a2e565b811580156109e95750805b156109f75760019250610a2e565b81158015610a03575080155b15610a115760039250610a2e565b818015610a1b5750805b15610a295760029250610a2e565b600392505b505092915050565b601d54610a4590611388612691565b601c541015610a8c5760405162461bcd60e51b815260206004820152600e60248201526d18d85b89dd0818d85b1b081e595d60921b60448201526064015b60405180910390fd5b6019546001600160a01b03166000908152601f602052604081206002015490610ab6600583612671565b90506000610ac2610eed565b610acc9083612671565b6019546001600160a01b03166000908152601f6020526040812060020180549293508492909190610afe9084906126b0565b90915550506000808052601f6020527f8c60882dec3cf54096060609fdd16c336781b436ca34f3f27a220dfcfa1d48578054849290610b3e908490612659565b90915550506019546040518281526000916001600160a01b0316907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3601d8054906000610b9683612702565b9190505550610ba3611066565b505050565b6002546001600160a01b03163314610bf15760405162461bcd60e51b815260206004820152600c60248201526b63616e6e6f7420636c61696d60a01b6044820152606401610a83565b600280546001600160a01b03191690556000805460405133926001600160a01b03909216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b03191633179055565b6000546001600160a01b0316331480610c7957506001546001600160a01b0316336001600160a01b0316145b610c955760405162461bcd60e51b8152600401610a83906125a1565b6001600160a01b0381166000908152601f602052604090205462010000900460ff1615610d045760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610a83565b6001600160a01b0381166000908152601f60205260409020805462ff00001916620100001781556002015415610d7f57610d3c610eed565b6001600160a01b0382166000908152601f6020526040902060020154610d629190612671565b6001600160a01b0382166000908152601f60205260409020600101555b6001600160a01b0381166000908152601f60205260409020805462ff0000191662010000179055610db1601282611728565b5050565b6001600160a01b0382166000908152601f602052604081205460ff1680610df457506001600160a01b0382166000908152601f602052604090205460ff165b9392505050565b6000610e0682610803565b15610e2d57506001600160a01b0381166000908152601f6020526040902060010154610826565b610e35610eed565b6001600160a01b0383166000908152601f602052604090206002015461077b9190612671565b6000546001600160a01b0316331480610e8757506001546001600160a01b0316336001600160a01b0316145b610ea35760405162461bcd60e51b8152600401610a83906125a1565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000806000610efa61087c565b9092509050610f098183612671565b9250505090565b60006107fe6000610dfb565b6000546001600160a01b0316331480610f4857506001546001600160a01b0316336001600160a01b0316145b610f645760405162461bcd60e51b8152600401610a83906125a1565b601e805460ff19169055565b6000546001600160a01b0316331480610f9c57506001546001600160a01b0316336001600160a01b0316145b610fb85760405162461bcd60e51b8152600401610a83906125a1565b6002546001600160a01b03166110035760405162461bcd60e51b815260206004820152601060248201526f3737903832b73234b7339037bbb732b960811b6044820152606401610a83565b600280546001600160a01b0319169055565b6060600480546106e7906126c7565b336000818152602080805260408083206001600160a01b0387168452909152812054909161077791859061086d9086906126b0565b6000610872338484611857565b601960009054906101000a90046001600160a01b03166001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156110b657600080fd5b505af11580156110ca573d6000803e3d6000fd5b50505050565b60185460009081906001600160a01b03868116911614156110f357506002611160565b6001600160a01b0385166000908152601f6020526040902054610100900460ff161561112e57600a548314611126575060025b506000611160565b6001600160a01b0384166000908152601f6020526040902054610100900460ff161561115c57506001611160565b5060025b949350505050565b61119a6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b506040805160a081018252600c548152600d546020820152600e5491810191909152600f546060820152601054608082015290565b6000546001600160a01b03163314806111fb57506001546001600160a01b0316336001600160a01b0316145b6112175760405162461bcd60e51b8152600401610a83906125a1565b6001600160a01b0381166000908152601f602052604090205462010000900460ff166112855760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610a83565b61128d610eed565b61129f906729a2241af62c0000612691565b6001600160a01b0382166000908152601f6020526040902060020154116113085760405162461bcd60e51b815260206004820152601e60248201527f6e6f7420656e6f75676820746f20696e636c75646520796f757273656c6600006044820152606401610a83565b6001600160a01b0381166000908152601f6020526040812060010155610db1601282611df1565b33600061133a610eed565b905061134582610803565b156113a65760405162461bcd60e51b815260206004820152602b60248201527f4578636c75646564206164647265737365732063616e27742063616c6c20746860448201526a34b990333ab731ba34b7b760a91b6064820152608401610a83565b6001600160a01b0382166000908152601f60205260409020600201546113cc8285612691565b106114045760405162461bcd60e51b81526020600482015260086024820152670e8dede40daeac6d60c31b6044820152606401610a83565b61140e8184612691565b6001600160a01b0383166000908152601f6020526040812060020180549091906114399084906126b0565b9091555061144990508184612691565b6017546001600160a01b03166000908152601f6020526040812060020180549091906114769084906126b0565b90915550506017546040518481526001600160a01b039091169033907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a3505050565b6000546001600160a01b03163314806114f157506001546001600160a01b0316336001600160a01b0316145b61150d5760405162461bcd60e51b8152600401610a83906125a1565b6001600160a01b0381166115725760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a83565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6115f160405180610160016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6000806115ff8888866110d0565b915061160b888861098e565b8684529050846116cb57601e5460ff166116cb57600f5461162c9087612671565b604084015260105461163e9087612671565b60c0840152600e546116509087612671565b60e0840152600182600281111561167757634e487b7160e01b600052602160045260246000fd5b141561169057600d5461168a9087612671565b60808401525b60008260028111156116b257634e487b7160e01b600052602160045260246000fd5b14156116cb57600c546116c59087612671565b60608401525b60e083015160c084015160608501516080860151604087015187516116f091906126b0565b6116fa91906126b0565b61170491906126b0565b61170e91906126b0565b61171891906126b0565b6020840152955095509592505050565b6000610df4836001600160a01b038416611e06565b6001600160a01b03831661179f5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a83565b6001600160a01b0382166118005760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a83565b6001600160a01b038381166000818152602080805260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591016114b8565b60006001600160a01b0384166118bd5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610a83565b6001600160a01b03831661191f5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610a83565b600082116119815760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610a83565b61198c601484611e55565b156119c85760405162461bcd60e51b815260206004820152600c60248201526b199d58dac81e5bdd48189bdd60a21b6044820152606401610a83565b6119d3601433611e55565b15611a0f5760405162461bcd60e51b815260206004820152600c60248201526b199d58dac81e5bdd48189bdd60a21b6044820152606401610a83565b6019546001600160a01b0385811691161415611a2f57611a2f8284611e77565b601e5460ff1615611a9f576000546001600160a01b0385811691161480611a6457506019546001600160a01b03848116911614155b611a9f5760405162461bcd60e51b815260206004820152600c60248201526b1cdd1a5b1b081c185d5cd95960a21b6044820152606401610a83565b6000611aa9610eed565b90506000611ab5610781565b90506000611ac38787610db5565b90506000806000611ad78a8a8a8789611594565b600a8890559194509250905083611d8c57858360c00151611af89190612691565b6017546001600160a01b03166000908152601f602052604081206002018054909190611b25908490612659565b909155505060e0830151611b3a908790612691565b6000808052601f6020527f8c60882dec3cf54096060609fdd16c336781b436ca34f3f27a220dfcfa1d48578054909190611b75908490612659565b909155505060e08301516000808052601f6020527f8c60882dec3cf54096060609fdd16c336781b436ca34f3f27a220dfcfa1d48568054909190611bba908490612659565b9091555060019050826002811115611be257634e487b7160e01b600052602160045260246000fd5b1415611c675785601b54611bf69190612691565b6017546001600160a01b03166000908152601f602052604081206002018054909190611c23908490612659565b9091555050601b546017546001600160a01b03166000908152601f602052604081206001018054909190611c58908490612659565b90915550506000601b55611d31565b6000826002811115611c8957634e487b7160e01b600052602160045260246000fd5b1415611cdd5785601b54611c9d9190612691565b6001600160a01b038a166000908152601f602052604081206002018054909190611cc8908490612659565b9091555050601c8054906000611c5883612702565b85601b54611ceb9190612691565b6000808052601f6020527f8c60882dec3cf54096060609fdd16c336781b436ca34f3f27a220dfcfa1d48578054909190611d26908490612659565b90915550506000601b555b82606001518360800151611d459190612659565b601b556040830151600b8054600090611d5f908490612659565b90915550506040830151611d74908790612691565b60078054600090611d869084906126b0565b90915550505b611d998a8a888685611f61565b6011805483919060ff19166001836002811115611dc657634e487b7160e01b600052602160045260246000fd5b021790555060019a9950505050505050505050565b600061077b825490565b6000610df48383612212565b6000610df4836001600160a01b0384166122a6565b6000818152600183016020526040812054611e4d5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561077b565b50600061077b565b6001600160a01b03811660009081526001830160205260408120541515610df4565b601e5460ff1615610db157600654606490611e9490600290612671565b611e9e9190612671565b821115611ede5760405162461bcd60e51b815260206004820152600e60248201526d3bb430b632903634b6b4ba1037b760911b6044820152606401610a83565b600654606490611ef090600290612671565b611efa9190612671565b611f0382610dfb565b1115610db15760405162461bcd60e51b815260206004820152602760248201527f616c726561647920626f75676874203530302c20776169742074696c6c20636860448201526632b1b59037b33360c91b6064820152608401610a83565b6001816003811115611f8357634e487b7160e01b600052602160045260246000fd5b1415612043578151611f96908490612691565b6001600160a01b0386166000908152601f602052604081206002018054909190611fc19084906126b0565b90915550506020808301516001600160a01b0386166000908152601f90925260408220600101805491929091611ff8908490612659565b9091555050602082015161200d908490612691565b6001600160a01b0385166000908152601f602052604081206002018054909190612038908490612659565b909155506121ba9050565b600081600381111561206557634e487b7160e01b600052602160045260246000fd5b14156120d55781516001600160a01b0386166000908152601f6020526040812060010180549091906120989084906126b0565b909155505081516120aa908490612691565b6001600160a01b0386166000908152601f602052604081206002018054909190611ff89084906126b0565b60028160038111156120f757634e487b7160e01b600052602160045260246000fd5b141561213c5781516001600160a01b0386166000908152601f60205260408120600101805490919061212a9084906126b0565b90915550508151611f96908490612691565b8151612149908490612691565b6001600160a01b0386166000908152601f6020526040812060020180549091906121749084906126b0565b90915550506020820151612189908490612691565b6001600160a01b0385166000908152601f6020526040812060020180549091906121b4908490612659565b90915550505b836001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846020015160405161220391815260200190565b60405180910390a35050505050565b815460009082106122705760405162461bcd60e51b815260206004820152602260248201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610a83565b82600001828154811061229357634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b600081815260018301602052604081205480156123b35760006122ca6001836126b0565b85549091506000906122de906001906126b0565b9050600086600001828154811061230557634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508087600001848154811061233657634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101929092558281526001890190915260409020849055865487908061237757634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905586600101600087815260200190815260200160002060009055600194505050505061077b565b600091505061077b565b80356001600160a01b038116811461082657600080fd5b6000602082840312156123e5578081fd5b610df4826123bd565b60008060408385031215612400578081fd5b612409836123bd565b9150612417602084016123bd565b90509250929050565b600080600060608486031215612434578081fd5b61243d846123bd565b925061244b602085016123bd565b9150604084013590509250925092565b600080600080600060a08688031215612472578081fd5b61247b866123bd565b9450612489602087016123bd565b935060408601359250606086013580151581146124a4578182fd5b949793965091946080013592915050565b600080604083850312156124c7578182fd5b6124d0836123bd565b946020939093013593505050565b6000602082840312156124ef578081fd5b5035919050565b600060208284031215612507578081fd5b5051919050565b6003811061251e5761251e612733565b9052565b6004811061251e5761251e612733565b6020810161077b828461250e565b6020810161077b8284612522565b6000602080835283518082850152825b8181101561257a5785810183015185820160400152820161255e565b8181111561258b5783604083870101525b50601f01601f1916929092016040019392505050565b6020808252600b908201526a1b9bdd08185b1b1bddd95960aa1b604082015260600190565b60006101a082019050845182526020850151602083015260408501516040830152606085015160608301526080850151608083015260a085015160a083015260c085015160c083015260e085015160e083015261010080860151818401525061012080860151818401525061014080860151818401525061264b61016083018561250e565b611160610180830184612522565b6000821982111561266c5761266c61271d565b500190565b60008261268c57634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156126ab576126ab61271d565b500290565b6000828210156126c2576126c261271d565b500390565b600181811c908216806126db57607f821691505b602082108114156126fc57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156127165761271661271d565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052602160045260246000fdfea2646970667358221220ed3937010f8170d81109ef7b74ab314be502efec7c1fcdca5d85966310969f0c64736f6c63430008030033

Deployed Bytecode Sourcemap

24752:14728:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36713:104;;;:::i;:::-;;;;;;11607:552:1;11793:3;11782:9;11778:19;11770:27;;11830:6;11824:13;11813:9;11806:32;11894:4;11886:6;11882:17;11876:24;11869:4;11858:9;11854:20;11847:54;11957:4;11949:6;11945:17;11939:24;11932:4;11921:9;11917:20;11910:54;12020:4;12012:6;12008:17;12002:24;11995:4;11984:9;11980:20;11973:54;12083:4;12075:6;12071:17;12065:24;12058:4;12047:9;12043:20;12036:54;12146:4;12138:6;12134:17;12128:24;12121:4;12110:9;12106:20;12099:54;11760:399;;;;;36713:104:0;;;;;;;;27648:82;;;:::i;:::-;;;;;;;:::i;28366:161::-;;;;;;:::i;:::-;;:::i;:::-;;;2915:14:1;;2908:22;2890:41;;2878:2;2863:18;28366:161:0;2845:92:1;36949:109:0;;;:::i;:::-;;;13931:25:1;;;13919:2;13904:18;36949:109:0;13886:76:1;29335:108:0;29415:8;:20;29335:108;;36825:116;;;;;;:::i;:::-;;:::i;29627:266::-;;;;;;:::i;:::-;;:::i;37694:798::-;;;:::i;:::-;;;;14141:25:1;;;14197:2;14182:18;;14175:34;;;;14114:18;37694:798:0;14096:119:1;27738:82:0;27803:9;;27738:82;;27803:9;;;;14362:36:1;;14350:2;14335:18;27738:82:0;14317:87:1;28879:214:0;;;;;;:::i;:::-;;:::i;38500:749::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;35789:397::-;;;:::i;:::-;;14832:180;;;:::i;34914:413::-;;;;;;:::i;:::-;;:::i;36296:163::-;;;;;;:::i;:::-;;:::i;25204:21::-;;;;;-1:-1:-1;;;;;25204:21:0;;;;;;-1:-1:-1;;;;;2706:32:1;;;2688:51;;2676:2;2661:18;25204:21:0;2643:102:1;28130:228:0;;;;;;:::i;:::-;;:::i;14316:148::-;;;:::i;39257:135::-;;;:::i;36194:94::-;;;:::i;30288:78::-;;;:::i;14669:155::-;;;:::i;13795:79::-;13833:7;13860:6;-1:-1:-1;;;;;13860:6:0;13795:79;;27828:87;;;:::i;25319:20::-;;;;;;29101:226;;;;;;:::i;:::-;;:::i;29451:168::-;;;;;;:::i;:::-;;:::i;39400:75::-;;;:::i;37066:620::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;36601:104::-;;;:::i;:::-;;;;;;12164:489:1;12350:3;12339:9;12335:19;12327:27;;12387:6;12381:13;12370:9;12363:32;12451:4;12443:6;12439:17;12433:24;12426:4;12415:9;12411:20;12404:54;12514:4;12506:6;12502:17;12496:24;12489:4;12478:9;12474:20;12467:54;12577:4;12569:6;12565:17;12559:24;12552:4;12541:9;12537:20;12530:54;12640:4;12632:6;12628:17;12622:24;12615:4;12604:9;12600:20;12593:54;12317:336;;;;;25293:19:0;;;;;;34573:333;;;;;;:::i;:::-;;:::i;27923:142::-;;;;;;:::i;:::-;-1:-1:-1;;;;;28031:17:0;;;28004:7;28031:17;;;:10;:17;;;;;;;:26;;;;;;;;;;;;;27923:142;14215:93;14287:13;;-1:-1:-1;;;;;14287:13:0;14215:93;;35335:446;;;;;;:::i;:::-;;:::i;14472:189::-;;;;;;:::i;:::-;;:::i;32404:940::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;36467:126::-;;;;;;:::i;:::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36568:17:0;;;;;:8;:17;;;;;;;;;36561:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36467:126;;;;;;;11067:535:1;11251:3;11240:9;11236:19;11228:27;;11302:6;11296:13;11289:21;11282:29;11271:9;11264:48;11382:4;11374:6;11370:17;11364:24;11357:32;11350:40;11343:4;11332:9;11328:20;11321:70;11461:4;11453:6;11449:17;11443:24;11436:32;11429:40;11422:4;11411:9;11407:20;11400:70;11526:4;11518:6;11514:17;11508:24;11501:4;11490:9;11486:20;11479:54;11589:4;11581:6;11577:17;11571:24;11564:4;11553:9;11549:20;11542:54;11218:384;;;;;36713:104:0;36758:23;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36758:23:0;-1:-1:-1;36794:15:0;;;;;;;;36801:8;36794:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36713:104;:::o;27648:82::-;27684:13;27717:5;27710:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27648:82;:::o;28366:161::-;28441:4;28458:39;12969:10;28481:7;28490:6;28458:8;:39::i;:::-;-1:-1:-1;28515:4:0;28366:161;;;;;:::o;36949:109::-;37030:5;;37023:27;;;-1:-1:-1;;;37023:27:0;;;;36996:7;;-1:-1:-1;;;;;37030:5:0;;37023:25;;:27;;;;;;;;;;;;;;37030:5;37023:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37016:34;;36949:109;:::o;36825:116::-;-1:-1:-1;;;;;36907:17:0;;36883:4;36907:17;;;:8;:17;;;;;:26;;;;;;36825:116;;;;:::o;29627:266::-;29725:4;29742:37;29753:6;29761:9;29772:6;29742:10;:37::i;:::-;-1:-1:-1;;;;;;29821:18:0;;;;;;:10;:18;;;;;;;12969:10;29821:32;;;;;;;;;29790:73;;29799:6;;29821:41;;29856:6;;29821:41;:::i;:::-;29790:8;:73::i;:::-;-1:-1:-1;29881:4:0;29627:266;;;;;:::o;37694:798::-;37793:22;;:8;37844:20;37746:7;;;;;37875:449;37899:38;37920:16;37899:20;:38::i;:::-;37895:1;:42;37875:449;;;37959:15;37977:37;37994:16;38012:1;37977:16;:37::i;:::-;-1:-1:-1;;;;;38048:17:0;;38029:16;38048:17;;;:8;:17;;;;;:24;;;;38106;;;;;37959:55;;-1:-1:-1;38048:24:0;38149:18;;;;:40;;;38182:7;38171:8;:18;38149:40;38145:99;;;-1:-1:-1;;38199:22:0;;:8;38223:20;38199:22;;-1:-1:-1;38223:20:0;-1:-1:-1;38191:53:0;;-1:-1:-1;;;;38191:53:0;38145:99;38259:19;38270:8;38259:19;;:::i;:::-;;-1:-1:-1;38293:19:0;38304:8;38293:19;;:::i;:::-;;;37875:449;;;37939:3;;;;;:::i;:::-;;;;37875:449;;;-1:-1:-1;38373:8:0;:20;38348:22;;:45;;38373:20;38348:45;:::i;:::-;38338:7;:55;38334:114;;;-1:-1:-1;;38403:22:0;;:8;38427:20;38403:22;;-1:-1:-1;38427:20:0;-1:-1:-1;38395:53:0;;38334:114;38467:7;;-1:-1:-1;38476:7:0;-1:-1:-1;37694:798:0;;;:::o;28879:214::-;12969:10;28967:4;29016:24;;;:10;:24;;;;;;;-1:-1:-1;;;;;29016:33:0;;;;;;;;;;28967:4;;28984:79;;29007:7;;29016:46;;29052:10;;29016:46;:::i;38500:749::-;-1:-1:-1;;;;;38628:16:0;;;38574:17;38628:16;;;:8;:16;;;;;;:25;38691:19;;;;;;;:28;38574:17;;38628:25;;;;;;;;;38691:28;;;;;38628:25;38734:40;;;;;38755:19;38754:20;38734:40;38730:493;;;38795:28;38791:32;;38730:493;;;38846:16;38845:17;:40;;;;;38866:19;38845:40;38841:382;;;38906:26;38902:30;;38841:382;;;38955:16;38954:17;:41;;;;;38976:19;38975:20;38954:41;38950:273;;;39016:24;39012:28;;38950:273;;;39062:16;:39;;;;;39082:19;39062:39;39058:165;;;39122:28;39118:32;;39058:165;;;39187:24;39183:28;;39058:165;39233:8;;38500:749;;;;:::o;35789:397::-;35848:5;;35841:12;;:4;:12;:::i;:::-;35833:4;;:20;;35825:47;;;;-1:-1:-1;;;35825:47:0;;6062:2:1;35825:47:0;;;6044:21:1;6101:2;6081:18;;;6074:30;-1:-1:-1;;;6120:18:1;;;6113:44;6174:18;;35825:47:0;;;;;;;;;35904:5;;-1:-1:-1;;;;;35904:5:0;35883:9;35895:15;;;:8;:15;;;;;:22;;;;35947:5;35951:1;35895:22;35947:5;:::i;:::-;35928:25;;35971:9;35993:7;:5;:7::i;:::-;35983:17;;:7;:17;:::i;:::-;36020:5;;-1:-1:-1;;;;;36020:5:0;36011:15;;;;:8;:15;;;;;:22;;:33;;35971:29;;-1:-1:-1;36037:7:0;;36011:22;;:15;:33;;36037:7;;36011:33;:::i;:::-;;;;-1:-1:-1;;36055:20:0;;;;:8;:20;;:27;:38;;36086:7;;36055:20;:38;;36086:7;;36055:38;:::i;:::-;;;;-1:-1:-1;;36118:5:0;;36109:30;;13931:25:1;;;36133:1:0;;-1:-1:-1;;;;;36118:5:0;;36109:30;;13919:2:1;13904:18;36109:30:0;;;;;;;36150:5;:7;;;:5;:7;;;:::i;:::-;;;;;;36168:10;:8;:10::i;:::-;35789:397;;;:::o;14832:180::-;14143:13;;-1:-1:-1;;;;;14143:13:0;14160:10;14143:27;14134:53;;;;-1:-1:-1;;;14134:53:0;;9705:2:1;14134:53:0;;;9687:21:1;9744:2;9724:18;;;9717:30;-1:-1:-1;;;9763:18:1;;;9756:42;9815:18;;14134:53:0;9677:162:1;14134:53:0;14888:13:::1;:26:::0;;-1:-1:-1;;;;;;14888:26:0::1;::::0;;-1:-1:-1;14951:6:0;;14930:42:::1;::::0;12969:10;;-1:-1:-1;;;;;14951:6:0;;::::1;::::0;14930:42:::1;::::0;::::1;14983:6;:21:::0;;-1:-1:-1;;;;;;14983:21:0::1;12969:10:::0;14983:21:::1;::::0;;14832:180::o;34914:413::-;14005:6;;-1:-1:-1;;;;;14005:6:0;12969:10;14005:22;;:51;;-1:-1:-1;14047:9:0;;-1:-1:-1;;;;;14047:9:0;12969:10;-1:-1:-1;;;;;14031:25:0;;14005:51;13997:75;;;;-1:-1:-1;;;13997:75:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34987:17:0;::::1;;::::0;;;:8:::1;:17;::::0;;;;:26;;;::::1;;;34986:27;34978:67;;;::::0;-1:-1:-1;;;34978:67:0;;7556:2:1;34978:67:0::1;::::0;::::1;7538:21:1::0;7595:2;7575:18;;;7568:30;7634:29;7614:18;;;7607:57;7681:18;;34978:67:0::1;7528:177:1::0;34978:67:0::1;-1:-1:-1::0;;;;;35056:17:0;::::1;;::::0;;;:8:::1;:17;::::0;;;;:33;;-1:-1:-1;;35056:33:0::1;::::0;::::1;::::0;;:26:::1;35103:24;::::0;:28;35100:121:::1;;35202:7;:5;:7::i;:::-;-1:-1:-1::0;;;;;35175:17:0;::::1;;::::0;;;:8:::1;:17;::::0;;;;:24:::1;;::::0;:34:::1;::::0;;::::1;:::i;:::-;-1:-1:-1::0;;;;;35148:17:0;::::1;;::::0;;;:8:::1;:17;::::0;;;;:24:::1;;:61:::0;35100:121:::1;-1:-1:-1::0;;;;;35231:17:0;::::1;;::::0;;;:8:::1;:17;::::0;;;;:33;;-1:-1:-1;;35231:33:0::1;::::0;::::1;::::0;;35275:44:::1;35293:16;35240:7:::0;35275:17:::1;:44::i;:::-;;34914:413:::0;:::o;36296:163::-;-1:-1:-1;;;;;36396:16:0;;36372:4;36396:16;;;:8;:16;;;;;:24;;;;:55;;-1:-1:-1;;;;;;36424:19:0;;;;;;:8;:19;;;;;:27;;;36396:55;36389:62;36296:163;-1:-1:-1;;;36296:163:0:o;28130:228::-;28196:7;28219:20;28231:7;28219:11;:20::i;:::-;28216:83;;;-1:-1:-1;;;;;;28263:17:0;;;;;;:8;:17;;;;;:24;;;28256:31;;28216:83;28343:7;:5;:7::i;:::-;-1:-1:-1;;;;;28316:17:0;;;;;;:8;:17;;;;;:24;;;:34;;;;:::i;14316:148::-;14005:6;;-1:-1:-1;;;;;14005:6:0;12969:10;14005:22;;:51;;-1:-1:-1;14047:9:0;;-1:-1:-1;;;;;14047:9:0;12969:10;-1:-1:-1;;;;;14031:25:0;;14005:51;13997:75;;;;-1:-1:-1;;;13997:75:0;;;;;;;:::i;:::-;14423:1:::1;14407:6:::0;;14386:40:::1;::::0;-1:-1:-1;;;;;14407:6:0;;::::1;::::0;14386:40:::1;::::0;14423:1;;14386:40:::1;14454:1;14437:19:::0;;-1:-1:-1;;;;;;14437:19:0::1;::::0;;14316:148::o;39257:135::-;39294:7;39315:9;39326;39339:22;:20;:22::i;:::-;39314:47;;-1:-1:-1;39314:47:0;-1:-1:-1;39379:5:0;39314:47;;39379:5;:::i;:::-;39372:12;;;;39257:135;:::o;36194:94::-;36232:7;36259:21;36277:1;36259:9;:21::i;30288:78::-;14005:6;;-1:-1:-1;;;;;14005:6:0;12969:10;14005:22;;:51;;-1:-1:-1;14047:9:0;;-1:-1:-1;;;;;14047:9:0;12969:10;-1:-1:-1;;;;;14031:25:0;;14005:51;13997:75;;;;-1:-1:-1;;;13997:75:0;;;;;;;:::i;:::-;30343:7:::1;:15:::0;;-1:-1:-1;;30343:15:0::1;::::0;;30288:78::o;14669:155::-;14005:6;;-1:-1:-1;;;;;14005:6:0;12969:10;14005:22;;:51;;-1:-1:-1;14047:9:0;;-1:-1:-1;;;;;14047:9:0;12969:10;-1:-1:-1;;;;;14031:25:0;;14005:51;13997:75;;;;-1:-1:-1;;;13997:75:0;;;;;;;:::i;:::-;14731:13:::1;::::0;-1:-1:-1;;;;;14731:13:0::1;14723:56;;;::::0;-1:-1:-1;;;14723:56:0;;5717:2:1;14723:56:0::1;::::0;::::1;5699:21:1::0;5756:2;5736:18;;;5729:30;-1:-1:-1;;;5775:18:1;;;5768:46;5831:18;;14723:56:0::1;5689:166:1::0;14723:56:0::1;14790:13;:26:::0;;-1:-1:-1;;;;;;14790:26:0::1;::::0;;14669:155::o;27828:87::-;27867:13;27900:7;27893:14;;;;;:::i;29101:226::-;12969:10;29194:4;29243:24;;;:10;:24;;;;;;;-1:-1:-1;;;;;29243:33:0;;;;;;;;;;29194:4;;29211:86;;29234:7;;29243:53;;29280:15;;29243:53;:::i;29451:168::-;29529:4;29546:43;12969:10;29571:9;29582:6;29546:10;:43::i;39400:75::-;39454:5;;;;;;;;;-1:-1:-1;;;;;39454:5:0;-1:-1:-1;;;;;39439:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39400:75::o;37066:620::-;37227:7;;37158:15;;;;-1:-1:-1;;;;;37217:17:0;;;37227:7;;37217:17;37214:446;;;-1:-1:-1;37255:22:0;37214:446;;;-1:-1:-1;;;;;37298:16:0;;;;;;:8;:16;;;;;:29;;;;;;37295:365;;;37347:17;;:29;;37344:114;;-1:-1:-1;37420:22:0;37344:114;-1:-1:-1;37476:19:0;37295:365;;;-1:-1:-1;;;;;37516:19:0;;;;;;:8;:19;;;;;:32;;;;;;37513:147;;;-1:-1:-1;37569:20:0;37513:147;;;-1:-1:-1;37626:22:0;37513:147;37677:1;37066:620;-1:-1:-1;;;;37066:620:0:o;36601:104::-;36646:23;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36646:23:0;-1:-1:-1;36682:15:0;;;;;;;;36689:8;36682:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36601:104;:::o;34573:333::-;14005:6;;-1:-1:-1;;;;;14005:6:0;12969:10;14005:22;;:51;;-1:-1:-1;14047:9:0;;-1:-1:-1;;;;;14047:9:0;12969:10;-1:-1:-1;;;;;14031:25:0;;14005:51;13997:75;;;;-1:-1:-1;;;13997:75:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34645:17:0;::::1;;::::0;;;:8:::1;:17;::::0;;;;:26;;;::::1;;;34637:66;;;::::0;-1:-1:-1;;;34637:66:0;;7556:2:1;34637:66:0::1;::::0;::::1;7538:21:1::0;7595:2;7575:18;;;7568:30;7634:29;7614:18;;;7607:57;7681:18;;34637:66:0::1;7528:177:1::0;34637:66:0::1;34759:7;:5;:7::i;:::-;34749:17;::::0;:7:::1;:17;:::i;:::-;-1:-1:-1::0;;;;;34722:17:0;::::1;;::::0;;;:8:::1;:17;::::0;;;;:24:::1;;::::0;:44:::1;34714:87;;;::::0;-1:-1:-1;;;34714:87:0;;8936:2:1;34714:87:0::1;::::0;::::1;8918:21:1::0;8975:2;8955:18;;;8948:30;9014:32;8994:18;;;8987:60;9064:18;;34714:87:0::1;8908:180:1::0;34714:87:0::1;-1:-1:-1::0;;;;;34812:17:0;::::1;34839:1;34812:17:::0;;;:8:::1;:17;::::0;;;;:24:::1;;:28:::0;34851:47:::1;34872:16;34821:7:::0;34851:20:::1;:47::i;35335:446::-:0;12969:10;35387:14;35442:7;:5;:7::i;:::-;35427:22;;35469:19;35481:6;35469:11;:19::i;:::-;35468:20;35460:76;;;;-1:-1:-1;;;35460:76:0;;10857:2:1;35460:76:0;;;10839:21:1;10896:2;10876:18;;;10869:30;10935:34;10915:18;;;10908:62;-1:-1:-1;;;10986:18:1;;;10979:41;11037:19;;35460:76:0;10829:233:1;35460:76:0;-1:-1:-1;;;;;35571:16:0;;;;;;:8;:16;;;;;:23;;;35555:13;35564:4;35555:6;:13;:::i;:::-;:39;35547:60;;;;-1:-1:-1;;;35547:60:0;;4166:2:1;35547:60:0;;;4148:21:1;4205:1;4185:18;;;4178:29;-1:-1:-1;;;4223:18:1;;;4216:38;4271:18;;35547:60:0;4138:157:1;35547:60:0;35646:13;35655:4;35646:6;:13;:::i;:::-;-1:-1:-1;;;;;35618:16:0;;;;;;:8;:16;;;;;:23;;:42;;:23;;:16;:42;;;;;:::i;:::-;;;;-1:-1:-1;35703:13:0;;-1:-1:-1;35712:4:0;35703:6;:13;:::i;:::-;35680:10;;-1:-1:-1;;;;;35680:10:0;35671:20;;;;:8;:20;;;;;:27;;:46;;:27;;:20;:46;;;;;:::i;:::-;;;;-1:-1:-1;;35754:10:0;;35733:40;;13931:25:1;;;-1:-1:-1;;;;;35754:10:0;;;;35742;;35733:40;;13919:2:1;13904:18;35733:40:0;;;;;;;;35335:446;;;:::o;14472:189::-;14005:6;;-1:-1:-1;;;;;14005:6:0;12969:10;14005:22;;:51;;-1:-1:-1;14047:9:0;;-1:-1:-1;;;;;14047:9:0;12969:10;-1:-1:-1;;;;;14031:25:0;;14005:51;13997:75;;;;-1:-1:-1;;;13997:75:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;14553:22:0;::::1;14545:73;;;::::0;-1:-1:-1;;;14545:73:0;;6405:2:1;14545:73:0::1;::::0;::::1;6387:21:1::0;6444:2;6424:18;;;6417:30;6483:34;6463:18;;;6456:62;-1:-1:-1;;;6534:18:1;;;6527:36;6580:19;;14545:73:0::1;6377:228:1::0;14545:73:0::1;14629:13;:24:::0;;-1:-1:-1;;;;;;14629:24:0::1;-1:-1:-1::0;;;;;14629:24:0;;;::::1;::::0;;;::::1;::::0;;14472:189::o;32404:940::-;32521:25;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32521:25:0;32548:18;32568:22;32608:38;32618:6;32626:9;32637:8;32608:9;:38::i;:::-;32603:43;;32666:28;32676:6;32684:9;32666;:28::i;:::-;32705:17;;;32657:37;-1:-1:-1;32737:5:0;32733:474;;32763:7;;;;32759:437;;32808:11;;32799:20;;:6;:20;:::i;:::-;32791:5;;;:28;32863:15;;32854:24;;:6;:24;:::i;:::-;32838:13;;;:40;32918:13;;32909:22;;:6;:22;:::i;:::-;32897:9;;;:34;32959:20;32953:2;:26;;;;;;-1:-1:-1;;;32953:26:0;;;;;;;;;;32950:108;;;33025:13;;33016:22;;:6;:22;:::i;:::-;33004:9;;;:34;32950:108;33085:19;33079:2;:25;;;;;;-1:-1:-1;;;33079:25:0;;;;;;;;;;33076:105;;;33149:8;:12;33140:21;;:6;:21;:::i;:::-;33129:8;;;:32;33076:105;33294:9;;;;33278:13;;;;33267:8;;;;33255:9;;;;33247:5;;;;33236:8;;:16;;33247:5;33236:16;:::i;:::-;:28;;;;:::i;:::-;:39;;;;:::i;:::-;:55;;;;:::i;:::-;:67;;;;:::i;:::-;33217:16;;;:86;32404:940;;;;;;;;;:::o;11308:152::-;11378:4;11402:50;11407:3;-1:-1:-1;;;;;11427:23:0;;11402:4;:50::i;28535:336::-;-1:-1:-1;;;;;28628:19:0;;28620:68;;;;-1:-1:-1;;;28620:68:0;;10452:2:1;28620:68:0;;;10434:21:1;10491:2;10471:18;;;10464:30;10530:34;10510:18;;;10503:62;-1:-1:-1;;;10581:18:1;;;10574:34;10625:19;;28620:68:0;10424:226:1;28620:68:0;-1:-1:-1;;;;;28707:21:0;;28699:68;;;;-1:-1:-1;;;28699:68:0;;6812:2:1;28699:68:0;;;6794:21:1;6851:2;6831:18;;;6824:30;6890:34;6870:18;;;6863:62;-1:-1:-1;;;6941:18:1;;;6934:32;6983:19;;28699:68:0;6784:224:1;28699:68:0;-1:-1:-1;;;;;28780:17:0;;;;;;;:10;:17;;;;;;;:26;;;;;;;;;;;;;:35;;;28831:32;;13931:25:1;;;28831:32:0;;13904:18:1;28831:32:0;13886:76:1;30374:2022:0;30462:4;-1:-1:-1;;;;;30487:20:0;;30479:70;;;;-1:-1:-1;;;30479:70:0;;10046:2:1;30479:70:0;;;10028:21:1;10085:2;10065:18;;;10058:30;10124:34;10104:18;;;10097:62;-1:-1:-1;;;10175:18:1;;;10168:35;10220:19;;30479:70:0;10018:227:1;30479:70:0;-1:-1:-1;;;;;30568:23:0;;30560:71;;;;-1:-1:-1;;;30560:71:0;;4905:2:1;30560:71:0;;;4887:21:1;4944:2;4924:18;;;4917:30;4983:34;4963:18;;;4956:62;-1:-1:-1;;;5034:18:1;;;5027:33;5077:19;;30560:71:0;4877:225:1;30560:71:0;30659:1;30650:6;:10;30642:64;;;;-1:-1:-1;;;30642:64:0;;9295:2:1;30642:64:0;;;9277:21:1;9334:2;9314:18;;;9307:30;9373:34;9353:18;;;9346:62;-1:-1:-1;;;9424:18:1;;;9417:39;9473:19;;30642:64:0;9267:231:1;30642:64:0;30726:50;30749:15;30766:9;30726:22;:50::i;:::-;30725:51;30717:76;;;;-1:-1:-1;;;30717:76:0;;7215:2:1;30717:76:0;;;7197:21:1;7254:2;7234:18;;;7227:30;-1:-1:-1;;;7273:18:1;;;7266:42;7325:18;;30717:76:0;7187:162:1;30717:76:0;30813:51;30836:15;30853:10;30813:22;:51::i;:::-;30812:52;30804:77;;;;-1:-1:-1;;;30804:77:0;;7215:2:1;30804:77:0;;;7197:21:1;7254:2;7234:18;;;7227:30;-1:-1:-1;;;7273:18:1;;;7266:42;7325:18;;30804:77:0;7187:162:1;30804:77:0;30905:5;;-1:-1:-1;;;;;30895:15:0;;;30905:5;;30895:15;30892:76;;;30927:29;30938:6;30946:9;30927:10;:29::i;:::-;30981:7;;;;30978:102;;;13833:7;13860:6;-1:-1:-1;;;;;31012:17:0;;;13860:6;;31012:17;;:39;;-1:-1:-1;31046:5:0;;-1:-1:-1;;;;;31033:18:0;;;31046:5;;31033:18;;31012:39;31004:64;;;;-1:-1:-1;;;31004:64:0;;8252:2:1;31004:64:0;;;8234:21:1;8291:2;8271:18;;;8264:30;-1:-1:-1;;;8310:18:1;;;8303:42;8362:18;;31004:64:0;8224:162:1;31004:64:0;31090:12;31105:7;:5;:7::i;:::-;31090:22;;31123:16;31142:17;:15;:17::i;:::-;31123:36;;31170:14;31187:30;31199:6;31207:9;31187:11;:30::i;:::-;31170:47;;31229:25;31256:18;31276:22;31302:53;31308:6;31316:9;31327:6;31335:9;31346:8;31302:5;:53::i;:::-;31366:17;:28;;;31228:127;;-1:-1:-1;31228:127:0;-1:-1:-1;31228:127:0;-1:-1:-1;31409:9:0;31405:880;;31483:4;31467:1;:13;;;:20;;;;:::i;:::-;31444:10;;-1:-1:-1;;;;;31444:10:0;31435:20;;;;:8;:20;;;;;:27;;:53;;:27;;:20;:53;;;;;:::i;:::-;;;;-1:-1:-1;;31535:9:0;;;;31534:18;;31548:4;;31534:18;:::i;:::-;31503:20;;;;:8;:20;;:27;:49;;:27;;:20;:49;;;;;:::i;:::-;;;;-1:-1:-1;;31599:9:0;;;;31567:20;;;;:8;:20;;:27;:42;;:27;;:20;:42;;31599:9;;31567:42;:::i;:::-;;;;-1:-1:-1;31633:20:0;;-1:-1:-1;31627:2:0;:26;;;;;;-1:-1:-1;;;31627:26:0;;;;;;;;;;31624:514;;;31718:4;31706:8;;31705:17;;;;:::i;:::-;31683:10;;-1:-1:-1;;;;;31683:10:0;31674:20;;;;:8;:20;;;;;:27;;:48;;:27;;:20;:48;;;;;:::i;:::-;;;;-1:-1:-1;;31773:8:0;;31750:10;;-1:-1:-1;;;;;31750:10:0;31741:20;;;;:8;:20;;;;;31750:10;31741:27;:41;;:27;;:20;:41;;31773:8;;31741:41;:::i;:::-;;;;-1:-1:-1;;31812:1:0;31801:8;:12;31624:514;;;31844:19;31838:2;:25;;;;;;-1:-1:-1;;;31838:25:0;;;;;;;;;;31835:303;;;31925:4;31914:8;;:15;;;;:::i;:::-;-1:-1:-1;;;;;31884:19:0;;;;;;:8;:19;;;;;:26;;:45;;:26;;:19;:45;;;;;:::i;:::-;;;;-1:-1:-1;;31948:4:0;:6;;;:4;:6;;;:::i;31835:303::-;32086:4;32075:8;;:15;;;;:::i;:::-;32043:20;;;;:8;:20;;:27;:48;;:27;;:20;:48;;;;;:::i;:::-;;;;-1:-1:-1;;32121:1:0;32110:8;:12;31835:303;32175:1;:8;;;32163:1;:9;;;:20;;;;:::i;:::-;32152:8;:31;32215:5;;;;32198:13;:22;;:13;;:22;;32215:5;;32198:22;:::i;:::-;;;;-1:-1:-1;;32261:5:0;;;;:12;;32269:4;;32261:12;:::i;:::-;32235:22;:38;;:22;;:38;;;;;:::i;:::-;;;;-1:-1:-1;;31405:880:0;32295:45;32305:6;32313:9;32324:4;32330:1;32333:6;32295:9;:45::i;:::-;32351:10;:15;;32364:2;;32351:10;-1:-1:-1;;32351:15:0;;32364:2;32351:15;;;;;;-1:-1:-1;;;32351:15:0;;;;;;;;;;;;;-1:-1:-1;32384:4:0;;30374:2022;-1:-1:-1;;;;;;;;;;30374:2022:0:o;11809:117::-;11872:7;11899:19;11907:3;10268:18;;10185:109;11934:158;12008:7;12059:22;12063:3;12075:5;12059:3;:22::i;11468:158::-;11541:4;11565:53;11573:3;-1:-1:-1;;;;;11593:23:0;;11565:7;:53::i;8065:414::-;8128:4;10145:19;;;:12;;;:19;;;;;;8145:327;;-1:-1:-1;8188:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;8371:18;;8349:19;;;:12;;;:19;;;;;;:40;;;;8404:11;;8145:327;-1:-1:-1;8455:5:0;8448:12;;11634:167;-1:-1:-1;;;;;11768:23:0;;11714:4;10145:19;;;:12;;;:19;;;;;;:24;;11738:55;10048:129;29903:314;29984:7;;;;29981:229;;;30027:8;:20;30055:3;;30027:24;;30050:1;;30027:24;:::i;:::-;30026:32;;;;:::i;:::-;30016:6;:42;;30008:69;;;;-1:-1:-1;;;30008:69:0;;8593:2:1;30008:69:0;;;8575:21:1;8632:2;8612:18;;;8605:30;-1:-1:-1;;;8651:18:1;;;8644:44;8705:18;;30008:69:0;8565:164:1;30008:69:0;30123:8;:20;30151:3;;30123:24;;30146:1;;30123:24;:::i;:::-;30122:32;;;;:::i;:::-;30100:18;30110:7;30100:9;:18::i;:::-;:54;;30092:106;;;;-1:-1:-1;;;30092:106:0;;5309:2:1;30092:106:0;;;5291:21:1;5348:2;5328:18;;;5321:30;5387:34;5367:18;;;5360:62;-1:-1:-1;;;5438:18:1;;;5431:37;5485:19;;30092:106:0;5281:229:1;33352:1213:0;33505:26;33495:6;:36;;;;;;-1:-1:-1;;;33495:36:0;;;;;;;;;;33491:1006;;;33583:8;;:15;;33594:4;;33583:15;:::i;:::-;-1:-1:-1;;;;;33548:16:0;;;;;;:8;:16;;;;;:23;;:50;;:23;;:16;:50;;;;;:::i;:::-;;;;-1:-1:-1;;33649:16:0;;;;;-1:-1:-1;;;;;33613:19:0;;;;;;:8;:19;;;;;;:26;;:53;;33649:16;;33613:26;;:53;;33649:16;;33613:53;:::i;:::-;;;;-1:-1:-1;;33716:16:0;;;;:23;;33735:4;;33716:23;:::i;:::-;-1:-1:-1;;;;;33681:19:0;;;;;;:8;:19;;;;;:26;;:58;;:26;;:19;:58;;;;;:::i;:::-;;;;-1:-1:-1;33491:1006:0;;-1:-1:-1;33491:1006:0;;33771:28;33761:6;:38;;;;;;-1:-1:-1;;;33761:38:0;;;;;;;;;;33757:740;;;33851:8;;-1:-1:-1;;;;;33816:16:0;;33851:8;33816:16;;;:8;:16;;;;;:23;;:43;;:23;;33851:8;33816:43;;33851:8;;33816:43;:::i;:::-;;;;-1:-1:-1;;33909:8:0;;:15;;33920:4;;33909:15;:::i;:::-;-1:-1:-1;;;;;33874:16:0;;;;;;:8;:16;;;;;:23;;:50;;:23;;:16;:50;;;;;:::i;33757:740::-;34029:28;34019:6;:38;;;;;;-1:-1:-1;;;34019:38:0;;;;;;;;;;34015:482;;;34109:8;;-1:-1:-1;;;;;34074:16:0;;34109:8;34074:16;;;:8;:16;;;;;:23;;:43;;:23;;34109:8;34074:43;;34109:8;;34074:43;:::i;:::-;;;;-1:-1:-1;;34168:8:0;;:15;;34179:4;;34168:15;:::i;34015:482::-;34394:8;;:15;;34405:4;;34394:15;:::i;:::-;-1:-1:-1;;;;;34358:16:0;;;;;;:8;:16;;;;;:23;;:52;;:23;;:16;:52;;;;;:::i;:::-;;;;-1:-1:-1;;34461:16:0;;;;:23;;34480:4;;34461:23;:::i;:::-;-1:-1:-1;;;;;34425:19:0;;;;;;:8;:19;;;;;:26;;:60;;:26;;:19;:60;;;;;:::i;:::-;;;;-1:-1:-1;;34015:482:0;34529:9;-1:-1:-1;;;;;34512:45:0;34521:6;-1:-1:-1;;;;;34512:45:0;;34540:1;:16;;;34512:45;;;;13931:25:1;;13919:2;13904:18;;13886:76;34512:45:0;;;;;;;;33352:1213;;;;;:::o;10302:204::-;10397:18;;10369:7;;10397:26;-1:-1:-1;10389:73:0;;;;-1:-1:-1;;;10389:73:0;;4502:2:1;10389:73:0;;;4484:21:1;4541:2;4521:18;;;4514:30;4580:34;4560:18;;;4553:62;-1:-1:-1;;;4631:18:1;;;4624:32;4673:19;;10389:73:0;4474:224:1;10389:73:0;10480:3;:11;;10492:5;10480:18;;;;;;-1:-1:-1;;;10480:18:0;;;;;;;;;;;;;;;;;10473:25;;10302:204;;;;:::o;8487:1553::-;8553:4;8692:19;;;:12;;;:19;;;;;;8728:15;;8724:1309;;9090:21;9114:14;9127:1;9114:10;:14;:::i;:::-;9163:18;;9090:38;;-1:-1:-1;9143:17:0;;9163:22;;9184:1;;9163:22;:::i;:::-;9143:42;;9430:17;9450:3;:11;;9462:9;9450:22;;;;;;-1:-1:-1;;;9450:22:0;;;;;;;;;;;;;;;;;9430:42;;9596:9;9567:3;:11;;9579:13;9567:26;;;;;;-1:-1:-1;;;9567:26:0;;;;;;;;;;;;;;;;;;;;:38;;;;9673:23;;;:12;;;:23;;;;;;:36;;;9834:17;;9673:3;;9834:17;;;-1:-1:-1;;;9834:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;9929:3;:12;;:19;9942:5;9929:19;;;;;;;;;;;9922:26;;;9972:4;9965:11;;;;;;;;8724:1309;10016:5;10009:12;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:2;;177:1;174;167:12;192:196;;304:2;292:9;283:7;279:23;275:32;272:2;;;325:6;317;310:22;272:2;353:29;372:9;353:29;:::i;393:270::-;;;522:2;510:9;501:7;497:23;493:32;490:2;;;543:6;535;528:22;490:2;571:29;590:9;571:29;:::i;:::-;561:39;;619:38;653:2;642:9;638:18;619:38;:::i;:::-;609:48;;480:183;;;;;:::o;668:338::-;;;;814:2;802:9;793:7;789:23;785:32;782:2;;;835:6;827;820:22;782:2;863:29;882:9;863:29;:::i;:::-;853:39;;911:38;945:2;934:9;930:18;911:38;:::i;:::-;901:48;;996:2;985:9;981:18;968:32;958:42;;772:234;;;;;:::o;1011:579::-;;;;;;1188:3;1176:9;1167:7;1163:23;1159:33;1156:2;;;1210:6;1202;1195:22;1156:2;1238:29;1257:9;1238:29;:::i;:::-;1228:39;;1286:38;1320:2;1309:9;1305:18;1286:38;:::i;:::-;1276:48;;1371:2;1360:9;1356:18;1343:32;1333:42;;1425:2;1414:9;1410:18;1397:32;1472:5;1465:13;1458:21;1451:5;1448:32;1438:2;;1499:6;1491;1484:22;1438:2;1146:444;;;;-1:-1:-1;1146:444:1;;1579:3;1564:19;1551:33;;1146:444;-1:-1:-1;;1146:444:1:o;1595:264::-;;;1724:2;1712:9;1703:7;1699:23;1695:32;1692:2;;;1745:6;1737;1730:22;1692:2;1773:29;1792:9;1773:29;:::i;:::-;1763:39;1849:2;1834:18;;;;1821:32;;-1:-1:-1;;;1682:177:1:o;1864:190::-;;1976:2;1964:9;1955:7;1951:23;1947:32;1944:2;;;1997:6;1989;1982:22;1944:2;-1:-1:-1;2025:23:1;;1934:120;-1:-1:-1;1934:120:1:o;2059:194::-;;2182:2;2170:9;2161:7;2157:23;2153:32;2150:2;;;2203:6;2195;2188:22;2150:2;-1:-1:-1;2231:16:1;;2140:113;-1:-1:-1;2140:113:1:o;2258:137::-;2336:1;2329:5;2326:12;2316:2;;2342:18;;:::i;:::-;2371;;2306:89::o;2400:137::-;2478:1;2471:5;2468:12;2458:2;;2484:18;;:::i;2942:202::-;3085:2;3070:18;;3097:41;3074:9;3120:6;3097:41;:::i;3149:202::-;3292:2;3277:18;;3304:41;3281:9;3327:6;3304:41;:::i;3356:603::-;;3497:2;3526;3515:9;3508:21;3558:6;3552:13;3601:6;3596:2;3585:9;3581:18;3574:34;3626:4;3639:140;3653:6;3650:1;3647:13;3639:140;;;3748:14;;;3744:23;;3738:30;3714:17;;;3733:2;3710:26;3703:66;3668:10;;3639:140;;;3797:6;3794:1;3791:13;3788:2;;;3867:4;3862:2;3853:6;3842:9;3838:22;3834:31;3827:45;3788:2;-1:-1:-1;3943:2:1;3922:15;-1:-1:-1;;3918:29:1;3903:45;;;;3950:2;3899:54;;3477:482;-1:-1:-1;;;3477:482:1:o;7710:335::-;7912:2;7894:21;;;7951:2;7931:18;;;7924:30;-1:-1:-1;;;7985:2:1;7970:18;;7963:41;8036:2;8021:18;;7884:161::o;12658:1122::-;;12916:3;12905:9;12901:19;12893:27;;12953:6;12947:13;12936:9;12929:32;13017:4;13009:6;13005:17;12999:24;12992:4;12981:9;12977:20;12970:54;13080:4;13072:6;13068:17;13062:24;13055:4;13044:9;13040:20;13033:54;13143:4;13135:6;13131:17;13125:24;13118:4;13107:9;13103:20;13096:54;13206:4;13198:6;13194:17;13188:24;13181:4;13170:9;13166:20;13159:54;13269:4;13261:6;13257:17;13251:24;13244:4;13233:9;13229:20;13222:54;13332:4;13324:6;13320:17;13314:24;13307:4;13296:9;13292:20;13285:54;13395:4;13387:6;13383:17;13377:24;13370:4;13359:9;13355:20;13348:54;13421:6;13481:2;13473:6;13469:15;13463:22;13458:2;13447:9;13443:18;13436:50;;13505:6;13565:2;13557:6;13553:15;13547:22;13542:2;13531:9;13527:18;13520:50;;13589:6;13649:2;13641:6;13637:15;13631:22;13626:2;13615:9;13611:18;13604:50;;13663:51;13709:3;13698:9;13694:19;13686:6;13663:51;:::i;:::-;13723;13769:3;13758:9;13754:19;13746:6;13723:51;:::i;14409:128::-;;14480:1;14476:6;14473:1;14470:13;14467:2;;;14486:18;;:::i;:::-;-1:-1:-1;14522:9:1;;14457:80::o;14542:217::-;;14608:1;14598:2;;-1:-1:-1;;;14633:31:1;;14687:4;14684:1;14677:15;14715:4;14640:1;14705:15;14598:2;-1:-1:-1;14744:9:1;;14588:171::o;14764:168::-;;14870:1;14866;14862:6;14858:14;14855:1;14852:21;14847:1;14840:9;14833:17;14829:45;14826:2;;;14877:18;;:::i;:::-;-1:-1:-1;14917:9:1;;14816:116::o;14937:125::-;;15005:1;15002;14999:8;14996:2;;;15010:18;;:::i;:::-;-1:-1:-1;15047:9:1;;14986:76::o;15067:380::-;15146:1;15142:12;;;;15189;;;15210:2;;15264:4;15256:6;15252:17;15242:27;;15210:2;15317;15309:6;15306:14;15286:18;15283:38;15280:2;;;15363:10;15358:3;15354:20;15351:1;15344:31;15398:4;15395:1;15388:15;15426:4;15423:1;15416:15;15280:2;;15122:325;;;:::o;15452:135::-;;-1:-1:-1;;15512:17:1;;15509:2;;;15532:18;;:::i;:::-;-1:-1:-1;15579:1:1;15568:13;;15499:88::o;15592:127::-;15653:10;15648:3;15644:20;15641:1;15634:31;15684:4;15681:1;15674:15;15708:4;15705:1;15698:15;15724:127;15785:10;15780:3;15776:20;15773:1;15766:31;15816:4;15813:1;15806:15;15840:4;15837:1;15830:15

Swarm Source

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