S Price: $0.762666 (+5.09%)

Token

Cobra Protocol (COBRA)

Overview

Max Total Supply

42,501 COBRA

Holders

34

Total Transfers

-

Market

Price

$0.00 @ 0.000000 S

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.

Contract Source Code Verified (Exact Match)

Contract Name:
Cobra

Compiler Version
v0.8.26+commit.8a97fa7a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at SonicScan.org on 2025-03-01
*/

pragma solidity ^0.8.0;

interface IOracle {
    function update() external;

    function consult(address _token, uint256 _amountIn) external view returns (uint144 amountOut);

    function twap(address _token, uint256 _amountIn) external view returns (uint144 _amountOut);
}

// File: contracts/lib/SafeMath8.sol



pragma solidity ^0.8.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath8 {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint8 a, uint8 b) internal pure returns (uint8) {
        uint8 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

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

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

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint8 a, uint8 b) internal pure returns (uint8) {
        // 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;
        }

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

        return c;
    }

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

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

        return c;
    }

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

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

// File: @openzeppelin/contracts/math/Math.sol



pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a >= b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow, so we distribute
        return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2);
    }
}

// File: @openzeppelin/contracts/math/SafeMath.sol



pragma solidity ^0.8.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b > a) return (false, 0);
        return (true, a - b);
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, 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 (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a / b);
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a % b);
    }

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

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

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) return 0;
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

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

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

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        return a - b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a % b;
    }
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol



pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
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);
}

// File: @openzeppelin/contracts/utils/Context.sol



// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}


// File: @openzeppelin/contracts/access/Ownable.sol



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/GSN/Context.sol



pragma solidity ^0.8.0;


// File: contracts/owner/Operator.sol



pragma solidity ^0.8.0;



contract Operator is Context, Ownable {
    address private _operator;

    event OperatorTransferred(address indexed previousOperator, address indexed newOperator);

    constructor() {
        _operator = _msgSender();
        emit OperatorTransferred(address(0), _operator);
    }

    function operator() public view returns (address) {
        return _operator;
    }

    modifier onlyOperator() {
        require(_operator == msg.sender, "operator: caller is not the operator");
        _;
    }

    function isOperator() public view returns (bool) {
        return _msgSender() == _operator;
    }

    function transferOperator(address newOperator_) public onlyOwner {
        _transferOperator(newOperator_);
    }

    function _transferOperator(address newOperator_) internal {
        require(newOperator_ != address(0), "operator: zero address given for new operator");
        emit OperatorTransferred(address(0), newOperator_);
        _operator = newOperator_;
    }
}

// File: @openzeppelin/contracts/token/ERC20/ERC20.sol



pragma solidity ^0.8.0;




/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin guidelines: functions revert instead
 * of returning `false` on failure. This behavior is nonetheless conventional
 * and does not conflict with the expectations of ERC20 applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20 {
    using SafeMath for uint256;

    mapping (address => uint256) private _balances;

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

    uint256 private _totalSupply;

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

    /**
     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with
     * a default value of 18.
     *
     * To select a different value for {decimals}, use {_setupDecimals}.
     *
     * All three of these values are immutable: they can only be set once during
     * construction.
     */
    constructor (string memory name_, string memory symbol_) public {
        _name = name_;
        _symbol = symbol_;
        _decimals = 18;
    }

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

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual 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 value {ERC20} uses, unless {_setupDecimals} is
     * called.
     *
     * 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 returns (uint8) {
        return _decimals;
    }

    /**
     * @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:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, 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}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), 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}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        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) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(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) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is 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:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(address sender, address recipient, uint256 amount) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, 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:
     *
     * - `to` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), 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 Sets {decimals} to a value other than the default one of 18.
     *
     * WARNING: This function should only be called from the constructor. Most
     * applications that interact with token contracts will not expect
     * {decimals} to ever change, and may work incorrectly if it does.
     */
    function _setupDecimals(uint8 decimals_) internal virtual {
        _decimals = decimals_;
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be to transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }
}

// File: @openzeppelin/contracts/token/ERC20/ERC20Burnable.sol



pragma solidity ^0.8.0;



/**
 * @dev Extension of {ERC20} that allows token holders to destroy both their own
 * tokens and those that they have an allowance for, in a way that can be
 * recognized off-chain (via event analysis).
 */
abstract contract ERC20Burnable is Context, ERC20 {
    using SafeMath for uint256;

    /**
     * @dev Destroys `amount` tokens from the caller.
     *
     * See {ERC20-_burn}.
     */
    function burn(uint256 amount) public virtual {
        _burn(_msgSender(), amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, deducting from the caller's
     * allowance.
     *
     * See {ERC20-_burn} and {ERC20-allowance}.
     *
     * Requirements:
     *
     * - the caller must have allowance for ``accounts``'s tokens of at least
     * `amount`.
     */
    function burnFrom(address account, uint256 amount) public virtual {
        uint256 decreasedAllowance = allowance(account, _msgSender()).sub(amount, "ERC20: burn amount exceeds allowance");

        _approve(account, _msgSender(), decreasedAllowance);
        _burn(account, amount);
    }
}

// File: contracts/Cobra.sol



pragma solidity ^0.8.0;

contract Cobra is ERC20Burnable, Operator {
    using SafeMath8 for uint8;
    using SafeMath for uint256;

    // Initial distribution for Liquidity
    uint256 public constant INITIAL_LAUNCH_DISTRIBUTION = 2500 ether;
    // Distribution for Genesis Pools
    uint256 public constant GENESIS_POOL_DISTRIBUTION = 40000 ether;

    // Have the rewards been distributed to the pools
    bool public rewardPoolDistributed = false;

    /* ================= Taxation =============== */
    // Address of the Oracle
    address public cobraOracle;
    // Address of the Tax Office
    address public taxOffice;

    // Current tax rate
    uint256 public taxRate;
    
    //buy tax
    uint256 public buyTax;
    //sell tax
    uint256 public sellTax;

    // Price threshold below which taxes will get burned
    uint256 public burnThreshold = 1.10e18;
    // Address of the tax collector wallet
    address public taxCollectorAddress;

    // Should the taxes be calculated using the tax tiers
    bool public autoCalculateTax;

    //spookyswap pair address
    address public uniswapV2Pair;

    // Tax Tiers
    uint256[] public taxTiersTwaps = [0, 5e17, 6e17, 7e17, 8e17, 9e17, 9.5e17, 1e18, 1.05e18, 1.10e18, 1.20e18, 1.30e18, 1.40e18, 1.50e18];
    uint256[] public taxTiersRates = [2000, 1900, 1800, 1700, 1600, 1500, 1500, 1500, 1500, 1400, 900, 400, 200, 100];

    // Sender addresses excluded from Tax
    mapping(address => bool) public excludedAddresses;

    event TaxOfficeTransferred(address oldAddress, address newAddress);

    modifier onlyTaxOffice() {
        require(taxOffice == msg.sender, "Caller is not the tax office");
        _;
    }

    modifier onlyOperatorOrTaxOffice() {
        require(isOperator() || taxOffice == msg.sender, "Caller is not the operator or the tax office");
        _;
    }

    /**
     * @notice Constructs the COBRA ERC-20 contract.
     */
    constructor(uint256 _taxRate, address _taxCollectorAddress) public ERC20("Cobra Protocol", "COBRA") {
        // Mints 1 COBRA to contract creator for initial pool setup
        require(_taxRate < 1000, "tax equal or bigger to 100%");
        require(_taxCollectorAddress != address(0), "tax collector address must be non-zero address");

        excludeAddress(address(this));

        _mint(msg.sender, 1 ether);
        taxRate = _taxRate;
        taxCollectorAddress = _taxCollectorAddress;
        buyTax = 0;
        sellTax = 0;
    }

    /* ============= Taxation ============= */

    function getTaxTiersTwapsCount() public view returns (uint256 count) {
        return taxTiersTwaps.length;
    }

    function getTaxTiersRatesCount() public view returns (uint256 count) {
        return taxTiersRates.length;
    }

    function isAddressExcluded(address _address) public view returns (bool) {
        return excludedAddresses[_address];
    }

    function setTaxTiersTwap(uint8 _index, uint256 _value) public onlyTaxOffice returns (bool) {
        require(_index >= 0, "Index has to be higher than 0");
        require(_index < getTaxTiersTwapsCount(), "Index has to lower than count of tax tiers");
        if (_index > 0) {
            require(_value > taxTiersTwaps[_index - 1]);
        }
        if (_index < getTaxTiersTwapsCount().sub(1)) {
            require(_value < taxTiersTwaps[_index + 1]);
        }
        taxTiersTwaps[_index] = _value;
        return true;
    }

    function setTaxTiersRate(uint8 _index, uint256 _value) public onlyTaxOffice returns (bool) {
        require(_index >= 0, "Index has to be higher than 0");
        require(_index < getTaxTiersRatesCount(), "Index has to lower than count of tax tiers");
        taxTiersRates[_index] = _value;
        return true;
    }

    function setBurnThreshold(uint256 _burnThreshold) public onlyTaxOffice returns (bool) {
        burnThreshold = _burnThreshold;
    }

    function _getCobraPrice() internal view returns (uint256 _cobraPrice) {
        try IOracle(cobraOracle).consult(address(this), 1e18) returns (uint144 _price) {
            return uint256(_price);
        } catch {
            revert("Cobra: failed to fetch COBRA price from Oracle");
        }
    }

    function _updateTaxRate(uint256 _cobraPrice) internal returns (uint256){
        if (autoCalculateTax) {
            for (uint8 tierId = uint8(getTaxTiersTwapsCount()).sub(1); tierId >= 0; --tierId) {
                if (_cobraPrice >= taxTiersTwaps[tierId]) {
                    require(taxTiersRates[tierId] < 10000, "tax equal or bigger to 100%");
                    taxRate = taxTiersRates[tierId];
                    return taxTiersRates[tierId];
                }
            }
        }
    }

    function enableAutoCalculateTax() public onlyTaxOffice {
        autoCalculateTax = true;
    }

    function disableAutoCalculateTax() public onlyTaxOffice {
        autoCalculateTax = false;
    }

    function setCobraOracle(address _cobraOracle) public onlyOperatorOrTaxOffice {
        require(_cobraOracle != address(0), "oracle address cannot be 0 address");
        cobraOracle = _cobraOracle;
    }

    function setTaxOffice(address _taxOffice) public onlyOperatorOrTaxOffice {
        require(_taxOffice != address(0), "tax office address cannot be 0 address");
        emit TaxOfficeTransferred(taxOffice, _taxOffice);
        taxOffice = _taxOffice;
    }

    function setTaxCollectorAddress(address _taxCollectorAddress) public onlyTaxOffice {
        require(_taxCollectorAddress != address(0), "tax collector address must be non-zero address");
        taxCollectorAddress = _taxCollectorAddress;
    }

    function setTaxRate(uint256 _taxRate) public onlyTaxOffice {
        require(!autoCalculateTax, "auto calculate tax cannot be enabled");
        require(_taxRate < 10000, "tax equal or bigger to 100%");
        taxRate = _taxRate;
    }

    function setBuyTax(uint256 _taxRate) public onlyTaxOffice {
        require(!autoCalculateTax, "auto calculate tax cannot be enabled");
        require(_taxRate < 1000, "tax equal or bigger to 100%");
        buyTax = _taxRate;
    }

    function setSellTax(uint256 _taxRate) public onlyTaxOffice {
        require(!autoCalculateTax, "auto calculate tax cannot be enabled");
        require(_taxRate < 1000, "tax equal or bigger to 100%");
        sellTax = _taxRate;
    }
    
    function setUniswapv2Pair(address _uniswapv2Pair) public onlyOperatorOrTaxOffice {
        require(_uniswapv2Pair != address(0), "uniswap address must be non-zero address");
        uniswapV2Pair = _uniswapv2Pair;
    }

    function excludeAddress(address _address) public onlyOperatorOrTaxOffice returns (bool) {
        require(!excludedAddresses[_address], "address can't be excluded");
        excludedAddresses[_address] = true;
        return true;
    }

    function includeAddress(address _address) public onlyOperatorOrTaxOffice returns (bool) {
        require(excludedAddresses[_address], "address can't be included");
        excludedAddresses[_address] = false;
        return true;
    }

    /**
     * @notice Operator mints COBRA to a recipient
     * @param recipient_ The address of recipient
     * @param amount_ The amount of COBRA to mint to
     * @return whether the process has been done
     */
    function mint(address recipient_, uint256 amount_) public onlyOperator returns (bool) {
        uint256 balanceBefore = balanceOf(recipient_);
        _mint(recipient_, amount_);
        uint256 balanceAfter = balanceOf(recipient_);

        return balanceAfter > balanceBefore;
    }

    function burn(uint256 amount) public override {
        super.burn(amount);
    }

    function burnFrom(address account, uint256 amount) public override onlyOperator {
        super.burnFrom(account, amount);
    }

    function transfer(address recipient, uint256 amount)
        public
        override
        returns (bool)
    {
        uint256 currentTaxRate = taxRate;
        bool burnTax = false;

        // if (autoCalculateTax) {
        //     uint256 currentCobraPrice = _getCobraPrice();
        //     currentTaxRate = _updateTaxRate(currentCobraPrice);
        //     if (currentCobraPrice < burnThreshold) {
        //         burnTax = true;
        //     }
        // }


        if (currentTaxRate == 0 || excludedAddresses[msg.sender]) {
            _transfer(msg.sender, recipient, amount);
        } else {
            _transferWithTax(msg.sender, recipient, amount, burnTax);
        }
        
        return true;
    }

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public override returns (bool) {
        uint256 currentTaxRate = taxRate;
        bool burnTax = false;

        // if (autoCalculateTax) {
        //     uint256 currentCobraPrice = _getCobraPrice();
        //     currentTaxRate = _updateTaxRate(currentCobraPrice);
        //     if (currentCobraPrice < burnThreshold) {
        //         burnTax = true;
        //     }
        // }


        if (currentTaxRate == 0 || excludedAddresses[sender]) {
            _transfer(sender, recipient, amount);
        } else {
            _transferWithTax(sender, recipient, amount, burnTax);
        }

        _approve(sender, _msgSender(), allowance(sender, _msgSender()).sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    function _transferWithTax(
        address sender,
        address recipient,
        uint256 amount,
        bool burnTax
    ) internal returns (bool) {
        uint256 taxAmount = 0;
        uint256 amountAfterTax = 0;
        
        if(sender == uniswapV2Pair){
            taxAmount = amount.mul(buyTax).div(1000);
            amountAfterTax = amount.sub(taxAmount);
        }

        if(recipient == uniswapV2Pair){
            taxAmount = amount.mul(sellTax).div(1000);
            amountAfterTax = amount.sub(taxAmount);
        }

        if ((sender != uniswapV2Pair) && (recipient != uniswapV2Pair)) {
            taxAmount = amount.mul(taxRate).div(1000);
            amountAfterTax = amount.sub(taxAmount);
        }

        // Transfer tax to tax collector
        _transfer(sender, taxCollectorAddress, taxAmount);

        // Transfer amount after tax to recipient
        _transfer(sender, recipient, amountAfterTax);

        return true;
    }

    /**
     * @notice distribute to reward pool (only once)
     */
    function distributeReward(
        address _launcherWallet,
        address _treasuryWallet
    ) external onlyOperator {
        require(!rewardPoolDistributed, "only can distribute once");
        require(_launcherWallet != address(0), "!_launcherWallet");
        require(_treasuryWallet != address(0), "!_treasuryWallet");
        rewardPoolDistributed = true;
        _mint(_launcherWallet, INITIAL_LAUNCH_DISTRIBUTION);
        _mint(_treasuryWallet, GENESIS_POOL_DISTRIBUTION);
    }

    function governanceRecoverUnsupported(
        IERC20 _token,
        uint256 _amount,
        address _to
    ) external onlyOperator {
        _token.transfer(_to, _amount);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"_taxRate","type":"uint256"},{"internalType":"address","name":"_taxCollectorAddress","type":"address"}],"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":"previousOperator","type":"address"},{"indexed":true,"internalType":"address","name":"newOperator","type":"address"}],"name":"OperatorTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldAddress","type":"address"},{"indexed":false,"internalType":"address","name":"newAddress","type":"address"}],"name":"TaxOfficeTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"GENESIS_POOL_DISTRIBUTION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"INITIAL_LAUNCH_DISTRIBUTION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"autoCalculateTax","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cobraOracle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableAutoCalculateTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_launcherWallet","type":"address"},{"internalType":"address","name":"_treasuryWallet","type":"address"}],"name":"distributeReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableAutoCalculateTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"excludeAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"excludedAddresses","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTaxTiersRatesCount","outputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTaxTiersTwapsCount","outputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"governanceRecoverUnsupported","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"includeAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"_address","type":"address"}],"name":"isAddressExcluded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardPoolDistributed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_burnThreshold","type":"uint256"}],"name":"setBurnThreshold","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_taxRate","type":"uint256"}],"name":"setBuyTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_cobraOracle","type":"address"}],"name":"setCobraOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_taxRate","type":"uint256"}],"name":"setSellTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_taxCollectorAddress","type":"address"}],"name":"setTaxCollectorAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_taxOffice","type":"address"}],"name":"setTaxOffice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_taxRate","type":"uint256"}],"name":"setTaxRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_index","type":"uint8"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setTaxTiersRate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_index","type":"uint8"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setTaxTiersTwap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_uniswapv2Pair","type":"address"}],"name":"setUniswapv2Pair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxCollectorAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxOffice","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"taxTiersRates","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"taxTiersTwaps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOperator_","type":"address"}],"name":"transferOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

