ETH Price: $3,407.73 (-1.60%)
Gas: 8 Gwei

Token

CatDoge (CDETH)
 

Overview

Max Total Supply

333,420,069 CDETH

Holders

228

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
mushroomchad.eth
Balance
0.442645695093411142 CDETH

Value
$0.00
0x39cc23e8b2e829a5d6b340e8a738fb2965c211f2
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:
CatDoge

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

pragma solidity 0.8.20;

// SPDX-License-Identifier: MIT

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;
    }
}

interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

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

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

interface IERC20Metadata is IERC20{
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the default value returned by this function, unless
     * it's overridden.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(address from, address to, uint256 amount) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }

        emit Transfer(from, to, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _totalSupply += amount;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 amount) internal virtual {
        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);
    }

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }
}

contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    function owner() public view returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    function renounceOwnership() external virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

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

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

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

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

    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

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

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

library SafeERC20 {
    using Address for address;

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

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

    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }

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

interface ILpPair {
    function sync() external;
    function mint(address to) external returns (uint liquidity);
}

interface IDexRouter {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function swapExactTokensForETHSupportingFeeOnTransferTokens(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 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 IDexFactory {
    function createPair(address tokenA, address tokenB) external returns (address pair);
}

library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, 'SafeMath: addition overflow');

        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, 'SafeMath: subtraction overflow');
    }

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

        return c;
    }

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

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

        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, 'SafeMath: division by zero');
    }

    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, 'SafeMath: modulo by zero');
    }

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

    function min(uint256 x, uint256 y) internal pure returns (uint256 z) {
        z = x < y ? x : y;
    }

    function sqrt(uint256 y) internal pure returns (uint256 z) {
        if (y > 3) {
            z = y;
            uint256 x = y / 2 + 1;
            while (x < z) {
                z = x;
                x = (y / x + x) / 2;
            }
        } else if (y != 0) {
            z = 1;
        }
    }
}

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

    /**
     * @dev Multiplies two int256 variables and fails on overflow.
     */
    function mul(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a * b;

        // Detect overflow when multiplying MIN_INT256 with -1
        require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256));
        require((b == 0) || (c / b == a));
        return c;
    }

    /**
     * @dev Division of two int256 variables and fails on overflow.
     */
    function div(int256 a, int256 b) internal pure returns (int256) {
        // Prevent overflow when dividing MIN_INT256 by -1
        require(b != -1 || a != MIN_INT256);

        // Solidity already throws when dividing by 0.
        return a / b;
    }

    /**
     * @dev Subtracts two int256 variables and fails on overflow.
     */
    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require((b >= 0 && c <= a) || (b < 0 && c > a));
        return c;
    }

    /**
     * @dev Adds two int256 variables and fails on overflow.
     */
    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        require((b >= 0 && c >= a) || (b < 0 && c < a));
        return c;
    }

    /**
     * @dev Converts to absolute value, and fails on overflow.
     */
    function abs(int256 a) internal pure returns (int256) {
        require(a != MIN_INT256);
        return a < 0 ? -a : a;
    }


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

library SafeMathUint {
  function toInt256Safe(uint256 a) internal pure returns (int256) {
    int256 b = int256(a);
    require(b >= 0);
    return b;
  }
}

interface DividendPayingContractOptionalInterface {
  function withdrawableDividendOf(address _owner) external view returns(uint256);
  function withdrawnDividendOf(address _owner) external view returns(uint256);
  function accumulativeDividendOf(address _owner) external view returns(uint256);
}

interface DividendPayingContractInterface {
  function dividendOf(address _owner) external view returns(uint256);
  function distributeDividends() external payable;
  function withdrawDividend() external;
  event DividendsDistributed(
    address indexed from,
    uint256 weiAmount
  );
  event DividendWithdrawn(
    address indexed to,
    uint256 weiAmount
  );
}

contract DividendPayingContract is DividendPayingContractInterface, DividendPayingContractOptionalInterface, Ownable {
    using SafeMath for uint256;
    using SafeMathUint for uint256;
    using SafeMathInt for int256;

    uint256 constant internal magnitude = 2**128;

    uint256 internal magnifiedDividendPerShare;
                                                                            
    mapping(address => int256) internal magnifiedDividendCorrections;
    mapping(address => uint256) internal withdrawnDividends;
    
    mapping (address => uint256) public holderBalance;
    uint256 public totalBalance;

    uint256 public totalDividendsDistributed;

    receive() external payable {
        distributeDividends();
    }

    function distributeDividends() public override payable {
        if(totalBalance > 0 && msg.value > 0){
            magnifiedDividendPerShare = magnifiedDividendPerShare.add(
                (msg.value).mul(magnitude) / totalBalance
            );
            emit DividendsDistributed(msg.sender, msg.value);

            totalDividendsDistributed = totalDividendsDistributed.add(msg.value);
        }
    }

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

    function _withdrawDividendOfUser(address payable user) internal returns (uint256) {
        uint256 _withdrawableDividend = withdrawableDividendOf(user);
        if (_withdrawableDividend > 0) {
        withdrawnDividends[user] = withdrawnDividends[user].add(_withdrawableDividend);

        emit DividendWithdrawn(user, _withdrawableDividend);
        (bool success,) = user.call{value: _withdrawableDividend}("");

        if(!success) {
            withdrawnDividends[user] = withdrawnDividends[user].sub(_withdrawableDividend);
            return 0;
        }

        return _withdrawableDividend;
        }

        return 0;
    }

    function withdrawDividendOfUserForCompound(address payable user) external onlyOwner returns (uint256 _withdrawableDividend) {
        _withdrawableDividend = withdrawableDividendOf(user);
        if (_withdrawableDividend > 0) {
            withdrawnDividends[user] = withdrawnDividends[user] + _withdrawableDividend;
            emit DividendWithdrawn(user, _withdrawableDividend);
        }
        (bool success,) = owner().call{value: _withdrawableDividend}("");
        if(!success) {
            withdrawnDividends[user] = withdrawnDividends[user].sub(_withdrawableDividend);
            return 0;
        }
    }

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

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

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

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

    function _increase(address account, uint256 value) internal {
        magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account]
        .sub( (magnifiedDividendPerShare.mul(value)).toInt256Safe() );
    }

    function _reduce(address account, uint256 value) internal {
        magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account]
        .add( (magnifiedDividendPerShare.mul(value)).toInt256Safe() );
    }

    function _setBalance(address account, uint256 newBalance) internal {
        uint256 currentBalance = holderBalance[account];
        holderBalance[account] = newBalance;
        if(newBalance > currentBalance) {
        uint256 increaseAmount = newBalance.sub(currentBalance);
        _increase(account, increaseAmount);
        totalBalance += increaseAmount;
        } else if(newBalance < currentBalance) {
        uint256 reduceAmount = currentBalance.sub(newBalance);
        _reduce(account, reduceAmount);
        totalBalance -= reduceAmount;
        }
    }
}


contract DividendTracker is DividendPayingContract {

    event Claim(address indexed account, uint256 amount, bool indexed automatic);

    mapping (address => bool) public excludedFromDividends;

    constructor() {}

    function getAccount(address _account)
        public view returns (
            address account,
            uint256 withdrawableDividends,
            uint256 totalDividends,
            uint256 balance) {
        account = _account;

        withdrawableDividends = withdrawableDividendOf(account);
        totalDividends = accumulativeDividendOf(account);

        balance = holderBalance[account];
    }
    function setBalance(address payable account, uint256 newBalance) external onlyOwner {
        if(excludedFromDividends[account]) {
    		return;
    	}

        _setBalance(account, newBalance);

    	processAccount(account, true);
    }
    
    function processAccount(address payable account, bool automatic) public onlyOwner returns (bool) {
        uint256 amount = _withdrawDividendOfUser(account);

    	if(amount > 0) {
            emit Claim(account, amount, automatic);
    		return true;
    	}

    	return false;
    }

    function getTotalDividendsDistributed() external view returns (uint256) {
        return totalDividendsDistributed;
    }

	function dividendTokenBalanceOf(address account) public view returns (uint256) {
		return holderBalance[account];
	}

    function getNumberOfDividends() external view returns(uint256) {
        return totalBalance;
    }

    function excludeFromDividends(address account) external onlyOwner {
    	excludedFromDividends[account] = true;

    	_setBalance(account, 0);
    }

    function includeInDividends(address account) external onlyOwner {
    	require(excludedFromDividends[account]);
    	excludedFromDividends[account] = false;
        _setBalance(account, IERC20(owner()).balanceOf(account)); // sets balance back to token balance
    }
}

interface IWETH {
    function deposit() external payable;
    function transfer(address to, uint value) external returns (bool);
    function withdraw(uint) external;
}

contract CatDoge is ERC20, Ownable {

    mapping (address => bool) public exemptFromFees;
    mapping (address => bool) public exemptFromLimits;

    bool public tradingAllowed;

    mapping (address => bool) public isAMMPair;

    address public marketingAddress;

    DividendTracker public dividendTracker;

    Taxes public buyTax;
    Taxes public sellTax;

    TokensForTax public tokensForTax;

    bool public limited = true;

    uint256 public swapTokensAtAmt;

    address public lpPair;
    IDexRouter internal dexRouter;
    IWETH internal immutable WETH;

    mapping(address => uint256) private _holderLastTransferBlock; // to hold last Transfers temporarily during launch
    bool public transferDelayEnabled = true;
    mapping(uint256 => mapping(uint256 => uint256)) public gweiMapping;

    TxLimits public txLimits;

    uint64 public constant FEE_DIVISOR = 10000;

    // structs

    struct TxLimits {
        uint128 transactionLimit;
        uint128 walletLimit;
    }

    struct Taxes {
        uint48 marketingTax;
        uint48 revShareTax;
        uint48 totalTax;
    }

    struct TokensForTax {
        uint64 tokensForMarketing;
        uint64 tokensForRevShare;
        bool gasSaver;
    }

    uint256 public launchTime;
    bool public dynamicTaxOn;

    // events

    event UpdatedTransactionLimit(uint newMax);
    event UpdatedWalletLimit(uint newMax);
    event SetExemptFromFees(address _address, bool _isExempt);
    event SetExemptFromLimits(address _address, bool _isExempt);
    event RemovedLimits();
    event UpdatedBuyTax(uint newAmt);
    event UpdatedSellTax(uint newAmt);

    // constructor

    constructor()
        ERC20("CatDoge", "CDETH")
    {   
        address _v2Router;

        // @dev assumes WETH pair
        if(block.chainid == 1){
            _v2Router = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
        } else if(block.chainid == 5){
            _v2Router = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
        } else {
            revert("Chain not configured");
        }

        dividendTracker = new DividendTracker();

        dynamicTaxOn = true;

        dexRouter = IDexRouter(_v2Router);

        marketingAddress = 0x56D162Db97b099bc71cF71eEA5F59c1dC511c837;
        address buyBackAddress = 0x44c5Cb3a16B4D46F47cAc68121dd3f64b7bfedC9;

        uint256 _totalSupply = 333_420_069 * 1e18;
        _mint(buyBackAddress, _totalSupply * 4 / 100);
        _mint(marketingAddress, _totalSupply * 4 / 100);
        _mint(address(this), 223_391_446 * 1e18);
        _mint(msg.sender, _totalSupply - balanceOf(marketingAddress) - balanceOf(buyBackAddress) - balanceOf(address(this)));
        
        dividendTracker.setBalance(payable(buyBackAddress), balanceOf(buyBackAddress));

        txLimits.transactionLimit = uint128(totalSupply() * 1 / 100);
        txLimits.walletLimit = uint128(totalSupply() * 2 / 100);
        swapTokensAtAmt = totalSupply() * 25 / 100000;

        buyTax.marketingTax = 900;
        buyTax.revShareTax = 0;
        buyTax.totalTax = buyTax.marketingTax + buyTax.revShareTax;

        sellTax.marketingTax = 2000;
        sellTax.revShareTax = 0;
        sellTax.totalTax = sellTax.marketingTax + sellTax.revShareTax;

        tokensForTax.gasSaver = true;

        WETH = IWETH(dexRouter.WETH());
        lpPair = IDexFactory(dexRouter.factory()).createPair(address(this), address(WETH));

        isAMMPair[lpPair] = true;

        exemptFromLimits[lpPair] = true;
        exemptFromLimits[msg.sender] = true;
        exemptFromLimits[address(this)] = true;

        exemptFromFees[msg.sender] = true;
        exemptFromFees[address(this)] = true;

        dividendTracker.excludeFromDividends(address(this));
        dividendTracker.excludeFromDividends(address(lpPair));
        dividendTracker.excludeFromDividends(msg.sender);
        dividendTracker.excludeFromDividends(marketingAddress);

 
        _approve(address(this), address(dexRouter), type(uint256).max);
        _approve(address(msg.sender), address(dexRouter), totalSupply());
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual override {
        
        if(!exemptFromFees[from] && !exemptFromFees[to]){
            require(tradingAllowed, "Trading not active");
            checkLimits(from, to, amount);
            amount -= handleTax(from, to, amount);
        }

        super._transfer(from,to,amount);

        dividendTracker.setBalance(payable(to), balanceOf(to));
        dividendTracker.setBalance(payable(from), balanceOf(from));
    }

    function checkLimits(address from, address to, uint256 amount) internal {
        if(limited){
            bool exFromLimitsTo = exemptFromLimits[to];
            uint256 balanceOfTo = balanceOf(to);
            TxLimits memory _txLimits = txLimits;
            // buy
            if (isAMMPair[from] && !exFromLimitsTo) {
                require(amount <= _txLimits.transactionLimit, "Max Txn");
                require(amount + balanceOfTo <= _txLimits.walletLimit, "Max Wallet");
            } 
            // sell
            else if (isAMMPair[to] && !exemptFromLimits[from]) {
                require(amount <= _txLimits.transactionLimit, "Max Txn");
            }
            else if(!exFromLimitsTo) {
                require(amount + balanceOfTo <= _txLimits.walletLimit, "Max Wallet");
            }

            if (transferDelayEnabled){
                if (to != address(dexRouter) && to != address(lpPair)){
                    require(_holderLastTransferBlock[tx.origin] < block.number, "Transfer Delay enabled");
                    require(tx.origin == to, "no buying to external wallets yet");
                    _holderLastTransferBlock[tx.origin] = block.number;
                    if(launchTime + 60 >= block.timestamp){
                        require(gweiMapping[tx.gasprice][amount] < block.number, "Dupe Txn");
                        gweiMapping[tx.gasprice][amount] = block.number;
                    }
                }
            }
        }
    }

    function handleTax(address from, address to, uint256 amount) internal returns (uint256){

        if(balanceOf(address(this)) >= swapTokensAtAmt && !isAMMPair[from]) {
            convertTaxes();
        }

        if(dynamicTaxOn){
            setInternalTaxes();
        }
        
        uint128 tax = 0;

        Taxes memory taxes;

        if (isAMMPair[to]){
            taxes = sellTax;
        } else if(isAMMPair[from]){
            taxes = buyTax;
        }

        if(taxes.totalTax > 0){
            TokensForTax memory tokensForTaxUpdate = tokensForTax;
            tax = uint128(amount * taxes.totalTax / FEE_DIVISOR);
            tokensForTaxUpdate.tokensForMarketing += uint64(tax * taxes.marketingTax / taxes.totalTax / 1e9);
            tokensForTaxUpdate.tokensForRevShare += uint64(tax * taxes.revShareTax / taxes.totalTax / 1e9);
            tokensForTax = tokensForTaxUpdate;
            super._transfer(from, address(this), tax);
        }
        
        return tax;
    }

    function swapTokensForETH(uint256 tokenAmt) private {

        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = address(WETH);

        dexRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmt,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function convertTaxes() private {

        uint256 contractBalance = balanceOf(address(this));
        TokensForTax memory tokensForTaxMem = tokensForTax;
        uint256 totalTokensToSwap = tokensForTaxMem.tokensForMarketing + tokensForTaxMem.tokensForRevShare;
        
        if(contractBalance == 0 || totalTokensToSwap == 0) {return;}

        if(contractBalance > swapTokensAtAmt * 40){
            contractBalance = swapTokensAtAmt * 40;
        }
        if(contractBalance > 0){

            swapTokensForETH(contractBalance);
            
            uint256 ethBalance = address(this).balance;

            bool success;

            if(tokensForTaxMem.tokensForRevShare > 0){
                (success,) = address(dividendTracker).call{value: ethBalance * tokensForTaxMem.tokensForRevShare/ totalTokensToSwap}("");  
            }

            ethBalance = address(this).balance;

            if(ethBalance > 0){
                (success,) = marketingAddress.call{value: ethBalance}("");  
            }
        }

        tokensForTaxMem.tokensForMarketing = 0;
        tokensForTaxMem.tokensForRevShare = 0;
        tokensForTax = tokensForTaxMem;
    }

    // owner functions
    function setExemptFromFee(address _address, bool _isExempt) external onlyOwner {
        require(_address != address(0), "Zero Address");
        require(_address != address(this), "Cannot unexempt contract");
        exemptFromFees[_address] = _isExempt;
        emit SetExemptFromFees(_address, _isExempt);
    }

    function setExemptFromLimit(address _address, bool _isExempt) external onlyOwner {
        require(_address != address(0), "Zero Address");
        if(!_isExempt){
            require(_address != lpPair, "Cannot remove pair");
        }
        exemptFromLimits[_address] = _isExempt;
        emit SetExemptFromLimits(_address, _isExempt);
    }

    function updateTransactionLimit(uint128 newNumInTokens) external onlyOwner {
        require(newNumInTokens >= (totalSupply() * 1 / 100)/(10**decimals()), "Too low");
        txLimits.transactionLimit = uint128(newNumInTokens * (10**decimals()));
        emit UpdatedTransactionLimit(txLimits.transactionLimit);
    }

    function updateWalletLimit(uint128 newNumInTokens) external onlyOwner {
        require(newNumInTokens >= (totalSupply() * 1 / 100)/(10**decimals()), "Too low");
        txLimits.walletLimit = uint128(newNumInTokens * (10**decimals()));
        emit UpdatedWalletLimit(txLimits.walletLimit);
    }

    function updateSwapTokensAmt(uint256 newAmount) external onlyOwner {
        require(newAmount >= (totalSupply() * 1) / 100000, "Swap amount cannot be lower than 0.001% total supply.");
        require(newAmount <= (totalSupply() * 5) / 1000, "Swap amount cannot be higher than 0.5% total supply.");
        swapTokensAtAmt = newAmount;
    }

    function updateBuyTax(uint48 _marketingTax, uint48 _revShareTax) external onlyOwner {
        Taxes memory taxes;
        taxes.marketingTax = _marketingTax;
        taxes.revShareTax = _revShareTax;
        taxes.totalTax = _marketingTax + _revShareTax;
        require(taxes.totalTax  <= 300, "Keep tax below 3%");
        emit UpdatedBuyTax(taxes.totalTax);
        buyTax = taxes;
    }

    function updateSellTax(uint48 _marketingTax, uint48 _revShareTax) external onlyOwner {
        Taxes memory taxes;
        taxes.marketingTax = _marketingTax;
        taxes.revShareTax = _revShareTax;
        taxes.totalTax = _marketingTax + _revShareTax;
        require(taxes.totalTax  <= 300, "Keep tax below 3%");
        emit UpdatedSellTax(taxes.totalTax);
        sellTax = taxes;
    }

    function enableTrading() external onlyOwner {
        require(!tradingAllowed, "Trading already live");
        tradingAllowed = true;
        launchTime = block.timestamp;
    }

    function removeTransferDelay() external onlyOwner {
        require(transferDelayEnabled, "Already disabled");
        transferDelayEnabled = false;
    }

    function removeDynamicTax() external onlyOwner {
        require(dynamicTaxOn, "Already disabled");
        dynamicTaxOn = false;
    }

    function removeLimits() external onlyOwner {
        limited = false;
        transferDelayEnabled = false;
        TxLimits memory _txLimits;
        uint256 supply = totalSupply();
        _txLimits.transactionLimit = uint128(supply);
        _txLimits.walletLimit = uint128(supply);
        txLimits = _txLimits;
        emit RemovedLimits();
    }

    function airdropToWallets(address[] calldata wallets, uint256[] calldata amountsInWei) external onlyOwner {
        require(wallets.length == amountsInWei.length, "arrays length mismatch");
        require(!tradingAllowed, "Cannot airdrop after trading enabled");
        address wallet;
        uint256 amount;
        for(uint256 i = 0; i < wallets.length; i++){
            wallet = wallets[i];
            amount = amountsInWei[i];
            super._transfer(msg.sender, wallet, amountsInWei[i]);
            dividendTracker.setBalance(payable(wallet), amount);
        }
    }

    function rescueTokens(address _token, address _to) external onlyOwner {
        require(_token != address(0), "_token address cannot be 0");
        require(_token != address(this), "_token address cannot be native token");
        uint256 _contractBalance = IERC20(_token).balanceOf(address(this));
        SafeERC20.safeTransfer(IERC20(_token),_to, _contractBalance);
    }

    function updateMarketingAddress(address _address) external onlyOwner {
        require(_address != address(0), "zero address");
        marketingAddress = _address;
    }

    function setInternalTaxes() internal {
        Taxes memory newBuyTax = buyTax;
        Taxes memory newSellTax = sellTax;
        uint256 currentTime = block.timestamp;
        uint256 timeSinceLaunch = currentTime - launchTime;
        if(timeSinceLaunch >= 45 minutes){
            dynamicTaxOn = false;
            newBuyTax.marketingTax = 150;
            newBuyTax.revShareTax = 150;
            newBuyTax.totalTax = 300;
            newSellTax.marketingTax = 150;
            newSellTax.revShareTax = 150;
            newSellTax.totalTax = 300;
        } else if (timeSinceLaunch >= 30 minutes){
            newBuyTax.marketingTax = 500;
            newBuyTax.revShareTax = 0;
            newBuyTax.totalTax = 500;
            newSellTax.marketingTax = 1000;
            newSellTax.revShareTax = 0;
            newSellTax.totalTax = 1000;
        } else if (timeSinceLaunch >= 15 minutes){
            newBuyTax.marketingTax = 700;
            newBuyTax.revShareTax = 0;
            newBuyTax.totalTax = 700;
            newSellTax.marketingTax = 1500;
            newSellTax.totalTax = 1500;
        }
        if(buyTax.totalTax != newBuyTax.totalTax){
            buyTax = newBuyTax;
        }
        if(sellTax.totalTax != newSellTax.totalTax){
            sellTax = newSellTax;
        }
    }

    receive() payable external {}

    // dividend functions

    function claim() external {
        dividendTracker.processAccount(payable(msg.sender), false);
    }

    function getTotalDividendsDistributed() external view returns (uint256) {
        return dividendTracker.totalDividendsDistributed();
    }

    function withdrawableDividendOf(address account) public view returns(uint256) {
    	return dividendTracker.withdrawableDividendOf(account);
  	}

	function dividendTokenBalanceOf(address account) public view returns (uint256) {
		return dividendTracker.holderBalance(account);
	}

    function getAccountDividendsInfo(address account)
        external view returns (
            address,
            uint256,
            uint256,
            uint256) {
        return dividendTracker.getAccount(account);
    }
    
    function getNumberOfDividends() external view returns(uint256) {
        return dividendTracker.totalBalance();
    }

    function excludeFromDividends(address _wallet) external onlyOwner {
        dividendTracker.excludeFromDividends(_wallet);
    }

     function includeInDividends(address _wallet) external onlyOwner {
        dividendTracker.includeInDividends(_wallet);
    }

    function compound(uint256 minOutput) external {
        uint256 amountEthForCompound = dividendTracker.withdrawDividendOfUserForCompound(payable(msg.sender));
        if(amountEthForCompound > 0){
            buyBackTokens(amountEthForCompound, minOutput, msg.sender);
        } else {
            revert("No rewards");
        }
    }

    function buyBackTokens(uint256 ethAmountInWei, uint256 minOut, address to) internal {
        // generate the uniswap pair path of weth -> eth
        address[] memory path = new address[](2);
        path[0] = dexRouter.WETH();
        path[1] = address(this);

        // make the swap
        dexRouter.swapExactETHForTokensSupportingFeeOnTransferTokens{value: ethAmountInWei}(
            minOut,
            path,
            address(to),
            block.timestamp
        );
    }

    // helper views

    function getExpectedCompoundOutputByEthAmount(uint256 rewardAmount) external view returns(uint256) {
        address[] memory path = new address[](2);
        path[0] = dexRouter.WETH();
        path[1] = address(this);
        uint256[] memory amounts = dexRouter.getAmountsOut(rewardAmount, path);
        return amounts[1] - (amounts[1] * (buyTax.totalTax + 50) / FEE_DIVISOR);
    }

    function getExpectedCompoundOutputByWallet(address wallet) external view returns(uint256) {
        uint256 rewardAmount = withdrawableDividendOf(wallet);
        address[] memory path = new address[](2);
        path[0] = dexRouter.WETH();
        path[1] = address(this);
        uint256[] memory amounts = dexRouter.getAmountsOut(rewardAmount, path);
        return amounts[1] - (amounts[1] * (buyTax.totalTax + 50) / FEE_DIVISOR);
    }

    function addLp(address _to) external onlyOwner payable {
        require(address(this).balance > 0 && balanceOf(address(this)) > 0);

        WETH.deposit{value: address(this).balance}();

        super._transfer(address(this), address(lpPair), balanceOf(address(this)));
        IERC20(address(WETH)).transfer(address(lpPair), IERC20(address(WETH)).balanceOf(address(this)));
        ILpPair(lpPair).mint(_to);
    }
}

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":[],"name":"RemovedLimits","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_address","type":"address"},{"indexed":false,"internalType":"bool","name":"_isExempt","type":"bool"}],"name":"SetExemptFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_address","type":"address"},{"indexed":false,"internalType":"bool","name":"_isExempt","type":"bool"}],"name":"SetExemptFromLimits","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newAmt","type":"uint256"}],"name":"UpdatedBuyTax","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newAmt","type":"uint256"}],"name":"UpdatedSellTax","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMax","type":"uint256"}],"name":"UpdatedTransactionLimit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMax","type":"uint256"}],"name":"UpdatedWalletLimit","type":"event"},{"inputs":[],"name":"FEE_DIVISOR","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"addLp","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"wallets","type":"address[]"},{"internalType":"uint256[]","name":"amountsInWei","type":"uint256[]"}],"name":"airdropToWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTax","outputs":[{"internalType":"uint48","name":"marketingTax","type":"uint48"},{"internalType":"uint48","name":"revShareTax","type":"uint48"},{"internalType":"uint48","name":"totalTax","type":"uint48"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"minOutput","type":"uint256"}],"name":"compound","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":"address","name":"account","type":"address"}],"name":"dividendTokenBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendTracker","outputs":[{"internalType":"contract DividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dynamicTaxOn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"excludeFromDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"exemptFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"exemptFromLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAccountDividendsInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rewardAmount","type":"uint256"}],"name":"getExpectedCompoundOutputByEthAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"getExpectedCompoundOutputByWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfDividends","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalDividendsDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"gweiMapping","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"includeInDividends","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":"","type":"address"}],"name":"isAMMPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limited","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeDynamicTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeTransferDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"rescueTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellTax","outputs":[{"internalType":"uint48","name":"marketingTax","type":"uint48"},{"internalType":"uint48","name":"revShareTax","type":"uint48"},{"internalType":"uint48","name":"totalTax","type":"uint48"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_isExempt","type":"bool"}],"name":"setExemptFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_isExempt","type":"bool"}],"name":"setExemptFromLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapTokensAtAmt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForTax","outputs":[{"internalType":"uint64","name":"tokensForMarketing","type":"uint64"},{"internalType":"uint64","name":"tokensForRevShare","type":"uint64"},{"internalType":"bool","name":"gasSaver","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferDelayEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"txLimits","outputs":[{"internalType":"uint128","name":"transactionLimit","type":"uint128"},{"internalType":"uint128","name":"walletLimit","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint48","name":"_marketingTax","type":"uint48"},{"internalType":"uint48","name":"_revShareTax","type":"uint48"}],"name":"updateBuyTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"updateMarketingAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint48","name":"_marketingTax","type":"uint48"},{"internalType":"uint48","name":"_revShareTax","type":"uint48"}],"name":"updateSellTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateSwapTokensAmt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"newNumInTokens","type":"uint128"}],"name":"updateTransactionLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"newNumInTokens","type":"uint128"}],"name":"updateWalletLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawableDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a0604052600f8054600160ff1991821681179092556014805490911690911790553480156200002d575f80fd5b5060405180604001604052806007815260200166436174446f676560c81b81525060405180604001604052806005815260200164086888aa8960db1b81525081600390816200007d919062000b40565b5060046200008c828262000b40565b5050505f620000a0620008a060201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250905f907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3505f46600103620001135750737a250d5630b4cf539739df2c5dacb4c659f2488d62000185565b46600503620001385750737a250d5630b4cf539739df2c5dacb4c659f2488d62000185565b60405162461bcd60e51b815260206004820152601460248201527f436861696e206e6f7420636f6e6669677572656400000000000000000000000060448201526064015b60405180910390fd5b604051620001939062000a92565b604051809103905ff080158015620001ad573d5f803e3d5ffd5b50600b80546001600160a01b039283166001600160a01b0319918216179091556018805460ff191660011790556012805492841692821692909217909155600a80549091167356d162db97b099bc71cf71eea5f59c1dc511c8371790557344c5cb3a16b4d46f47cac68121dd3f64b7bfedc96b0113cc722872e827c9740000620002528260646200024084600462000c1c565b6200024c919062000c3c565b620008a4565b600a5462000272906001600160a01b031660646200024084600462000c1c565b62000289306ab8c8fa8dab3933e5980000620008a4565b305f90815260208190526040808220546001600160a01b03858116845282842054600a5490911684529190922054620002e49233929091620002cc908662000c5c565b620002d8919062000c5c565b6200024c919062000c5c565b600b546001600160a01b031663e30443bc8362000315816001600160a01b03165f9081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015f604051808303815f87803b15801562000359575f80fd5b505af11580156200036c573d5f803e3d5ffd5b505050506064620003826200096560201b60201c565b6200038f90600162000c1c565b6200039b919062000c3c565b601680546001600160801b0319166001600160801b03929092169190911790556064620003c760025490565b620003d490600262000c1c565b620003e0919062000c3c565b601680546001600160801b03928316600160801b029216919091179055620186a06200040b60025490565b6200041890601962000c1c565b62000424919062000c3c565b601055600c80546001600160601b031916610384908117918290556200045d916601000000000000900465ffffffffffff169062000c72565b600c805465ffffffffffff60601b19166c0100000000000000000000000065ffffffffffff93841602179055600d80546107d06001600160601b0319909116811791829055620004bc9266010000000000009092049091169062000c72565b600d805465ffffffffffff929092166c010000000000000000000000000265ffffffffffff60601b19909216919091179055600e805460ff60801b1916600160801b179055601254604080516315ab88c960e31b815290516001600160a01b039092169163ad5c4648916004808201926020929091908290030181865afa1580156200054a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000570919062000c9b565b6001600160a01b039081166080526012546040805163c45a015560e01b81529051919092169163c45a01559160048083019260209291908290030181865afa158015620005bf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620005e5919062000c9b565b6080516040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303815f875af115801562000634573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200065a919062000c9b565b601180546001600160a01b0319166001600160a01b0392831690811782555f908152600960209081526040808320805460ff19908116600190811790925594548616845260078352818420805486168217905533808552828520805487168317905530808652838620805488168417905590855260069093528184208054861682179055828452928190208054909416909217909255600b54905163031e79db60e41b81526004810192909252909116906331e79db0906024015f604051808303815f87803b1580156200072c575f80fd5b505af11580156200073f573d5f803e3d5ffd5b5050600b5460115460405163031e79db60e41b81526001600160a01b039182166004820152911692506331e79db091506024015f604051808303815f87803b1580156200078a575f80fd5b505af11580156200079d573d5f803e3d5ffd5b5050600b5460405163031e79db60e41b81523360048201526001600160a01b0390911692506331e79db091506024015f604051808303815f87803b158015620007e4575f80fd5b505af1158015620007f7573d5f803e3d5ffd5b5050600b54600a5460405163031e79db60e41b81526001600160a01b039182166004820152911692506331e79db091506024015f604051808303815f87803b15801562000842575f80fd5b505af115801562000855573d5f803e3d5ffd5b50506012546200087492503091506001600160a01b03165f196200096b565b601254620008979033906001600160a01b03166200089160025490565b6200096b565b50505062000ce0565b3390565b6001600160a01b038216620008fc5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016200017c565b8060025f8282546200090f919062000cca565b90915550506001600160a01b0382165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b60025490565b6001600160a01b038316620009cf5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016200017c565b6001600160a01b03821662000a325760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016200017c565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b61114c8062004f3983390190565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168062000ac957607f821691505b60208210810362000ae857634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000b3b575f81815260208120601f850160051c8101602086101562000b165750805b601f850160051c820191505b8181101562000b375782815560010162000b22565b5050505b505050565b81516001600160401b0381111562000b5c5762000b5c62000aa0565b62000b748162000b6d845462000ab4565b8462000aee565b602080601f83116001811462000baa575f841562000b925750858301515b5f19600386901b1c1916600185901b17855562000b37565b5f85815260208120601f198616915b8281101562000bda5788860151825594840194600190910190840162000bb9565b508582101562000bf857878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b808202811582820484141762000c365762000c3662000c08565b92915050565b5f8262000c5757634e487b7160e01b5f52601260045260245ffd5b500490565b8181038181111562000c365762000c3662000c08565b65ffffffffffff81811683821601908082111562000c945762000c9462000c08565b5092915050565b5f6020828403121562000cac575f80fd5b81516001600160a01b038116811462000cc3575f80fd5b9392505050565b8082018082111562000c365762000c3662000c08565b60805161423262000d075f395f8181610ba901528181610c58015261386301526142325ff3fe608060405260043610610374575f3560e01c8063751039fc116101c8578063a9059cbb116100fd578063c876d0b91161009d578063f270fde41161006d578063f270fde414610aa3578063f2fde38b14610aed578063f8686f0714610b0c578063fe40fd7114610b20575f80fd5b8063c876d0b914610a18578063cc1776d314610a31578063ccad03e114610a65578063dd62ed3e14610a84575f80fd5b8063b0249cc6116100d8578063b0249cc614610997578063bedafd01146109c5578063c0f306ef146109e4578063c78d0fa014610a03575f80fd5b8063a9059cbb14610910578063aa5f7e261461092f578063ad56c13c1461094e575f80fd5b806395d89b4111610168578063a457c2d711610143578063a457c2d714610894578063a5ece941146108b3578063a7630da9146108d2578063a8b9d240146108f1575f80fd5b806395d89b411461083f5780639e7261af146108535780639e93ad8e14610867575f80fd5b8063860a32ec116101a3578063860a32ec146107c75780638a8c523c146107e05780638d3e6e40146107f45780638da5cb5b14610822575f80fd5b8063751039fc1461077f578063790ca413146107935780637c174e87146107a8575f80fd5b806336e18e19116102a95780635431c94e116102495780636d7adcad116102195780636d7adcad146106d957806370a0823114610738578063715018a61461075757806371778e7d1461076b575f80fd5b80635431c94e1461064e5780635a90a49e1461066d57806366ebd39a1461069b5780636843cd84146106ba575f80fd5b8063452ed4f111610284578063452ed4f1146105a55780634e71d92d146105c45780634f7041a5146105d857806353371be014610635575f80fd5b806336e18e191461054857806339509351146105675780633fe79e1d14610586575f80fd5b80632369bf831161031457806330bb4cff116102ef57806330bb4cff146104e1578063313ce567146104f557806331e79db014610510578063362919a71461052f575f80fd5b80632369bf831461046c57806323b872dd1461048b5780632c1f5216146104aa575f80fd5b8063095ea7b31161034f578063095ea7b3146103eb57806318160ddd1461041a578063210459181461042e5780632307b4411461044d575f80fd5b806306f200031461037f57806306fdde031461039457806308f2f233146103be575f80fd5b3661037b57005b5f80fd5b61039261038d366004613a8b565b610b56565b005b34801561039f575f80fd5b506103a8610dab565b6040516103b59190613acf565b60405180910390f35b3480156103c9575f80fd5b506103dd6103d8366004613a8b565b610e3b565b6040519081526020016103b5565b3480156103f6575f80fd5b5061040a610405366004613b01565b611029565b60405190151581526020016103b5565b348015610425575f80fd5b506002546103dd565b348015610439575f80fd5b50610392610448366004613b2b565b611042565b348015610458575f80fd5b50610392610467366004613b89565b61118d565b348015610477575f80fd5b50610392610486366004613a8b565b61134e565b348015610496575f80fd5b5061040a6104a5366004613bef565b6113df565b3480156104b5575f80fd5b50600b546104c9906001600160a01b031681565b6040516001600160a01b0390911681526020016103b5565b3480156104ec575f80fd5b506103dd611402565b348015610500575f80fd5b50604051601281526020016103b5565b34801561051b575f80fd5b5061039261052a366004613a8b565b611472565b34801561053a575f80fd5b5060185461040a9060ff1681565b348015610553575f80fd5b50610392610562366004613c2d565b6114fa565b348015610572575f80fd5b5061040a610581366004613b01565b611611565b348015610591575f80fd5b506103926105a0366004613c6d565b611632565b3480156105b0575f80fd5b506011546104c9906001600160a01b031681565b3480156105cf575f80fd5b50610392611772565b3480156105e3575f80fd5b50600c5461060c9065ffffffffffff80821691600160301b8104821691600160601b9091041683565b6040805165ffffffffffff948516815292841660208401529216918101919091526060016103b5565b348015610640575f80fd5b5060085461040a9060ff1681565b348015610659575f80fd5b50610392610668366004613c9e565b6117e6565b348015610678575f80fd5b5061040a610687366004613a8b565b60066020525f908152604090205460ff1681565b3480156106a6575f80fd5b506103926106b5366004613c2d565b611946565b3480156106c5575f80fd5b506103dd6106d4366004613a8b565b611a59565b3480156106e4575f80fd5b50600e54610710906001600160401b0380821691600160401b810490911690600160801b900460ff1683565b604080516001600160401b0394851681529390921660208401521515908201526060016103b5565b348015610743575f80fd5b506103dd610752366004613a8b565b611ac6565b348015610762575f80fd5b50610392611ae0565b348015610776575f80fd5b506103dd611b53565b34801561078a575f80fd5b50610392611b9a565b34801561079e575f80fd5b506103dd60175481565b3480156107b3575f80fd5b506103dd6107c2366004613b2b565b611c45565b3480156107d2575f80fd5b50600f5461040a9060ff1681565b3480156107eb575f80fd5b50610392611e26565b3480156107ff575f80fd5b5061040a61080e366004613a8b565b60076020525f908152604090205460ff1681565b34801561082d575f80fd5b506005546001600160a01b03166104c9565b34801561084a575f80fd5b506103a8611ead565b34801561085e575f80fd5b50610392611ebc565b348015610872575f80fd5b5061087c61271081565b6040516001600160401b0390911681526020016103b5565b34801561089f575f80fd5b5061040a6108ae366004613b01565b611f37565b3480156108be575f80fd5b50600a546104c9906001600160a01b031681565b3480156108dd575f80fd5b506103926108ec366004613c6d565b611fb1565b3480156108fc575f80fd5b506103dd61090b366004613a8b565b6120f1565b34801561091b575f80fd5b5061040a61092a366004613b01565b612123565b34801561093a575f80fd5b50610392610949366004613b2b565b612130565b348015610959575f80fd5b5061096d610968366004613a8b565b6121e3565b604080516001600160a01b03909516855260208501939093529183015260608201526080016103b5565b3480156109a2575f80fd5b5061040a6109b1366004613a8b565b60096020525f908152604090205460ff1681565b3480156109d0575f80fd5b506103926109df366004613ce2565b612264565b3480156109ef575f80fd5b506103926109fe366004613a8b565b61238e565b348015610a0e575f80fd5b506103dd60105481565b348015610a23575f80fd5b5060145461040a9060ff1681565b348015610a3c575f80fd5b50600d5461060c9065ffffffffffff80821691600160301b8104821691600160601b9091041683565b348015610a70575f80fd5b50610392610a7f366004613ce2565b6123ea565b348015610a8f575f80fd5b506103dd610a9e366004613c9e565b61250c565b348015610aae575f80fd5b50601654610acd906001600160801b0380821691600160801b90041682565b604080516001600160801b039384168152929091166020830152016103b5565b348015610af8575f80fd5b50610392610b07366004613a8b565b612536565b348015610b17575f80fd5b50610392612620565b348015610b2b575f80fd5b506103dd610b3a366004613d0e565b601560209081525f928352604080842090915290825290205481565b6005546001600160a01b03163314610b895760405162461bcd60e51b8152600401610b8090613d2e565b60405180910390fd5b5f47118015610b9f57505f610b9d30611ac6565b115b610ba7575f80fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0476040518263ffffffff1660e01b81526004015f604051808303818588803b158015610c00575f80fd5b505af1158015610c12573d5f803e3d5ffd5b5050601154610c3893503092506001600160a01b03169050610c3382611ac6565b61269b565b6011546040516370a0823160e01b81523060048201526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263a9059cbb9291169083906370a0823190602401602060405180830381865afa158015610ca9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ccd9190613d63565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303815f875af1158015610d15573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d399190613d7a565b506011546040516335313c2160e11b81526001600160a01b03838116600483015290911690636a627842906024016020604051808303815f875af1158015610d83573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610da79190613d63565b5050565b606060038054610dba90613d95565b80601f0160208091040260200160405190810160405280929190818152602001828054610de690613d95565b8015610e315780601f10610e0857610100808354040283529160200191610e31565b820191905f5260205f20905b815481529060010190602001808311610e1457829003601f168201915b5050505050905090565b5f80610e46836120f1565b6040805160028082526060820183529293505f9290916020830190803683375050601254604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015610eb2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ed69190613de1565b815f81518110610ee857610ee8613dfc565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110610f1c57610f1c613dfc565b6001600160a01b03928316602091820292909201015260125460405163d06ca61f60e01b81525f92919091169063d06ca61f90610f5f9086908690600401613e52565b5f60405180830381865afa158015610f79573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610fa09190810190613e6a565b600c5490915061271090610fc490600160601b900465ffffffffffff166032613f36565b65ffffffffffff1682600181518110610fdf57610fdf613dfc565b6020026020010151610ff19190613f5c565b610ffb9190613f87565b8160018151811061100e5761100e613dfc565b60200260200101516110209190613f9a565b95945050505050565b5f3361103681858561283e565b60019150505b92915050565b6005546001600160a01b0316331461106c5760405162461bcd60e51b8152600401610b8090613d2e565b620186a061107960025490565b611084906001613f5c565b61108e9190613f87565b8110156110fb5760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610b80565b6103e861110760025490565b611112906005613f5c565b61111c9190613f87565b8111156111885760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171a92903a37ba30b61039bab838363c9760611b6064820152608401610b80565b601055565b6005546001600160a01b031633146111b75760405162461bcd60e51b8152600401610b8090613d2e565b8281146111ff5760405162461bcd60e51b81526020600482015260166024820152750c2e4e4c2f2e640d8cadccee8d040dad2e6dac2e8c6d60531b6044820152606401610b80565b60085460ff161561125e5760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f742061697264726f702061667465722074726164696e6720656e61604482015263189b195960e21b6064820152608401610b80565b5f805f5b858110156113455786868281811061127c5761127c613dfc565b90506020020160208101906112919190613a8b565b92508484828181106112a5576112a5613dfc565b9050602002013591506112d133848787858181106112c5576112c5613dfc565b9050602002013561269b565b600b546040516338c110ef60e21b81526001600160a01b038581166004830152602482018590529091169063e30443bc906044015f604051808303815f87803b15801561131c575f80fd5b505af115801561132e573d5f803e3d5ffd5b50505050808061133d90613fad565b915050611262565b50505050505050565b6005546001600160a01b031633146113785760405162461bcd60e51b8152600401610b8090613d2e565b6001600160a01b0381166113bd5760405162461bcd60e51b815260206004820152600c60248201526b7a65726f206164647265737360a01b6044820152606401610b80565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b5f336113ec858285612961565b6113f78585856129d9565b506001949350505050565b600b54604080516342d359d760e11b815290515f926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015611449573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061146d9190613d63565b905090565b6005546001600160a01b0316331461149c5760405162461bcd60e51b8152600401610b8090613d2e565b600b5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024015b5f604051808303815f87803b1580156114e1575f80fd5b505af11580156114f3573d5f803e3d5ffd5b5050505050565b6005546001600160a01b031633146115245760405162461bcd60e51b8152600401610b8090613d2e565b6115306012600a6140a5565b606461153b60025490565b611546906001613f5c565b6115509190613f87565b61155a9190613f87565b816001600160801b0316101561159c5760405162461bcd60e51b8152602060048201526007602482015266546f6f206c6f7760c81b6044820152606401610b80565b6115a86012600a6140a5565b6115bb906001600160801b038316613f5c565b601680546001600160801b0319166001600160801b039290921691821790556040519081527f6710da7d4acedae09cb83751ae24c150719ef67dcbc1e02049f171d13c6b44e6906020015b60405180910390a150565b5f33611036818585611623838361250c565b61162d91906140b3565b61283e565b6005546001600160a01b0316331461165c5760405162461bcd60e51b8152600401610b8090613d2e565b604080516060810182525f9181019190915265ffffffffffff83811682528216602082015261168b8284613f36565b65ffffffffffff166040820181905261012c10156116df5760405162461bcd60e51b81526020600482015260116024820152704b656570207461782062656c6f7720332560781b6044820152606401610b80565b604080820151905165ffffffffffff90911681527fa02824f65350567bc405e202b741e7ca6274004a9feeb44149df72b8bd599c979060200160405180910390a18051600d8054602084015160409094015165ffffffffffff908116600160601b0265ffffffffffff60601b19958216600160301b026001600160601b0319909316919094161717929092161790555050565b600b5460405163bc4c4b3760e01b81523360048201525f60248201526001600160a01b039091169063bc4c4b37906044016020604051808303815f875af11580156117bf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117e39190613d7a565b50565b6005546001600160a01b031633146118105760405162461bcd60e51b8152600401610b8090613d2e565b6001600160a01b0382166118665760405162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f7420626520300000000000006044820152606401610b80565b306001600160a01b038316036118cc5760405162461bcd60e51b815260206004820152602560248201527f5f746f6b656e20616464726573732063616e6e6f74206265206e6174697665206044820152643a37b5b2b760d91b6064820152608401610b80565b6040516370a0823160e01b81523060048201525f906001600160a01b038416906370a0823190602401602060405180830381865afa158015611910573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119349190613d63565b9050611941838383612b79565b505050565b6005546001600160a01b031633146119705760405162461bcd60e51b8152600401610b8090613d2e565b61197c6012600a6140a5565b606461198760025490565b611992906001613f5c565b61199c9190613f87565b6119a69190613f87565b816001600160801b031610156119e85760405162461bcd60e51b8152602060048201526007602482015266546f6f206c6f7760c81b6044820152606401610b80565b6119f46012600a6140a5565b611a07906001600160801b038316613f5c565b601680546001600160801b03908116600160801b93821684021791829055604051929091041681527fde064515fae8f8bb6d8ff19d2c6ba704322def7494147d8a971266430ade078890602001611606565b600b5460405163156dbbf560e31b81526001600160a01b0383811660048301525f92169063ab6ddfa8906024015b602060405180830381865afa158015611aa2573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061103c9190613d63565b6001600160a01b03165f9081526020819052604090205490565b6005546001600160a01b03163314611b0a5760405162461bcd60e51b8152600401610b8090613d2e565b6005546040515f916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b600b546040805163ad7a672f60e01b815290515f926001600160a01b03169163ad7a672f9160048083019260209291908290030181865afa158015611449573d5f803e3d5ffd5b6005546001600160a01b03163314611bc45760405162461bcd60e51b8152600401610b8090613d2e565b600f805460ff19908116909155601480549091169055604080518082019091525f80825260208201525f611bf760025490565b6001600160801b03811680845260208401819052600160801b8102176016556040519091507fa4ffae85e880608d5d4365c2b682786545d136145537788e7e0940dff9f0b98c905f90a15050565b6040805160028082526060820183525f92839291906020830190803683375050601254604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015611cb0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cd49190613de1565b815f81518110611ce657611ce6613dfc565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110611d1a57611d1a613dfc565b6001600160a01b03928316602091820292909201015260125460405163d06ca61f60e01b81525f92919091169063d06ca61f90611d5d9087908690600401613e52565b5f60405180830381865afa158015611d77573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d9e9190810190613e6a565b600c5490915061271090611dc290600160601b900465ffffffffffff166032613f36565b65ffffffffffff1682600181518110611ddd57611ddd613dfc565b6020026020010151611def9190613f5c565b611df99190613f87565b81600181518110611e0c57611e0c613dfc565b6020026020010151611e1e9190613f9a565b949350505050565b6005546001600160a01b03163314611e505760405162461bcd60e51b8152600401610b8090613d2e565b60085460ff1615611e9a5760405162461bcd60e51b815260206004820152601460248201527354726164696e6720616c7265616479206c69766560601b6044820152606401610b80565b6008805460ff1916600117905542601755565b606060048054610dba90613d95565b6005546001600160a01b03163314611ee65760405162461bcd60e51b8152600401610b8090613d2e565b60185460ff16611f2b5760405162461bcd60e51b815260206004820152601060248201526f105b1c9958591e48191a5cd8589b195960821b6044820152606401610b80565b6018805460ff19169055565b5f3381611f44828661250c565b905083811015611fa45760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610b80565b6113f7828686840361283e565b6005546001600160a01b03163314611fdb5760405162461bcd60e51b8152600401610b8090613d2e565b604080516060810182525f9181019190915265ffffffffffff83811682528216602082015261200a8284613f36565b65ffffffffffff166040820181905261012c101561205e5760405162461bcd60e51b81526020600482015260116024820152704b656570207461782062656c6f7720332560781b6044820152606401610b80565b604080820151905165ffffffffffff90911681527f5380a61520019ce8270d583f62f1b2b9f4f4372e1acaaf708f4865cecece05089060200160405180910390a18051600c8054602084015160409094015165ffffffffffff908116600160601b0265ffffffffffff60601b19958216600160301b026001600160601b0319909316919094161717929092161790555050565b600b546040516302a2e74960e61b81526001600160a01b0383811660048301525f92169063a8b9d24090602401611a87565b5f336110368185856129d9565b600b5460405163dcb95ed960e01b81523360048201525f916001600160a01b03169063dcb95ed9906024016020604051808303815f875af1158015612177573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061219b9190613d63565b905080156121ae57610da7818333612bcb565b60405162461bcd60e51b815260206004820152600a6024820152694e6f207265776172647360b01b6044820152606401610b80565b600b5460405163fbcbc0f160e01b81526001600160a01b0383811660048301525f92839283928392169063fbcbc0f190602401608060405180830381865afa158015612231573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061225591906140c6565b93509350935093509193509193565b6005546001600160a01b0316331461228e5760405162461bcd60e51b8152600401610b8090613d2e565b6001600160a01b0382166122d35760405162461bcd60e51b815260206004820152600c60248201526b5a65726f204164647265737360a01b6044820152606401610b80565b306001600160a01b0383160361232b5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420756e6578656d707420636f6e747261637400000000000000006044820152606401610b80565b6001600160a01b0382165f81815260066020908152604091829020805460ff19168515159081179091558251938452908301527f998cce27cbf44405c67eb636a634d5e2f2e6ff248b3d71fbbbb022f3c4c6dd2d91015b60405180910390a15050565b6005546001600160a01b031633146123b85760405162461bcd60e51b8152600401610b8090613d2e565b600b5460405163c0f306ef60e01b81526001600160a01b0383811660048301529091169063c0f306ef906024016114ca565b6005546001600160a01b031633146124145760405162461bcd60e51b8152600401610b8090613d2e565b6001600160a01b0382166124595760405162461bcd60e51b815260206004820152600c60248201526b5a65726f204164647265737360a01b6044820152606401610b80565b806124b1576011546001600160a01b03908116908316036124b15760405162461bcd60e51b815260206004820152601260248201527121b0b73737ba103932b6b7bb32903830b4b960711b6044820152606401610b80565b6001600160a01b0382165f81815260076020908152604091829020805460ff19168515159081179091558251938452908301527f8f9f40630a1d139e6cf69b4f447ca47a36f10a017524efaa38252e516fa227ce9101612382565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6005546001600160a01b031633146125605760405162461bcd60e51b8152600401610b8090613d2e565b6001600160a01b0381166125c55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b80565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b0316331461264a5760405162461bcd60e51b8152600401610b8090613d2e565b60145460ff1661268f5760405162461bcd60e51b815260206004820152601060248201526f105b1c9958591e48191a5cd8589b195960821b6044820152606401610b80565b6014805460ff19169055565b6001600160a01b0383166126ff5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610b80565b6001600160a01b0382166127615760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610b80565b6001600160a01b0383165f90815260208190526040902054818110156127d85760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610b80565b6001600160a01b038481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a350505050565b6001600160a01b0383166128a05760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610b80565b6001600160a01b0382166129015760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610b80565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b5f61296c848461250c565b90505f1981146129d357818110156129c65760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610b80565b6129d3848484840361283e565b50505050565b6001600160a01b0383165f9081526006602052604090205460ff16158015612a1957506001600160a01b0382165f9081526006602052604090205460ff16155b15612a885760085460ff16612a655760405162461bcd60e51b815260206004820152601260248201527154726164696e67206e6f742061637469766560701b6044820152606401610b80565b612a70838383612d15565b612a7b8383836130ac565b612a859082613f9a565b90505b612a9383838361269b565b600b546001600160a01b031663e30443bc83612aae81611ac6565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015f604051808303815f87803b158015612af1575f80fd5b505af1158015612b03573d5f803e3d5ffd5b5050600b546001600160a01b0316915063e30443bc905084612b2481611ac6565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015f604051808303815f87803b158015612b67575f80fd5b505af1158015611345573d5f803e3d5ffd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261194190849061335c565b6040805160028082526060820183525f926020830190803683375050601254604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015612c32573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c569190613de1565b815f81518110612c6857612c68613dfc565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110612c9c57612c9c613dfc565b6001600160a01b03928316602091820292909201015260125460405163b6f9de9560e01b815291169063b6f9de95908690612ce1908790869088904290600401614102565b5f604051808303818588803b158015612cf8575f80fd5b505af1158015612d0a573d5f803e3d5ffd5b505050505050505050565b600f5460ff1615611941576001600160a01b0382165f9081526007602052604081205460ff1690612d4584611ac6565b6040805180820182526016546001600160801b038082168352600160801b909104166020808301919091526001600160a01b0389165f908152600990915291909120549192509060ff168015612d99575082155b15612e3a5780516001600160801b0316841115612de25760405162461bcd60e51b815260206004820152600760248201526626b0bc102a3c3760c91b6044820152606401610b80565b60208101516001600160801b0316612dfa83866140b3565b1115612e355760405162461bcd60e51b815260206004820152600a60248201526913585e0815d85b1b195d60b21b6044820152606401610b80565b612f1a565b6001600160a01b0385165f9081526009602052604090205460ff168015612e7957506001600160a01b0386165f9081526007602052604090205460ff16155b15612ec25780516001600160801b0316841115612e355760405162461bcd60e51b815260206004820152600760248201526626b0bc102a3c3760c91b6044820152606401610b80565b82612f1a5760208101516001600160801b0316612edf83866140b3565b1115612f1a5760405162461bcd60e51b815260206004820152600a60248201526913585e0815d85b1b195d60b21b6044820152606401610b80565b60145460ff16156130a4576012546001600160a01b03868116911614801590612f5157506011546001600160a01b03868116911614155b156130a457325f908152601360205260409020544311612fac5760405162461bcd60e51b8152602060048201526016602482015275151c985b9cd9995c8811195b185e48195b98589b195960521b6044820152606401610b80565b326001600160a01b0386161461300e5760405162461bcd60e51b815260206004820152602160248201527f6e6f20627579696e6720746f2065787465726e616c2077616c6c6574732079656044820152601d60fa1b6064820152608401610b80565b325f908152601360205260409020439055601754429061302f90603c6140b3565b106130a4573a5f90815260156020908152604080832087845290915290205443116130875760405162461bcd60e51b8152602060048201526008602482015267223ab832902a3c3760c11b6044820152606401610b80565b3a5f90815260156020908152604080832087845290915290204390555b505050505050565b5f6010546130b930611ac6565b101580156130df57506001600160a01b0384165f9081526009602052604090205460ff16155b156130ec576130ec61342d565b60185460ff16156130ff576130ff613606565b604080516060810182525f80825260208083018290528284018290526001600160a01b0387168252600990529182205460ff1615613174575060408051606081018252600d5465ffffffffffff8082168352600160301b820481166020840152600160601b90910416918101919091526131cd565b6001600160a01b0386165f9081526009602052604090205460ff16156131cd575060408051606081018252600c5465ffffffffffff8082168352600160301b820481166020840152600160601b90910416918101919091525b604081015165ffffffffffff161561334a5760408051606081018252600e546001600160401b038082168352600160401b8204166020830152600160801b900460ff1615158183015290820151612710906132309065ffffffffffff1687613f5c565b61323a9190613f87565b9250633b9aca00826040015165ffffffffffff16835f015165ffffffffffff16856132659190614136565b61326f9190614161565b6132799190614161565b81518290613288908390614186565b6001600160401b031690525060408201516020830151633b9aca009165ffffffffffff908116916132ba911686614136565b6132c49190614161565b6132ce9190614161565b816020018181516132df9190614186565b6001600160401b039081169091528251600e8054602086015160408701511515600160801b0260ff60801b19918616600160401b026001600160801b0319909316949095169390931717919091169190911790555061334887306001600160801b03861661269b565b505b506001600160801b0316949350505050565b5f6133b0826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166138009092919063ffffffff16565b80519091501561194157808060200190518101906133ce9190613d7a565b6119415760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610b80565b5f61343730611ac6565b60408051606081018252600e546001600160401b03808216808452600160401b830490911660208401819052600160801b90920460ff16151593830193909352929350915f916134879190614186565b6001600160401b0316905082158061349d575080155b156134a757505050565b6010546134b5906028613f5c565b8311156134cd576010546134ca906028613f5c565b92505b82156135cb576134dc8361380e565b602082015147905f906001600160401b03161561356a57600b5460208501516001600160a01b0390911690849061351c906001600160401b031685613f5c565b6135269190613f87565b6040515f81818185875af1925050503d805f811461355f576040519150601f19603f3d011682016040523d82523d5f602084013e613564565b606091505b50909150505b47915081156135c857600a546040516001600160a01b039091169083905f81818185875af1925050503d805f81146135bd576040519150601f19603f3d011682016040523d82523d5f602084013e6135c2565b606091505b50909150505b50505b505f8082526020820152600e80546040909201511515600160801b0270ffffffffffffffffffffffffffffffffff1990921691909117905550565b6040805160608082018352600c5465ffffffffffff8082168452600160301b8083048216602080870191909152600160601b9384900483168688015286519485018752600d54808416865291820483169085015291909104169281019290925260175490919042905f9061367a9083613f9a565b9050610a8c81106136b9576018805460ff191690556096808552602080860182905261012c604080880182905283875291860192909252840152613719565b61070881106136f0576101f48085525f60208087018290526040808801939093526103e88087529086019190915290840152613719565b6103848110613719576102bc8085525f60208601526040808601919091526105dc808552908401525b6040840151600c54600160601b900465ffffffffffff90811691161461378a578351600c80546020870151604088015165ffffffffffff908116600160601b0265ffffffffffff60601b19928216600160301b026001600160601b0319909416919095161791909117169190911790555b6040830151600d54600160601b900465ffffffffffff9081169116146129d3578251600d80546020860151604087015165ffffffffffff908116600160601b0265ffffffffffff60601b19928216600160301b026001600160601b03199094169190951617919091171691909117905550505050565b6060611e1e84845f85613903565b6040805160028082526060820183525f9260208301908036833701905050905030815f8151811061384157613841613dfc565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000008160018151811061389557613895613dfc565b6001600160a01b03928316602091820292909201015260125460405163791ac94760e01b815291169063791ac947906138da9085905f908690309042906004016141a6565b5f604051808303815f87803b1580156138f1575f80fd5b505af11580156130a4573d5f803e3d5ffd5b6060824710156139645760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610b80565b5f80866001600160a01b0316858760405161397f91906141e1565b5f6040518083038185875af1925050503d805f81146139b9576040519150601f19603f3d011682016040523d82523d5f602084013e6139be565b606091505b50915091506139cf878383876139da565b979650505050505050565b60608315613a485782515f03613a41576001600160a01b0385163b613a415760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b80565b5081611e1e565b611e1e8383815115613a5d5781518083602001fd5b8060405162461bcd60e51b8152600401610b809190613acf565b6001600160a01b03811681146117e3575f80fd5b5f60208284031215613a9b575f80fd5b8135613aa681613a77565b9392505050565b5f5b83811015613ac7578181015183820152602001613aaf565b50505f910152565b602081525f8251806020840152613aed816040850160208701613aad565b601f01601f19169190910160400192915050565b5f8060408385031215613b12575f80fd5b8235613b1d81613a77565b946020939093013593505050565b5f60208284031215613b3b575f80fd5b5035919050565b5f8083601f840112613b52575f80fd5b5081356001600160401b03811115613b68575f80fd5b6020830191508360208260051b8501011115613b82575f80fd5b9250929050565b5f805f8060408587031215613b9c575f80fd5b84356001600160401b0380821115613bb2575f80fd5b613bbe88838901613b42565b90965094506020870135915080821115613bd6575f80fd5b50613be387828801613b42565b95989497509550505050565b5f805f60608486031215613c01575f80fd5b8335613c0c81613a77565b92506020840135613c1c81613a77565b929592945050506040919091013590565b5f60208284031215613c3d575f80fd5b81356001600160801b0381168114613aa6575f80fd5b803565ffffffffffff81168114613c68575f80fd5b919050565b5f8060408385031215613c7e575f80fd5b613c8783613c53565b9150613c9560208401613c53565b90509250929050565b5f8060408385031215613caf575f80fd5b8235613cba81613a77565b91506020830135613cca81613a77565b809150509250929050565b80151581146117e3575f80fd5b5f8060408385031215613cf3575f80fd5b8235613cfe81613a77565b91506020830135613cca81613cd5565b5f8060408385031215613d1f575f80fd5b50508035926020909101359150565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b5f60208284031215613d73575f80fd5b5051919050565b5f60208284031215613d8a575f80fd5b8151613aa681613cd5565b600181811c90821680613da957607f821691505b602082108103613dc757634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215613df1575f80fd5b8151613aa681613a77565b634e487b7160e01b5f52603260045260245ffd5b5f8151808452602080850194508084015f5b83811015613e475781516001600160a01b031687529582019590820190600101613e22565b509495945050505050565b828152604060208201525f611e1e6040830184613e10565b5f6020808385031215613e7b575f80fd5b82516001600160401b0380821115613e91575f80fd5b818501915085601f830112613ea4575f80fd5b815181811115613eb657613eb6613dcd565b8060051b604051601f19603f83011681018181108582111715613edb57613edb613dcd565b604052918252848201925083810185019188831115613ef8575f80fd5b938501935b82851015613f1657845184529385019392850192613efd565b98975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b65ffffffffffff818116838216019080821115613f5557613f55613f22565b5092915050565b808202811582820484141761103c5761103c613f22565b634e487b7160e01b5f52601260045260245ffd5b5f82613f9557613f95613f73565b500490565b8181038181111561103c5761103c613f22565b5f60018201613fbe57613fbe613f22565b5060010190565b600181815b80851115613fff57815f1904821115613fe557613fe5613f22565b80851615613ff257918102915b93841c9390800290613fca565b509250929050565b5f826140155750600161103c565b8161402157505f61103c565b816001811461403757600281146140415761405d565b600191505061103c565b60ff84111561405257614052613f22565b50506001821b61103c565b5060208310610133831016604e8410600b8410161715614080575081810a61103c565b61408a8383613fc5565b805f190482111561409d5761409d613f22565b029392505050565b5f613aa660ff841683614007565b8082018082111561103c5761103c613f22565b5f805f80608085870312156140d9575f80fd5b84516140e481613a77565b60208601516040870151606090970151919890975090945092505050565b848152608060208201525f61411a6080830186613e10565b6001600160a01b03949094166040830152506060015292915050565b6001600160801b0381811683821602808216919082811461415957614159613f22565b505092915050565b5f6001600160801b038084168061417a5761417a613f73565b92169190910492915050565b6001600160401b03818116838216019080821115613f5557613f55613f22565b85815284602082015260a060408201525f6141c460a0830186613e10565b6001600160a01b0394909416606083015250608001529392505050565b5f82516141f2818460208701613aad565b919091019291505056fea2646970667358221220253c05185b05d50c778c1598fd5f4909a8daa9e5512ec80e4344fcf7bc9e14cb64736f6c63430008140033608060405234801561000f575f80fd5b505f80546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506110ef8061005d5f395ff3fe608060405260043610610134575f3560e01c806391b89fba116100a8578063bc4c4b371161006d578063bc4c4b371461034f578063c0f306ef1461036e578063dcb95ed91461038d578063e30443bc146103ac578063f2fde38b146103cb578063fbcbc0f1146103ea575f80fd5b806391b89fba1461029d578063a8b9d240146102bc578063aafd847a146102db578063ab6ddfa81461030f578063ad7a672f1461033a575f80fd5b80636843cd84116100f95780636843cd84146101f25780636a47400214610226578063715018a61461023a57806371778e7d1461024e57806385a6b3ae146102625780638da5cb5b14610277575f80fd5b806303c833021461014757806327ce01471461014f57806330bb4cff1461018157806331e79db0146101955780634e7b827f146101b4575f80fd5b3661014357610141610433565b005b5f80fd5b610141610433565b34801561015a575f80fd5b5061016e610169366004610eec565b6104bb565b6040519081526020015b60405180910390f35b34801561018c575f80fd5b5060065461016e565b3480156101a0575f80fd5b506101416101af366004610eec565b61051d565b3480156101bf575f80fd5b506101e26101ce366004610eec565b60076020525f908152604090205460ff1681565b6040519015158152602001610178565b3480156101fd575f80fd5b5061016e61020c366004610eec565b6001600160a01b03165f9081526004602052604090205490565b348015610231575f80fd5b5061014161057f565b348015610245575f80fd5b50610141610588565b348015610259575f80fd5b5060055461016e565b34801561026d575f80fd5b5061016e60065481565b348015610282575f80fd5b505f546040516001600160a01b039091168152602001610178565b3480156102a8575f80fd5b5061016e6102b7366004610eec565b6105f9565b3480156102c7575f80fd5b5061016e6102d6366004610eec565b6105ff565b3480156102e6575f80fd5b5061016e6102f5366004610eec565b6001600160a01b03165f9081526003602052604090205490565b34801561031a575f80fd5b5061016e610329366004610eec565b60046020525f908152604090205481565b348015610345575f80fd5b5061016e60055481565b34801561035a575f80fd5b506101e2610369366004610f07565b61062a565b348015610379575f80fd5b50610141610388366004610eec565b6106bf565b348015610398575f80fd5b5061016e6103a7366004610eec565b6107ae565b3480156103b7575f80fd5b506101416103c6366004610f42565b610908565b3480156103d6575f80fd5b506101416103e5366004610eec565b61096b565b3480156103f5575f80fd5b50610409610404366004610eec565b610a52565b604080516001600160a01b0390951685526020850193909352918301526060820152608001610178565b5f60055411801561044357505f34115b156104b9576005546104709061045d34600160801b610a8e565b6104679190610f80565b60015490610b13565b60015560405134815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a26006546104b59034610b13565b6006555b565b6001600160a01b0381165f908152600260209081526040808320546004909252822054600154600160801b9261050d9261050892610502916104fd9190610a8e565b610b71565b90610b7f565b610bb9565b6105179190610f80565b92915050565b5f546001600160a01b0316331461054f5760405162461bcd60e51b815260040161054690610f9f565b60405180910390fd5b6001600160a01b0381165f908152600760205260408120805460ff1916600117905561057c908290610bca565b50565b61057c33610c5e565b5f546001600160a01b031633146105b15760405162461bcd60e51b815260040161054690610f9f565b5f80546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a35f80546001600160a01b0319169055565b5f610517825b6001600160a01b0381165f9081526003602052604081205461051790610624846104bb565b90610d95565b5f80546001600160a01b031633146106545760405162461bcd60e51b815260040161054690610f9f565b5f61065e84610c5e565b905080156106b657821515846001600160a01b03167fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf092836040516106a491815260200190565b60405180910390a36001915050610517565b505f9392505050565b5f546001600160a01b031633146106e85760405162461bcd60e51b815260040161054690610f9f565b6001600160a01b0381165f9081526007602052604090205460ff1661070b575f80fd5b6001600160a01b0381165f908152600760205260409020805460ff1916905561057c8161073f5f546001600160a01b031690565b6040516370a0823160e01b81526001600160a01b03858116600483015291909116906370a0823190602401602060405180830381865afa158015610785573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107a99190610fd4565b610bca565b5f80546001600160a01b031633146107d85760405162461bcd60e51b815260040161054690610f9f565b6107e1826105ff565b90508015610863576001600160a01b0382165f9081526003602052604090205461080c908290610feb565b6001600160a01b0383165f81815260036020526040908190209290925590517fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d9061085a9084815260200190565b60405180910390a25b5f80546040516001600160a01b039091169083908381818185875af1925050503d805f81146108ad576040519150601f19603f3d011682016040523d82523d5f602084013e6108b2565b606091505b5050905080610901576001600160a01b0383165f908152600360205260409020546108dd9083610d95565b6001600160a01b0384165f9081526003602052604081209190915591506109039050565b505b919050565b5f546001600160a01b031633146109315760405162461bcd60e51b815260040161054690610f9f565b6001600160a01b0382165f9081526007602052604090205460ff166109675761095a8282610bca565b61096582600161062a565b505b5050565b5f546001600160a01b031633146109945760405162461bcd60e51b815260040161054690610f9f565b6001600160a01b0381166109f95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610546565b5f80546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35f80546001600160a01b0319166001600160a01b0392909216919091179055565b805f8080610a5f846105ff565b9250610a6a846104bb565b6001600160a01b0385165f9081526004602052604090205494969395509392915050565b5f825f03610a9d57505f610517565b5f610aa88385610ffe565b905082610ab58583610f80565b14610b0c5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610546565b9392505050565b5f80610b1f8385610feb565b905083811015610b0c5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610546565b5f8181811215610517575f80fd5b5f80610b8b8385611015565b90505f8312158015610b9d5750838112155b80610bb157505f83128015610bb157508381125b610b0c575f80fd5b5f80821215610bc6575f80fd5b5090565b6001600160a01b0382165f90815260046020526040902080549082905580821115610c23575f610bfa8383610d95565b9050610c068482610dd6565b8060055f828254610c179190610feb565b90915550610965915050565b80821015610965575f610c368284610d95565b9050610c428482610e2e565b8060055f828254610c53919061103c565b909155505050505050565b5f80610c69836105ff565b90508015610d8d576001600160a01b0383165f90815260036020526040902054610c939082610b13565b6001600160a01b0384165f81815260036020526040908190209290925590517fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d90610ce19084815260200190565b60405180910390a25f836001600160a01b0316826040515f6040518083038185875af1925050503d805f8114610d32576040519150601f19603f3d011682016040523d82523d5f602084013e610d37565b606091505b5050905080610d86576001600160a01b0384165f90815260036020526040902054610d629083610d95565b6001600160a01b039094165f90815260036020526040812094909455509192915050565b5092915050565b505f92915050565b5f610b0c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610e67565b610e0f610df16104fd83600154610a8e90919063ffffffff16565b6001600160a01b0384165f9081526002602052604090205490610e9f565b6001600160a01b039092165f9081526002602052604090209190915550565b610e0f610e496104fd83600154610a8e90919063ffffffff16565b6001600160a01b0384165f9081526002602052604090205490610b7f565b5f8184841115610e8a5760405162461bcd60e51b8152600401610546919061104f565b505f610e96848661103c565b95945050505050565b5f80610eab838561109a565b90505f8312158015610ebd5750838113155b80610bb157505f83128015610bb15750838113610b0c575f80fd5b6001600160a01b038116811461057c575f80fd5b5f60208284031215610efc575f80fd5b8135610b0c81610ed8565b5f8060408385031215610f18575f80fd5b8235610f2381610ed8565b915060208301358015158114610f37575f80fd5b809150509250929050565b5f8060408385031215610f53575f80fd5b8235610f5e81610ed8565b946020939093013593505050565b634e487b7160e01b5f52601160045260245ffd5b5f82610f9a57634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b5f60208284031215610fe4575f80fd5b5051919050565b8082018082111561051757610517610f6c565b808202811582820484141761051757610517610f6c565b8082018281125f83128015821682158216171561103457611034610f6c565b505092915050565b8181038181111561051757610517610f6c565b5f6020808352835180828501525f5b8181101561107a5785810183015185820160400152820161105e565b505f604082860101526040601f19601f8301168501019250505092915050565b8181035f831280158383131683831282161715610d8657610d86610f6c56fea2646970667358221220825150840eedac54c7cb98c67384cbcccab32fa6979819c00a5c182471b38d6a64736f6c63430008140033