6006805460ff60a01b19169055670f43fc2c04ee0000600c8190556102406040525f60809081526706f05b59d3b2000060a052670853a0d2313c000060c0526709b6e64a8ec6000060e052670b1a2bc2ec50000061010052670c7d713b49da000061012052670d2f13f7789f000061014052670de0b6b3a764000061016052670e92596fd6290000610180526101a0919091526710a741a4627800006101c05267120a871cc00200006101e05267136dcc951d8c0000610200526714d1120d7b160000610220526100d490600f90600e610606565b50604080516101c0810182526107d0815261076c6020820152610708918101919091526106a4606082015261064060808201526105dc60a0820181905260c0820181905260e0820181905261010082015261057861012082015261038461014082015261019061016082015260c861018082015260646101a082015261015e90601090600e61065a565b5034801561016a575f80fd5b50604051612c95380380612c95833981016040819052610189916106ad565b6040518060400160405280600e81526020016d10dbd89c9848141c9bdd1bd8dbdb60921b81525060405180604001604052806005815260200164434f42524160d81b81525081600390816101dd919061077e565b5060046101ea828261077e565b50506005805460ff19166012179055505f6102023390565b60058054610100600160a81b0319166101006001600160a01b03841690810291909117909155604051919250905f907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600680546001600160a01b031916339081179091556040515f907f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed908290a36103e882106102ec5760405162461bcd60e51b815260206004820152601b60248201527f74617820657175616c206f722062696767657220746f2031303025000000000060448201526064015b60405180910390fd5b6001600160a01b0381166103595760405162461bcd60e51b815260206004820152602e60248201527f74617820636f6c6c6563746f722061646472657373206d757374206265206e6f60448201526d6e2d7a65726f206164647265737360901b60648201526084016102e3565b610362306103a8565b5061037533670de0b6b3a76400006104be565b600991909155600d80546001600160a01b0319166001600160a01b039092169190911790555f600a819055600b55610857565b6006545f906001600160a01b03163314806103cd57506008546001600160a01b031633145b61042e5760405162461bcd60e51b815260206004820152602c60248201527f43616c6c6572206973206e6f7420746865206f70657261746f72206f7220746860448201526b6520746178206f666669636560a01b60648201526084016102e3565b6001600160a01b0382165f9081526011602052604090205460ff16156104965760405162461bcd60e51b815260206004820152601960248201527f616464726573732063616e2774206265206578636c756465640000000000000060448201526064016102e3565b506001600160a01b03165f908152601160205260409020805460ff1916600190811790915590565b6001600160a01b0382166105145760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016102e3565b600254610521908261059f565b6002556001600160a01b0382165f90815260208190526040902054610546908261059f565b6001600160a01b0383165f81815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b5f806105ab8385610838565b9050838110156105fd5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016102e3565b90505b92915050565b828054828255905f5260205f2090810192821561064a579160200282015b8281111561064a57825182906001600160401b0316905591602001919060010190610624565b50610656929150610699565b5090565b828054828255905f5260205f2090810192821561064a579160200282015b8281111561064a578251829061ffff16905591602001919060010190610678565b5b80821115610656575f815560010161069a565b5f80604083850312156106be575f80fd5b825160208401519092506001600160a01b03811681146106dc575f80fd5b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061070f57607f821691505b60208210810361072d57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561059a57805f5260205f20601f840160051c810160208510156107585750805b601f840160051c820191505b81811015610777575f8155600101610764565b5050505050565b81516001600160401b03811115610797576107976106e7565b6107ab816107a584546106fb565b84610733565b6020601f8211600181146107dd575f83156107c65750848201515b5f19600385901b1c1916600184901b178455610777565b5f84815260208120601f198516915b8281101561080c57878501518255602094850194600190920191016107ec565b508482101561082957868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b8082018082111561060057634e487b7160e01b5f52601160045260245ffd5b612431806108645f395ff3fe608060405234801561000f575f80fd5b5060043610610333575f3560e01c8063771a3a1d116101af578063b87c5a4a116100fe578063dd62ed3e1161009e578063f2fde38b11610079578063f2fde38b14610723578063f4fd47cf14610736578063f7c1ad9b14610749578063ff87fc7c1461075c575f80fd5b8063dd62ed3e146106b8578063ebca1bd9146106f0578063ee2a95351461071b575f80fd5b8063cbb4e23a116100d9578063cbb4e23a14610669578063cc1776d31461067a578063cf011b2614610683578063dc1052e2146106a5575f80fd5b8063b87c5a4a14610630578063c3bdf61314610643578063c6d69a3014610656575f80fd5b8063939ba2a4116101695780639d6b5f21116101445780639d6b5f21146105ef578063a457c2d714610602578063a6431bba14610615578063a9059cbb1461061d575f80fd5b8063939ba2a4146105c357806395d89b41146105d35780639662676c146105db575f80fd5b8063771a3a1d1461055757806379cc6790146105605780638cd09d50146105735780638d3cc818146105865780638da5cb5b1461059a57806393995d4b146105b0575f80fd5b806342966c6811610285578063570ca7351161022557806366206ce91161020057806366206ce91461050157806369356d471461051457806370a0823114610527578063715018a61461054f575f80fd5b8063570ca735146104d55780635c29908d146104e657806365bbacd9146104f9575f80fd5b806349bd5a5e1161026057806349bd5a5e1461049d5780634f6d38d0146104b05780634f7041a5146104b957806354575af4146104c2575f80fd5b806342966c681461046457806342c6b4f1146104775780634456eda21461048a575f80fd5b806329605e77116102f057806339509351116102cb57806339509351146104185780633e5f13d41461042b5780633f07d76a1461043e57806340c10f1914610451575f80fd5b806329605e77146103dd578063313ce567146103f05780633758e6ce14610405575f80fd5b806306fdde0314610337578063095ea7b314610355578063178a2fef1461037857806318160ddd1461038d57806323b872dd1461039f57806325fc8ac1146103b2575b5f80fd5b61033f610764565b60405161034c9190611efa565b60405180910390f35b610368610363366004611f43565b6107f4565b604051901515815260200161034c565b61038b610386366004611f6d565b61080a565b005b6002545b60405190815260200161034c565b6103686103ad366004611f88565b6108db565b6007546103c5906001600160a01b031681565b6040516001600160a01b03909116815260200161034c565b61038b6103eb366004611f6d565b61096c565b60055460405160ff909116815260200161034c565b610368610413366004611f6d565b6109a8565b610368610426366004611f43565b610a79565b6008546103c5906001600160a01b031681565b61038b61044c366004611f6d565b610aae565b61036861045f366004611f43565b610bbb565b61038b610472366004611fc6565b610c2d565b610391610485366004611fc6565b610c36565b6006546001600160a01b03163314610368565b600e546103c5906001600160a01b031681565b610391600c5481565b610391600a5481565b61038b6104d0366004611fdd565b610c55565b6006546001600160a01b03166103c5565b6103916104f4366004611fc6565b610cf5565b61038b610d04565b61036861050f36600461201c565b610d3d565b61038b610522366004611f6d565b610e45565b610391610535366004611f6d565b6001600160a01b03165f9081526020819052604090205490565b61038b610efe565b61039160095481565b61038b61056e366004611f43565b610f7d565b61038b610581366004611fc6565b610fb5565b600d5461036890600160a01b900460ff1681565b60055461010090046001600160a01b03166103c5565b6103686105be366004611f6d565b61102f565b61039168878678326eac90000081565b61033f6110fb565b60065461036890600160a01b900460ff1681565b6103686105fd366004611fc6565b61110a565b610368610610366004611f43565b61113f565b600f54610391565b61036861062b366004611f43565b61118c565b61036861063e36600461201c565b6111db565b600d546103c5906001600160a01b031681565b61038b610664366004611fc6565b611242565b610391690878678326eac900000081565b610391600b5481565b610368610691366004611f6d565b60116020525f908152604090205460ff1681565b61038b6106b3366004611fc6565b6112bc565b6103916106c636600461203d565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6103686106fe366004611f6d565b6001600160a01b03165f9081526011602052604090205460ff1690565b601054610391565b61038b610731366004611f6d565b611336565b61038b61074436600461203d565b611431565b61038b610757366004611f6d565b611581565b61038b611643565b60606003805461077390612074565b80601f016020809104026020016040519081016040528092919081815260200182805461079f90612074565b80156107ea5780601f106107c1576101008083540402835291602001916107ea565b820191905f5260205f20905b8154815290600101906020018083116107cd57829003601f168201915b5050505050905090565b5f610800338484611682565b5060015b92915050565b6006546001600160a01b031633148061082d57506008546001600160a01b031633145b6108525760405162461bcd60e51b8152600401610849906120ac565b60405180910390fd5b6001600160a01b0381166108b95760405162461bcd60e51b815260206004820152602860248201527f756e69737761702061646472657373206d757374206265206e6f6e2d7a65726f604482015267206164647265737360c01b6064820152608401610849565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b6009545f908181158061090557506001600160a01b0386165f9081526011602052604090205460ff165b1561091a576109158686866117a6565b610928565b61092686868684611926565b505b610960863361095b8760405180606001604052806028815260200161238b602891396109548c336106c6565b9190611a3d565b611682565b50600195945050505050565b6005546001600160a01b0361010090910416331461099c5760405162461bcd60e51b8152600401610849906120f8565b6109a581611a73565b50565b6006545f906001600160a01b03163314806109cd57506008546001600160a01b031633145b6109e95760405162461bcd60e51b8152600401610849906120ac565b6001600160a01b0382165f9081526011602052604090205460ff1615610a515760405162461bcd60e51b815260206004820152601960248201527f616464726573732063616e2774206265206578636c75646564000000000000006044820152606401610849565b506001600160a01b03165f908152601160205260409020805460ff1916600190811790915590565b335f8181526001602090815260408083206001600160a01b0387168452909152812054909161080091859061095b9086611b36565b6006546001600160a01b0316331480610ad157506008546001600160a01b031633145b610aed5760405162461bcd60e51b8152600401610849906120ac565b6001600160a01b038116610b525760405162461bcd60e51b815260206004820152602660248201527f746178206f666669636520616464726573732063616e6e6f742062652030206160448201526564647265737360d01b6064820152608401610849565b600854604080516001600160a01b03928316815291831660208301527f75237613d1cfb394eb7979839ecbeacaca4592ef0cf96791979625803948a601910160405180910390a1600880546001600160a01b0319166001600160a01b0392909216919091179055565b6006545f906001600160a01b03163314610be75760405162461bcd60e51b81526004016108499061212d565b6001600160a01b0383165f90815260208190526040902054610c098484611b9b565b6001600160a01b0384165f9081526020819052604081205491909111949350505050565b6109a581611c78565b600f8181548110610c45575f80fd5b5f91825260209091200154905081565b6006546001600160a01b03163314610c7f5760405162461bcd60e51b81526004016108499061212d565b60405163a9059cbb60e01b81526001600160a01b0382811660048301526024820184905284169063a9059cbb906044016020604051808303815f875af1158015610ccb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cef9190612171565b50505050565b60108181548110610c45575f80fd5b6008546001600160a01b03163314610d2e5760405162461bcd60e51b815260040161084990612190565b600d805460ff60a01b19169055565b6008545f906001600160a01b03163314610d695760405162461bcd60e51b815260040161084990612190565b600f548360ff1610610d8d5760405162461bcd60e51b8152600401610849906121c7565b60ff831615610dc957600f610da3600185612225565b60ff1681548110610db657610db661223e565b905f5260205f2001548211610dc9575f80fd5b610ddd6001610dd7600f5490565b90611c82565b8360ff161015610e1a57600f610df4846001612252565b60ff1681548110610e0757610e0761223e565b905f5260205f2001548210610e1a575f80fd5b81600f8460ff1681548110610e3157610e3161223e565b5f9182526020909120015550600192915050565b6008546001600160a01b03163314610e6f5760405162461bcd60e51b815260040161084990612190565b6001600160a01b038116610edc5760405162461bcd60e51b815260206004820152602e60248201527f74617820636f6c6c6563746f722061646472657373206d757374206265206e6f60448201526d6e2d7a65726f206164647265737360901b6064820152608401610849565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03610100909104163314610f2e5760405162461bcd60e51b8152600401610849906120f8565b6005546040515f9161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360058054610100600160a81b0319169055565b6006546001600160a01b03163314610fa75760405162461bcd60e51b81526004016108499061212d565b610fb18282611cdd565b5050565b6008546001600160a01b03163314610fdf5760405162461bcd60e51b815260040161084990612190565b600d54600160a01b900460ff16156110095760405162461bcd60e51b81526004016108499061226b565b6103e8811061102a5760405162461bcd60e51b8152600401610849906122af565b600b55565b6006545f906001600160a01b031633148061105457506008546001600160a01b031633145b6110705760405162461bcd60e51b8152600401610849906120ac565b6001600160a01b0382165f9081526011602052604090205460ff166110d75760405162461bcd60e51b815260206004820152601960248201527f616464726573732063616e277420626520696e636c75646564000000000000006044820152606401610849565b506001600160a01b03165f908152601160205260409020805460ff19169055600190565b60606004805461077390612074565b6008545f906001600160a01b031633146111365760405162461bcd60e51b815260040161084990612190565b600c9190915590565b5f610800338461095b856040518060600160405280602581526020016123d760259139335f9081526001602090815260408083206001600160a01b038d1684529091529020549190611a3d565b6009545f90818115806111ad5750335f9081526011602052604090205460ff165b156111c2576111bd3386866117a6565b6111d0565b6111ce33868684611926565b505b506001949350505050565b6008545f906001600160a01b031633146112075760405162461bcd60e51b815260040161084990612190565b6010548360ff161061122b5760405162461bcd60e51b8152600401610849906121c7565b8160108460ff1681548110610e3157610e3161223e565b6008546001600160a01b0316331461126c5760405162461bcd60e51b815260040161084990612190565b600d54600160a01b900460ff16156112965760405162461bcd60e51b81526004016108499061226b565b61271081106112b75760405162461bcd60e51b8152600401610849906122af565b600955565b6008546001600160a01b031633146112e65760405162461bcd60e51b815260040161084990612190565b600d54600160a01b900460ff16156113105760405162461bcd60e51b81526004016108499061226b565b6103e881106113315760405162461bcd60e51b8152600401610849906122af565b600a55565b6005546001600160a01b036101009091041633146113665760405162461bcd60e51b8152600401610849906120f8565b6001600160a01b0381166113cb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610849565b6005546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3600580546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6006546001600160a01b0316331461145b5760405162461bcd60e51b81526004016108499061212d565b600654600160a01b900460ff16156114b55760405162461bcd60e51b815260206004820152601860248201527f6f6e6c792063616e2064697374726962757465206f6e636500000000000000006044820152606401610849565b6001600160a01b0382166114fe5760405162461bcd60e51b815260206004820152601060248201526f0857db185d5b98da195c95d85b1b195d60821b6044820152606401610849565b6001600160a01b0381166115475760405162461bcd60e51b815260206004820152601060248201526f0857dd1c99585cdd5c9e55d85b1b195d60821b6044820152606401610849565b6006805460ff60a01b1916600160a01b17905561156d8268878678326eac900000611b9b565b610fb181690878678326eac9000000611b9b565b6006546001600160a01b03163314806115a457506008546001600160a01b031633145b6115c05760405162461bcd60e51b8152600401610849906120ac565b6001600160a01b0381166116215760405162461bcd60e51b815260206004820152602260248201527f6f7261636c6520616464726573732063616e6e6f742062652030206164647265604482015261737360f01b6064820152608401610849565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6008546001600160a01b0316331461166d5760405162461bcd60e51b815260040161084990612190565b600d805460ff60a01b1916600160a01b179055565b6001600160a01b0383166116e45760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610849565b6001600160a01b0382166117455760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610849565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b03831661180a5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610849565b6001600160a01b03821661186c5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610849565b6118a881604051806060016040528060268152602001612365602691396001600160a01b0386165f908152602081905260409020549190611a3d565b6001600160a01b038085165f9081526020819052604080822093909355908416815220546118d69082611b36565b6001600160a01b038381165f818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101611799565b600e545f90819081906001600160a01b0390811690881603611972576119636103e861195d600a5488611d2190919063ffffffff16565b90611d9f565b915061196f8583611c82565b90505b600e546001600160a01b03908116908716036119b2576119a36103e861195d600b5488611d2190919063ffffffff16565b91506119af8583611c82565b90505b600e546001600160a01b038881169116148015906119de5750600e546001600160a01b03878116911614155b15611a0d576119fe6103e861195d60095488611d2190919063ffffffff16565b9150611a0a8583611c82565b90505b600d54611a259088906001600160a01b0316846117a6565b611a308787836117a6565b5060019695505050505050565b5f8184841115611a605760405162461bcd60e51b81526004016108499190611efa565b50611a6b83856122e6565b949350505050565b6001600160a01b038116611adf5760405162461bcd60e51b815260206004820152602d60248201527f6f70657261746f723a207a65726f206164647265737320676976656e20666f7260448201526c103732bb9037b832b930ba37b960991b6064820152608401610849565b6040516001600160a01b038216905f907f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed908290a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b5f80611b4283856122f9565b905083811015611b945760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610849565b9392505050565b6001600160a01b038216611bf15760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610849565b600254611bfe9082611b36565b6002556001600160a01b0382165f90815260208190526040902054611c239082611b36565b6001600160a01b0383165f81815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b6109a53382611df9565b5f82821115611cd35760405162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006044820152606401610849565b611b9482846122e6565b5f611d05826040518060600160405280602481526020016123b36024913961095486336106c6565b9050611d12833383611682565b611d1c8383611df9565b505050565b5f825f03611d3057505f610804565b5f611d3b838561230c565b905082611d488583612323565b14611b945760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610849565b5f808211611def5760405162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f0000000000006044820152606401610849565b611b948284612323565b6001600160a01b038216611e595760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610849565b611e9581604051806060016040528060228152602001612343602291396001600160a01b0385165f908152602081905260409020549190611a3d565b6001600160a01b0383165f90815260208190526040902055600254611eba9082611c82565b6002556040518181525f906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611c6c565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b6001600160a01b03811681146109a5575f80fd5b5f8060408385031215611f54575f80fd5b8235611f5f81611f2f565b946020939093013593505050565b5f60208284031215611f7d575f80fd5b8135611b9481611f2f565b5f805f60608486031215611f9a575f80fd5b8335611fa581611f2f565b92506020840135611fb581611f2f565b929592945050506040919091013590565b5f60208284031215611fd6575f80fd5b5035919050565b5f805f60608486031215611fef575f80fd5b8335611ffa81611f2f565b925060208401359150604084013561201181611f2f565b809150509250925092565b5f806040838503121561202d575f80fd5b823560ff81168114611f5f575f80fd5b5f806040838503121561204e575f80fd5b823561205981611f2f565b9150602083013561206981611f2f565b809150509250929050565b600181811c9082168061208857607f821691505b6020821081036120a657634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252602c908201527f43616c6c6572206973206e6f7420746865206f70657261746f72206f7220746860408201526b6520746178206f666669636560a01b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526024908201527f6f70657261746f723a2063616c6c6572206973206e6f7420746865206f70657260408201526330ba37b960e11b606082015260800190565b5f60208284031215612181575f80fd5b81518015158114611b94575f80fd5b6020808252601c908201527f43616c6c6572206973206e6f742074686520746178206f666669636500000000604082015260600190565b6020808252602a908201527f496e6465782068617320746f206c6f776572207468616e20636f756e74206f666040820152692074617820746965727360b01b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b60ff828116828216039081111561080457610804612211565b634e487b7160e01b5f52603260045260245ffd5b60ff818116838216019081111561080457610804612211565b60208082526024908201527f6175746f2063616c63756c617465207461782063616e6e6f7420626520656e61604082015263189b195960e21b606082015260800190565b6020808252601b908201527f74617820657175616c206f722062696767657220746f20313030250000000000604082015260600190565b8181038181111561080457610804612211565b8082018082111561080457610804612211565b808202811582820484141761080457610804612211565b5f8261233d57634e487b7160e01b5f52601260045260245ffd5b50049056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220d60d85b3f8f83c99ff37fc4a1a4ced741911b94a3bfd40286d24e4e090ab761e64736f6c634300081a00330000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c6568bf26a3ef8c2c72cd73a4093b77616dedf64