Deployed Bytecode

0x608060405260043610610374575f3560e01c8063751039fc116101c8578063a9059cbb116100fd578063c876d0b91161009d578063f270fde41161006d578063f270fde414610aa3578063f2fde38b14610aed578063f8686f0714610b0c578063fe40fd7114610b20575f80fd5b8063c876d0b914610a18578063cc1776d314610a31578063ccad03e114610a65578063dd62ed3e14610a84575f80fd5b8063b0249cc6116100d8578063b0249cc614610997578063bedafd01146109c5578063c0f306ef146109e4578063c78d0fa014610a03575f80fd5b8063a9059cbb14610910578063aa5f7e261461092f578063ad56c13c1461094e575f80fd5b806395d89b4111610168578063a457c2d711610143578063a457c2d714610894578063a5ece941146108b3578063a7630da9146108d2578063a8b9d240146108f1575f80fd5b806395d89b411461083f5780639e7261af146108535780639e93ad8e14610867575f80fd5b8063860a32ec116101a3578063860a32ec146107c75780638a8c523c146107e05780638d3e6e40146107f45780638da5cb5b14610822575f80fd5b8063751039fc1461077f578063790ca413146107935780637c174e87146107a8575f80fd5b806336e18e19116102a95780635431c94e116102495780636d7adcad116102195780636d7adcad146106d957806370a0823114610738578063715018a61461075757806371778e7d1461076b575f80fd5b80635431c94e1461064e5780635a90a49e1461066d57806366ebd39a1461069b5780636843cd84146106ba575f80fd5b8063452ed4f111610284578063452ed4f1146105a55780634e71d92d146105c45780634f7041a5146105d857806353371be014610635575f80fd5b806336e18e191461054857806339509351146105675780633fe79e1d14610586575f80fd5b80632369bf831161031457806330bb4cff116102ef57806330bb4cff146104e1578063313ce567146104f557806331e79db014610510578063362919a71461052f575f80fd5b80632369bf831461046c57806323b872dd1461048b5780632c1f5216146104aa575f80fd5b8063095ea7b31161034f578063095ea7b3146103eb57806318160ddd1461041a578063210459181461042e5780632307b4411461044d575f80fd5b806306f200031461037f57806306fdde031461039457806308f2f233146103be575f80fd5b3661037b57005b5f80fd5b61039261038d366004613a8b565b610b56565b005b34801561039f575f80fd5b506103a8610dab565b6040516103b59190613acf565b60405180910390f35b3480156103c9575f80fd5b506103dd6103d8366004613a8b565b610e3b565b6040519081526020016103b5565b3480156103f6575f80fd5b5061040a610405366004613b01565b611029565b60405190151581526020016103b5565b348015610425575f80fd5b506002546103dd565b348015610439575f80fd5b50610392610448366004613b2b565b611042565b348015610458575f80fd5b50610392610467366004613b89565b61118d565b348015610477575f80fd5b50610392610486366004613a8b565b61134e565b348015610496575f80fd5b5061040a6104a5366004613bef565b6113df565b3480156104b5575f80fd5b50600b546104c9906001600160a01b031681565b6040516001600160a01b0390911681526020016103b5565b3480156104ec575f80fd5b506103dd611402565b348015610500575f80fd5b50604051601281526020016103b5565b34801561051b575f80fd5b5061039261052a366004613a8b565b611472565b34801561053a575f80fd5b5060185461040a9060ff1681565b348015610553575f80fd5b50610392610562366004613c2d565b6114fa565b348015610572575f80fd5b5061040a610581366004613b01565b611611565b348015610591575f80fd5b506103926105a0366004613c6d565b611632565b3480156105b0575f80fd5b506011546104c9906001600160a01b031681565b3480156105cf575f80fd5b50610392611772565b3480156105e3575f80fd5b50600c5461060c9065ffffffffffff80821691600160301b8104821691600160601b9091041683565b6040805165ffffffffffff948516815292841660208401529216918101919091526060016103b5565b348015610640575f80fd5b5060085461040a9060ff1681565b348015610659575f80fd5b50610392610668366004613c9e565b6117e6565b348015610678575f80fd5b5061040a610687366004613a8b565b60066020525f908152604090205460ff1681565b3480156106a6575f80fd5b506103926106b5366004613c2d565b611946565b3480156106c5575f80fd5b506103dd6106d4366004613a8b565b611a59565b3480156106e4575f80fd5b50600e54610710906001600160401b0380821691600160401b810490911690600160801b900460ff1683565b604080516001600160401b0394851681529390921660208401521515908201526060016103b5565b348015610743575f80fd5b506103dd610752366004613a8b565b611ac6565b348015610762575f80fd5b50610392611ae0565b348015610776575f80fd5b506103dd611b53565b34801561078a575f80fd5b50610392611b9a565b34801561079e575f80fd5b506103dd60175481565b3480156107b3575f80fd5b506103dd6107c2366004613b2b565b611c45565b3480156107d2575f80fd5b50600f5461040a9060ff1681565b3480156107eb575f80fd5b50610392611e26565b3480156107ff575f80fd5b5061040a61080e366004613a8b565b60076020525f908152604090205460ff1681565b34801561082d575f80fd5b506005546001600160a01b03166104c9565b34801561084a575f80fd5b506103a8611ead565b34801561085e575f80fd5b50610392611ebc565b348015610872575f80fd5b5061087c61271081565b6040516001600160401b0390911681526020016103b5565b34801561089f575f80fd5b5061040a6108ae366004613b01565b611f37565b3480156108be575f80fd5b50600a546104c9906001600160a01b031681565b3480156108dd575f80fd5b506103926108ec366004613c6d565b611fb1565b3480156108fc575f80fd5b506103dd61090b366004613a8b565b6120f1565b34801561091b575f80fd5b5061040a61092a366004613b01565b612123565b34801561093a575f80fd5b50610392610949366004613b2b565b612130565b348015610959575f80fd5b5061096d610968366004613a8b565b6121e3565b604080516001600160a01b03909516855260208501939093529183015260608201526080016103b5565b3480156109a2575f80fd5b5061040a6109b1366004613a8b565b60096020525f908152604090205460ff1681565b3480156109d0575f80fd5b506103926109df366004613ce2565b612264565b3480156109ef575f80fd5b506103926109fe366004613a8b565b61238e565b348015610a0e575f80fd5b506103dd60105481565b348015610a23575f80fd5b5060145461040a9060ff1681565b348015610a3c575f80fd5b50600d5461060c9065ffffffffffff80821691600160301b8104821691600160601b9091041683565b348015610a70575f80fd5b50610392610a7f366004613ce2565b6123ea565b348015610a8f575f80fd5b506103dd610a9e366004613c9e565b61250c565b348015610aae575f80fd5b50601654610acd906001600160801b0380821691600160801b90041682565b604080516001600160801b039384168152929091166020830152016103b5565b348015610af8575f80fd5b50610392610b07366004613a8b565b612536565b348015610b17575f80fd5b50610392612620565b348015610b2b575f80fd5b506103dd610b3a366004613d0e565b601560209081525f928352604080842090915290825290205481565b6005546001600160a01b03163314610b895760405162461bcd60e51b8152600401610b8090613d2e565b60405180910390fd5b5f47118015610b9f57505f610b9d30611ac6565b115b610ba7575f80fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0476040518263ffffffff1660e01b81526004015f604051808303818588803b158015610c00575f80fd5b505af1158015610c12573d5f803e3d5ffd5b5050601154610c3893503092506001600160a01b03169050610c3382611ac6565b61269b565b6011546040516370a0823160e01b81523060048201526001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281169263a9059cbb9291169083906370a0823190602401602060405180830381865afa158015610ca9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ccd9190613d63565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303815f875af1158015610d15573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d399190613d7a565b506011546040516335313c2160e11b81526001600160a01b03838116600483015290911690636a627842906024016020604051808303815f875af1158015610d83573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610da79190613d63565b5050565b606060038054610dba90613d95565b80601f0160208091040260200160405190810160405280929190818152602001828054610de690613d95565b8015610e315780601f10610e0857610100808354040283529160200191610e31565b820191905f5260205f20905b815481529060010190602001808311610e1457829003601f168201915b5050505050905090565b5f80610e46836120f1565b6040805160028082526060820183529293505f9290916020830190803683375050601254604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015610eb2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ed69190613de1565b815f81518110610ee857610ee8613dfc565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110610f1c57610f1c613dfc565b6001600160a01b03928316602091820292909201015260125460405163d06ca61f60e01b81525f92919091169063d06ca61f90610f5f9086908690600401613e52565b5f60405180830381865afa158015610f79573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610fa09190810190613e6a565b600c5490915061271090610fc490600160601b900465ffffffffffff166032613f36565b65ffffffffffff1682600181518110610fdf57610fdf613dfc565b6020026020010151610ff19190613f5c565b610ffb9190613f87565b8160018151811061100e5761100e613dfc565b60200260200101516110209190613f9a565b95945050505050565b5f3361103681858561283e565b60019150505b92915050565b6005546001600160a01b0316331461106c5760405162461bcd60e51b8152600401610b8090613d2e565b620186a061107960025490565b611084906001613f5c565b61108e9190613f87565b8110156110fb5760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610b80565b6103e861110760025490565b611112906005613f5c565b61111c9190613f87565b8111156111885760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171a92903a37ba30b61039bab838363c9760611b6064820152608401610b80565b601055565b6005546001600160a01b031633146111b75760405162461bcd60e51b8152600401610b8090613d2e565b8281146111ff5760405162461bcd60e51b81526020600482015260166024820152750c2e4e4c2f2e640d8cadccee8d040dad2e6dac2e8c6d60531b6044820152606401610b80565b60085460ff161561125e5760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f742061697264726f702061667465722074726164696e6720656e61604482015263189b195960e21b6064820152608401610b80565b5f805f5b858110156113455786868281811061127c5761127c613dfc565b90506020020160208101906112919190613a8b565b92508484828181106112a5576112a5613dfc565b9050602002013591506112d133848787858181106112c5576112c5613dfc565b9050602002013561269b565b600b546040516338c110ef60e21b81526001600160a01b038581166004830152602482018590529091169063e30443bc906044015f604051808303815f87803b15801561131c575f80fd5b505af115801561132e573d5f803e3d5ffd5b50505050808061133d90613fad565b915050611262565b50505050505050565b6005546001600160a01b031633146113785760405162461bcd60e51b8152600401610b8090613d2e565b6001600160a01b0381166113bd5760405162461bcd60e51b815260206004820152600c60248201526b7a65726f206164647265737360a01b6044820152606401610b80565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b5f336113ec858285612961565b6113f78585856129d9565b506001949350505050565b600b54604080516342d359d760e11b815290515f926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015611449573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061146d9190613d63565b905090565b6005546001600160a01b0316331461149c5760405162461bcd60e51b8152600401610b8090613d2e565b600b5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024015b5f604051808303815f87803b1580156114e1575f80fd5b505af11580156114f3573d5f803e3d5ffd5b5050505050565b6005546001600160a01b031633146115245760405162461bcd60e51b8152600401610b8090613d2e565b6115306012600a6140a5565b606461153b60025490565b611546906001613f5c565b6115509190613f87565b61155a9190613f87565b816001600160801b0316101561159c5760405162461bcd60e51b8152602060048201526007602482015266546f6f206c6f7760c81b6044820152606401610b80565b6115a86012600a6140a5565b6115bb906001600160801b038316613f5c565b601680546001600160801b0319166001600160801b039290921691821790556040519081527f6710da7d4acedae09cb83751ae24c150719ef67dcbc1e02049f171d13c6b44e6906020015b60405180910390a150565b5f33611036818585611623838361250c565b61162d91906140b3565b61283e565b6005546001600160a01b0316331461165c5760405162461bcd60e51b8152600401610b8090613d2e565b604080516060810182525f9181019190915265ffffffffffff83811682528216602082015261168b8284613f36565b65ffffffffffff166040820181905261012c10156116df5760405162461bcd60e51b81526020600482015260116024820152704b656570207461782062656c6f7720332560781b6044820152606401610b80565b604080820151905165ffffffffffff90911681527fa02824f65350567bc405e202b741e7ca6274004a9feeb44149df72b8bd599c979060200160405180910390a18051600d8054602084015160409094015165ffffffffffff908116600160601b0265ffffffffffff60601b19958216600160301b026001600160601b0319909316919094161717929092161790555050565b600b5460405163bc4c4b3760e01b81523360048201525f60248201526001600160a01b039091169063bc4c4b37906044016020604051808303815f875af11580156117bf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117e39190613d7a565b50565b6005546001600160a01b031633146118105760405162461bcd60e51b8152600401610b8090613d2e565b6001600160a01b0382166118665760405162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f7420626520300000000000006044820152606401610b80565b306001600160a01b038316036118cc5760405162461bcd60e51b815260206004820152602560248201527f5f746f6b656e20616464726573732063616e6e6f74206265206e6174697665206044820152643a37b5b2b760d91b6064820152608401610b80565b6040516370a0823160e01b81523060048201525f906001600160a01b038416906370a0823190602401602060405180830381865afa158015611910573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119349190613d63565b9050611941838383612b79565b505050565b6005546001600160a01b031633146119705760405162461bcd60e51b8152600401610b8090613d2e565b61197c6012600a6140a5565b606461198760025490565b611992906001613f5c565b61199c9190613f87565b6119a69190613f87565b816001600160801b031610156119e85760405162461bcd60e51b8152602060048201526007602482015266546f6f206c6f7760c81b6044820152606401610b80565b6119f46012600a6140a5565b611a07906001600160801b038316613f5c565b601680546001600160801b03908116600160801b93821684021791829055604051929091041681527fde064515fae8f8bb6d8ff19d2c6ba704322def7494147d8a971266430ade078890602001611606565b600b5460405163156dbbf560e31b81526001600160a01b0383811660048301525f92169063ab6ddfa8906024015b602060405180830381865afa158015611aa2573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061103c9190613d63565b6001600160a01b03165f9081526020819052604090205490565b6005546001600160a01b03163314611b0a5760405162461bcd60e51b8152600401610b8090613d2e565b6005546040515f916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b600b546040805163ad7a672f60e01b815290515f926001600160a01b03169163ad7a672f9160048083019260209291908290030181865afa158015611449573d5f803e3d5ffd5b6005546001600160a01b03163314611bc45760405162461bcd60e51b8152600401610b8090613d2e565b600f805460ff19908116909155601480549091169055604080518082019091525f80825260208201525f611bf760025490565b6001600160801b03811680845260208401819052600160801b8102176016556040519091507fa4ffae85e880608d5d4365c2b682786545d136145537788e7e0940dff9f0b98c905f90a15050565b6040805160028082526060820183525f92839291906020830190803683375050601254604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015611cb0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cd49190613de1565b815f81518110611ce657611ce6613dfc565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110611d1a57611d1a613dfc565b6001600160a01b03928316602091820292909201015260125460405163d06ca61f60e01b81525f92919091169063d06ca61f90611d5d9087908690600401613e52565b5f60405180830381865afa158015611d77573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d9e9190810190613e6a565b600c5490915061271090611dc290600160601b900465ffffffffffff166032613f36565b65ffffffffffff1682600181518110611ddd57611ddd613dfc565b6020026020010151611def9190613f5c565b611df99190613f87565b81600181518110611e0c57611e0c613dfc565b6020026020010151611e1e9190613f9a565b949350505050565b6005546001600160a01b03163314611e505760405162461bcd60e51b8152600401610b8090613d2e565b60085460ff1615611e9a5760405162461bcd60e51b815260206004820152601460248201527354726164696e6720616c7265616479206c69766560601b6044820152606401610b80565b6008805460ff1916600117905542601755565b606060048054610dba90613d95565b6005546001600160a01b03163314611ee65760405162461bcd60e51b8152600401610b8090613d2e565b60185460ff16611f2b5760405162461bcd60e51b815260206004820152601060248201526f105b1c9958591e48191a5cd8589b195960821b6044820152606401610b80565b6018805460ff19169055565b5f3381611f44828661250c565b905083811015611fa45760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610b80565b6113f7828686840361283e565b6005546001600160a01b03163314611fdb5760405162461bcd60e51b8152600401610b8090613d2e565b604080516060810182525f9181019190915265ffffffffffff83811682528216602082015261200a8284613f36565b65ffffffffffff166040820181905261012c101561205e5760405162461bcd60e51b81526020600482015260116024820152704b656570207461782062656c6f7720332560781b6044820152606401610b80565b604080820151905165ffffffffffff90911681527f5380a61520019ce8270d583f62f1b2b9f4f4372e1acaaf708f4865cecece05089060200160405180910390a18051600c8054602084015160409094015165ffffffffffff908116600160601b0265ffffffffffff60601b19958216600160301b026001600160601b0319909316919094161717929092161790555050565b600b546040516302a2e74960e61b81526001600160a01b0383811660048301525f92169063a8b9d24090602401611a87565b5f336110368185856129d9565b600b5460405163dcb95ed960e01b81523360048201525f916001600160a01b03169063dcb95ed9906024016020604051808303815f875af1158015612177573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061219b9190613d63565b905080156121ae57610da7818333612bcb565b60405162461bcd60e51b815260206004820152600a6024820152694e6f207265776172647360b01b6044820152606401610b80565b600b5460405163fbcbc0f160e01b81526001600160a01b0383811660048301525f92839283928392169063fbcbc0f190602401608060405180830381865afa158015612231573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061225591906140c6565b93509350935093509193509193565b6005546001600160a01b0316331461228e5760405162461bcd60e51b8152600401610b8090613d2e565b6001600160a01b0382166122d35760405162461bcd60e51b815260206004820152600c60248201526b5a65726f204164647265737360a01b6044820152606401610b80565b306001600160a01b0383160361232b5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420756e6578656d707420636f6e747261637400000000000000006044820152606401610b80565b6001600160a01b0382165f81815260066020908152604091829020805460ff19168515159081179091558251938452908301527f998cce27cbf44405c67eb636a634d5e2f2e6ff248b3d71fbbbb022f3c4c6dd2d91015b60405180910390a15050565b6005546001600160a01b031633146123b85760405162461bcd60e51b8152600401610b8090613d2e565b600b5460405163c0f306ef60e01b81526001600160a01b0383811660048301529091169063c0f306ef906024016114ca565b6005546001600160a01b031633146124145760405162461bcd60e51b8152600401610b8090613d2e565b6001600160a01b0382166124595760405162461bcd60e51b815260206004820152600c60248201526b5a65726f204164647265737360a01b6044820152606401610b80565b806124b1576011546001600160a01b03908116908316036124b15760405162461bcd60e51b815260206004820152601260248201527121b0b73737ba103932b6b7bb32903830b4b960711b6044820152606401610b80565b6001600160a01b0382165f81815260076020908152604091829020805460ff19168515159081179091558251938452908301527f8f9f40630a1d139e6cf69b4f447ca47a36f10a017524efaa38252e516fa227ce9101612382565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6005546001600160a01b031633146125605760405162461bcd60e51b8152600401610b8090613d2e565b6001600160a01b0381166125c55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b80565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b0316331461264a5760405162461bcd60e51b8152600401610b8090613d2e565b60145460ff1661268f5760405162461bcd60e51b815260206004820152601060248201526f105b1c9958591e48191a5cd8589b195960821b6044820152606401610b80565b6014805460ff19169055565b6001600160a01b0383166126ff5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610b80565b6001600160a01b0382166127615760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610b80565b6001600160a01b0383165f90815260208190526040902054818110156127d85760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610b80565b6001600160a01b038481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a350505050565b6001600160a01b0383166128a05760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610b80565b6001600160a01b0382166129015760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610b80565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b5f61296c848461250c565b90505f1981146129d357818110156129c65760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610b80565b6129d3848484840361283e565b50505050565b6001600160a01b0383165f9081526006602052604090205460ff16158015612a1957506001600160a01b0382165f9081526006602052604090205460ff16155b15612a885760085460ff16612a655760405162461bcd60e51b815260206004820152601260248201527154726164696e67206e6f742061637469766560701b6044820152606401610b80565b612a70838383612d15565b612a7b8383836130ac565b612a859082613f9a565b90505b612a9383838361269b565b600b546001600160a01b031663e30443bc83612aae81611ac6565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015f604051808303815f87803b158015612af1575f80fd5b505af1158015612b03573d5f803e3d5ffd5b5050600b546001600160a01b0316915063e30443bc905084612b2481611ac6565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015f604051808303815f87803b158015612b67575f80fd5b505af1158015611345573d5f803e3d5ffd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261194190849061335c565b6040805160028082526060820183525f926020830190803683375050601254604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015612c32573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c569190613de1565b815f81518110612c6857612c68613dfc565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110612c9c57612c9c613dfc565b6001600160a01b03928316602091820292909201015260125460405163b6f9de9560e01b815291169063b6f9de95908690612ce1908790869088904290600401614102565b5f604051808303818588803b158015612cf8575f80fd5b505af1158015612d0a573d5f803e3d5ffd5b505050505050505050565b600f5460ff1615611941576001600160a01b0382165f9081526007602052604081205460ff1690612d4584611ac6565b6040805180820182526016546001600160801b038082168352600160801b909104166020808301919091526001600160a01b0389165f908152600990915291909120549192509060ff168015612d99575082155b15612e3a5780516001600160801b0316841115612de25760405162461bcd60e51b815260206004820152600760248201526626b0bc102a3c3760c91b6044820152606401610b80565b60208101516001600160801b0316612dfa83866140b3565b1115612e355760405162461bcd60e51b815260206004820152600a60248201526913585e0815d85b1b195d60b21b6044820152606401610b80565b612f1a565b6001600160a01b0385165f9081526009602052604090205460ff168015612e7957506001600160a01b0386165f9081526007602052604090205460ff16155b15612ec25780516001600160801b0316841115612e355760405162461bcd60e51b815260206004820152600760248201526626b0bc102a3c3760c91b6044820152606401610b80565b82612f1a5760208101516001600160801b0316612edf83866140b3565b1115612f1a5760405162461bcd60e51b815260206004820152600a60248201526913585e0815d85b1b195d60b21b6044820152606401610b80565b60145460ff16156130a4576012546001600160a01b03868116911614801590612f5157506011546001600160a01b03868116911614155b156130a457325f908152601360205260409020544311612fac5760405162461bcd60e51b8152602060048201526016602482015275151c985b9cd9995c8811195b185e48195b98589b195960521b6044820152606401610b80565b326001600160a01b0386161461300e5760405162461bcd60e51b815260206004820152602160248201527f6e6f20627579696e6720746f2065787465726e616c2077616c6c6574732079656044820152601d60fa1b6064820152608401610b80565b325f908152601360205260409020439055601754429061302f90603c6140b3565b106130a4573a5f90815260156020908152604080832087845290915290205443116130875760405162461bcd60e51b8152602060048201526008602482015267223ab832902a3c3760c11b6044820152606401610b80565b3a5f90815260156020908152604080832087845290915290204390555b505050505050565b5f6010546130b930611ac6565b101580156130df57506001600160a01b0384165f9081526009602052604090205460ff16155b156130ec576130ec61342d565b60185460ff16156130ff576130ff613606565b604080516060810182525f80825260208083018290528284018290526001600160a01b0387168252600990529182205460ff1615613174575060408051606081018252600d5465ffffffffffff8082168352600160301b820481166020840152600160601b90910416918101919091526131cd565b6001600160a01b0386165f9081526009602052604090205460ff16156131cd575060408051606081018252600c5465ffffffffffff8082168352600160301b820481166020840152600160601b90910416918101919091525b604081015165ffffffffffff161561334a5760408051606081018252600e546001600160401b038082168352600160401b8204166020830152600160801b900460ff1615158183015290820151612710906132309065ffffffffffff1687613f5c565b61323a9190613f87565b9250633b9aca00826040015165ffffffffffff16835f015165ffffffffffff16856132659190614136565b61326f9190614161565b6132799190614161565b81518290613288908390614186565b6001600160401b031690525060408201516020830151633b9aca009165ffffffffffff908116916132ba911686614136565b6132c49190614161565b6132ce9190614161565b816020018181516132df9190614186565b6001600160401b039081169091528251600e8054602086015160408701511515600160801b0260ff60801b19918616600160401b026001600160801b0319909316949095169390931717919091169190911790555061334887306001600160801b03861661269b565b505b506001600160801b0316949350505050565b5f6133b0826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166138009092919063ffffffff16565b80519091501561194157808060200190518101906133ce9190613d7a565b6119415760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610b80565b5f61343730611ac6565b60408051606081018252600e546001600160401b03808216808452600160401b830490911660208401819052600160801b90920460ff16151593830193909352929350915f916134879190614186565b6001600160401b0316905082158061349d575080155b156134a757505050565b6010546134b5906028613f5c565b8311156134cd576010546134ca906028613f5c565b92505b82156135cb576134dc8361380e565b602082015147905f906001600160401b03161561356a57600b5460208501516001600160a01b0390911690849061351c906001600160401b031685613f5c565b6135269190613f87565b6040515f81818185875af1925050503d805f811461355f576040519150601f19603f3d011682016040523d82523d5f602084013e613564565b606091505b50909150505b47915081156135c857600a546040516001600160a01b039091169083905f81818185875af1925050503d805f81146135bd576040519150601f19603f3d011682016040523d82523d5f602084013e6135c2565b606091505b50909150505b50505b505f8082526020820152600e80546040909201511515600160801b0270ffffffffffffffffffffffffffffffffff1990921691909117905550565b6040805160608082018352600c5465ffffffffffff8082168452600160301b8083048216602080870191909152600160601b9384900483168688015286519485018752600d54808416865291820483169085015291909104169281019290925260175490919042905f9061367a9083613f9a565b9050610a8c81106136b9576018805460ff191690556096808552602080860182905261012c604080880182905283875291860192909252840152613719565b61070881106136f0576101f48085525f60208087018290526040808801939093526103e88087529086019190915290840152613719565b6103848110613719576102bc8085525f60208601526040808601919091526105dc808552908401525b6040840151600c54600160601b900465ffffffffffff90811691161461378a578351600c80546020870151604088015165ffffffffffff908116600160601b0265ffffffffffff60601b19928216600160301b026001600160601b0319909416919095161791909117169190911790555b6040830151600d54600160601b900465ffffffffffff9081169116146129d3578251600d80546020860151604087015165ffffffffffff908116600160601b0265ffffffffffff60601b19928216600160301b026001600160601b03199094169190951617919091171691909117905550505050565b6060611e1e84845f85613903565b6040805160028082526060820183525f9260208301908036833701905050905030815f8151811061384157613841613dfc565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160018151811061389557613895613dfc565b6001600160a01b03928316602091820292909201015260125460405163791ac94760e01b815291169063791ac947906138da9085905f908690309042906004016141a6565b5f604051808303815f87803b1580156138f1575f80fd5b505af11580156130a4573d5f803e3d5ffd5b6060824710156139645760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610b80565b5f80866001600160a01b0316858760405161397f91906141e1565b5f6040518083038185875af1925050503d805f81146139b9576040519150601f19603f3d011682016040523d82523d5f602084013e6139be565b606091505b50915091506139cf878383876139da565b979650505050505050565b60608315613a485782515f03613a41576001600160a01b0385163b613a415760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b80565b5081611e1e565b611e1e8383815115613a5d5781518083602001fd5b8060405162461bcd60e51b8152600401610b809190613acf565b6001600160a01b03811681146117e3575f80fd5b5f60208284031215613a9b575f80fd5b8135613aa681613a77565b9392505050565b5f5b83811015613ac7578181015183820152602001613aaf565b50505f910152565b602081525f8251806020840152613aed816040850160208701613aad565b601f01601f19169190910160400192915050565b5f8060408385031215613b12575f80fd5b8235613b1d81613a77565b946020939093013593505050565b5f60208284031215613b3b575f80fd5b5035919050565b5f8083601f840112613b52575f80fd5b5081356001600160401b03811115613b68575f80fd5b6020830191508360208260051b8501011115613b82575f80fd5b9250929050565b5f805f8060408587031215613b9c575f80fd5b84356001600160401b0380821115613bb2575f80fd5b613bbe88838901613b42565b90965094506020870135915080821115613bd6575f80fd5b50613be387828801613b42565b95989497509550505050565b5f805f60608486031215613c01575f80fd5b8335613c0c81613a77565b92506020840135613c1c81613a77565b929592945050506040919091013590565b5f60208284031215613c3d575f80fd5b81356001600160801b0381168114613aa6575f80fd5b803565ffffffffffff81168114613c68575f80fd5b919050565b5f8060408385031215613c7e575f80fd5b613c8783613c53565b9150613c9560208401613c53565b90509250929050565b5f8060408385031215613caf575f80fd5b8235613cba81613a77565b91506020830135613cca81613a77565b809150509250929050565b80151581146117e3575f80fd5b5f8060408385031215613cf3575f80fd5b8235613cfe81613a77565b91506020830135613cca81613cd5565b5f8060408385031215613d1f575f80fd5b50508035926020909101359150565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b5f60208284031215613d73575f80fd5b5051919050565b5f60208284031215613d8a575f80fd5b8151613aa681613cd5565b600181811c90821680613da957607f821691505b602082108103613dc757634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215613df1575f80fd5b8151613aa681613a77565b634e487b7160e01b5f52603260045260245ffd5b5f8151808452602080850194508084015f5b83811015613e475781516001600160a01b031687529582019590820190600101613e22565b509495945050505050565b828152604060208201525f611e1e6040830184613e10565b5f6020808385031215613e7b575f80fd5b82516001600160401b0380821115613e91575f80fd5b818501915085601f830112613ea4575f80fd5b815181811115613eb657613eb6613dcd565b8060051b604051601f19603f83011681018181108582111715613edb57613edb613dcd565b604052918252848201925083810185019188831115613ef8575f80fd5b938501935b82851015613f1657845184529385019392850192613efd565b98975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b65ffffffffffff818116838216019080821115613f5557613f55613f22565b5092915050565b808202811582820484141761103c5761103c613f22565b634e487b7160e01b5f52601260045260245ffd5b5f82613f9557613f95613f73565b500490565b8181038181111561103c5761103c613f22565b5f60018201613fbe57613fbe613f22565b5060010190565b600181815b80851115613fff57815f1904821115613fe557613fe5613f22565b80851615613ff257918102915b93841c9390800290613fca565b509250929050565b5f826140155750600161103c565b8161402157505f61103c565b816001811461403757600281146140415761405d565b600191505061103c565b60ff84111561405257614052613f22565b50506001821b61103c565b5060208310610133831016604e8410600b8410161715614080575081810a61103c565b61408a8383613fc5565b805f190482111561409d5761409d613f22565b029392505050565b5f613aa660ff841683614007565b8082018082111561103c5761103c613f22565b5f805f80608085870312156140d9575f80fd5b84516140e481613a77565b60208601516040870151606090970151919890975090945092505050565b848152608060208201525f61411a6080830186613e10565b6001600160a01b03949094166040830152506060015292915050565b6001600160801b0381811683821602808216919082811461415957614159613f22565b505092915050565b5f6001600160801b038084168061417a5761417a613f73565b92169190910492915050565b6001600160401b03818116838216019080821115613f5557613f55613f22565b85815284602082015260a060408201525f6141c460a0830186613e10565b6001600160a01b0394909416606083015250608001529392505050565b5f82516141f2818460208701613aad565b919091019291505056fea2646970667358221220253c05185b05d50c778c1598fd5f4909a8daa9e5512ec80e4344fcf7bc9e14cb64736f6c63430008140033