Deployed Bytecode

0x608060405234801561000f575f80fd5b5060043610610333575f3560e01c8063771a3a1d116101af578063b87c5a4a116100fe578063dd62ed3e1161009e578063f2fde38b11610079578063f2fde38b14610723578063f4fd47cf14610736578063f7c1ad9b14610749578063ff87fc7c1461075c575f80fd5b8063dd62ed3e146106b8578063ebca1bd9146106f0578063ee2a95351461071b575f80fd5b8063cbb4e23a116100d9578063cbb4e23a14610669578063cc1776d31461067a578063cf011b2614610683578063dc1052e2146106a5575f80fd5b8063b87c5a4a14610630578063c3bdf61314610643578063c6d69a3014610656575f80fd5b8063939ba2a4116101695780639d6b5f21116101445780639d6b5f21146105ef578063a457c2d714610602578063a6431bba14610615578063a9059cbb1461061d575f80fd5b8063939ba2a4146105c357806395d89b41146105d35780639662676c146105db575f80fd5b8063771a3a1d1461055757806379cc6790146105605780638cd09d50146105735780638d3cc818146105865780638da5cb5b1461059a57806393995d4b146105b0575f80fd5b806342966c6811610285578063570ca7351161022557806366206ce91161020057806366206ce91461050157806369356d471461051457806370a0823114610527578063715018a61461054f575f80fd5b8063570ca735146104d55780635c29908d146104e657806365bbacd9146104f9575f80fd5b806349bd5a5e1161026057806349bd5a5e1461049d5780634f6d38d0146104b05780634f7041a5146104b957806354575af4146104c2575f80fd5b806342966c681461046457806342c6b4f1146104775780634456eda21461048a575f80fd5b806329605e77116102f057806339509351116102cb57806339509351146104185780633e5f13d41461042b5780633f07d76a1461043e57806340c10f1914610451575f80fd5b806329605e77146103dd578063313ce567146103f05780633758e6ce14610405575f80fd5b806306fdde0314610337578063095ea7b314610355578063178a2fef1461037857806318160ddd1461038d57806323b872dd1461039f57806325fc8ac1146103b2575b5f80fd5b61033f610764565b60405161034c9190611efa565b60405180910390f35b610368610363366004611f43565b6107f4565b604051901515815260200161034c565b61038b610386366004611f6d565b61080a565b005b6002545b60405190815260200161034c565b6103686103ad366004611f88565b6108db565b6007546103c5906001600160a01b031681565b6040516001600160a01b03909116815260200161034c565b61038b6103eb366004611f6d565b61096c565b60055460405160ff909116815260200161034c565b610368610413366004611f6d565b6109a8565b610368610426366004611f43565b610a79565b6008546103c5906001600160a01b031681565b61038b61044c366004611f6d565b610aae565b61036861045f366004611f43565b610bbb565b61038b610472366004611fc6565b610c2d565b610391610485366004611fc6565b610c36565b6006546001600160a01b03163314610368565b600e546103c5906001600160a01b031681565b610391600c5481565b610391600a5481565b61038b6104d0366004611fdd565b610c55565b6006546001600160a01b03166103c5565b6103916104f4366004611fc6565b610cf5565b61038b610d04565b61036861050f36600461201c565b610d3d565b61038b610522366004611f6d565b610e45565b610391610535366004611f6d565b6001600160a01b03165f9081526020819052604090205490565b61038b610efe565b61039160095481565b61038b61056e366004611f43565b610f7d565b61038b610581366004611fc6565b610fb5565b600d5461036890600160a01b900460ff1681565b60055461010090046001600160a01b03166103c5565b6103686105be366004611f6d565b61102f565b61039168878678326eac90000081565b61033f6110fb565b60065461036890600160a01b900460ff1681565b6103686105fd366004611fc6565b61110a565b610368610610366004611f43565b61113f565b600f54610391565b61036861062b366004611f43565b61118c565b61036861063e36600461201c565b6111db565b600d546103c5906001600160a01b031681565b61038b610664366004611fc6565b611242565b610391690878678326eac900000081565b610391600b5481565b610368610691366004611f6d565b60116020525f908152604090205460ff1681565b61038b6106b3366004611fc6565b6112bc565b6103916106c636600461203d565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6103686106fe366004611f6d565b6001600160a01b03165f9081526011602052604090205460ff1690565b601054610391565b61038b610731366004611f6d565b611336565b61038b61074436600461203d565b611431565b61038b610757366004611f6d565b611581565b61038b611643565b60606003805461077390612074565b80601f016020809104026020016040519081016040528092919081815260200182805461079f90612074565b80156107ea5780601f106107c1576101008083540402835291602001916107ea565b820191905f5260205f20905b8154815290600101906020018083116107cd57829003601f168201915b5050505050905090565b5f610800338484611682565b5060015b92915050565b6006546001600160a01b031633148061082d57506008546001600160a01b031633145b6108525760405162461bcd60e51b8152600401610849906120ac565b60405180910390fd5b6001600160a01b0381166108b95760405162461bcd60e51b815260206004820152602860248201527f756e69737761702061646472657373206d757374206265206e6f6e2d7a65726f604482015267206164647265737360c01b6064820152608401610849565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b6009545f908181158061090557506001600160a01b0386165f9081526011602052604090205460ff165b1561091a576109158686866117a6565b610928565b61092686868684611926565b505b610960863361095b8760405180606001604052806028815260200161238b602891396109548c336106c6565b9190611a3d565b611682565b50600195945050505050565b6005546001600160a01b0361010090910416331461099c5760405162461bcd60e51b8152600401610849906120f8565b6109a581611a73565b50565b6006545f906001600160a01b03163314806109cd57506008546001600160a01b031633145b6109e95760405162461bcd60e51b8152600401610849906120ac565b6001600160a01b0382165f9081526011602052604090205460ff1615610a515760405162461bcd60e51b815260206004820152601960248201527f616464726573732063616e2774206265206578636c75646564000000000000006044820152606401610849565b506001600160a01b03165f908152601160205260409020805460ff1916600190811790915590565b335f8181526001602090815260408083206001600160a01b0387168452909152812054909161080091859061095b9086611b36565b6006546001600160a01b0316331480610ad157506008546001600160a01b031633145b610aed5760405162461bcd60e51b8152600401610849906120ac565b6001600160a01b038116610b525760405162461bcd60e51b815260206004820152602660248201527f746178206f666669636520616464726573732063616e6e6f742062652030206160448201526564647265737360d01b6064820152608401610849565b600854604080516001600160a01b03928316815291831660208301527f75237613d1cfb394eb7979839ecbeacaca4592ef0cf96791979625803948a601910160405180910390a1600880546001600160a01b0319166001600160a01b0392909216919091179055565b6006545f906001600160a01b03163314610be75760405162461bcd60e51b81526004016108499061212d565b6001600160a01b0383165f90815260208190526040902054610c098484611b9b565b6001600160a01b0384165f9081526020819052604081205491909111949350505050565b6109a581611c78565b600f8181548110610c45575f80fd5b5f91825260209091200154905081565b6006546001600160a01b03163314610c7f5760405162461bcd60e51b81526004016108499061212d565b60405163a9059cbb60e01b81526001600160a01b0382811660048301526024820184905284169063a9059cbb906044016020604051808303815f875af1158015610ccb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cef9190612171565b50505050565b60108181548110610c45575f80fd5b6008546001600160a01b03163314610d2e5760405162461bcd60e51b815260040161084990612190565b600d805460ff60a01b19169055565b6008545f906001600160a01b03163314610d695760405162461bcd60e51b815260040161084990612190565b600f548360ff1610610d8d5760405162461bcd60e51b8152600401610849906121c7565b60ff831615610dc957600f610da3600185612225565b60ff1681548110610db657610db661223e565b905f5260205f2001548211610dc9575f80fd5b610ddd6001610dd7600f5490565b90611c82565b8360ff161015610e1a57600f610df4846001612252565b60ff1681548110610e0757610e0761223e565b905f5260205f2001548210610e1a575f80fd5b81600f8460ff1681548110610e3157610e3161223e565b5f9182526020909120015550600192915050565b6008546001600160a01b03163314610e6f5760405162461bcd60e51b815260040161084990612190565b6001600160a01b038116610edc5760405162461bcd60e51b815260206004820152602e60248201527f74617820636f6c6c6563746f722061646472657373206d757374206265206e6f60448201526d6e2d7a65726f206164647265737360901b6064820152608401610849565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03610100909104163314610f2e5760405162461bcd60e51b8152600401610849906120f8565b6005546040515f9161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360058054610100600160a81b0319169055565b6006546001600160a01b03163314610fa75760405162461bcd60e51b81526004016108499061212d565b610fb18282611cdd565b5050565b6008546001600160a01b03163314610fdf5760405162461bcd60e51b815260040161084990612190565b600d54600160a01b900460ff16156110095760405162461bcd60e51b81526004016108499061226b565b6103e8811061102a5760405162461bcd60e51b8152600401610849906122af565b600b55565b6006545f906001600160a01b031633148061105457506008546001600160a01b031633145b6110705760405162461bcd60e51b8152600401610849906120ac565b6001600160a01b0382165f9081526011602052604090205460ff166110d75760405162461bcd60e51b815260206004820152601960248201527f616464726573732063616e277420626520696e636c75646564000000000000006044820152606401610849565b506001600160a01b03165f908152601160205260409020805460ff19169055600190565b60606004805461077390612074565b6008545f906001600160a01b031633146111365760405162461bcd60e51b815260040161084990612190565b600c9190915590565b5f610800338461095b856040518060600160405280602581526020016123d760259139335f9081526001602090815260408083206001600160a01b038d1684529091529020549190611a3d565b6009545f90818115806111ad5750335f9081526011602052604090205460ff165b156111c2576111bd3386866117a6565b6111d0565b6111ce33868684611926565b505b506001949350505050565b6008545f906001600160a01b031633146112075760405162461bcd60e51b815260040161084990612190565b6010548360ff161061122b5760405162461bcd60e51b8152600401610849906121c7565b8160108460ff1681548110610e3157610e3161223e565b6008546001600160a01b0316331461126c5760405162461bcd60e51b815260040161084990612190565b600d54600160a01b900460ff16156112965760405162461bcd60e51b81526004016108499061226b565b61271081106112b75760405162461bcd60e51b8152600401610849906122af565b600955565b6008546001600160a01b031633146112e65760405162461bcd60e51b815260040161084990612190565b600d54600160a01b900460ff16156113105760405162461bcd60e51b81526004016108499061226b565b6103e881106113315760405162461bcd60e51b8152600401610849906122af565b600a55565b6005546001600160a01b036101009091041633146113665760405162461bcd60e51b8152600401610849906120f8565b6001600160a01b0381166113cb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610849565b6005546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3600580546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6006546001600160a01b0316331461145b5760405162461bcd60e51b81526004016108499061212d565b600654600160a01b900460ff16156114b55760405162461bcd60e51b815260206004820152601860248201527f6f6e6c792063616e2064697374726962757465206f6e636500000000000000006044820152606401610849565b6001600160a01b0382166114fe5760405162461bcd60e51b815260206004820152601060248201526f0857db185d5b98da195c95d85b1b195d60821b6044820152606401610849565b6001600160a01b0381166115475760405162461bcd60e51b815260206004820152601060248201526f0857dd1c99585cdd5c9e55d85b1b195d60821b6044820152606401610849565b6006805460ff60a01b1916600160a01b17905561156d8268878678326eac900000611b9b565b610fb181690878678326eac9000000611b9b565b6006546001600160a01b03163314806115a457506008546001600160a01b031633145b6115c05760405162461bcd60e51b8152600401610849906120ac565b6001600160a01b0381166116215760405162461bcd60e51b815260206004820152602260248201527f6f7261636c6520616464726573732063616e6e6f742062652030206164647265604482015261737360f01b6064820152608401610849565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6008546001600160a01b0316331461166d5760405162461bcd60e51b815260040161084990612190565b600d805460ff60a01b1916600160a01b179055565b6001600160a01b0383166116e45760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610849565b6001600160a01b0382166117455760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610849565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b03831661180a5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610849565b6001600160a01b03821661186c5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610849565b6118a881604051806060016040528060268152602001612365602691396001600160a01b0386165f908152602081905260409020549190611a3d565b6001600160a01b038085165f9081526020819052604080822093909355908416815220546118d69082611b36565b6001600160a01b038381165f818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101611799565b600e545f90819081906001600160a01b0390811690881603611972576119636103e861195d600a5488611d2190919063ffffffff16565b90611d9f565b915061196f8583611c82565b90505b600e546001600160a01b03908116908716036119b2576119a36103e861195d600b5488611d2190919063ffffffff16565b91506119af8583611c82565b90505b600e546001600160a01b038881169116148015906119de5750600e546001600160a01b03878116911614155b15611a0d576119fe6103e861195d60095488611d2190919063ffffffff16565b9150611a0a8583611c82565b90505b600d54611a259088906001600160a01b0316846117a6565b611a308787836117a6565b5060019695505050505050565b5f8184841115611a605760405162461bcd60e51b81526004016108499190611efa565b50611a6b83856122e6565b949350505050565b6001600160a01b038116611adf5760405162461bcd60e51b815260206004820152602d60248201527f6f70657261746f723a207a65726f206164647265737320676976656e20666f7260448201526c103732bb9037b832b930ba37b960991b6064820152608401610849565b6040516001600160a01b038216905f907f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed908290a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b5f80611b4283856122f9565b905083811015611b945760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610849565b9392505050565b6001600160a01b038216611bf15760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610849565b600254611bfe9082611b36565b6002556001600160a01b0382165f90815260208190526040902054611c239082611b36565b6001600160a01b0383165f81815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b6109a53382611df9565b5f82821115611cd35760405162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006044820152606401610849565b611b9482846122e6565b5f611d05826040518060600160405280602481526020016123b36024913961095486336106c6565b9050611d12833383611682565b611d1c8383611df9565b505050565b5f825f03611d3057505f610804565b5f611d3b838561230c565b905082611d488583612323565b14611b945760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610849565b5f808211611def5760405162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f0000000000006044820152606401610849565b611b948284612323565b6001600160a01b038216611e595760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610849565b611e9581604051806060016040528060228152602001612343602291396001600160a01b0385165f908152602081905260409020549190611a3d565b6001600160a01b0383165f90815260208190526040902055600254611eba9082611c82565b6002556040518181525f906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611c6c565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b6001600160a01b03811681146109a5575f80fd5b5f8060408385031215611f54575f80fd5b8235611f5f81611f2f565b946020939093013593505050565b5f60208284031215611f7d575f80fd5b8135611b9481611f2f565b5f805f60608486031215611f9a575f80fd5b8335611fa581611f2f565b92506020840135611fb581611f2f565b929592945050506040919091013590565b5f60208284031215611fd6575f80fd5b5035919050565b5f805f60608486031215611fef575f80fd5b8335611ffa81611f2f565b925060208401359150604084013561201181611f2f565b809150509250925092565b5f806040838503121561202d575f80fd5b823560ff81168114611f5f575f80fd5b5f806040838503121561204e575f80fd5b823561205981611f2f565b9150602083013561206981611f2f565b809150509250929050565b600181811c9082168061208857607f821691505b6020821081036120a657634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252602c908201527f43616c6c6572206973206e6f7420746865206f70657261746f72206f7220746860408201526b6520746178206f666669636560a01b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526024908201527f6f70657261746f723a2063616c6c6572206973206e6f7420746865206f70657260408201526330ba37b960e11b606082015260800190565b5f60208284031215612181575f80fd5b81518015158114611b94575f80fd5b6020808252601c908201527f43616c6c6572206973206e6f742074686520746178206f666669636500000000604082015260600190565b6020808252602a908201527f496e6465782068617320746f206c6f776572207468616e20636f756e74206f666040820152692074617820746965727360b01b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b60ff828116828216039081111561080457610804612211565b634e487b7160e01b5f52603260045260245ffd5b60ff818116838216019081111561080457610804612211565b60208082526024908201527f6175746f2063616c63756c617465207461782063616e6e6f7420626520656e61604082015263189b195960e21b606082015260800190565b6020808252601b908201527f74617820657175616c206f722062696767657220746f20313030250000000000604082015260600190565b8181038181111561080457610804612211565b8082018082111561080457610804612211565b808202811582820484141761080457610804612211565b5f8261233d57634e487b7160e01b5f52601260045260245ffd5b50049056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220d60d85b3f8f83c99ff37fc4a1a4ced741911b94a3bfd40286d24e4e090ab761e64736f6c634300081a0033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c6568bf26a3ef8c2c72cd73a4093b77616dedf64

-----Decoded View---------------
Arg [0] : _taxRate (uint256): 0
Arg [1] : _taxCollectorAddress (address): 0xc6568bf26a3EF8C2c72cD73A4093B77616DedF64

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [1] : 000000000000000000000000c6568bf26a3ef8c2c72cd73a4093b77616dedf64


Deployed Bytecode Sourcemap

33582:11409:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23419:91;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25565:169;;;;;;:::i;:::-;;:::i;:::-;;;1110:14:1;;1103:22;1085:41;;1073:2;1058:18;25565:169:0;945:187:1;40088:222:0;;;;;;:::i;:::-;;:::i;:::-;;24518:108;24606:12;;24518:108;;;1535:25:1;;;1523:2;1508:18;24518:108:0;1389:177:1;42325:883:0;;;;;;:::i;:::-;;:::i;34112:26::-;;;;;-1:-1:-1;;;;;34112:26:0;;;;;;-1:-1:-1;;;;;2248:32:1;;;2230:51;;2218:2;2203:18;34112:26:0;2084:203:1;20872:115:0;;;;;;:::i;:::-;;:::i;24362:91::-;24436:9;;24362:91;;24436:9;;;;2434:36:1;;2422:2;2407:18;24362:91:0;2292:184:1;40318:240:0;;;;;;:::i;:::-;;:::i;26946:218::-;;;;;;:::i;:::-;;:::i;34179:24::-;;;;;-1:-1:-1;;;;;34179:24:0;;;38821:259;;;;;;:::i;:::-;;:::i;41039:290::-;;;;;;:::i;:::-;;:::i;41337:83::-;;;;;;:::i;:::-;;:::i;34734:134::-;;;;;;:::i;:::-;;:::i;20764:100::-;20847:9;;-1:-1:-1;;;;;20847:9:0;17525:10;20831:25;20764:100;;34679:28;;;;;-1:-1:-1;;;;;34679:28:0;;;34420:38;;;;;;34287:21;;;;;;44801:187;;;;;;:::i;:::-;;:::i;20536:85::-;20604:9;;-1:-1:-1;;;;;20604:9:0;20536:85;;34875:113;;;;;;:::i;:::-;;:::i;38500:99::-;;;:::i;36533:545::-;;;;;;:::i;:::-;;:::i;39088:248::-;;;;;;:::i;:::-;;:::i;24689:127::-;;;;;;:::i;:::-;-1:-1:-1;;;;;24790:18:0;24763:7;24790:18;;;;;;;;;;;;24689:127;19522:148;;;:::i;34237:22::-;;;;;;41428:130;;;;;;:::i;:::-;;:::i;39837:239::-;;;;;;:::i;:::-;;:::i;34611:28::-;;;;;-1:-1:-1;;;34611:28:0;;;;;;18871:87;18944:6;;;;;-1:-1:-1;;;;;18944:6:0;18871:87;;40566:240;;;;;;:::i;:::-;;:::i;33741:64::-;;33795:10;33741:64;;23629:95;;;:::i;33978:41::-;;;;;-1:-1:-1;;;33978:41:0;;;;;;37418:135;;;;;;:::i;:::-;;:::i;27667:269::-;;;;;;:::i;:::-;;:::i;36154:115::-;36241:13;:20;36154:115;;41566:751;;;;;;:::i;:::-;;:::i;37086:324::-;;;;;;:::i;:::-;;:::i;34509:34::-;;;;;-1:-1:-1;;;;;34509:34:0;;;39344:240;;;;;;:::i;:::-;;:::i;33851:63::-;;33903:11;33851:63;;34331:22;;;;;;35040:49;;;;;;:::i;:::-;;;;;;;;;;;;;;;;39592:237;;;;;;:::i;:::-;;:::i;25267:151::-;;;;;;:::i;:::-;-1:-1:-1;;;;;25383:18:0;;;25356:7;25383:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;25267:151;36400:125;;;;;;:::i;:::-;-1:-1:-1;;;;;36490:27:0;36466:4;36490:27;;;:17;:27;;;;;;;;;36400:125;36277:115;36364:13;:20;36277:115;;19825:244;;;;;;:::i;:::-;;:::i;44293:500::-;;;;;;:::i;:::-;;:::i;38607:206::-;;;;;;:::i;:::-;;:::i;38395:97::-;;;:::i;23419:91::-;23464:13;23497:5;23490:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23419:91;:::o;25565:169::-;25648:4;25665:39;17525:10;25688:7;25697:6;25665:8;:39::i;:::-;-1:-1:-1;25722:4:0;25565:169;;;;;:::o;40088:222::-;20847:9;;-1:-1:-1;;;;;20847:9:0;17525:10;20831:25;35355:39;;;-1:-1:-1;35371:9:0;;-1:-1:-1;;;;;35371:9:0;35384:10;35371:23;35355:39;35347:96;;;;-1:-1:-1;;;35347:96:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;40188:28:0;::::1;40180:81;;;::::0;-1:-1:-1;;;40180:81:0;;5026:2:1;40180:81:0::1;::::0;::::1;5008:21:1::0;5065:2;5045:18;;;5038:30;5104:34;5084:18;;;5077:62;-1:-1:-1;;;5155:18:1;;;5148:38;5203:19;;40180:81:0::1;4824:404:1::0;40180:81:0::1;40272:13;:30:::0;;-1:-1:-1;;;;;;40272:30:0::1;-1:-1:-1::0;;;;;40272:30:0;;;::::1;::::0;;;::::1;::::0;;40088:222::o;42325:883::-;42499:7;;42457:4;;;42849:19;;;:48;;-1:-1:-1;;;;;;42872:25:0;;;;;;:17;:25;;;;;;;;42849:48;42845:202;;;42914:36;42924:6;42932:9;42943:6;42914:9;:36::i;:::-;42845:202;;;42983:52;43000:6;43008:9;43019:6;43027:7;42983:16;:52::i;:::-;;42845:202;43059:119;43068:6;17525:10;43090:87;43126:6;43090:87;;;;;;;;;;;;;;;;;:31;43100:6;17525:10;25267:151;:::i;43090:31::-;:35;:87;:35;:87::i;:::-;43059:8;:119::i;:::-;-1:-1:-1;43196:4:0;;42325:883;-1:-1:-1;;;;;42325:883:0:o;20872:115::-;18944:6;;-1:-1:-1;;;;;18944:6:0;;;;;17525:10;19091:23;19083:68;;;;-1:-1:-1;;;19083:68:0;;;;;;;:::i;:::-;20948:31:::1;20966:12;20948:17;:31::i;:::-;20872:115:::0;:::o;40318:240::-;20847:9;;40400:4;;-1:-1:-1;;;;;20847:9:0;17525:10;20831:25;35355:39;;;-1:-1:-1;35371:9:0;;-1:-1:-1;;;;;35371:9:0;35384:10;35371:23;35355:39;35347:96;;;;-1:-1:-1;;;35347:96:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;40426:27:0;::::1;;::::0;;;:17:::1;:27;::::0;;;;;::::1;;40425:28;40417:66;;;::::0;-1:-1:-1;;;40417:66:0;;5796:2:1;40417:66:0::1;::::0;::::1;5778:21:1::0;5835:2;5815:18;;;5808:30;5874:27;5854:18;;;5847:55;5919:18;;40417:66:0::1;5594:349:1::0;40417:66:0::1;-1:-1:-1::0;;;;;;40494:27:0::1;;::::0;;;:17:::1;:27;::::0;;;;:34;;-1:-1:-1;;40494:34:0::1;40524:4;40494:34:::0;;::::1;::::0;;;40524:4;40318:240::o;26946:218::-;17525:10;27034:4;27083:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;27083:34:0;;;;;;;;;;27034:4;;27051:83;;27074:7;;27083:50;;27122:10;27083:38;:50::i;38821:259::-;20847:9;;-1:-1:-1;;;;;20847:9:0;17525:10;20831:25;35355:39;;;-1:-1:-1;35371:9:0;;-1:-1:-1;;;;;35371:9:0;35384:10;35371:23;35355:39;35347:96;;;;-1:-1:-1;;;35347:96:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;38913:24:0;::::1;38905:75;;;::::0;-1:-1:-1;;;38905:75:0;;6150:2:1;38905:75:0::1;::::0;::::1;6132:21:1::0;6189:2;6169:18;;;6162:30;6228:34;6208:18;;;6201:62;-1:-1:-1;;;6279:18:1;;;6272:36;6325:19;;38905:75:0::1;5948:402:1::0;38905:75:0::1;39017:9;::::0;38996:43:::1;::::0;;-1:-1:-1;;;;;39017:9:0;;::::1;6529:51:1::0;;6616:32;;;6611:2;6596:18;;6589:60;38996:43:0::1;::::0;6502:18:1;38996:43:0::1;;;;;;;39050:9;:22:::0;;-1:-1:-1;;;;;;39050:22:0::1;-1:-1:-1::0;;;;;39050:22:0;;;::::1;::::0;;;::::1;::::0;;38821:259::o;41039:290::-;20672:9;;41119:4;;-1:-1:-1;;;;;20672:9:0;20685:10;20672:23;20664:72;;;;-1:-1:-1;;;20664:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;24790:18:0;;41136:21:::1;24790:18:::0;;;;;;;;;;;41192:26:::1;24790:18:::0;41210:7;41192:5:::1;:26::i;:::-;-1:-1:-1::0;;;;;24790:18:0;;41229:20:::1;24790:18:::0;;;;;;;;;;;41293:28;;;::::1;::::0;41039:290;-1:-1:-1;;;;41039:290:0:o;41337:83::-;41394:18;41405:6;41394:10;:18::i;34734:134::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34734:134:0;:::o;44801:187::-;20672:9;;-1:-1:-1;;;;;20672:9:0;20685:10;20672:23;20664:72;;;;-1:-1:-1;;;20664:72:0;;;;;;;:::i;:::-;44951:29:::1;::::0;-1:-1:-1;;;44951:29:0;;-1:-1:-1;;;;;7257:32:1;;;44951:29:0::1;::::0;::::1;7239:51:1::0;7306:18;;;7299:34;;;44951:15:0;::::1;::::0;::::1;::::0;7212:18:1;;44951:29:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;44801:187:::0;;;:::o;34875:113::-;;;;;;;;;;;;38500:99;35217:9;;-1:-1:-1;;;;;35217:9:0;35230:10;35217:23;35209:64;;;;-1:-1:-1;;;35209:64:0;;;;;;;:::i;:::-;38567:16:::1;:24:::0;;-1:-1:-1;;;;38567:24:0::1;::::0;;38500:99::o;36533:545::-;35217:9;;36618:4;;-1:-1:-1;;;;;35217:9:0;35230:10;35217:23;35209:64;;;;-1:-1:-1;;;35209:64:0;;;;;;;:::i;:::-;36241:13;:20;36707:6:::1;:32;;;36699:87;;;;-1:-1:-1::0;;;36699:87:0::1;;;;;;;:::i;:::-;36801:10;::::0;::::1;::::0;36797:86:::1;;36845:13;36859:10;36868:1;36859:6:::0;:10:::1;:::i;:::-;36845:25;;;;;;;;;;:::i;:::-;;;;;;;;;36836:6;:34;36828:43;;;::::0;::::1;;36906:30;36934:1;36906:23;36241:13:::0;:20;;36154:115;36906:23:::1;:27:::0;::::1;:30::i;:::-;36897:6;:39;;;36893:115;;;36970:13;36984:10;:6:::0;36993:1:::1;36984:10;:::i;:::-;36970:25;;;;;;;;;;:::i;:::-;;;;;;;;;36961:6;:34;36953:43;;;::::0;::::1;;37042:6;37018:13;37032:6;37018:21;;;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;:30:::0;-1:-1:-1;37066:4:0::1;36533:545:::0;;;;:::o;39088:248::-;35217:9;;-1:-1:-1;;;;;35217:9:0;35230:10;35217:23;35209:64;;;;-1:-1:-1;;;35209:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;39190:34:0;::::1;39182:93;;;::::0;-1:-1:-1;;;39182:93:0;;9527:2:1;39182:93:0::1;::::0;::::1;9509:21:1::0;9566:2;9546:18;;;9539:30;9605:34;9585:18;;;9578:62;-1:-1:-1;;;9656:18:1;;;9649:44;9710:19;;39182:93:0::1;9325:410:1::0;39182:93:0::1;39286:19;:42:::0;;-1:-1:-1;;;;;;39286:42:0::1;-1:-1:-1::0;;;;;39286:42:0;;;::::1;::::0;;;::::1;::::0;;39088:248::o;19522:148::-;18944:6;;-1:-1:-1;;;;;18944:6:0;;;;;17525:10;19091:23;19083:68;;;;-1:-1:-1;;;19083:68:0;;;;;;;:::i;:::-;19613:6:::1;::::0;19592:40:::1;::::0;19629:1:::1;::::0;19613:6:::1;::::0;::::1;-1:-1:-1::0;;;;;19613:6:0::1;::::0;19592:40:::1;::::0;19629:1;;19592:40:::1;19643:6;:19:::0;;-1:-1:-1;;;;;;19643:19:0::1;::::0;;19522:148::o;41428:130::-;20672:9;;-1:-1:-1;;;;;20672:9:0;20685:10;20672:23;20664:72;;;;-1:-1:-1;;;20664:72:0;;;;;;;:::i;:::-;41519:31:::1;41534:7;41543:6;41519:14;:31::i;:::-;41428:130:::0;;:::o;39837:239::-;35217:9;;-1:-1:-1;;;;;35217:9:0;35230:10;35217:23;35209:64;;;;-1:-1:-1;;;35209:64:0;;;;;;;:::i;:::-;39916:16:::1;::::0;-1:-1:-1;;;39916:16:0;::::1;;;39915:17;39907:66;;;;-1:-1:-1::0;;;39907:66:0::1;;;;;;;:::i;:::-;40003:4;39992:8;:15;39984:55;;;;-1:-1:-1::0;;;39984:55:0::1;;;;;;;:::i;:::-;40050:7;:18:::0;39837:239::o;40566:240::-;20847:9;;40648:4;;-1:-1:-1;;;;;20847:9:0;17525:10;20831:25;35355:39;;;-1:-1:-1;35371:9:0;;-1:-1:-1;;;;;35371:9:0;35384:10;35371:23;35355:39;35347:96;;;;-1:-1:-1;;;35347:96:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;40673:27:0;::::1;;::::0;;;:17:::1;:27;::::0;;;;;::::1;;40665:65;;;::::0;-1:-1:-1;;;40665:65:0;;10703:2:1;40665:65:0::1;::::0;::::1;10685:21:1::0;10742:2;10722:18;;;10715:30;10781:27;10761:18;;;10754:55;10826:18;;40665:65:0::1;10501:349:1::0;40665:65:0::1;-1:-1:-1::0;;;;;;40741:27:0::1;40771:5;40741:27:::0;;;:17:::1;:27;::::0;;;;:35;;-1:-1:-1;;40741:35:0::1;::::0;;-1:-1:-1;;40566:240:0:o;23629:95::-;23676:13;23709:7;23702:14;;;;;:::i;37418:135::-;35217:9;;37498:4;;-1:-1:-1;;;;;35217:9:0;35230:10;35217:23;35209:64;;;;-1:-1:-1;;;35209:64:0;;;;;;;:::i;:::-;37515:13:::1;:30:::0;;;;37418:135;:::o;27667:269::-;27760:4;27777:129;17525:10;27800:7;27809:96;27848:15;27809:96;;;;;;;;;;;;;;;;;17525:10;27809:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;27809:34:0;;;;;;;;;;;;:38;:96::i;41566:751::-;41718:7;;41671:4;;;42068:19;;;:52;;-1:-1:-1;42109:10:0;42091:29;;;;:17;:29;;;;;;;;42068:52;42064:214;;;42137:40;42147:10;42159:9;42170:6;42137:9;:40::i;:::-;42064:214;;;42210:56;42227:10;42239:9;42250:6;42258:7;42210:16;:56::i;:::-;;42064:214;-1:-1:-1;42305:4:0;;41566:751;-1:-1:-1;;;;41566:751:0:o;37086:324::-;35217:9;;37171:4;;-1:-1:-1;;;;;35217:9:0;35230:10;35217:23;35209:64;;;;-1:-1:-1;;;35209:64:0;;;;;;;:::i;:::-;36364:13;:20;37260:6:::1;:32;;;37252:87;;;;-1:-1:-1::0;;;37252:87:0::1;;;;;;;:::i;:::-;37374:6;37350:13;37364:6;37350:21;;;;;;;;;;:::i;39344:240::-:0;35217:9;;-1:-1:-1;;;;;35217:9:0;35230:10;35217:23;35209:64;;;;-1:-1:-1;;;35209:64:0;;;;;;;:::i;:::-;39423:16:::1;::::0;-1:-1:-1;;;39423:16:0;::::1;;;39422:17;39414:66;;;;-1:-1:-1::0;;;39414:66:0::1;;;;;;;:::i;:::-;39510:5;39499:8;:16;39491:56;;;;-1:-1:-1::0;;;39491:56:0::1;;;;;;;:::i;:::-;39558:7;:18:::0;39344:240::o;39592:237::-;35217:9;;-1:-1:-1;;;;;35217:9:0;35230:10;35217:23;35209:64;;;;-1:-1:-1;;;35209:64:0;;;;;;;:::i;:::-;39670:16:::1;::::0;-1:-1:-1;;;39670:16:0;::::1;;;39669:17;39661:66;;;;-1:-1:-1::0;;;39661:66:0::1;;;;;;;:::i;:::-;39757:4;39746:8;:15;39738:55;;;;-1:-1:-1::0;;;39738:55:0::1;;;;;;;:::i;:::-;39804:6;:17:::0;39592:237::o;19825:244::-;18944:6;;-1:-1:-1;;;;;18944:6:0;;;;;17525:10;19091:23;19083:68;;;;-1:-1:-1;;;19083:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19914:22:0;::::1;19906:73;;;::::0;-1:-1:-1;;;19906:73:0;;11057:2:1;19906:73:0::1;::::0;::::1;11039:21:1::0;11096:2;11076:18;;;11069:30;11135:34;11115:18;;;11108:62;-1:-1:-1;;;11186:18:1;;;11179:36;11232:19;;19906:73:0::1;10855:402:1::0;19906:73:0::1;20016:6;::::0;19995:38:::1;::::0;-1:-1:-1;;;;;19995:38:0;;::::1;::::0;20016:6:::1;::::0;::::1;;::::0;19995:38:::1;::::0;;;::::1;20044:6;:17:::0;;-1:-1:-1;;;;;20044:17:0;;::::1;;;-1:-1:-1::0;;;;;;20044:17:0;;::::1;::::0;;;::::1;::::0;;19825:244::o;44293:500::-;20672:9;;-1:-1:-1;;;;;20672:9:0;20685:10;20672:23;20664:72;;;;-1:-1:-1;;;20664:72:0;;;;;;;:::i;:::-;44436:21:::1;::::0;-1:-1:-1;;;44436:21:0;::::1;;;44435:22;44427:59;;;::::0;-1:-1:-1;;;44427:59:0;;11464:2:1;44427:59:0::1;::::0;::::1;11446:21:1::0;11503:2;11483:18;;;11476:30;11542:26;11522:18;;;11515:54;11586:18;;44427:59:0::1;11262:348:1::0;44427:59:0::1;-1:-1:-1::0;;;;;44505:29:0;::::1;44497:58;;;::::0;-1:-1:-1;;;44497:58:0;;11817:2:1;44497:58:0::1;::::0;::::1;11799:21:1::0;11856:2;11836:18;;;11829:30;-1:-1:-1;;;11875:18:1;;;11868:46;11931:18;;44497:58:0::1;11615:340:1::0;44497:58:0::1;-1:-1:-1::0;;;;;44574:29:0;::::1;44566:58;;;::::0;-1:-1:-1;;;44566:58:0;;12162:2:1;44566:58:0::1;::::0;::::1;12144:21:1::0;12201:2;12181:18;;;12174:30;-1:-1:-1;;;12220:18:1;;;12213:46;12276:18;;44566:58:0::1;11960:340:1::0;44566:58:0::1;44635:21;:28:::0;;-1:-1:-1;;;;44635:28:0::1;-1:-1:-1::0;;;44635:28:0::1;::::0;;44674:51:::1;44680:15:::0;33795:10:::1;44674:5;:51::i;:::-;44736:49;44742:15;33903:11;44736:5;:49::i;38607:206::-:0;20847:9;;-1:-1:-1;;;;;20847:9:0;17525:10;20831:25;35355:39;;;-1:-1:-1;35371:9:0;;-1:-1:-1;;;;;35371:9:0;35384:10;35371:23;35355:39;35347:96;;;;-1:-1:-1;;;35347:96:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;38703:26:0;::::1;38695:73;;;::::0;-1:-1:-1;;;38695:73:0;;12507:2:1;38695:73:0::1;::::0;::::1;12489:21:1::0;12546:2;12526:18;;;12519:30;12585:34;12565:18;;;12558:62;-1:-1:-1;;;12636:18:1;;;12629:32;12678:19;;38695:73:0::1;12305:398:1::0;38695:73:0::1;38779:11;:26:::0;;-1:-1:-1;;;;;;38779:26:0::1;-1:-1:-1::0;;;;;38779:26:0;;;::::1;::::0;;;::::1;::::0;;38607:206::o;38395:97::-;35217:9;;-1:-1:-1;;;;;35217:9:0;35230:10;35217:23;35209:64;;;;-1:-1:-1;;;35209:64:0;;;;;;;:::i;:::-;38461:16:::1;:23:::0;;-1:-1:-1;;;;38461:23:0::1;-1:-1:-1::0;;;38461:23:0::1;::::0;;38395:97::o;30814:346::-;-1:-1:-1;;;;;30916:19:0;;30908:68;;;;-1:-1:-1;;;30908:68:0;;12910:2:1;30908:68:0;;;12892:21:1;12949:2;12929:18;;;12922:30;12988:34;12968:18;;;12961:62;-1:-1:-1;;;13039:18:1;;;13032:34;13083:19;;30908:68:0;12708:400:1;30908:68:0;-1:-1:-1;;;;;30995:21:0;;30987:68;;;;-1:-1:-1;;;30987:68:0;;13315:2:1;30987:68:0;;;13297:21:1;13354:2;13334:18;;;13327:30;13393:34;13373:18;;;13366:62;-1:-1:-1;;;13444:18:1;;;13437:32;13486:19;;30987:68:0;13113:398:1;30987:68:0;-1:-1:-1;;;;;31068:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;31120:32;;1535:25:1;;;31120:32:0;;1508:18:1;31120:32:0;;;;;;;;30814:346;;;:::o;28426:539::-;-1:-1:-1;;;;;28532:20:0;;28524:70;;;;-1:-1:-1;;;28524:70:0;;13718:2:1;28524:70:0;;;13700:21:1;13757:2;13737:18;;;13730:30;13796:34;13776:18;;;13769:62;-1:-1:-1;;;13847:18:1;;;13840:35;13892:19;;28524:70:0;13516:401:1;28524:70:0;-1:-1:-1;;;;;28613:23:0;;28605:71;;;;-1:-1:-1;;;28605:71:0;;14124:2:1;28605:71:0;;;14106:21:1;14163:2;14143:18;;;14136:30;14202:34;14182:18;;;14175:62;-1:-1:-1;;;14253:18:1;;;14246:33;14296:19;;28605:71:0;13922:399:1;28605:71:0;28769;28791:6;28769:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28769:17:0;;:9;:17;;;;;;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;28749:17:0;;;:9;:17;;;;;;;;;;;:91;;;;28874:20;;;;;;;:32;;28899:6;28874:24;:32::i;:::-;-1:-1:-1;;;;;28851:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;28922:35;1535:25:1;;;28851:20:0;;28922:35;;;;;;1508:18:1;28922:35:0;1389:177:1;43216:997:0;43477:13;;43368:4;;;;;;-1:-1:-1;;;;;43477:13:0;;;43467:23;;;;43464:147;;43518:28;43541:4;43518:18;43529:6;;43518;:10;;:18;;;;:::i;:::-;:22;;:28::i;:::-;43506:40;-1:-1:-1;43578:21:0;:6;43506:40;43578:10;:21::i;:::-;43561:38;;43464:147;43639:13;;-1:-1:-1;;;;;43639:13:0;;;43626:26;;;;43623:151;;43680:29;43704:4;43680:19;43691:7;;43680:6;:10;;:19;;;;:::i;:29::-;43668:41;-1:-1:-1;43741:21:0;:6;43668:41;43741:10;:21::i;:::-;43724:38;;43623:151;43801:13;;-1:-1:-1;;;;;43791:23:0;;;43801:13;;43791:23;;;;43790:57;;-1:-1:-1;43833:13:0;;-1:-1:-1;;;;;43820:26:0;;;43833:13;;43820:26;;43790:57;43786:184;;;43876:29;43900:4;43876:19;43887:7;;43876:6;:10;;:19;;;;:::i;:29::-;43864:41;-1:-1:-1;43937:21:0;:6;43864:41;43937:10;:21::i;:::-;43920:38;;43786:184;44042:19;;44024:49;;44034:6;;-1:-1:-1;;;;;44042:19:0;44063:9;44024;:49::i;:::-;44137:44;44147:6;44155:9;44166:14;44137:9;:44::i;:::-;-1:-1:-1;44201:4:0;;43216:997;-1:-1:-1;;;;;;43216:997:0:o;12073:166::-;12159:7;12195:12;12187:6;;;;12179:29;;;;-1:-1:-1;;;12179:29:0;;;;;;;;:::i;:::-;-1:-1:-1;12226:5:0;12230:1;12226;:5;:::i;:::-;12219:12;12073:166;-1:-1:-1;;;;12073:166:0:o;20995:257::-;-1:-1:-1;;;;;21072:26:0;;21064:84;;;;-1:-1:-1;;;21064:84:0;;14661:2:1;21064:84:0;;;14643:21:1;14700:2;14680:18;;;14673:30;14739:34;14719:18;;;14712:62;-1:-1:-1;;;14790:18:1;;;14783:43;14843:19;;21064:84:0;14459:409:1;21064:84:0;21164:45;;-1:-1:-1;;;;;21164:45:0;;;21192:1;;21164:45;;21192:1;;21164:45;21220:9;:24;;-1:-1:-1;;;;;;21220:24:0;-1:-1:-1;;;;;21220:24:0;;;;;;;;;;20995:257::o;9246:179::-;9304:7;;9336:5;9340:1;9336;:5;:::i;:::-;9324:17;;9365:1;9360;:6;;9352:46;;;;-1:-1:-1;;;9352:46:0;;15205:2:1;9352:46:0;;;15187:21:1;15244:2;15224:18;;;15217:30;15283:29;15263:18;;;15256:57;15330:18;;9352:46:0;15003:351:1;9352:46:0;9416:1;9246:179;-1:-1:-1;;;9246:179:0:o;29247:378::-;-1:-1:-1;;;;;29331:21:0;;29323:65;;;;-1:-1:-1;;;29323:65:0;;15561:2:1;29323:65:0;;;15543:21:1;15600:2;15580:18;;;15573:30;15639:33;15619:18;;;15612:61;15690:18;;29323:65:0;15359:355:1;29323:65:0;29478:12;;:24;;29495:6;29478:16;:24::i;:::-;29463:12;:39;-1:-1:-1;;;;;29534:18:0;;:9;:18;;;;;;;;;;;:30;;29557:6;29534:22;:30::i;:::-;-1:-1:-1;;;;;29513:18:0;;:9;:18;;;;;;;;;;;:51;;;;29580:37;;1535:25:1;;;29513:18:0;;:9;;29580:37;;1508:18:1;29580:37:0;;;;;;;;29247:378;;:::o;32807:91::-;32863:27;17525:10;32883:6;32863:5;:27::i;9708:158::-;9766:7;9799:1;9794;:6;;9786:49;;;;-1:-1:-1;;;9786:49:0;;15921:2:1;9786:49:0;;;15903:21:1;15960:2;15940:18;;;15933:30;15999:32;15979:18;;;15972:60;16049:18;;9786:49:0;15719:354:1;9786:49:0;9853:5;9857:1;9853;:5;:::i;33217:295::-;33294:26;33323:84;33360:6;33323:84;;;;;;;;;;;;;;;;;:32;33333:7;17525:10;25267:151;:::i;33323:84::-;33294:113;-1:-1:-1;33420:51:0;33429:7;17525:10;33452:18;33420:8;:51::i;:::-;33482:22;33488:7;33497:6;33482:5;:22::i;:::-;33283:229;33217:295;;:::o;10125:220::-;10183:7;10207:1;10212;10207:6;10203:20;;-1:-1:-1;10222:1:0;10215:8;;10203:20;10234:9;10246:5;10250:1;10246;:5;:::i;:::-;10234:17;-1:-1:-1;10279:1:0;10270:5;10274:1;10234:17;10270:5;:::i;:::-;:10;10262:56;;;;-1:-1:-1;;;10262:56:0;;16675:2:1;10262:56:0;;;16657:21:1;16714:2;16694:18;;;16687:30;16753:34;16733:18;;;16726:62;-1:-1:-1;;;16804:18:1;;;16797:31;16845:19;;10262:56:0;16473:397:1;10823:153:0;10881:7;10913:1;10909;:5;10901:44;;;;-1:-1:-1;;;10901:44:0;;17077:2:1;10901:44:0;;;17059:21:1;17116:2;17096:18;;;17089:30;17155:28;17135:18;;;17128:56;17201:18;;10901:44:0;16875:350:1;10901:44:0;10963:5;10967:1;10963;:5;:::i;29958:418::-;-1:-1:-1;;;;;30042:21:0;;30034:67;;;;-1:-1:-1;;;30034:67:0;;17432:2:1;30034:67:0;;;17414:21:1;17471:2;17451:18;;;17444:30;17510:34;17490:18;;;17483:62;-1:-1:-1;;;17561:18:1;;;17554:31;17602:19;;30034:67:0;17230:397:1;30034:67:0;30197:68;30220:6;30197:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30197:18:0;;:9;:18;;;;;;;;;;;;:68;:22;:68::i;:::-;-1:-1:-1;;;;;30176:18:0;;:9;:18;;;;;;;;;;:89;30291:12;;:24;;30308:6;30291:16;:24::i;:::-;30276:12;:39;30331:37;;1535:25:1;;;30357:1:0;;-1:-1:-1;;;;;30331:37:0;;;;;1523:2:1;1508:18;30331:37:0;1389:177:1;14:418;163:2;152:9;145:21;126:4;195:6;189:13;238:6;233:2;222:9;218:18;211:34;297:6;292:2;284:6;280:15;275:2;264:9;260:18;254:50;353:1;348:2;339:6;328:9;324:22;320:31;313:42;423:2;416;412:7;407:2;399:6;395:15;391:29;380:9;376:45;372:54;364:62;;;14:418;;;;:::o;437:131::-;-1:-1:-1;;;;;512:31:1;;502:42;;492:70;;558:1;555;548:12;573:367;641:6;649;702:2;690:9;681:7;677:23;673:32;670:52;;;718:1;715;708:12;670:52;757:9;744:23;776:31;801:5;776:31;:::i;:::-;826:5;904:2;889:18;;;;876:32;;-1:-1:-1;;;573:367:1:o;1137:247::-;1196:6;1249:2;1237:9;1228:7;1224:23;1220:32;1217:52;;;1265:1;1262;1255:12;1217:52;1304:9;1291:23;1323:31;1348:5;1323:31;:::i;1571:508::-;1648:6;1656;1664;1717:2;1705:9;1696:7;1692:23;1688:32;1685:52;;;1733:1;1730;1723:12;1685:52;1772:9;1759:23;1791:31;1816:5;1791:31;:::i;:::-;1841:5;-1:-1:-1;1898:2:1;1883:18;;1870:32;1911:33;1870:32;1911:33;:::i;:::-;1571:508;;1963:7;;-1:-1:-1;;;2043:2:1;2028:18;;;;2015:32;;1571:508::o;2481:226::-;2540:6;2593:2;2581:9;2572:7;2568:23;2564:32;2561:52;;;2609:1;2606;2599:12;2561:52;-1:-1:-1;2654:23:1;;2481:226;-1:-1:-1;2481:226:1:o;2712:522::-;2803:6;2811;2819;2872:2;2860:9;2851:7;2847:23;2843:32;2840:52;;;2888:1;2885;2878:12;2840:52;2927:9;2914:23;2946:31;2971:5;2946:31;:::i;:::-;2996:5;-1:-1:-1;3074:2:1;3059:18;;3046:32;;-1:-1:-1;3156:2:1;3141:18;;3128:32;3169:33;3128:32;3169:33;:::i;:::-;3221:7;3211:17;;;2712:522;;;;;:::o;3239:389::-;3305:6;3313;3366:2;3354:9;3345:7;3341:23;3337:32;3334:52;;;3382:1;3379;3372:12;3334:52;3421:9;3408:23;3471:4;3464:5;3460:16;3453:5;3450:27;3440:55;;3491:1;3488;3481:12;3633:388;3701:6;3709;3762:2;3750:9;3741:7;3737:23;3733:32;3730:52;;;3778:1;3775;3768:12;3730:52;3817:9;3804:23;3836:31;3861:5;3836:31;:::i;:::-;3886:5;-1:-1:-1;3943:2:1;3928:18;;3915:32;3956:33;3915:32;3956:33;:::i;:::-;4008:7;3998:17;;;3633:388;;;;;:::o;4026:380::-;4105:1;4101:12;;;;4148;;;4169:61;;4223:4;4215:6;4211:17;4201:27;;4169:61;4276:2;4268:6;4265:14;4245:18;4242:38;4239:161;;4322:10;4317:3;4313:20;4310:1;4303:31;4357:4;4354:1;4347:15;4385:4;4382:1;4375:15;4239:161;;4026:380;;;:::o;4411:408::-;4613:2;4595:21;;;4652:2;4632:18;;;4625:30;4691:34;4686:2;4671:18;;4664:62;-1:-1:-1;;;4757:2:1;4742:18;;4735:42;4809:3;4794:19;;4411:408::o;5233:356::-;5435:2;5417:21;;;5454:18;;;5447:30;5513:34;5508:2;5493:18;;5486:62;5580:2;5565:18;;5233:356::o;6660:400::-;6862:2;6844:21;;;6901:2;6881:18;;;6874:30;6940:34;6935:2;6920:18;;6913:62;-1:-1:-1;;;7006:2:1;6991:18;;6984:34;7050:3;7035:19;;6660:400::o;7344:277::-;7411:6;7464:2;7452:9;7443:7;7439:23;7435:32;7432:52;;;7480:1;7477;7470:12;7432:52;7512:9;7506:16;7565:5;7558:13;7551:21;7544:5;7541:32;7531:60;;7587:1;7584;7577:12;7626:352;7828:2;7810:21;;;7867:2;7847:18;;;7840:30;7906;7901:2;7886:18;;7879:58;7969:2;7954:18;;7626:352::o;8341:406::-;8543:2;8525:21;;;8582:2;8562:18;;;8555:30;8621:34;8616:2;8601:18;;8594:62;-1:-1:-1;;;8687:2:1;8672:18;;8665:40;8737:3;8722:19;;8341:406::o;8752:127::-;8813:10;8808:3;8804:20;8801:1;8794:31;8844:4;8841:1;8834:15;8868:4;8865:1;8858:15;8884:151;8974:4;8967:12;;;8953;;;8949:31;;8992:14;;8989:40;;;9009:18;;:::i;9040:127::-;9101:10;9096:3;9092:20;9089:1;9082:31;9132:4;9129:1;9122:15;9156:4;9153:1;9146:15;9172:148;9260:4;9239:12;;;9253;;;9235:31;;9278:13;;9275:39;;;9294:18;;:::i;9740:400::-;9942:2;9924:21;;;9981:2;9961:18;;;9954:30;10020:34;10015:2;10000:18;;9993:62;-1:-1:-1;;;10086:2:1;10071:18;;10064:34;10130:3;10115:19;;9740:400::o;10145:351::-;10347:2;10329:21;;;10386:2;10366:18;;;10359:30;10425:29;10420:2;10405:18;;10398:57;10487:2;10472:18;;10145:351::o;14326:128::-;14393:9;;;14414:11;;;14411:37;;;14428:18;;:::i;14873:125::-;14938:9;;;14959:10;;;14956:36;;;14972:18;;:::i;16078:168::-;16151:9;;;16182;;16199:15;;;16193:22;;16179:37;16169:71;;16220:18;;:::i;16251:217::-;16291:1;16317;16307:132;;16361:10;16356:3;16352:20;16349:1;16342:31;16396:4;16393:1;16386:15;16424:4;16421:1;16414:15;16307:132;-1:-1:-1;16453:9:1;;16251:217::o

Swarm Source

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