Deployed Bytecode Sourcemap

33525:18241:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51338:425;;;;;;:::i;:::-;;:::i;:::-;;4189:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50883:447;;;;;;;;;;-1:-1:-1;50883:447:0;;;;;:::i;:::-;;:::i;:::-;;;1204:25:1;;;1192:2;1177:18;50883:447:0;1058:177:1;6549:201:0;;;;;;;;;;-1:-1:-1;6549:201:0;;;;;:::i;:::-;;:::i;:::-;;;1725:14:1;;1718:22;1700:41;;1688:2;1673:18;6549:201:0;1560:187:1;5318:108:0;;;;;;;;;;-1:-1:-1;5406:12:0;;5318:108;;43783:346;;;;;;;;;;-1:-1:-1;43783:346:0;;;;;:::i;:::-;;:::i;45821:593::-;;;;;;;;;;-1:-1:-1;45821:593:0;;;;;:::i;:::-;;:::i;46810:173::-;;;;;;;;;;-1:-1:-1;46810:173:0;;;;;:::i;:::-;;:::i;7330:261::-;;;;;;;;;;-1:-1:-1;7330:261:0;;;;;:::i;:::-;;:::i;33807:38::-;;;;;;;;;;-1:-1:-1;33807:38:0;;;;-1:-1:-1;;;;;33807:38:0;;;;;;-1:-1:-1;;;;;3744:32:1;;;3726:51;;3714:2;3699:18;33807:38:0;3548:235:1;48514:141:0;;;;;;;;;;;;;:::i;5160:93::-;;;;;;;;;;-1:-1:-1;5160:93:0;;5243:2;3930:36:1;;3918:2;3903:18;5160:93:0;3788:184:1;49328:130:0;;;;;;;;;;-1:-1:-1;49328:130:0;;;;;:::i;:::-;;:::i;34842:24::-;;;;;;;;;;-1:-1:-1;34842:24:0;;;;;;;;43145:321;;;;;;;;;;-1:-1:-1;43145:321:0;;;;;:::i;:::-;;:::i;8000:238::-;;;;;;;;;;-1:-1:-1;8000:238:0;;;;;:::i;:::-;;:::i;44543:401::-;;;;;;;;;;-1:-1:-1;44543:401:0;;;;;:::i;:::-;;:::i;34024:21::-;;;;;;;;;;-1:-1:-1;34024:21:0;;;;-1:-1:-1;;;;;34024:21:0;;;48403:103;;;;;;;;;;;;;:::i;33854:19::-;;;;;;;;;;-1:-1:-1;33854:19:0;;;;;;;;;-1:-1:-1;;;33854:19:0;;;;;-1:-1:-1;;;33854:19:0;;;;;;;;;;5130:14:1;5171:15;;;5153:34;;5223:15;;;5218:2;5203:18;;5196:43;5275:15;;5255:18;;;5248:43;;;;5108:2;5093:18;33854:19:0;4924:373:1;33681:26:0;;;;;;;;;;-1:-1:-1;33681:26:0;;;;;;;;46422:380;;;;;;;;;;-1:-1:-1;46422:380:0;;;;;:::i;:::-;;:::i;33569:47::-;;;;;;;;;;-1:-1:-1;33569:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;43474:301;;;;;;;;;;-1:-1:-1;43474:301:0;;;;;:::i;:::-;;:::i;48815:134::-;;;;;;;;;;-1:-1:-1;48815:134:0;;;;;:::i;:::-;;:::i;33909:32::-;;;;;;;;;;-1:-1:-1;33909:32:0;;;;-1:-1:-1;;;;;33909:32:0;;;;-1:-1:-1;;;33909:32:0;;;;;;-1:-1:-1;;;33909:32:0;;;;;;;;;;-1:-1:-1;;;;;5942:15:1;;;5924:34;;5994:15;;;;5989:2;5974:18;;5967:43;6053:14;6046:22;6026:18;;;6019:50;5875:2;5860:18;33909:32:0;5695:380:1;5489:127:0;;;;;;;;;;-1:-1:-1;5489:127:0;;;;;:::i;:::-;;:::i;13103:150::-;;;;;;;;;;;;;:::i;49201:119::-;;;;;;;;;;;;;:::i;45453:360::-;;;;;;;;;;;;;:::i;34810:25::-;;;;;;;;;;;;;;;;50483:392;;;;;;;;;;-1:-1:-1;50483:392:0;;;;;:::i;:::-;;:::i;33950:26::-;;;;;;;;;;-1:-1:-1;33950:26:0;;;;;;;;44952:182;;;;;;;;;;;;;:::i;33623:49::-;;;;;;;;;;-1:-1:-1;33623:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;12889:79;;;;;;;;;;-1:-1:-1;12954:6:0;;-1:-1:-1;;;;;12954:6:0;12889:79;;4408:104;;;;;;;;;;;;;:::i;45307:138::-;;;;;;;;;;;;;:::i;34399:42::-;;;;;;;;;;;;34436:5;34399:42;;;;;-1:-1:-1;;;;;6242:31:1;;;6224:50;;6212:2;6197:18;34399:42:0;6080:200:1;8741:436:0;;;;;;;;;;-1:-1:-1;8741:436:0;;;;;:::i;:::-;;:::i;33767:31::-;;;;;;;;;;-1:-1:-1;33767:31:0;;;;-1:-1:-1;;;;;33767:31:0;;;44137:398;;;;;;;;;;-1:-1:-1;44137:398:0;;;;;:::i;:::-;;:::i;48663:147::-;;;;;;;;;;-1:-1:-1;48663:147:0;;;;;:::i;:::-;;:::i;5822:193::-;;;;;;;;;;-1:-1:-1;5822:193:0;;;;;:::i;:::-;;:::i;49601:342::-;;;;;;;;;;-1:-1:-1;49601:342:0;;;;;:::i;:::-;;:::i;48957:232::-;;;;;;;;;;-1:-1:-1;48957:232:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;6534:32:1;;;6516:51;;6598:2;6583:18;;6576:34;;;;6626:18;;;6619:34;6684:2;6669:18;;6662:34;6503:3;6488:19;48957:232:0;6285:417:1;33716:42:0;;;;;;;;;;-1:-1:-1;33716:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;42458:319;;;;;;;;;;-1:-1:-1;42458:319:0;;;;;:::i;:::-;;:::i;49467:126::-;;;;;;;;;;-1:-1:-1;49467:126:0;;;;;:::i;:::-;;:::i;33985:30::-;;;;;;;;;;;;;;;;34245:39;;;;;;;;;;-1:-1:-1;34245:39:0;;;;;;;;33880:20;;;;;;;;;;-1:-1:-1;33880:20:0;;;;;;;;;-1:-1:-1;;;33880:20:0;;;;;-1:-1:-1;;;33880:20:0;;;;;;42785:352;;;;;;;;;;-1:-1:-1;42785:352:0;;;;;:::i;:::-;;:::i;6078:151::-;;;;;;;;;;-1:-1:-1;6078:151:0;;;;;:::i;:::-;;:::i;34366:24::-;;;;;;;;;;-1:-1:-1;34366:24:0;;;;-1:-1:-1;;;;;34366:24:0;;;;-1:-1:-1;;;34366:24:0;;;;;;;;;-1:-1:-1;;;;;7462:15:1;;;7444:34;;7514:15;;;;7509:2;7494:18;;7487:43;7364:18;34366:24:0;7217:319:1;13261:244:0;;;;;;;;;;-1:-1:-1;13261:244:0;;;;;:::i;:::-;;:::i;45142:157::-;;;;;;;;;;;;;:::i;34291:66::-;;;;;;;;;;-1:-1:-1;34291:66:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;51338:425;13016:6;;-1:-1:-1;;;;;13016:6:0;175:10;13016:22;13008:67;;;;-1:-1:-1;;;13008:67:0;;;;;;;:::i;:::-;;;;;;;;;51436:1:::1;51412:21;:25;:57;;;;;51468:1;51441:24;51459:4;51441:9;:24::i;:::-;:28;51412:57;51404:66;;;::::0;::::1;;51483:4;-1:-1:-1::0;;;;;51483:12:0::1;;51503:21;51483:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;51579:6:0::1;::::0;51540:73:::1;::::0;-1:-1:-1;51564:4:0::1;::::0;-1:-1:-1;;;;;;51579:6:0::1;::::0;-1:-1:-1;51588:24:0::1;51564:4:::0;51588:9:::1;:24::i;:::-;51540:15;:73::i;:::-;51663:6;::::0;51672:46:::1;::::0;-1:-1:-1;;;51672:46:0;;51712:4:::1;51672:46;::::0;::::1;3726:51:1::0;-1:-1:-1;;;;;51639:4:0::1;51624:30:::0;::::1;::::0;::::1;::::0;51663:6;::::1;::::0;51624:30;;51672:31:::1;::::0;3699:18:1;;51672:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51624:95;::::0;-1:-1:-1;;;;;;51624:95:0::1;::::0;;;;;;-1:-1:-1;;;;;8536:32:1;;;51624:95:0::1;::::0;::::1;8518:51:1::0;8585:18;;;8578:34;8491:18;;51624:95:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;51738:6:0::1;::::0;51730:25:::1;::::0;-1:-1:-1;;;51730:25:0;;-1:-1:-1;;;;;3744:32:1;;;51730:25:0::1;::::0;::::1;3726:51:1::0;51738:6:0;;::::1;::::0;51730:20:::1;::::0;3699:18:1;;51730:25:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;51338:425:::0;:::o;4189:100::-;4243:13;4276:5;4269:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4189:100;:::o;50883:447::-;50964:7;50984:20;51007:30;51030:6;51007:22;:30::i;:::-;51072:16;;;51086:1;51072:16;;;;;;;;50984:53;;-1:-1:-1;51048:21:0;;51072:16;;;;;;;;;;-1:-1:-1;;51109:9:0;;:16;;;-1:-1:-1;;;51109:16:0;;;;51048:40;;-1:-1:-1;;;;;;51109:9:0;;;;:14;;-1:-1:-1;51109:16:0;;;;;;;;;;;;;;:9;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51099:4;51104:1;51099:7;;;;;;;;:::i;:::-;;;;;;:26;-1:-1:-1;;;;;51099:26:0;;;-1:-1:-1;;;;;51099:26:0;;;;;51154:4;51136;51141:1;51136:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;51136:23:0;;;:7;;;;;;;;;:23;51197:9;;:43;;-1:-1:-1;;;51197:43:0;;51170:24;;51197:9;;;;;:23;;:43;;51221:12;;51235:4;;51197:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;51197:43:0;;;;;;;;;;;;:::i;:::-;51286:6;:15;51170:70;;-1:-1:-1;34436:5:0;;51286:20;;-1:-1:-1;;;51286:15:0;;;;51304:2;51286:20;:::i;:::-;51272:35;;:7;51280:1;51272:10;;;;;;;;:::i;:::-;;;;;;;:35;;;;:::i;:::-;:49;;;;:::i;:::-;51258:7;51266:1;51258:10;;;;;;;;:::i;:::-;;;;;;;:64;;;;:::i;:::-;51251:71;50883:447;-1:-1:-1;;;;;50883:447:0:o;6549:201::-;6632:4;175:10;6688:32;175:10;6704:7;6713:6;6688:8;:32::i;:::-;6738:4;6731:11;;;6549:201;;;;;:::o;43783:346::-;13016:6;;-1:-1:-1;;;;;13016:6:0;175:10;13016:22;13008:67;;;;-1:-1:-1;;;13008:67:0;;;;;;;:::i;:::-;43904:6:::1;43883:13;5406:12:::0;;;5318:108;43883:13:::1;:17;::::0;43899:1:::1;43883:17;:::i;:::-;43882:28;;;;:::i;:::-;43869:9;:41;;43861:107;;;::::0;-1:-1:-1;;;43861:107:0;;12769:2:1;43861:107:0::1;::::0;::::1;12751:21:1::0;12808:2;12788:18;;;12781:30;12847:34;12827:18;;;12820:62;-1:-1:-1;;;12898:18:1;;;12891:51;12959:19;;43861:107:0::1;12567:417:1::0;43861:107:0::1;44022:4;44001:13;5406:12:::0;;;5318:108;44001:13:::1;:17;::::0;44017:1:::1;44001:17;:::i;:::-;44000:26;;;;:::i;:::-;43987:9;:39;;43979:104;;;::::0;-1:-1:-1;;;43979:104:0;;13191:2:1;43979:104:0::1;::::0;::::1;13173:21:1::0;13230:2;13210:18;;;13203:30;13269:34;13249:18;;;13242:62;-1:-1:-1;;;13320:18:1;;;13313:50;13380:19;;43979:104:0::1;12989:416:1::0;43979:104:0::1;44094:15;:27:::0;43783:346::o;45821:593::-;13016:6;;-1:-1:-1;;;;;13016:6:0;175:10;13016:22;13008:67;;;;-1:-1:-1;;;13008:67:0;;;;;;;:::i;:::-;45946:37;;::::1;45938:72;;;::::0;-1:-1:-1;;;45938:72:0;;13612:2:1;45938:72:0::1;::::0;::::1;13594:21:1::0;13651:2;13631:18;;;13624:30;-1:-1:-1;;;13670:18:1;;;13663:52;13732:18;;45938:72:0::1;13410:346:1::0;45938:72:0::1;46030:14;::::0;::::1;;46029:15;46021:64;;;::::0;-1:-1:-1;;;46021:64:0;;13963:2:1;46021:64:0::1;::::0;::::1;13945:21:1::0;14002:2;13982:18;;;13975:30;14041:34;14021:18;;;14014:62;-1:-1:-1;;;14092:18:1;;;14085:34;14136:19;;46021:64:0::1;13761:400:1::0;46021:64:0::1;46096:14;46121::::0;46150:9:::1;46146:261;46165:18:::0;;::::1;46146:261;;;46213:7;;46221:1;46213:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;46204:19;;46247:12;;46260:1;46247:15;;;;;;;:::i;:::-;;;;;;;46238:24;;46277:52;46293:10;46305:6;46313:12;;46326:1;46313:15;;;;;;;:::i;:::-;;;;;;;46277;:52::i;:::-;46344:15;::::0;:51:::1;::::0;-1:-1:-1;;;46344:51:0;;-1:-1:-1;;;;;8536:32:1;;;46344:51:0::1;::::0;::::1;8518::1::0;8585:18;;;8578:34;;;46344:15:0;;::::1;::::0;:26:::1;::::0;8491:18:1;;46344:51:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;46185:3;;;;;:::i;:::-;;;;46146:261;;;;45927:487;;45821:593:::0;;;;:::o;46810:173::-;13016:6;;-1:-1:-1;;;;;13016:6:0;175:10;13016:22;13008:67;;;;-1:-1:-1;;;13008:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;46898:22:0;::::1;46890:47;;;::::0;-1:-1:-1;;;46890:47:0;;14803:2:1;46890:47:0::1;::::0;::::1;14785:21:1::0;14842:2;14822:18;;;14815:30;-1:-1:-1;;;14861:18:1;;;14854:42;14913:18;;46890:47:0::1;14601:336:1::0;46890:47:0::1;46948:16;:27:::0;;-1:-1:-1;;;;;;46948:27:0::1;-1:-1:-1::0;;;;;46948:27:0;;;::::1;::::0;;;::::1;::::0;;46810:173::o;7330:261::-;7427:4;175:10;7485:38;7501:4;175:10;7516:6;7485:15;:38::i;:::-;7534:27;7544:4;7550:2;7554:6;7534:9;:27::i;:::-;-1:-1:-1;7579:4:0;;7330:261;-1:-1:-1;;;;7330:261:0:o;48514:141::-;48604:15;;:43;;;-1:-1:-1;;;48604:43:0;;;;48577:7;;-1:-1:-1;;;;;48604:15:0;;:41;;:43;;;;;;;;;;;;;;:15;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48597:50;;48514:141;:::o;49328:130::-;13016:6;;-1:-1:-1;;;;;13016:6:0;175:10;13016:22;13008:67;;;;-1:-1:-1;;;13008:67:0;;;;;;;:::i;:::-;49405:15:::1;::::0;:45:::1;::::0;-1:-1:-1;;;49405:45:0;;-1:-1:-1;;;;;3744:32:1;;;49405:45:0::1;::::0;::::1;3726:51:1::0;49405:15:0;;::::1;::::0;:36:::1;::::0;3699:18:1;;49405:45:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;49328:130:::0;:::o;43145:321::-;13016:6;;-1:-1:-1;;;;;13016:6:0;175:10;13016:22;13008:67;;;;-1:-1:-1;;;13008:67:0;;;;;;;:::i;:::-;43284:14:::1;5243:2:::0;43284::::1;:14;:::i;:::-;43278:3;43258:13;5406:12:::0;;;5318:108;43258:13:::1;:17;::::0;43274:1:::1;43258:17;:::i;:::-;:23;;;;:::i;:::-;43257:42;;;;:::i;:::-;43239:14;-1:-1:-1::0;;;;;43239:60:0::1;;;43231:80;;;::::0;-1:-1:-1;;;43231:80:0;;16527:2:1;43231:80:0::1;::::0;::::1;16509:21:1::0;16566:1;16546:18;;;16539:29;-1:-1:-1;;;16584:18:1;;;16577:37;16631:18;;43231:80:0::1;16325:330:1::0;43231:80:0::1;43376:14;5243:2:::0;43376::::1;:14;:::i;:::-;43358:33;::::0;-1:-1:-1;;;;;43358:33:0;::::1;;:::i;:::-;43322:8;:70:::0;;-1:-1:-1;;;;;;43322:70:0::1;-1:-1:-1::0;;;;;43322:70:0;;;::::1;::::0;;::::1;::::0;;43408:50:::1;::::0;16806:66:1;;;43408:50:0::1;::::0;16794:2:1;16779:18;43408:50:0::1;;;;;;;;43145:321:::0;:::o;8000:238::-;8088:4;175:10;8144:64;175:10;8160:7;8197:10;8169:25;175:10;8160:7;8169:9;:25::i;:::-;:38;;;;:::i;:::-;8144:8;:64::i;44543:401::-;13016:6;;-1:-1:-1;;;;;13016:6:0;175:10;13016:22;13008:67;;;;-1:-1:-1;;;13008:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;;;;;;;;;;;44668:34:0::1;::::0;;::::1;::::0;;44713:32;::::1;-1:-1:-1::0;;;44713:32:0;44773:28:::1;44713:32:::0;44668:34;44773:28:::1;:::i;:::-;44756:45;;:14;::::0;::::1;:45:::0;;;44839:3:::1;-1:-1:-1::0;44820:22:0::1;44812:52;;;::::0;-1:-1:-1;;;44812:52:0;;17215:2:1;44812:52:0::1;::::0;::::1;17197:21:1::0;17254:2;17234:18;;;17227:30;-1:-1:-1;;;17273:18:1;;;17266:47;17330:18;;44812:52:0::1;17013:341:1::0;44812:52:0::1;44895:14;::::0;;::::1;::::0;44880:30;;17534:14:1;17522:27;;;17504:46;;44880:30:0::1;::::0;17492:2:1;17477:18;44880:30:0::1;;;;;;;44921:15:::0;;:7:::1;:15:::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;;44921:15:0::1;-1:-1:-1::0;;;;44921:15:0;;::::1;-1:-1:-1::0;;;44921:15:0::1;-1:-1:-1::0;;;;;;44921:15:0;;;;;;::::1;::::0;::::1;::::0;;;::::1;;::::0;;-1:-1:-1;;44543:401:0:o;48403:103::-;48440:15;;:58;;-1:-1:-1;;;48440:58:0;;48479:10;48440:58;;;17745:51:1;48440:15:0;17812:18:1;;;17805:50;-1:-1:-1;;;;;48440:15:0;;;;:30;;17718:18:1;;48440:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;48403:103::o;46422:380::-;13016:6;;-1:-1:-1;;;;;13016:6:0;175:10;13016:22;13008:67;;;;-1:-1:-1;;;13008:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;46511:20:0;::::1;46503:59;;;::::0;-1:-1:-1;;;46503:59:0;;18068:2:1;46503:59:0::1;::::0;::::1;18050:21:1::0;18107:2;18087:18;;;18080:30;18146:28;18126:18;;;18119:56;18192:18;;46503:59:0::1;17866:350:1::0;46503:59:0::1;46599:4;-1:-1:-1::0;;;;;46581:23:0;::::1;::::0;46573:73:::1;;;::::0;-1:-1:-1;;;46573:73:0;;18423:2:1;46573:73:0::1;::::0;::::1;18405:21:1::0;18462:2;18442:18;;;18435:30;18501:34;18481:18;;;18474:62;-1:-1:-1;;;18552:18:1;;;18545:35;18597:19;;46573:73:0::1;18221:401:1::0;46573:73:0::1;46684:39;::::0;-1:-1:-1;;;46684:39:0;;46717:4:::1;46684:39;::::0;::::1;3726:51:1::0;46657:24:0::1;::::0;-1:-1:-1;;;;;46684:24:0;::::1;::::0;::::1;::::0;3699:18:1;;46684:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46657:66;;46734:60;46764:6;46772:3;46777:16;46734:22;:60::i;:::-;46492:310;46422:380:::0;;:::o;43474:301::-;13016:6;;-1:-1:-1;;;;;13016:6:0;175:10;13016:22;13008:67;;;;-1:-1:-1;;;13008:67:0;;;;;;;:::i;:::-;43608:14:::1;5243:2:::0;43608::::1;:14;:::i;:::-;43602:3;43582:13;5406:12:::0;;;5318:108;43582:13:::1;:17;::::0;43598:1:::1;43582:17;:::i;:::-;:23;;;;:::i;:::-;43581:42;;;;:::i;:::-;43563:14;-1:-1:-1::0;;;;;43563:60:0::1;;;43555:80;;;::::0;-1:-1:-1;;;43555:80:0;;16527:2:1;43555:80:0::1;::::0;::::1;16509:21:1::0;16566:1;16546:18;;;16539:29;-1:-1:-1;;;16584:18:1;;;16577:37;16631:18;;43555:80:0::1;16325:330:1::0;43555:80:0::1;43695:14;5243:2:::0;43695::::1;:14;:::i;:::-;43677:33;::::0;-1:-1:-1;;;;;43677:33:0;::::1;;:::i;:::-;43646:8;:65:::0;;-1:-1:-1;;;;;43646:65:0;;::::1;-1:-1:-1::0;;;43646:65:0;;::::1;::::0;::::1;;::::0;;;;43727:40:::1;::::0;43746:20;;;::::1;;16806:66:1::0;;43727:40:0::1;::::0;16794:2:1;16779:18;43727:40:0::1;16660:218:1::0;48815:134:0;48906:15;;:38;;-1:-1:-1;;;48906:38:0;;-1:-1:-1;;;;;3744:32:1;;;48906:38:0;;;3726:51:1;48885:7:0;;48906:15;;:29;;3699:18:1;;48906:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;5489:127::-;-1:-1:-1;;;;;5590:18:0;5563:7;5590:18;;;;;;;;;;;;5489:127::o;13103:150::-;13016:6;;-1:-1:-1;;;;;13016:6:0;175:10;13016:22;13008:67;;;;-1:-1:-1;;;13008:67:0;;;;;;;:::i;:::-;13196:6:::1;::::0;13175:40:::1;::::0;13212:1:::1;::::0;-1:-1:-1;;;;;13196:6:0::1;::::0;13175:40:::1;::::0;13212:1;;13175:40:::1;13226:6;:19:::0;;-1:-1:-1;;;;;;13226:19:0::1;::::0;;13103:150::o;49201:119::-;49282:15;;:30;;;-1:-1:-1;;;49282:30:0;;;;49255:7;;-1:-1:-1;;;;;49282:15:0;;:28;;:30;;;;;;;;;;;;;;:15;:30;;;;;;;;;;;;;;45453:360;13016:6;;-1:-1:-1;;;;;13016:6:0;175:10;13016:22;13008:67;;;;-1:-1:-1;;;13008:67:0;;;;;;;:::i;:::-;45507:7:::1;:15:::0;;-1:-1:-1;;45507:15:0;;::::1;::::0;;;45533:20:::1;:28:::0;;;;::::1;::::0;;-1:-1:-1;;;;;;;;;45517:5:0::1;-1:-1:-1::0;;;;;;;45608:14:0::1;45625:13;5406:12:::0;;;5318:108;45625:13:::1;-1:-1:-1::0;;;;;45649:44:0;::::1;::::0;;;45704:21:::1;::::0;::::1;:39:::0;;;-1:-1:-1;;;45754:20:0;::::1;;:8;:20:::0;45790:15:::1;::::0;45608:30;;-1:-1:-1;45790:15:0::1;::::0;45649:26:::1;::::0;45790:15:::1;45496:317;;45453:360::o:0;50483:392::-;50617:16;;;50631:1;50617:16;;;;;;;;50573:7;;;;50617:16;50631:1;50617:16;;;;;;;;-1:-1:-1;;50654:9:0;;:16;;;-1:-1:-1;;;50654:16:0;;;;50593:40;;-1:-1:-1;;;;;;50654:9:0;;;;:14;;-1:-1:-1;50654:16:0;;;;;;;;;;;;;;:9;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50644:4;50649:1;50644:7;;;;;;;;:::i;:::-;;;;;;:26;-1:-1:-1;;;;;50644:26:0;;;-1:-1:-1;;;;;50644:26:0;;;;;50699:4;50681;50686:1;50681:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;50681:23:0;;;:7;;;;;;;;;:23;50742:9;;:43;;-1:-1:-1;;;50742:43:0;;50715:24;;50742:9;;;;;:23;;:43;;50766:12;;50780:4;;50742:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;50742:43:0;;;;;;;;;;;;:::i;:::-;50831:6;:15;50715:70;;-1:-1:-1;34436:5:0;;50831:20;;-1:-1:-1;;;50831:15:0;;;;50849:2;50831:20;:::i;:::-;50817:35;;:7;50825:1;50817:10;;;;;;;;:::i;:::-;;;;;;;:35;;;;:::i;:::-;:49;;;;:::i;:::-;50803:7;50811:1;50803:10;;;;;;;;:::i;:::-;;;;;;;:64;;;;:::i;:::-;50796:71;50483:392;-1:-1:-1;;;;50483:392:0:o;44952:182::-;13016:6;;-1:-1:-1;;;;;13016:6:0;175:10;13016:22;13008:67;;;;-1:-1:-1;;;13008:67:0;;;;;;;:::i;:::-;45016:14:::1;::::0;::::1;;45015:15;45007:48;;;::::0;-1:-1:-1;;;45007:48:0;;18829:2:1;45007:48:0::1;::::0;::::1;18811:21:1::0;18868:2;18848:18;;;18841:30;-1:-1:-1;;;18887:18:1;;;18880:50;18947:18;;45007:48:0::1;18627:344:1::0;45007:48:0::1;45066:14;:21:::0;;-1:-1:-1;;45066:21:0::1;45083:4;45066:21;::::0;;45111:15:::1;45098:10;:28:::0;44952:182::o;4408:104::-;4464:13;4497:7;4490:14;;;;;:::i;45307:138::-;13016:6;;-1:-1:-1;;;;;13016:6:0;175:10;13016:22;13008:67;;;;-1:-1:-1;;;13008:67:0;;;;;;;:::i;:::-;45373:12:::1;::::0;::::1;;45365:41;;;::::0;-1:-1:-1;;;45365:41:0;;19178:2:1;45365:41:0::1;::::0;::::1;19160:21:1::0;19217:2;19197:18;;;19190:30;-1:-1:-1;;;19236:18:1;;;19229:46;19292:18;;45365:41:0::1;18976:340:1::0;45365:41:0::1;45417:12;:20:::0;;-1:-1:-1;;45417:20:0::1;::::0;;45307:138::o;8741:436::-;8834:4;175:10;8834:4;8917:25;175:10;8934:7;8917:9;:25::i;:::-;8890:52;;8981:15;8961:16;:35;;8953:85;;;;-1:-1:-1;;;8953:85:0;;19523:2:1;8953:85:0;;;19505:21:1;19562:2;19542:18;;;19535:30;19601:34;19581:18;;;19574:62;-1:-1:-1;;;19652:18:1;;;19645:35;19697:19;;8953:85:0;19321:401:1;8953:85:0;9074:60;9083:5;9090:7;9118:15;9099:16;:34;9074:8;:60::i;44137:398::-;13016:6;;-1:-1:-1;;;;;13016:6:0;175:10;13016:22;13008:67;;;;-1:-1:-1;;;13008:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;;;;;;;;;;;44261:34:0::1;::::0;;::::1;::::0;;44306:32;::::1;-1:-1:-1::0;;;44306:32:0;44366:28:::1;44306:32:::0;44261:34;44366:28:::1;:::i;:::-;44349:45;;:14;::::0;::::1;:45:::0;;;44432:3:::1;-1:-1:-1::0;44413:22:0::1;44405:52;;;::::0;-1:-1:-1;;;44405:52:0;;17215:2:1;44405:52:0::1;::::0;::::1;17197:21:1::0;17254:2;17234:18;;;17227:30;-1:-1:-1;;;17273:18:1;;;17266:47;17330:18;;44405:52:0::1;17013:341:1::0;44405:52:0::1;44487:14;::::0;;::::1;::::0;44473:29;;17534:14:1;17522:27;;;17504:46;;44473:29:0::1;::::0;17492:2:1;17477:18;44473:29:0::1;;;;;;;44513:14:::0;;:6:::1;:14:::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;;44513:14:0::1;-1:-1:-1::0;;;;44513:14:0;;::::1;-1:-1:-1::0;;;44513:14:0::1;-1:-1:-1::0;;;;;;44513:14:0;;;;;;::::1;::::0;::::1;::::0;;;::::1;;::::0;;-1:-1:-1;;44137:398:0:o;48663:147::-;48756:15;;:47;;-1:-1:-1;;;48756:47:0;;-1:-1:-1;;;;;3744:32:1;;;48756:47:0;;;3726:51:1;48732:7:0;;48756:15;;:38;;3699:18:1;;48756:47:0;3548:235:1;5822:193:0;5901:4;175:10;5957:28;175:10;5974:2;5978:6;5957:9;:28::i;49601:342::-;49689:15;;:70;;-1:-1:-1;;;49689:70:0;;49747:10;49689:70;;;3726:51:1;49658:28:0;;-1:-1:-1;;;;;49689:15:0;;:49;;3699:18:1;;49689:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49658:101;-1:-1:-1;49773:24:0;;49770:166;;49813:58;49827:20;49849:9;49860:10;49813:13;:58::i;49770:166::-;49904:20;;-1:-1:-1;;;49904:20:0;;20153:2:1;49904:20:0;;;20135:21:1;20192:2;20172:18;;;20165:30;-1:-1:-1;;;20211:18:1;;;20204:40;20261:18;;49904:20:0;19951:334:1;48957:232:0;49146:15;;:35;;-1:-1:-1;;;49146:35:0;;-1:-1:-1;;;;;3744:32:1;;;49146:35:0;;;3726:51:1;49053:7:0;;;;;;;;49146:15;;:26;;3699:18:1;;49146:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49139:42;;;;;;;;48957:232;;;;;:::o;42458:319::-;13016:6;;-1:-1:-1;;;;;13016:6:0;175:10;13016:22;13008:67;;;;-1:-1:-1;;;13008:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;42556:22:0;::::1;42548:47;;;::::0;-1:-1:-1;;;42548:47:0;;20932:2:1;42548:47:0::1;::::0;::::1;20914:21:1::0;20971:2;20951:18;;;20944:30;-1:-1:-1;;;20990:18:1;;;20983:42;21042:18;;42548:47:0::1;20730:336:1::0;42548:47:0::1;42634:4;-1:-1:-1::0;;;;;42614:25:0;::::1;::::0;42606:62:::1;;;::::0;-1:-1:-1;;;42606:62:0;;21273:2:1;42606:62:0::1;::::0;::::1;21255:21:1::0;21312:2;21292:18;;;21285:30;21351:26;21331:18;;;21324:54;21395:18;;42606:62:0::1;21071:348:1::0;42606:62:0::1;-1:-1:-1::0;;;;;42679:24:0;::::1;;::::0;;;:14:::1;:24;::::0;;;;;;;;:36;;-1:-1:-1;;42679:36:0::1;::::0;::::1;;::::0;;::::1;::::0;;;42731:38;;17745:51:1;;;17812:18;;;17805:50;42731:38:0::1;::::0;17718:18:1;42731:38:0::1;;;;;;;;42458:319:::0;;:::o;49467:126::-;13016:6;;-1:-1:-1;;;;;13016:6:0;175:10;13016:22;13008:67;;;;-1:-1:-1;;;13008:67:0;;;;;;;:::i;:::-;49542:15:::1;::::0;:43:::1;::::0;-1:-1:-1;;;49542:43:0;;-1:-1:-1;;;;;3744:32:1;;;49542:43:0::1;::::0;::::1;3726:51:1::0;49542:15:0;;::::1;::::0;:34:::1;::::0;3699:18:1;;49542:43:0::1;3548:235:1::0;42785:352:0;13016:6;;-1:-1:-1;;;;;13016:6:0;175:10;13016:22;13008:67;;;;-1:-1:-1;;;13008:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;42885:22:0;::::1;42877:47;;;::::0;-1:-1:-1;;;42877:47:0;;20932:2:1;42877:47:0::1;::::0;::::1;20914:21:1::0;20971:2;20951:18;;;20944:30;-1:-1:-1;;;20990:18:1;;;20983:42;21042:18;;42877:47:0::1;20730:336:1::0;42877:47:0::1;42939:9;42935:90;;42984:6;::::0;-1:-1:-1;;;;;42984:6:0;;::::1;42972:18:::0;;::::1;::::0;42964:49:::1;;;::::0;-1:-1:-1;;;42964:49:0;;21915:2:1;42964:49:0::1;::::0;::::1;21897:21:1::0;21954:2;21934:18;;;21927:30;-1:-1:-1;;;21973:18:1;;;21966:48;22031:18;;42964:49:0::1;21713:342:1::0;42964:49:0::1;-1:-1:-1::0;;;;;43035:26:0;::::1;;::::0;;;:16:::1;:26;::::0;;;;;;;;:38;;-1:-1:-1;;43035:38:0::1;::::0;::::1;;::::0;;::::1;::::0;;;43089:40;;17745:51:1;;;17812:18;;;17805:50;43089:40:0::1;::::0;17718:18:1;43089:40:0::1;17561:300:1::0;6078:151:0;-1:-1:-1;;;;;6194:18:0;;;6167:7;6194:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;6078:151::o;13261:244::-;13016:6;;-1:-1:-1;;;;;13016:6:0;175:10;13016:22;13008:67;;;;-1:-1:-1;;;13008:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;13350:22:0;::::1;13342:73;;;::::0;-1:-1:-1;;;13342:73:0;;22262:2:1;13342:73:0::1;::::0;::::1;22244:21:1::0;22301:2;22281:18;;;22274:30;22340:34;22320:18;;;22313:62;-1:-1:-1;;;22391:18:1;;;22384:36;22437:19;;13342:73:0::1;22060:402:1::0;13342:73:0::1;13452:6;::::0;13431:38:::1;::::0;-1:-1:-1;;;;;13431:38:0;;::::1;::::0;13452:6:::1;::::0;13431:38:::1;::::0;13452:6:::1;::::0;13431:38:::1;13480:6;:17:::0;;-1:-1:-1;;;;;;13480:17:0::1;-1:-1:-1::0;;;;;13480:17:0;;;::::1;::::0;;;::::1;::::0;;13261:244::o;45142:157::-;13016:6;;-1:-1:-1;;;;;13016:6:0;175:10;13016:22;13008:67;;;;-1:-1:-1;;;13008:67:0;;;;;;;:::i;:::-;45211:20:::1;::::0;::::1;;45203:49;;;::::0;-1:-1:-1;;;45203:49:0;;19178:2:1;45203:49:0::1;::::0;::::1;19160:21:1::0;19217:2;19197:18;;;19190:30;-1:-1:-1;;;19236:18:1;;;19229:46;19292:18;;45203:49:0::1;18976:340:1::0;45203:49:0::1;45263:20;:28:::0;;-1:-1:-1;;45263:28:0::1;::::0;;45142:157::o;9647:705::-;-1:-1:-1;;;;;9744:18:0;;9736:68;;;;-1:-1:-1;;;9736:68:0;;22669:2:1;9736:68:0;;;22651:21:1;22708:2;22688:18;;;22681:30;22747:34;22727:18;;;22720:62;-1:-1:-1;;;22798:18:1;;;22791:35;22843:19;;9736:68:0;22467:401:1;9736:68:0;-1:-1:-1;;;;;9823:16:0;;9815:64;;;;-1:-1:-1;;;9815:64:0;;23075:2:1;9815:64:0;;;23057:21:1;23114:2;23094:18;;;23087:30;23153:34;23133:18;;;23126:62;-1:-1:-1;;;23204:18:1;;;23197:33;23247:19;;9815:64:0;22873:399:1;9815:64:0;-1:-1:-1;;;;;9914:15:0;;9892:19;9914:15;;;;;;;;;;;9948:21;;;;9940:72;;;;-1:-1:-1;;;9940:72:0;;23479:2:1;9940:72:0;;;23461:21:1;23518:2;23498:18;;;23491:30;23557:34;23537:18;;;23530:62;-1:-1:-1;;;23608:18:1;;;23601:36;23654:19;;9940:72:0;23277:402:1;9940:72:0;-1:-1:-1;;;;;10048:15:0;;;:9;:15;;;;;;;;;;;10066:20;;;10048:38;;10266:13;;;;;;;;;;:23;;;;;;10318:26;;1204:25:1;;;10266:13:0;;10318:26;;1177:18:1;10318:26:0;;;;;;;9725:627;9647:705;;;:::o;11502:346::-;-1:-1:-1;;;;;11604:19:0;;11596:68;;;;-1:-1:-1;;;11596:68:0;;23886:2:1;11596:68:0;;;23868:21:1;23925:2;23905:18;;;23898:30;23964:34;23944:18;;;23937:62;-1:-1:-1;;;24015:18:1;;;24008:34;24059:19;;11596:68:0;23684:400:1;11596:68:0;-1:-1:-1;;;;;11683:21:0;;11675:68;;;;-1:-1:-1;;;11675:68:0;;24291:2:1;11675:68:0;;;24273:21:1;24330:2;24310:18;;;24303:30;24369:34;24349:18;;;24342:62;-1:-1:-1;;;24420:18:1;;;24413:32;24462:19;;11675:68:0;24089:398:1;11675:68:0;-1:-1:-1;;;;;11756:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;11808:32;;1204:25:1;;;11808:32:0;;1177:18:1;11808:32:0;;;;;;;11502:346;;;:::o;12139:419::-;12240:24;12267:25;12277:5;12284:7;12267:9;:25::i;:::-;12240:52;;-1:-1:-1;;12307:16:0;:37;12303:248;;12389:6;12369:16;:26;;12361:68;;;;-1:-1:-1;;;12361:68:0;;24694:2:1;12361:68:0;;;24676:21:1;24733:2;24713:18;;;24706:30;24772:31;24752:18;;;24745:59;24821:18;;12361:68:0;24492:353:1;12361:68:0;12473:51;12482:5;12489:7;12517:6;12498:16;:25;12473:8;:51::i;:::-;12229:329;12139:419;;;:::o;37728:545::-;-1:-1:-1;;;;;37874:20:0;;;;;;:14;:20;;;;;;;;37873:21;:44;;;;-1:-1:-1;;;;;;37899:18:0;;;;;;:14;:18;;;;;;;;37898:19;37873:44;37870:216;;;37941:14;;;;37933:45;;;;-1:-1:-1;;;37933:45:0;;25052:2:1;37933:45:0;;;25034:21:1;25091:2;25071:18;;;25064:30;-1:-1:-1;;;25110:18:1;;;25103:48;25168:18;;37933:45:0;24850:342:1;37933:45:0;37993:29;38005:4;38011:2;38015:6;37993:11;:29::i;:::-;38047:27;38057:4;38063:2;38067:6;38047:9;:27::i;:::-;38037:37;;;;:::i;:::-;;;37870:216;38098:31;38114:4;38119:2;38122:6;38098:15;:31::i;:::-;38142:15;;-1:-1:-1;;;;;38142:15:0;:26;38177:2;38182:13;38177:2;38182:9;:13::i;:::-;38142:54;;-1:-1:-1;;;;;;38142:54:0;;;;;;;-1:-1:-1;;;;;8536:32:1;;;38142:54:0;;;8518:51:1;8585:18;;;8578:34;8491:18;;38142:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;38207:15:0;;-1:-1:-1;;;;;38207:15:0;;-1:-1:-1;38207:26:0;;-1:-1:-1;38242:4:0;38249:15;38242:4;38249:9;:15::i;:::-;38207:58;;-1:-1:-1;;;;;;38207:58:0;;;;;;;-1:-1:-1;;;;;8536:32:1;;;38207:58:0;;;8518:51:1;8585:18;;;8578:34;8491:18;;38207:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19675:177;19785:58;;;-1:-1:-1;;;;;8536:32:1;;19785:58:0;;;8518:51:1;8585:18;;;;8578:34;;;19785:58:0;;;;;;;;;;8491:18:1;;;;19785:58:0;;;;;;;;-1:-1:-1;;;;;19785:58:0;-1:-1:-1;;;19785:58:0;;;19758:86;;19778:5;;19758:19;:86::i;49951:501::-;50128:16;;;50142:1;50128:16;;;;;;;;50104:21;;50128:16;;;;;;;;-1:-1:-1;;50165:9:0;;:16;;;-1:-1:-1;;;50165:16:0;;;;50104:40;;-1:-1:-1;;;;;;50165:9:0;;;;:14;;-1:-1:-1;50165:16:0;;;;;;;;;;;;;;:9;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50155:4;50160:1;50155:7;;;;;;;;:::i;:::-;;;;;;:26;-1:-1:-1;;;;;50155:26:0;;;-1:-1:-1;;;;;50155:26:0;;;;;50210:4;50192;50197:1;50192:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;50192:23:0;;;:7;;;;;;;;;:23;50254:9;;:190;;-1:-1:-1;;;50254:190:0;;:9;;;:60;;50322:14;;50254:190;;50352:6;;50373:4;;50400:2;;50418:15;;50254:190;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50035:417;49951:501;;;:::o;38281:1510::-;38367:7;;;;38364:1420;;;-1:-1:-1;;;;;38412:20:0;;38390:19;38412:20;;;:16;:20;;;;;;;;;38469:13;38429:2;38469:9;:13::i;:::-;38497:36;;;;;;;;38525:8;38497:36;-1:-1:-1;;;;;38497:36:0;;;;;-1:-1:-1;;;38497:36:0;;;;;;;;;;;;-1:-1:-1;;;;;38572:15:0;;38497:25;38572:15;;;:9;:15;;;;;;;;38447:35;;-1:-1:-1;38497:36:0;38572:15;;:34;;;;;38592:14;38591:15;38572:34;38568:538;;;38645:26;;-1:-1:-1;;;;;38635:36:0;;;;38627:56;;;;-1:-1:-1;;;38627:56:0;;25906:2:1;38627:56:0;;;25888:21:1;25945:1;25925:18;;;25918:29;-1:-1:-1;;;25963:18:1;;;25956:37;26010:18;;38627:56:0;25704:330:1;38627:56:0;38734:21;;;;-1:-1:-1;;;;;38710:45:0;:20;38719:11;38710:6;:20;:::i;:::-;:45;;38702:68;;;;-1:-1:-1;;;38702:68:0;;26241:2:1;38702:68:0;;;26223:21:1;26280:2;26260:18;;;26253:30;-1:-1:-1;;;26299:18:1;;;26292:40;26349:18;;38702:68:0;26039:334:1;38702:68:0;38568:538;;;-1:-1:-1;;;;;38831:13:0;;;;;;:9;:13;;;;;;;;:40;;;;-1:-1:-1;;;;;;38849:22:0;;;;;;:16;:22;;;;;;;;38848:23;38831:40;38827:279;;;38910:26;;-1:-1:-1;;;;;38900:36:0;;;;38892:56;;;;-1:-1:-1;;;38892:56:0;;25906:2:1;38892:56:0;;;25888:21:1;25945:1;25925:18;;;25918:29;-1:-1:-1;;;25963:18:1;;;25956:37;26010:18;;38892:56:0;25704:330:1;38827:279:0;38987:14;38983:123;;39054:21;;;;-1:-1:-1;;;;;39030:45:0;:20;39039:11;39030:6;:20;:::i;:::-;:45;;39022:68;;;;-1:-1:-1;;;39022:68:0;;26241:2:1;39022:68:0;;;26223:21:1;26280:2;26260:18;;;26253:30;-1:-1:-1;;;26299:18:1;;;26292:40;26349:18;;39022:68:0;26039:334:1;39022:68:0;39126:20;;;;39122:651;;;39184:9;;-1:-1:-1;;;;;39170:24:0;;;39184:9;;39170:24;;;;:49;;-1:-1:-1;39212:6:0;;-1:-1:-1;;;;;39198:21:0;;;39212:6;;39198:21;;39170:49;39166:592;;;39276:9;39251:35;;;;:24;:35;;;;;;39289:12;-1:-1:-1;39243:85:0;;;;-1:-1:-1;;;39243:85:0;;26580:2:1;39243:85:0;;;26562:21:1;26619:2;26599:18;;;26592:30;-1:-1:-1;;;26638:18:1;;;26631:52;26700:18;;39243:85:0;26378:346:1;39243:85:0;39359:9;-1:-1:-1;;;;;39359:15:0;;;39351:61;;;;-1:-1:-1;;;39351:61:0;;26931:2:1;39351:61:0;;;26913:21:1;26970:2;26950:18;;;26943:30;27009:34;26989:18;;;26982:62;-1:-1:-1;;;27060:18:1;;;27053:31;27101:19;;39351:61:0;26729:397:1;39351:61:0;39460:9;39435:35;;;;:24;:35;;;;;39473:12;39435:50;;39511:10;;39530:15;;39511;;39524:2;39511:15;:::i;:::-;:34;39508:231;;39593:11;39581:24;;;;:11;:24;;;;;;;;:32;;;;;;;;;39616:12;-1:-1:-1;39573:68:0;;;;-1:-1:-1;;;39573:68:0;;27333:2:1;39573:68:0;;;27315:21:1;27372:1;27352:18;;;27345:29;-1:-1:-1;;;27390:18:1;;;27383:38;27438:18;;39573:68:0;27131:331:1;39573:68:0;39680:11;39668:24;;;;:11;:24;;;;;;;;:32;;;;;;;;39703:12;39668:47;;39508:231;38375:1409;;;38281:1510;;;:::o;39799:1030::-;39878:7;39930:15;;39902:24;39920:4;39902:9;:24::i;:::-;:43;;:63;;;;-1:-1:-1;;;;;;39950:15:0;;;;;;:9;:15;;;;;;;;39949:16;39902:63;39899:109;;;39982:14;:12;:14::i;:::-;40023:12;;;;40020:61;;;40051:18;:16;:18::i;:::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40164:13:0;;;;:9;:13;;;;;;;;40160:126;;;-1:-1:-1;40193:15:0;;;;;;;;40201:7;40193:15;;;;;;;-1:-1:-1;;;40193:15:0;;;;;;;;-1:-1:-1;;;40193:15:0;;;;;;;;;;;40160:126;;;-1:-1:-1;;;;;40229:15:0;;;;;;:9;:15;;;;;;;;40226:60;;;-1:-1:-1;40260:14:0;;;;;;;;40268:6;40260:14;;;;;;;-1:-1:-1;;;40260:14:0;;;;;;;;-1:-1:-1;;;40260:14:0;;;;;;;;;;;40226:60;40301:14;;;;:18;;;40298:493;;40335:53;;;;;;;;40376:12;40335:53;-1:-1:-1;;;;;40335:53:0;;;;;-1:-1:-1;;;40335:53:0;;;;;;;-1:-1:-1;;;40335:53:0;;;;;;;;;;40426:14;;;;34436:5;;40417:23;;;;:6;:23;:::i;:::-;:37;;;;:::i;:::-;40403:52;;40562:3;40545:5;:14;;;40518:41;;40524:5;:18;;;40518:24;;:3;:24;;;;:::i;:::-;:41;;;;:::i;:::-;:47;;;;:::i;:::-;40470:96;;:18;;:96;;;;;:::i;:::-;-1:-1:-1;;;;;40470:96:0;;;-1:-1:-1;40654:14:0;;;;40634:17;;;;40671:3;;40628:40;;;;;:23;;;:3;:23;:::i;:::-;:40;;;;:::i;:::-;:46;;;;:::i;:::-;40581:18;:36;;:94;;;;;;;:::i;:::-;-1:-1:-1;;;;;40581:94:0;;;;;;40690:33;;:12;:33;;;;;;;;;;;;-1:-1:-1;;;40690:33:0;-1:-1:-1;;;;40690:33:0;;;-1:-1:-1;;;40690:33:0;-1:-1:-1;;;;;;40690:33:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40738:41:0;40754:4;40768;-1:-1:-1;;;;;40738:41:0;;:15;:41::i;:::-;40320:471;40298:493;-1:-1:-1;;;;;;40811:10:0;;39799:1030;-1:-1:-1;;;;39799:1030:0:o;20073:333::-;20154:23;20180:69;20208:4;20180:69;;;;;;;;;;;;;;;;;20188:5;-1:-1:-1;;;;;20180:27:0;;;:69;;;;;:::i;:::-;20264:17;;20154:95;;-1:-1:-1;20264:21:0;20260:139;;20321:10;20310:30;;;;;;;;;;;;:::i;:::-;20302:85;;;;-1:-1:-1;;;20302:85:0;;28354:2:1;20302:85:0;;;28336:21:1;28393:2;28373:18;;;28366:30;28432:34;28412:18;;;28405:62;-1:-1:-1;;;28483:18:1;;;28476:40;28533:19;;20302:85:0;28152:406:1;41226:1200:0;41271:23;41297:24;41315:4;41297:9;:24::i;:::-;41332:50;;;;;;;;41370:12;41332:50;-1:-1:-1;;;;;41332:50:0;;;;;;-1:-1:-1;;;41332:50:0;;;;;;;;;;;-1:-1:-1;;;41332:50:0;;;;;;;;;;;;;;41271;;-1:-1:-1;41332:50:0;-1:-1:-1;;41421:70:0;;41332:50;41421:70;:::i;:::-;-1:-1:-1;;;;;41393:98:0;;-1:-1:-1;41515:20:0;;;:46;;-1:-1:-1;41539:22:0;;41515:46;41512:60;;;41564:7;;;41226:1200::o;41512:60::-;41605:15;;:20;;41623:2;41605:20;:::i;:::-;41587:15;:38;41584:107;;;41659:15;;:20;;41677:2;41659:20;:::i;:::-;41641:38;;41584:107;41704:19;;41701:578;;41741:33;41758:15;41741:16;:33::i;:::-;41894;;;;41824:21;;41803:18;;-1:-1:-1;;;;;41894:37:0;;41891:198;;41972:15;;42014:33;;;;-1:-1:-1;;;;;41972:15:0;;;;42049:17;;42001:46;;-1:-1:-1;;;;;42001:46:0;:10;:46;:::i;:::-;:65;;;;:::i;:::-;41964:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41951:120:0;;-1:-1:-1;;41891:198:0;42118:21;;-1:-1:-1;42159:14:0;;42156:112;;42206:16;;:44;;-1:-1:-1;;;;;42206:16:0;;;;42235:10;;42206:44;;;;42235:10;42206:16;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42193:57:0;;-1:-1:-1;;42156:112:0;41724:555;;41701:578;-1:-1:-1;42328:1:0;42291:38;;;42340:33;;;:37;42388:12;:30;;;;;;;;;-1:-1:-1;;;42388:30:0;-1:-1:-1;;42388:30:0;;;;;;;;;-1:-1:-1;41226:1200:0:o;46991:1338::-;47039:31;;;;;;;;;47064:6;47039:31;;;;;;;-1:-1:-1;;;47039:31:0;;;;;;;;;;;;;-1:-1:-1;;;47039:31:0;;;;;;;;;;47081:33;;;;;;;47107:7;47081:33;;;;;;;;;;;;;;;;;;;;;;;;;;;47213:10;;47039:31;;47081:33;47147:15;;47039:22;;47199:24;;47147:15;47199:24;:::i;:::-;47173:50;;47256:10;47237:15;:29;47234:892;;47282:12;:20;;-1:-1:-1;;47282:20:0;;;47342:3;47317:28;;;47360:21;;;;:27;;;47423:3;47402:18;;;;:24;;;47441:29;;;47485:22;;;:28;;;;47528:19;;:25;47234:892;;;47594:10;47575:15;:29;47571:555;;47645:3;47620:28;;;:22;47663:21;;;;:25;;;47703:18;;;;:24;;;;47768:4;47742:30;;;47787:22;;;:26;;;;47828:19;;;:26;47571:555;;;47895:10;47876:15;:29;47872:254;;47946:3;47921:28;;;:22;47964:21;;;:25;48004:18;;;;:24;;;;48069:4;48043:30;;;48088:19;;;:26;47872:254;48158:18;;;;48139:6;:15;-1:-1:-1;;;48139:15:0;;:37;:15;;;:37;;;48136:86;;48192:18;;:6;:18;;;;;;;;;;;;;;-1:-1:-1;;;48192:18:0;-1:-1:-1;;;;48192:18:0;;;-1:-1:-1;;;48192:18:0;-1:-1:-1;;;;;;48192:18:0;;;;;;;;;;;;;;;;;;;48136:86;48255:19;;;;48235:7;:16;-1:-1:-1;;;48235:16:0;;:39;:16;;;:39;;;48232:90;;48290:20;;:7;:20;;;;;;;;;;;;;;-1:-1:-1;;;48290:20:0;-1:-1:-1;;;;48290:20:0;;;-1:-1:-1;;;48290:20:0;-1:-1:-1;;;;;;48290:20:0;;;;;;;;;;;;;;;;;;;47028:1301;;;;46991:1338::o;14178:229::-;14315:12;14347:52;14369:6;14377:4;14383:1;14386:12;14347:21;:52::i;40837:381::-;40926:16;;;40940:1;40926:16;;;;;;;;40902:21;;40926:16;;;;;;;;;;-1:-1:-1;40926:16:0;40902:40;;40971:4;40953;40958:1;40953:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;40953:23:0;;;-1:-1:-1;;;;;40953:23:0;;;;;41005:4;40987;40992:1;40987:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;40987:23:0;;;:7;;;;;;;;;:23;41023:9;;:187;;-1:-1:-1;;;41023:187:0;;:9;;;:60;;:187;;41098:8;;41023:9;;41137:4;;41164;;41184:15;;41023:187;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15298:455;15468:12;15526:5;15501:21;:30;;15493:81;;;;-1:-1:-1;;;15493:81:0;;29562:2:1;15493:81:0;;;29544:21:1;29601:2;29581:18;;;29574:30;29640:34;29620:18;;;29613:62;-1:-1:-1;;;29691:18:1;;;29684:36;29737:19;;15493:81:0;29360:402:1;15493:81:0;15586:12;15600:23;15627:6;-1:-1:-1;;;;;15627:11:0;15646:5;15653:4;15627:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15585:73;;;;15676:69;15703:6;15711:7;15720:10;15732:12;15676:26;:69::i;:::-;15669:76;15298:455;-1:-1:-1;;;;;;;15298:455:0:o;17871:644::-;18056:12;18085:7;18081:427;;;18113:10;:17;18134:1;18113:22;18109:290;;-1:-1:-1;;;;;13619:19:0;;;18323:60;;;;-1:-1:-1;;;18323:60:0;;30261:2:1;18323:60:0;;;30243:21:1;30300:2;30280:18;;;30273:30;30339:31;30319:18;;;30312:59;30388:18;;18323:60:0;30059:353:1;18323:60:0;-1:-1:-1;18420:10:0;18413:17;;18081:427;18463:33;18471:10;18483:12;19218:17;;:21;19214:388;;19450:10;19444:17;19507:15;19494:10;19490:2;19486:19;19479:44;19214:388;19577:12;19570:20;;-1:-1:-1;;;19570:20:0;;;;;;;;:::i;14:131:1:-;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;150:247;209:6;262:2;250:9;241:7;237:23;233:32;230:52;;;278:1;275;268:12;230:52;317:9;304:23;336:31;361:5;336:31;:::i;:::-;386:5;150:247;-1:-1:-1;;;150:247:1:o;402:250::-;487:1;497:113;511:6;508:1;505:13;497:113;;;587:11;;;581:18;568:11;;;561:39;533:2;526:10;497:113;;;-1:-1:-1;;644:1:1;626:16;;619:27;402:250::o;657:396::-;806:2;795:9;788:21;769:4;838:6;832:13;881:6;876:2;865:9;861:18;854:34;897:79;969:6;964:2;953:9;949:18;944:2;936:6;932:15;897:79;:::i;:::-;1037:2;1016:15;-1:-1:-1;;1012:29:1;997:45;;;;1044:2;993:54;;657:396;-1:-1:-1;;657:396:1:o;1240:315::-;1308:6;1316;1369:2;1357:9;1348:7;1344:23;1340:32;1337:52;;;1385:1;1382;1375:12;1337:52;1424:9;1411:23;1443:31;1468:5;1443:31;:::i;:::-;1493:5;1545:2;1530:18;;;;1517:32;;-1:-1:-1;;;1240:315:1:o;1752:180::-;1811:6;1864:2;1852:9;1843:7;1839:23;1835:32;1832:52;;;1880:1;1877;1870:12;1832:52;-1:-1:-1;1903:23:1;;1752:180;-1:-1:-1;1752:180:1:o;1937:367::-;2000:8;2010:6;2064:3;2057:4;2049:6;2045:17;2041:27;2031:55;;2082:1;2079;2072:12;2031:55;-1:-1:-1;2105:20:1;;-1:-1:-1;;;;;2137:30:1;;2134:50;;;2180:1;2177;2170:12;2134:50;2217:4;2209:6;2205:17;2193:29;;2277:3;2270:4;2260:6;2257:1;2253:14;2245:6;2241:27;2237:38;2234:47;2231:67;;;2294:1;2291;2284:12;2231:67;1937:367;;;;;:::o;2309:773::-;2431:6;2439;2447;2455;2508:2;2496:9;2487:7;2483:23;2479:32;2476:52;;;2524:1;2521;2514:12;2476:52;2564:9;2551:23;-1:-1:-1;;;;;2634:2:1;2626:6;2623:14;2620:34;;;2650:1;2647;2640:12;2620:34;2689:70;2751:7;2742:6;2731:9;2727:22;2689:70;:::i;:::-;2778:8;;-1:-1:-1;2663:96:1;-1:-1:-1;2866:2:1;2851:18;;2838:32;;-1:-1:-1;2882:16:1;;;2879:36;;;2911:1;2908;2901:12;2879:36;;2950:72;3014:7;3003:8;2992:9;2988:24;2950:72;:::i;:::-;2309:773;;;;-1:-1:-1;3041:8:1;-1:-1:-1;;;;2309:773:1:o;3087:456::-;3164:6;3172;3180;3233:2;3221:9;3212:7;3208:23;3204:32;3201:52;;;3249:1;3246;3239:12;3201:52;3288:9;3275:23;3307:31;3332:5;3307:31;:::i;:::-;3357:5;-1:-1:-1;3414:2:1;3399:18;;3386:32;3427:33;3386:32;3427:33;:::i;:::-;3087:456;;3479:7;;-1:-1:-1;;;3533:2:1;3518:18;;;;3505:32;;3087:456::o;3977:301::-;4036:6;4089:2;4077:9;4068:7;4064:23;4060:32;4057:52;;;4105:1;4102;4095:12;4057:52;4144:9;4131:23;-1:-1:-1;;;;;4187:5:1;4183:46;4176:5;4173:57;4163:85;;4244:1;4241;4234:12;4283:167;4350:20;;4410:14;4399:26;;4389:37;;4379:65;;4440:1;4437;4430:12;4379:65;4283:167;;;:::o;4455:256::-;4521:6;4529;4582:2;4570:9;4561:7;4557:23;4553:32;4550:52;;;4598:1;4595;4588:12;4550:52;4621:28;4639:9;4621:28;:::i;:::-;4611:38;;4668:37;4701:2;4690:9;4686:18;4668:37;:::i;:::-;4658:47;;4455:256;;;;;:::o;5302:388::-;5370:6;5378;5431:2;5419:9;5410:7;5406:23;5402:32;5399:52;;;5447:1;5444;5437:12;5399:52;5486:9;5473:23;5505:31;5530:5;5505:31;:::i;:::-;5555:5;-1:-1:-1;5612:2:1;5597:18;;5584:32;5625:33;5584:32;5625:33;:::i;:::-;5677:7;5667:17;;;5302:388;;;;;:::o;6707:118::-;6793:5;6786:13;6779:21;6772:5;6769:32;6759:60;;6815:1;6812;6805:12;6830:382;6895:6;6903;6956:2;6944:9;6935:7;6931:23;6927:32;6924:52;;;6972:1;6969;6962:12;6924:52;7011:9;6998:23;7030:31;7055:5;7030:31;:::i;:::-;7080:5;-1:-1:-1;7137:2:1;7122:18;;7109:32;7150:30;7109:32;7150:30;:::i;7541:248::-;7609:6;7617;7670:2;7658:9;7649:7;7645:23;7641:32;7638:52;;;7686:1;7683;7676:12;7638:52;-1:-1:-1;;7709:23:1;;;7779:2;7764:18;;;7751:32;;-1:-1:-1;7541:248:1:o;7794:356::-;7996:2;7978:21;;;8015:18;;;8008:30;8074:34;8069:2;8054:18;;8047:62;8141:2;8126:18;;7794:356::o;8155:184::-;8225:6;8278:2;8266:9;8257:7;8253:23;8249:32;8246:52;;;8294:1;8291;8284:12;8246:52;-1:-1:-1;8317:16:1;;8155:184;-1:-1:-1;8155:184:1:o;8623:245::-;8690:6;8743:2;8731:9;8722:7;8718:23;8714:32;8711:52;;;8759:1;8756;8749:12;8711:52;8791:9;8785:16;8810:28;8832:5;8810:28;:::i;8873:380::-;8952:1;8948:12;;;;8995;;;9016:61;;9070:4;9062:6;9058:17;9048:27;;9016:61;9123:2;9115:6;9112:14;9092:18;9089:38;9086:161;;9169:10;9164:3;9160:20;9157:1;9150:31;9204:4;9201:1;9194:15;9232:4;9229:1;9222:15;9086:161;;8873:380;;;:::o;9258:127::-;9319:10;9314:3;9310:20;9307:1;9300:31;9350:4;9347:1;9340:15;9374:4;9371:1;9364:15;9390:251;9460:6;9513:2;9501:9;9492:7;9488:23;9484:32;9481:52;;;9529:1;9526;9519:12;9481:52;9561:9;9555:16;9580:31;9605:5;9580:31;:::i;9646:127::-;9707:10;9702:3;9698:20;9695:1;9688:31;9738:4;9735:1;9728:15;9762:4;9759:1;9752:15;9778:461;9831:3;9869:5;9863:12;9896:6;9891:3;9884:19;9922:4;9951:2;9946:3;9942:12;9935:19;;9988:2;9981:5;9977:14;10009:1;10019:195;10033:6;10030:1;10027:13;10019:195;;;10098:13;;-1:-1:-1;;;;;10094:39:1;10082:52;;10154:12;;;;10189:15;;;;10130:1;10048:9;10019:195;;;-1:-1:-1;10230:3:1;;9778:461;-1:-1:-1;;;;;9778:461:1:o;10244:332::-;10451:6;10440:9;10433:25;10494:2;10489;10478:9;10474:18;10467:30;10414:4;10514:56;10566:2;10555:9;10551:18;10543:6;10514:56;:::i;10581:1105::-;10676:6;10707:2;10750;10738:9;10729:7;10725:23;10721:32;10718:52;;;10766:1;10763;10756:12;10718:52;10799:9;10793:16;-1:-1:-1;;;;;10869:2:1;10861:6;10858:14;10855:34;;;10885:1;10882;10875:12;10855:34;10923:6;10912:9;10908:22;10898:32;;10968:7;10961:4;10957:2;10953:13;10949:27;10939:55;;10990:1;10987;10980:12;10939:55;11019:2;11013:9;11041:2;11037;11034:10;11031:36;;;11047:18;;:::i;:::-;11093:2;11090:1;11086:10;11125:2;11119:9;11188:2;11184:7;11179:2;11175;11171:11;11167:25;11159:6;11155:38;11243:6;11231:10;11228:22;11223:2;11211:10;11208:18;11205:46;11202:72;;;11254:18;;:::i;:::-;11290:2;11283:22;11340:18;;;11374:15;;;;-1:-1:-1;11416:11:1;;;11412:20;;;11444:19;;;11441:39;;;11476:1;11473;11466:12;11441:39;11500:11;;;;11520:135;11536:6;11531:3;11528:15;11520:135;;;11602:10;;11590:23;;11553:12;;;;11633;;;;11520:135;;;11674:6;10581:1105;-1:-1:-1;;;;;;;;10581:1105:1:o;11691:127::-;11752:10;11747:3;11743:20;11740:1;11733:31;11783:4;11780:1;11773:15;11807:4;11804:1;11797:15;11823:176;11890:14;11924:10;;;11936;;;11920:27;;11959:11;;;11956:37;;;11973:18;;:::i;:::-;11956:37;11823:176;;;;:::o;12004:168::-;12077:9;;;12108;;12125:15;;;12119:22;;12105:37;12095:71;;12146:18;;:::i;12177:127::-;12238:10;12233:3;12229:20;12226:1;12219:31;12269:4;12266:1;12259:15;12293:4;12290:1;12283:15;12309:120;12349:1;12375;12365:35;;12380:18;;:::i;:::-;-1:-1:-1;12414:9:1;;12309:120::o;12434:128::-;12501:9;;;12522:11;;;12519:37;;;12536:18;;:::i;14461:135::-;14500:3;14521:17;;;14518:43;;14541:18;;:::i;:::-;-1:-1:-1;14588:1:1;14577:13;;14461:135::o;14942:422::-;15031:1;15074:5;15031:1;15088:270;15109:7;15099:8;15096:21;15088:270;;;15168:4;15164:1;15160:6;15156:17;15150:4;15147:27;15144:53;;;15177:18;;:::i;:::-;15227:7;15217:8;15213:22;15210:55;;;15247:16;;;;15210:55;15326:22;;;;15286:15;;;;15088:270;;;15092:3;14942:422;;;;;:::o;15369:806::-;15418:5;15448:8;15438:80;;-1:-1:-1;15489:1:1;15503:5;;15438:80;15537:4;15527:76;;-1:-1:-1;15574:1:1;15588:5;;15527:76;15619:4;15637:1;15632:59;;;;15705:1;15700:130;;;;15612:218;;15632:59;15662:1;15653:10;;15676:5;;;15700:130;15737:3;15727:8;15724:17;15721:43;;;15744:18;;:::i;:::-;-1:-1:-1;;15800:1:1;15786:16;;15815:5;;15612:218;;15914:2;15904:8;15901:16;15895:3;15889:4;15886:13;15882:36;15876:2;15866:8;15863:16;15858:2;15852:4;15849:12;15845:35;15842:77;15839:159;;;-1:-1:-1;15951:19:1;;;15983:5;;15839:159;16030:34;16055:8;16049:4;16030:34;:::i;:::-;16100:6;16096:1;16092:6;16088:19;16079:7;16076:32;16073:58;;;16111:18;;:::i;:::-;16149:20;;15369:806;-1:-1:-1;;;15369:806:1:o;16180:140::-;16238:5;16267:47;16308:4;16298:8;16294:19;16288:4;16267:47;:::i;16883:125::-;16948:9;;;16969:10;;;16966:36;;;16982:18;;:::i;20290:435::-;20387:6;20395;20403;20411;20464:3;20452:9;20443:7;20439:23;20435:33;20432:53;;;20481:1;20478;20471:12;20432:53;20513:9;20507:16;20532:31;20557:5;20532:31;:::i;:::-;20627:2;20612:18;;20606:25;20671:2;20656:18;;20650:25;20715:2;20700:18;;;20694:25;20582:5;;20606:25;;-1:-1:-1;20694:25:1;;-1:-1:-1;20290:435:1;-1:-1:-1;;;20290:435:1:o;25197:502::-;25460:6;25449:9;25442:25;25503:3;25498:2;25487:9;25483:18;25476:31;25423:4;25524:57;25576:3;25565:9;25561:19;25553:6;25524:57;:::i;:::-;-1:-1:-1;;;;;25617:32:1;;;;25612:2;25597:18;;25590:60;-1:-1:-1;25681:2:1;25666:18;25659:34;25516:65;25197:502;-1:-1:-1;;25197:502:1:o;27467:274::-;-1:-1:-1;;;;;27605:10:1;;;27617;;;27601:27;27648:20;;;;27539:34;27687:24;;;27677:58;;27715:18;;:::i;:::-;27677:58;;27467:274;;;;:::o;27746:216::-;27786:1;-1:-1:-1;;;;;27873:2:1;27870:1;27866:10;27895:3;27885:37;;27902:18;;:::i;:::-;27940:10;;27936:20;;;;;27746:216;-1:-1:-1;;27746:216:1:o;27967:180::-;-1:-1:-1;;;;;28072:10:1;;;28084;;;28068:27;;28107:11;;;28104:37;;;28121:18;;:::i;28773:582::-;29072:6;29061:9;29054:25;29115:6;29110:2;29099:9;29095:18;29088:34;29158:3;29153:2;29142:9;29138:18;29131:31;29035:4;29179:57;29231:3;29220:9;29216:19;29208:6;29179:57;:::i;:::-;-1:-1:-1;;;;;29272:32:1;;;;29267:2;29252:18;;29245:60;-1:-1:-1;29336:3:1;29321:19;29314:35;29171:65;28773:582;-1:-1:-1;;;28773:582:1:o;29767:287::-;29896:3;29934:6;29928:13;29950:66;30009:6;30004:3;29997:4;29989:6;29985:17;29950:66;:::i;:::-;30032:16;;;;;29767:287;-1:-1:-1;;29767:287:1:o

Swarm Source

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