ETH Price: $2,524.41 (-2.76%)

Token

Imagawa (GAWA)
 

Overview

Max Total Supply

4,968.809808657360694393 GAWA

Holders

95

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.348887801798685961 GAWA

Value
$0.00
0x2242fa07c69e22a781015c1c6a53736a4c2d56c7
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
ImagawaToken

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-10-31
*/

// SPDX-License-Identifier: MIT

pragma solidity 0.6.12;

contract Context {
    // Empty internal constructor, to prevent people from mistakenly deploying
    // an instance of this contract, which should be used via inheritance.
    constructor() internal {}

    function _msgSender() internal view returns (address payable) {
        return msg.sender;
    }

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

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 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 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 onlyOwner {
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     */
    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0), 'Ownable: new owner is the zero address');
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

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

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

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

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

    /**
     * @dev Returns the bep token owner.
     */
    function getOwner() external view returns (address);

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

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

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

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

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

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

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

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

        return c;
    }

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

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

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

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

        return c;
    }

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

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

        return c;
    }

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

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

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

    // babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method)
    function sqrt(uint256 y) internal pure returns (uint256 z) {
        if (y > 3) {
            z = y;
            uint256 x = y / 2 + 1;
            while (x < z) {
                z = x;
                x = (y / x + x) / 2;
            }
        } else if (y != 0) {
            z = 1;
        }
    }
}

library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly {
            codehash := extcodehash(account)
        }
        return (codehash != accountHash && codehash != 0x0);
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive rewardss via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, 'Address: insufficient balance');

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{value: amount}('');
        require(success, 'Address: unable to send value, recipient may have reverted');
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, 'Address: low-level call failed');
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return _functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, 'Address: low-level call with value failed');
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, 'Address: insufficient balance for call');
        return _functionCallWithValue(target, data, value, errorMessage);
    }

    function _functionCallWithValue(
        address target,
        bytes memory data,
        uint256 weiValue,
        string memory errorMessage
    ) private returns (bytes memory) {
        require(isContract(target), 'Address: call to non-contract');

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{value: weiValue}(data);
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}


contract BEP20 is Context, IBEP20, Ownable {
    using SafeMath for uint256;
    using Address for address;

    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, uint8 decimals) public {
        _name = name;
        _symbol = symbol;
        _decimals = decimals;
    }

    /**
     * @dev Returns the bep token owner.
     */
    function getOwner() external override view returns (address) {
        return owner();
    }

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

    /**
     * @dev Returns the token decimals.
     */
    function decimals() public override view returns (uint8) {
        return _decimals;
    }

    /**
     * @dev Returns the token symbol.
     */
    function symbol() public override view returns (string memory) {
        return _symbol;
    }

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

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

    /**
     * @dev See {BEP20-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 override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

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

    /**
     * @dev See {BEP20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {BEP20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {BEP20};
     *
     * 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 override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(
            sender,
            _msgSender(),
            _allowances[sender][_msgSender()].sub(amount, 'BEP20: 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 {BEP20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public 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 {BEP20-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 returns (bool) {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender].sub(subtractedValue, 'BEP20: decreased allowance below zero')
        );
        return true;
    }

    /**
     * @dev Destroys `amount` tokens from `msg.sender`, decreasing the total supply.
     *
     */
    function burn(uint256 amount) public returns (bool) {
        _burn(_msgSender(), amount);
        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), 'BEP20: transfer from the zero address');
        require(recipient != address(0), 'BEP20: transfer to the zero address');

        _balances[sender] = _balances[sender].sub(amount, 'BEP20: 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 {
        require(account != address(0), 'BEP20: mint to the zero address');

        _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 {
        require(account != address(0), 'BEP20: burn from the zero address');

        _balances[account] = _balances[account].sub(amount, 'BEP20: 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 is 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 {
        require(owner != address(0), 'BEP20: approve from the zero address');
        require(spender != address(0), 'BEP20: approve to the zero address');

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

    /**
     * @dev Destroys `amount` tokens from `account`.`amount` is then deducted
     * from the caller's allowance.
     *
     * See {_burn} and {_approve}.
     */
    function _burnFrom(address account, uint256 amount) internal {
        _burn(account, amount);
        _approve(
            account,
            _msgSender(),
            _allowances[account][_msgSender()].sub(amount, 'BEP20: burn amount exceeds allowance')
        );
    }
}

library SafeBEP20 {
    using SafeMath for uint256;
    using Address for address;

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

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

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IBEP20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IBEP20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        // solhint-disable-next-line max-line-length
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            'SafeBEP20: approve from non-zero to non-zero allowance'
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IBEP20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender).add(value);
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IBEP20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender).sub(
            value,
            'SafeBEP20: decreased allowance below zero'
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IBEP20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, 'SafeBEP20: low-level call failed');
        if (returndata.length > 0) {
            // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), 'SafeBEP20: BEP20 operation did not succeed');
        }
    }
}

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

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

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

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

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

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

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

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

    function initialize(address, address) external;
    function setSwapFee(uint32) external;
}

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

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

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

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

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
    function setSwapFee(address _pair, uint32 _swapFee) external;
}

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

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

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


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

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

contract ImagawaToken is BEP20 {
    using SafeMath for uint256;
    using SafeBEP20 for IBEP20;

    IUniRouter02 public uniSwapRouter;
    address public uniSwapPair;

    bool private swapping;
    address payable public liquidityWallet = 
    payable(0xadc2be1a8c917a786613389ED7Ef5Fba0b1D7cEB);

    address payable public devmarketingWallet =
        payable(0x4C58ee2B919b513550e47da597e7D8571DFB131f);
    address payable public rewardsWallet =
        payable(0xadc2be1a8c917a786613389ED7Ef5Fba0b1D7cEB);
    address payable public serviceWallet =
        payable(0xadc2be1a8c917a786613389ED7Ef5Fba0b1D7cEB);

    uint256 public nativeAmountToSwap = 1 ether;

    uint256 public devmarketingFeeOnBuy;
    uint256 public burnFeeOnBuy;
    uint256 public rewardsFeeOnBuy;
    uint256 public rewardsFeeOnSell;
    uint256 public totalFeesOnBuy;
    uint256 public devmarketingFeeOnSell;
    uint256 public burnFeeOnSell;
    uint256 public liquidityFeeOnBuy;
    uint256 public liquidityFeeOnSell;
    uint256 public totalFeesOnSell;
    uint256 public serviceTokenAmount;
    uint256 public serviceFee = 1;
    uint256 public liquidityShare = 3;
    uint256 public devmarketingShare = 6;
    uint256 public rewardsShare = 8;
    uint256 public totalShares = 17;

    bool public SwapAndLiquifyEnabled = false;
    uint256 public maxTxAmount = 5000 * (10**18); // Initial Max Tx Amount

    // exlcude from fees and max transaction amount
    mapping(address => bool) private _isExcludedFromFees;

    // getting fee addresses
    mapping(address => bool) public _isGetFees;

    // store addresses that are automated market maker pairs. Any transfer to these addresses
    // could be subject to a maximum transfer amount
    mapping(address => bool) public automatedMarketMakerPairs;

    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }

    // Contract Events
    event ExcludeFromFees(address indexed account, bool isExcluded);
    event GetFee(address indexed account, bool isGetFee);
    event ExcludeMultipleAccountsFromFees(address[] accounts, bool isExcluded);
    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);
    event DevMarketingWalletUpdated(
        address indexed newDevMarketingWallet,
        address indexed oldDevMarketingWallet
    );

    event RewardsWalletUpdated(
        address indexed newRewardsWallet,
        address indexed oldRewardsWallet
    );
    event LiquidityWalletUpdated(
        address indexed newLiquidityWallet,
        address indexed oldLiquidityWallet
    );
    event UpdateUniSwapRouter(
        address indexed newAddress,
        address indexed oldAddress
    );
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 nativeReceived,
        uint256 tokensIntoLiqudity
    );
    event UpdateSwapAndLiquify(bool value);
    event SetDevMarketingFee(uint256 onBuy, uint256 onSell);
    event SetRewardsFee(uint256 onBuy, uint256 onSell);
    event SetDistribution(
        uint256 liquidity,
        uint256 devmarketing,
        uint256 rewards
    );
    event SetLiquidityFee(uint256 onBuy, uint256 onSell);
    event SetBurnFee(uint256 onBuy, uint256 onSell);
    event SetNativeAmountToSwap(uint256 nativeAmountToSwap);
    event UpdateMaxTxAmount(uint256 txAmount);

    constructor() public BEP20("Imagawa", "GAWA", 18) {
        devmarketingFeeOnBuy = 1;
        devmarketingFeeOnSell = 3;
        rewardsFeeOnBuy = 3;
        rewardsFeeOnSell = 4;
        liquidityFeeOnBuy = 2;
        liquidityFeeOnSell = 3;
        burnFeeOnBuy = 1;
        burnFeeOnSell = 1;
        totalFeesOnBuy = devmarketingFeeOnBuy
            .add(liquidityFeeOnBuy)
            .add(rewardsFeeOnBuy)
            .add(serviceFee);
        totalFeesOnSell = devmarketingFeeOnSell
            .add(liquidityFeeOnSell)
            .add(rewardsFeeOnSell)
            .add(serviceFee);

        IUniRouter02 _uniSwapRouter = IUniRouter02(
            0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
        ); // mainnet

        address _uniSwapPair = IUniFactory(_uniSwapRouter.factory())
            .createPair(address(this), _uniSwapRouter.WETH());

        uniSwapRouter = _uniSwapRouter;
        uniSwapPair = _uniSwapPair;

        _setAutomatedMarketMakerPair(uniSwapPair, true);

        // exclude from paying fees or having max transaction amount
        excludeFromFees(devmarketingWallet, true);
        excludeFromFees(rewardsWallet, true);
        excludeFromFees(liquidityWallet, true);
        excludeFromFees(address(this), true);
        excludeFromFees(owner(), true);

        // set getFee addresses
        _isGetFees[_uniSwapPair] = true;

        _mint(owner(), 5000 * (10**18));

        _status = _NOT_ENTERED;
    }

    receive() external payable {}

    function updateSwapAndLiquifiy(bool value) public onlyOwner {
        SwapAndLiquifyEnabled = value;
        emit UpdateSwapAndLiquify(value);
    }

    function setDevMarketingFee(uint256 _onBuy, uint256 _onSell)
        external
        onlyOwner
    {
        require(_onBuy <= 10 && _onSell <= 10, "Invalid devmarketingFee");
        devmarketingFeeOnBuy = _onBuy;
        devmarketingFeeOnSell = _onSell;
        totalFeesOnBuy = devmarketingFeeOnBuy
            .add(liquidityFeeOnBuy)
            .add(rewardsFeeOnBuy)
            .add(serviceFee);
        totalFeesOnSell = devmarketingFeeOnSell
            .add(liquidityFeeOnSell)
            .add(rewardsFeeOnSell)
            .add(serviceFee);
        emit SetDevMarketingFee(_onBuy, _onSell);
    }

    function setRewardsFee(uint256 _onBuy, uint256 _onSell) external onlyOwner {
        require(_onBuy <= 10 && _onSell <= 10, "Invalid rewardsFee");
        rewardsFeeOnBuy = _onBuy;
        rewardsFeeOnSell = _onSell;
        totalFeesOnBuy = rewardsFeeOnBuy
            .add(devmarketingFeeOnBuy)
            .add(liquidityFeeOnBuy)
            .add(serviceFee);
        totalFeesOnSell = rewardsFeeOnSell
            .add(devmarketingFeeOnSell)
            .add(liquidityFeeOnSell)
            .add(serviceFee);
        emit SetRewardsFee(_onBuy, _onSell);
    }

    function setLiquidityFee(uint256 _onBuy, uint256 _onSell)
        external
        onlyOwner
    {
        require(_onBuy <= 10 && _onSell <= 10, "Invalid Liquidity Fee");
        liquidityFeeOnBuy = _onBuy;
        liquidityFeeOnSell = _onSell;
        totalFeesOnBuy = liquidityFeeOnBuy
            .add(devmarketingFeeOnBuy)
            .add(rewardsFeeOnBuy)
            .add(serviceFee);
        totalFeesOnSell = liquidityFeeOnSell
            .add(devmarketingFeeOnSell)
            .add(rewardsFeeOnSell)
            .add(serviceFee);
        emit SetLiquidityFee(_onBuy, _onSell);
    }

    function setBurnFee(uint256 _onBuy, uint256 _onSell) external onlyOwner {
        require(_onBuy <= 10 && _onSell <= 10, "Invalid Burn Fee");
        burnFeeOnBuy = _onBuy;
        burnFeeOnSell = _onSell;
        emit SetBurnFee(_onBuy, _onSell);
    }

    function updateShares(
        uint256 _liquidity,
        uint256 _devmarketing,
        uint256 _rewards
    ) external onlyOwner {
        liquidityShare = _liquidity;
        devmarketingShare = _devmarketing;
        rewardsShare = _rewards;
        totalShares = liquidityShare.add(devmarketingShare).add(rewardsShare);

        emit SetDistribution(_liquidity, _devmarketing, _rewards);
    }

    function updateUniSwapRouter(address newAddress) public onlyOwner {
        require(
            newAddress != address(uniSwapRouter),
            "The router already has that address"
        );
        emit UpdateUniSwapRouter(newAddress, address(uniSwapRouter));
        uniSwapRouter = IUniRouter02(newAddress);
        address _uniSwapPair;
        _uniSwapPair = IUniFactory(uniSwapRouter.factory()).getPair(
            address(this),
            uniSwapRouter.WETH()
        );
        if (_uniSwapPair == address(0)) {
            _uniSwapPair = IUniFactory(uniSwapRouter.factory())
                .createPair(address(this), uniSwapRouter.WETH());
        }
        _setAutomatedMarketMakerPair(uniSwapPair, false);
        uniSwapPair = _uniSwapPair;
        _setAutomatedMarketMakerPair(uniSwapPair, true);
    }

    function excludeFromFees(address account, bool excluded) public onlyOwner {
        _isExcludedFromFees[account] = excluded;

        emit ExcludeFromFees(account, excluded);
    }

    function setFeeAccount(address account, bool isGetFee) public onlyOwner {
        require(
            _isGetFees[account] != isGetFee,
            "Account is already the value of 'isGetFee'"
        );
        _isGetFees[account] = isGetFee;

        emit GetFee(account, isGetFee);
    }

    function excludeMultipleAccountsFromFees(
        address[] calldata accounts,
        bool excluded
    ) public onlyOwner {
        for (uint256 i = 0; i < accounts.length; i++) {
            _isExcludedFromFees[accounts[i]] = excluded;
        }

        emit ExcludeMultipleAccountsFromFees(accounts, excluded);
    }

    function setAutomatedMarketMakerPair(address pair, bool value)
        public
        onlyOwner
    {
        _setAutomatedMarketMakerPair(pair, value);
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        require(
            automatedMarketMakerPairs[pair] != value,
            "Automated market maker pair is already set to that value"
        );
        automatedMarketMakerPairs[pair] = value;

        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function setNativeAmountToSwap(uint256 _nativeAmount) public onlyOwner {
        nativeAmountToSwap = _nativeAmount;
        emit SetNativeAmountToSwap(nativeAmountToSwap);
    }

    function updateDevMarketingWallet(address newDevMarketingWallet)
        public
        onlyOwner
    {
        require(
            newDevMarketingWallet != devmarketingWallet,
            "The devmarketing wallet is already this address"
        );
        excludeFromFees(newDevMarketingWallet, true);
        excludeFromFees(devmarketingWallet, false);
        emit DevMarketingWalletUpdated(
            newDevMarketingWallet,
            devmarketingWallet
        );
        devmarketingWallet = payable(newDevMarketingWallet);
    }

    function updateLiquidityWallet(address _liquidityWallet)
        external
        onlyOwner
    {
        require(
            _liquidityWallet != liquidityWallet,
            "The liquidity Wallet is already this address"
        );
        excludeFromFees(_liquidityWallet, true);
        emit LiquidityWalletUpdated(_liquidityWallet, liquidityWallet);
        liquidityWallet = payable(_liquidityWallet);
    }

    function updateRewardsWallet(address newRewardsWallet) public onlyOwner {
        require(
            newRewardsWallet != rewardsWallet,
            "The rewards wallet is already this address"
        );
        excludeFromFees(newRewardsWallet, true);
        excludeFromFees(rewardsWallet, false);
        rewardsWallet = payable(newRewardsWallet);
        emit RewardsWalletUpdated(newRewardsWallet, rewardsWallet);
    }

    function updateMaxTxAmount(uint256 _amount) public onlyOwner {
        maxTxAmount = _amount;
        emit UpdateMaxTxAmount(_amount);
    }

    function isExcludedFromFees(address account) public view returns (bool) {
        return _isExcludedFromFees[account];
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(from != address(0), "BEP20: transfer from the zero address");
        require(to != address(0), "BEP20: transfer to the zero address");
        require(amount <= maxTxAmount, "max-tx-amount-overflow");

        if (amount == 0) {
            super._transfer(from, to, 0);
            return;
        }

        if (SwapAndLiquifyEnabled) {
            uint256 contractTokenBalance = balanceOf(address(this));
            uint256 nativeTokenAmount = _getTokenAmountFromNative();

            bool canSwap = contractTokenBalance >= nativeTokenAmount;

            if (canSwap && !swapping && !automatedMarketMakerPairs[from]) {
                swapping = true;
                // Set number of tokens to sell to nativeTokenAmount
                contractTokenBalance = nativeTokenAmount;
                swapTokens(contractTokenBalance);
                swapping = false;
            }
        }

        // indicates if fee should be deducted from transfer
        bool takeFee = true;

        // if any account belongs to _isExcludedFromFee account then remove the fee
        if (_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }

        if (takeFee) {
            if (_isGetFees[from] || _isGetFees[to]) {
                uint256 fees;
                uint256 burnFee;
                    if (_isGetFees[from]) {
                        fees = amount.mul(totalFeesOnBuy).div(100);
                        burnFee = amount.mul(burnFeeOnBuy).div(100);
                        super._transfer(from, address(this), fees);
                        _burn(from, burnFee);
                        serviceTokenAmount = serviceTokenAmount.add(
                            fees.mul(serviceFee).div(totalFeesOnBuy)
                        );
                    } else {
                        fees = amount.mul(totalFeesOnSell).div(100);
                        burnFee = amount.mul(burnFeeOnSell).div(100);
                        super._transfer(from, address(this), fees);
                        _burn(from, burnFee);
                        serviceTokenAmount = serviceTokenAmount.add(
                            fees.mul(serviceFee).div(totalFeesOnSell)
                        );
                    }
                
                  amount = amount.sub(fees).sub(burnFee);
            }
        }

        super._transfer(from, to, amount);
    }

    function swapTokens(uint256 tokenAmount) private {
        uint256 serviceSwapAmount = tokenAmount.mul(serviceTokenAmount).div(
            super.balanceOf(address(this))
        );
        uint256 tokensForLiquidity = tokenAmount.mul(liquidityShare).div(
            totalShares
        );
        uint256 swapTokenAmount = tokenAmount.sub(tokensForLiquidity);
        swapTokensForNative(swapTokenAmount);
        uint256 swappedNative = address(this).balance;
        uint256 serviceNative = swappedNative.mul(serviceSwapAmount).div(
            swapTokenAmount
        );
        swappedNative = swappedNative.sub(serviceNative);
        serviceTokenAmount = serviceTokenAmount.sub(serviceSwapAmount);
        uint256 nativeForLiquidity = swappedNative.mul(liquidityShare).div(
            totalShares
        );
        uint256 nativeForRewards = swappedNative.mul(rewardsShare).div(totalShares);
        uint256 nativeForDevMarketing = swappedNative
            .sub(nativeForLiquidity)
            .sub(nativeForRewards);

        if (serviceNative > 0) {
            transferNativeToServiceWallet(serviceNative);
        }
        if (tokensForLiquidity > 0) {
            addLiquidity(tokensForLiquidity, nativeForLiquidity);
        }
        if (nativeForRewards > 0) {
            transferNativeToRewardsWallet(nativeForRewards);
        }
        if (nativeForDevMarketing > 0) {
            transferNativeToDevMarketingWallet(nativeForDevMarketing);
        }
    }

    function addLiquidity(uint256 tokenAmount, uint256 nativeAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniSwapRouter), tokenAmount);

        // add the liquidity
        uniSwapRouter.addLiquidityETH{value: nativeAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            liquidityWallet,
            block.timestamp
        );
    }

    // Swap tokens on PacakeSwap
    function swapTokensForNative(uint256 tokenAmount) private {
        // generate the uniswap pair path of token -> WETH
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniSwapRouter.WETH();

        _approve(address(this), address(uniSwapRouter), tokenAmount);

        // make the swap
        uniSwapRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of Native
            path,
            address(this),
            block.timestamp + 120
        );
    }



    function _getTokenAmountFromNative() internal view returns (uint256) {
        uint256 tokenAmount;
        address[] memory path = new address[](2);
        path[0] = uniSwapRouter.WETH();
        path[1] = address(this);
        uint256[] memory amounts = uniSwapRouter.getAmountsOut(
            nativeAmountToSwap,
            path
        );
        tokenAmount = amounts[1];
        return tokenAmount;
    }

    function transferNativeToDevMarketingWallet(uint256 amount) private {
        devmarketingWallet.transfer(amount);
    }

    function transferNativeToRewardsWallet(uint256 amount) private {
        rewardsWallet.transfer(amount);
    }

    function transferNativeToServiceWallet(uint256 amount) private {
        serviceWallet.transfer(amount);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newDevMarketingWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldDevMarketingWallet","type":"address"}],"name":"DevMarketingWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"accounts","type":"address[]"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeMultipleAccountsFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isGetFee","type":"bool"}],"name":"GetFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newLiquidityWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldLiquidityWallet","type":"address"}],"name":"LiquidityWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newRewardsWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldRewardsWallet","type":"address"}],"name":"RewardsWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"onBuy","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"onSell","type":"uint256"}],"name":"SetBurnFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"onBuy","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"onSell","type":"uint256"}],"name":"SetDevMarketingFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"liquidity","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"devmarketing","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewards","type":"uint256"}],"name":"SetDistribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"onBuy","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"onSell","type":"uint256"}],"name":"SetLiquidityFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"nativeAmountToSwap","type":"uint256"}],"name":"SetNativeAmountToSwap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"onBuy","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"onSell","type":"uint256"}],"name":"SetRewardsFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nativeReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"txAmount","type":"uint256"}],"name":"UpdateMaxTxAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"value","type":"bool"}],"name":"UpdateSwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniSwapRouter","type":"event"},{"inputs":[],"name":"SwapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isGetFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","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":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnFeeOnBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnFeeOnSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"devmarketingFeeOnBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devmarketingFeeOnSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devmarketingShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devmarketingWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeMultipleAccountsFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFeeOnBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFeeOnSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nativeAmountToSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"rewardsFeeOnBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsFeeOnSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"serviceFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"serviceTokenAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"serviceWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_onBuy","type":"uint256"},{"internalType":"uint256","name":"_onSell","type":"uint256"}],"name":"setBurnFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_onBuy","type":"uint256"},{"internalType":"uint256","name":"_onSell","type":"uint256"}],"name":"setDevMarketingFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"isGetFee","type":"bool"}],"name":"setFeeAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_onBuy","type":"uint256"},{"internalType":"uint256","name":"_onSell","type":"uint256"}],"name":"setLiquidityFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nativeAmount","type":"uint256"}],"name":"setNativeAmountToSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_onBuy","type":"uint256"},{"internalType":"uint256","name":"_onSell","type":"uint256"}],"name":"setRewardsFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFeesOnBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFeesOnSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniSwapPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniSwapRouter","outputs":[{"internalType":"contract IUniRouter02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newDevMarketingWallet","type":"address"}],"name":"updateDevMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_liquidityWallet","type":"address"}],"name":"updateLiquidityWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"updateMaxTxAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRewardsWallet","type":"address"}],"name":"updateRewardsWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_liquidity","type":"uint256"},{"internalType":"uint256","name":"_devmarketing","type":"uint256"},{"internalType":"uint256","name":"_rewards","type":"uint256"}],"name":"updateShares","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"updateSwapAndLiquifiy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateUniSwapRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052600880546001600160a01b031990811673adc2be1a8c917a786613389ed7ef5fba0b1d7ceb9081178355600980548316734c58ee2b919b513550e47da597e7d8571dfb131f179055600a8054831682179055600b8054909216179055670de0b6b3a7640000600c55600160185560036019556006601a55601b556011601c55601d805460ff1916905569010f0cf064dd59200000601e55348015620000a857600080fd5b5060405180604001604052806007815260200166496d616761776160c81b815250604051806040016040528060048152602001634741574160e01b81525060126000620000fa620004af60201b60201c565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350825162000159906004906020860190620007aa565b5081516200016f906005906020850190620007aa565b506006805460ff191660ff9290921691909117905550506001600d81905560036012819055600f8190556004601055600260148190556015829055600e8390556013839055601854620001ed939092620001d99290918391620004b3602090811b6200246717901c565b620004b360201b620024671790919060201c565b6011819055506200021f601854620001d9601054620001d9601554601254620004b360201b620024671790919060201c565b6016819055506000737a250d5630b4cf539739df2c5dacb4c659f2488d90506000816001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156200027a57600080fd5b505afa1580156200028f573d6000803e3d6000fd5b505050506040513d6020811015620002a657600080fd5b5051604080516315ab88c960e31b815290516001600160a01b039283169263c9c653969230929187169163ad5c464891600480820192602092909190829003018186803b158015620002f757600080fd5b505afa1580156200030c573d6000803e3d6000fd5b505050506040513d60208110156200032357600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301525160448083019260209291908290030181600087803b1580156200037657600080fd5b505af11580156200038b573d6000803e3d6000fd5b505050506040513d6020811015620003a257600080fd5b505160068054610100600160a81b0319166101006001600160a01b038681169190910291909117909155600780546001600160a01b0319168284161790819055919250620003f39116600162000515565b6009546200040c906001600160a01b03166001620005c9565b600a5462000425906001600160a01b03166001620005c9565b6008546200043e906001600160a01b03166001620005c9565b6200044b306001620005c9565b620004616200045962000696565b6001620005c9565b6001600160a01b03811660009081526020805260409020805460ff19166001179055620004a26200049162000696565b69010f0cf064dd59200000620006a5565b5050600160225562000846565b3390565b6000828201838110156200050e576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6001600160a01b03821660009081526021602052604090205460ff1615158115151415620005755760405162461bcd60e51b81526004018080602001828103825260388152602001806200409c6038913960400191505060405180910390fd5b6001600160a01b038216600081815260216020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b620005d3620004af565b6000546001600160a01b0390811691161462000636576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0382166000818152601f6020908152604091829020805460ff1916851515908117909155825190815291517f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df79281900390910190a25050565b6000546001600160a01b031690565b6001600160a01b03821662000701576040805162461bcd60e51b815260206004820152601f60248201527f42455032303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b6200071d81600354620004b360201b620024671790919060201c565b6003556001600160a01b0382166000908152600160209081526040909120546200075291839062002467620004b3821b17901c565b6001600160a01b03831660008181526001602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620007ed57805160ff19168380011785556200081d565b828001600101855582156200081d579182015b828111156200081d57825182559160200191906001019062000800565b506200082b9291506200082f565b5090565b5b808211156200082b576000815560010162000830565b61384680620008566000396000f3fe60806040526004361061039b5760003560e01c80638768a9cd116101dc578063b24db8f811610102578063cfc0d024116100a0578063dd62ed3e1161006f578063dd62ed3e14610c5d578063e37ba8f914610c98578063e4893fdc14610ccb578063f2fde38b14610ce0576103a2565b8063cfc0d02414610bd0578063d469801614610c03578063d837df0514610c18578063da21bcbc14610c2d576103a2565b8063c0246668116100dc578063c024666814610aad578063c13b3def14610ae8578063c492f04614610b1b578063cb61b42d14610b9a576103a2565b8063b24db8f814610a50578063b62496f514610a65578063b94315ff14610a98576103a2565b8063989a124f1161017a578063a457c2d711610149578063a457c2d71461098e578063a4de3c19146109c7578063a9059cbb14610a02578063a938d1c914610a3b576103a2565b8063989a124f146108ff5780639a7a23d6146109145780639c4afbbd1461094f578063a254b41e14610964576103a2565b80638c0b5e22116101b65780638c0b5e22146108ab5780638da5cb5b146108c05780639372881b146108d557806395d89b41146108ea576103a2565b80638768a9cd1461084e578063893d20e8146108815780638abdf5aa14610896576103a2565b806342659d97116102c15780636256d1811161025f578063715018a61161022e578063715018a6146107fa578063766ea4151461080f57806377a6b369146108245780637b3c83b114610839576103a2565b80636256d181146107415780636836f9591461076b57806368b4cac91461079b57806370a08231146107c7576103a2565b80635641f3c31161029b5780635641f3c3146106cf5780635b35f9c9146106e45780635c4907c9146106f95780635d01ff3d1461072c576103a2565b806342659d971461065d57806342966c68146106725780634fbee1931461069c576103a2565b806318160ddd11610339578063337270771161030857806333727077146105e557806339509351146105fa5780633a98ef3914610633578063423ce9cc14610648576103a2565b806318160ddd1461054d57806323b872dd146105625780632ce86fbf146105a5578063313ce567146105ba576103a2565b8063095ea7b311610375578063095ea7b31461048a5780630b504da3146104d75780630d9dd4dc1461050757806315291cd414610538576103a2565b80630664fd92146103a757806306fdde03146103d9578063087ed97214610463576103a2565b366103a257005b600080fd5b3480156103b357600080fd5b506103d7600480360360408110156103ca57600080fd5b5080359060200135610d13565b005b3480156103e557600080fd5b506103ee610e64565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610428578181015183820152602001610410565b50505050905090810190601f1680156104555780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561046f57600080fd5b50610478610efa565b60408051918252519081900360200190f35b34801561049657600080fd5b506104c3600480360360408110156104ad57600080fd5b506001600160a01b038135169060200135610f00565b604080519115158252519081900360200190f35b3480156104e357600080fd5b506103d7600480360360408110156104fa57600080fd5b5080359060200135610f1e565b34801561051357600080fd5b5061051c611015565b604080516001600160a01b039092168252519081900360200190f35b34801561054457600080fd5b50610478611024565b34801561055957600080fd5b5061047861102a565b34801561056e57600080fd5b506104c36004803603606081101561058557600080fd5b506001600160a01b03813581169160208101359091169060400135611030565b3480156105b157600080fd5b506104786110b7565b3480156105c657600080fd5b506105cf6110bd565b6040805160ff9092168252519081900360200190f35b3480156105f157600080fd5b506104786110c6565b34801561060657600080fd5b506104c36004803603604081101561061d57600080fd5b506001600160a01b0381351690602001356110cc565b34801561063f57600080fd5b5061047861111a565b34801561065457600080fd5b506104c3611120565b34801561066957600080fd5b50610478611129565b34801561067e57600080fd5b506104c36004803603602081101561069557600080fd5b503561112f565b3480156106a857600080fd5b506104c3600480360360208110156106bf57600080fd5b50356001600160a01b031661114a565b3480156106db57600080fd5b5061051c611168565b3480156106f057600080fd5b5061051c611177565b34801561070557600080fd5b506103d76004803603602081101561071c57600080fd5b50356001600160a01b0316611186565b34801561073857600080fd5b5061051c6115e4565b34801561074d57600080fd5b506103d76004803603602081101561076457600080fd5b50356115f8565b34801561077757600080fd5b506103d76004803603604081101561078e57600080fd5b508035906020013561168b565b3480156107a757600080fd5b506103d7600480360360208110156107be57600080fd5b503515156117cb565b3480156107d357600080fd5b50610478600480360360208110156107ea57600080fd5b50356001600160a01b031661186a565b34801561080657600080fd5b506103d7611885565b34801561081b57600080fd5b50610478611927565b34801561083057600080fd5b5061047861192d565b34801561084557600080fd5b50610478611933565b34801561085a57600080fd5b506104c36004803603602081101561087157600080fd5b50356001600160a01b0316611939565b34801561088d57600080fd5b5061051c61194d565b3480156108a257600080fd5b5061047861195c565b3480156108b757600080fd5b50610478611962565b3480156108cc57600080fd5b5061051c611968565b3480156108e157600080fd5b50610478611977565b3480156108f657600080fd5b506103ee61197d565b34801561090b57600080fd5b506104786119de565b34801561092057600080fd5b506103d76004803603604081101561093757600080fd5b506001600160a01b03813516906020013515156119e4565b34801561095b57600080fd5b50610478611a46565b34801561097057600080fd5b506103d76004803603602081101561098757600080fd5b5035611a4c565b34801561099a57600080fd5b506104c3600480360360408110156109b157600080fd5b506001600160a01b038135169060200135611adf565b3480156109d357600080fd5b506103d7600480360360408110156109ea57600080fd5b506001600160a01b0381351690602001351515611b47565b348015610a0e57600080fd5b506104c360048036036040811015610a2557600080fd5b506001600160a01b038135169060200135611c5a565b348015610a4757600080fd5b50610478611c6e565b348015610a5c57600080fd5b50610478611c74565b348015610a7157600080fd5b506104c360048036036020811015610a8857600080fd5b50356001600160a01b0316611c7a565b348015610aa457600080fd5b50610478611c8f565b348015610ab957600080fd5b506103d760048036036040811015610ad057600080fd5b506001600160a01b0381351690602001351515611c95565b348015610af457600080fd5b506103d760048036036020811015610b0b57600080fd5b50356001600160a01b0316611d4d565b348015610b2757600080fd5b506103d760048036036040811015610b3e57600080fd5b810190602081018135640100000000811115610b5957600080fd5b820183602082011115610b6b57600080fd5b80359060200191846020830284011164010000000083111715610b8d57600080fd5b9193509150351515611e71565b348015610ba657600080fd5b506103d760048036036060811015610bbd57600080fd5b5080359060208101359060400135611f91565b348015610bdc57600080fd5b506103d760048036036020811015610bf357600080fd5b50356001600160a01b031661204e565b348015610c0f57600080fd5b5061051c612164565b348015610c2457600080fd5b5061051c612173565b348015610c3957600080fd5b506103d760048036036040811015610c5057600080fd5b5080359060200135612182565b348015610c6957600080fd5b5061047860048036036040811015610c8057600080fd5b506001600160a01b03813581169160200135166122c5565b348015610ca457600080fd5b506103d760048036036020811015610cbb57600080fd5b50356001600160a01b03166122f0565b348015610cd757600080fd5b506104786123fd565b348015610cec57600080fd5b506103d760048036036020811015610d0357600080fd5b50356001600160a01b0316612403565b610d1b6124c8565b6000546001600160a01b03908116911614610d6b576040805162461bcd60e51b815260206004820181905260248201526000805160206136c3833981519152604482015290519081900360640190fd5b600a8211158015610d7d5750600a8111155b610dce576040805162461bcd60e51b815260206004820152601760248201527f496e76616c6964206465766d61726b6574696e67466565000000000000000000604482015290519081900360640190fd5b600d8290556012819055601854600f54601454610df99291610df39182908790612467565b90612467565b601181905550610e22601854610df3601054610df360155460125461246790919063ffffffff16565b601655604080518381526020810183905281517fcd545670799e0a627eebb91afce3bbbb9a91b706c87df4806f881feedd6a251d929181900390910190a15050565b60048054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610ef05780601f10610ec557610100808354040283529160200191610ef0565b820191906000526020600020905b815481529060010190602001808311610ed357829003601f168201915b5050505050905090565b60165481565b6000610f14610f0d6124c8565b84846124cc565b5060015b92915050565b610f266124c8565b6000546001600160a01b03908116911614610f76576040805162461bcd60e51b815260206004820181905260248201526000805160206136c3833981519152604482015290519081900360640190fd5b600a8211158015610f885750600a8111155b610fcc576040805162461bcd60e51b815260206004820152601060248201526f496e76616c6964204275726e2046656560801b604482015290519081900360640190fd5b600e8290556013819055604080518381526020810183905281517f845a2030e65ce67ab0b9dce718144ca03b9ad4b8f2a4de64c8bb15b60f73841b929181900390910190a15050565b6009546001600160a01b031681565b60195481565b60035490565b600061103d8484846125b8565b6110ad846110496124c8565b6110a885604051806060016040528060288152602001613626602891396001600160a01b038a166000908152600260205260408120906110876124c8565b6001600160a01b031681526020810191909152604001600020549190612916565b6124cc565b5060019392505050565b60155481565b60065460ff1690565b601b5481565b6000610f146110d96124c8565b846110a885600260006110ea6124c8565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490612467565b601c5481565b601d5460ff1681565b600d5481565b600061114261113c6124c8565b836129ad565b506001919050565b6001600160a01b03166000908152601f602052604090205460ff1690565b600b546001600160a01b031681565b600a546001600160a01b031681565b61118e6124c8565b6000546001600160a01b039081169116146111de576040805162461bcd60e51b815260206004820181905260248201526000805160206136c3833981519152604482015290519081900360640190fd5b6006546001600160a01b038281166101009092041614156112305760405162461bcd60e51b81526004018080602001828103825260238152602001806136036023913960400191505060405180910390fd5b6006546040516001600160a01b036101009092048216918316907fc6d84343deeef130694d651cf50fba44dac10b82787d805d3996e031dde6cc6190600090a380600660016101000a8154816001600160a01b0302191690836001600160a01b031602179055506000600660019054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156112e757600080fd5b505afa1580156112fb573d6000803e3d6000fd5b505050506040513d602081101561131157600080fd5b5051600654604080516315ab88c960e31b815290516001600160a01b039384169363e6a439059330936101009091049091169163ad5c464891600480820192602092909190829003018186803b15801561136a57600080fd5b505afa15801561137e573d6000803e3d6000fd5b505050506040513d602081101561139457600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b039384166004820152929091166024830152516044808301926020929190829003018186803b1580156113e457600080fd5b505afa1580156113f8573d6000803e3d6000fd5b505050506040513d602081101561140e57600080fd5b505190506001600160a01b03811661159c57600660019054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801561146e57600080fd5b505afa158015611482573d6000803e3d6000fd5b505050506040513d602081101561149857600080fd5b5051600654604080516315ab88c960e31b815290516001600160a01b039384169363c9c653969330936101009091049091169163ad5c464891600480820192602092909190829003018186803b1580156114f157600080fd5b505afa158015611505573d6000803e3d6000fd5b505050506040513d602081101561151b57600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301525160448083019260209291908290030181600087803b15801561156d57600080fd5b505af1158015611581573d6000803e3d6000fd5b505050506040513d602081101561159757600080fd5b505190505b6007546115b3906001600160a01b03166000612a9d565b600780546001600160a01b0319166001600160a01b0383811691909117918290556115e091166001612a9d565b5050565b60065461010090046001600160a01b031681565b6116006124c8565b6000546001600160a01b03908116911614611650576040805162461bcd60e51b815260206004820181905260248201526000805160206136c3833981519152604482015290519081900360640190fd5b601e8190556040805182815290517faa3699eefc959af0349072633ce13d21ce9c6fe475e5818b99da990ee39645a19181900360200190a150565b6116936124c8565b6000546001600160a01b039081169116146116e3576040805162461bcd60e51b815260206004820181905260248201526000805160206136c3833981519152604482015290519081900360640190fd5b600a82111580156116f55750600a8111155b61173b576040805162461bcd60e51b8152602060048201526012602482015271496e76616c6964207265776172647346656560701b604482015290519081900360640190fd5b600f8290556010819055601854601454600d546117609291610df39182908790612467565b601181905550611789601854610df3601554610df360125460105461246790919063ffffffff16565b601655604080518381526020810183905281517fedf08c12b059669fcdbffabbc3c123b9eb39dd2d8ed9afc63a3b300b6584d203929181900390910190a15050565b6117d36124c8565b6000546001600160a01b03908116911614611823576040805162461bcd60e51b815260206004820181905260248201526000805160206136c3833981519152604482015290519081900360640190fd5b601d805482151560ff19909116811790915560408051918252517f701507a13d5701687328d70ea5a717a33a062f46c229a785b315fb4517fef0699181900360200190a150565b6001600160a01b031660009081526001602052604090205490565b61188d6124c8565b6000546001600160a01b039081169116146118dd576040805162461bcd60e51b815260206004820181905260248201526000805160206136c3833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60115481565b60175481565b60145481565b602080526000908152604090205460ff1681565b6000611957611968565b905090565b60185481565b601e5481565b6000546001600160a01b031690565b60125481565b60058054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610ef05780601f10610ec557610100808354040283529160200191610ef0565b60135481565b6119ec6124c8565b6000546001600160a01b03908116911614611a3c576040805162461bcd60e51b815260206004820181905260248201526000805160206136c3833981519152604482015290519081900360640190fd5b6115e08282612a9d565b600c5481565b611a546124c8565b6000546001600160a01b03908116911614611aa4576040805162461bcd60e51b815260206004820181905260248201526000805160206136c3833981519152604482015290519081900360640190fd5b600c8190556040805182815290517f7c57306552f9ca1d69c9c779932ef43e8bc6f04d7718d9e1fbf6a877013ececd9181900360200190a150565b6000610f14611aec6124c8565b846110a8856040518060600160405280602581526020016137586025913960026000611b166124c8565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190612916565b611b4f6124c8565b6000546001600160a01b03908116911614611b9f576040805162461bcd60e51b815260206004820181905260248201526000805160206136c3833981519152604482015290519081900360640190fd5b6001600160a01b038216600090815260208052604090205460ff1615158115151415611bfc5760405162461bcd60e51b815260040180806020018281038252602a81526020018061364e602a913960400191505060405180910390fd5b6001600160a01b03821660008181526020808052604091829020805460ff1916851515908117909155825190815291517fd3d1fab5db42ae85293059c69e12bf01ffffb1dd5ff4caa5e5568f99fc387f249281900390910190a25050565b6000610f14611c676124c8565b84846125b8565b600e5481565b601a5481565b60216020526000908152604090205460ff1681565b60105481565b611c9d6124c8565b6000546001600160a01b03908116911614611ced576040805162461bcd60e51b815260206004820181905260248201526000805160206136c3833981519152604482015290519081900360640190fd5b6001600160a01b0382166000818152601f6020908152604091829020805460ff1916851515908117909155825190815291517f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df79281900390910190a25050565b611d556124c8565b6000546001600160a01b03908116911614611da5576040805162461bcd60e51b815260206004820181905260248201526000805160206136c3833981519152604482015290519081900360640190fd5b6009546001600160a01b0382811691161415611df25760405162461bcd60e51b815260040180806020018281038252602f8152602001806137c0602f913960400191505060405180910390fd5b611dfd816001611c95565b600954611e14906001600160a01b03166000611c95565b6009546040516001600160a01b03918216918316907fbff926882094c380d5379f3e72d6d8391654afd5bc68e2a3c4a12f38ad379ac390600090a3600980546001600160a01b0319166001600160a01b0392909216919091179055565b611e796124c8565b6000546001600160a01b03908116911614611ec9576040805162461bcd60e51b815260206004820181905260248201526000805160206136c3833981519152604482015290519081900360640190fd5b60005b82811015611f1e5781601f6000868685818110611ee557fe5b602090810292909201356001600160a01b0316835250810191909152604001600020805460ff1916911515919091179055600101611ecc565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b35838383604051808060200183151581526020018281038252858582818152602001925060200280828437600083820152604051601f909101601f1916909201829003965090945050505050a1505050565b611f996124c8565b6000546001600160a01b03908116911614611fe9576040805162461bcd60e51b815260206004820181905260248201526000805160206136c3833981519152604482015290519081900360640190fd5b6019839055601a829055601b81905561200681610df38585612467565b601c55604080518481526020810184905280820183905290517fcc891d40504d5b798e9edf203f13fad7a7e3db2585689577e22c7529a474fc099181900360600190a1505050565b6120566124c8565b6000546001600160a01b039081169116146120a6576040805162461bcd60e51b815260206004820181905260248201526000805160206136c3833981519152604482015290519081900360640190fd5b600a546001600160a01b03828116911614156120f35760405162461bcd60e51b815260040180806020018281038252602a815260200180613678602a913960400191505060405180910390fd5b6120fe816001611c95565b600a54612115906001600160a01b03166000611c95565b600a80546001600160a01b0319166001600160a01b03838116918217928390556040519216917f85710b1053f40e0d492d81001a623cd191d251fed32881e7bb80fc1b66a6e46390600090a350565b6008546001600160a01b031681565b6007546001600160a01b031681565b61218a6124c8565b6000546001600160a01b039081169116146121da576040805162461bcd60e51b815260206004820181905260248201526000805160206136c3833981519152604482015290519081900360640190fd5b600a82111580156121ec5750600a8111155b612235576040805162461bcd60e51b8152602060048201526015602482015274496e76616c6964204c69717569646974792046656560581b604482015290519081900360640190fd5b60148290556015819055601854600f54600d5461225a9291610df39182908790612467565b601181905550612283601854610df3601054610df360125460155461246790919063ffffffff16565b601655604080518381526020810183905281517fdcabb673b8004b29667370cf7e48059178985da4fa97105c1532cdfb5bbc5c0d929181900390910190a15050565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b6122f86124c8565b6000546001600160a01b03908116911614612348576040805162461bcd60e51b815260206004820181905260248201526000805160206136c3833981519152604482015290519081900360640190fd5b6008546001600160a01b03828116911614156123955760405162461bcd60e51b815260040180806020018281038252602c8152602001806136e3602c913960400191505060405180910390fd5b6123a0816001611c95565b6008546040516001600160a01b03918216918316907f6080503d1da552ae8eb4b7b8a20245d9fabed014180510e7d1a05ea08fdb0f3e90600090a3600880546001600160a01b0319166001600160a01b0392909216919091179055565b600f5481565b61240b6124c8565b6000546001600160a01b0390811691161461245b576040805162461bcd60e51b815260206004820181905260248201526000805160206136c3833981519152604482015290519081900360640190fd5b61246481612b4f565b50565b6000828201838110156124c1576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b3390565b6001600160a01b0383166125115760405162461bcd60e51b81526004018080602001828103825260248152602001806135816024913960400191505060405180910390fd5b6001600160a01b0382166125565760405162461bcd60e51b81526004018080602001828103825260228152602001806137ef6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260026020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b0383166125fd5760405162461bcd60e51b815260040180806020018281038252602581526020018061355c6025913960400191505060405180910390fd5b6001600160a01b0382166126425760405162461bcd60e51b81526004018080602001828103825260238152602001806137356023913960400191505060405180910390fd5b601e54811115612692576040805162461bcd60e51b81526020600482015260166024820152756d61782d74782d616d6f756e742d6f766572666c6f7760501b604482015290519081900360640190fd5b806126a8576126a383836000612bef565b612911565b601d5460ff16156127455760006126be3061186a565b905060006126ca612d41565b905080821080159081906126e85750600754600160a01b900460ff16155b801561270d57506001600160a01b03861660009081526021602052604090205460ff16155b15612741576007805460ff60a01b1916600160a01b179055909150819061273382612faf565b6007805460ff60a01b191690555b5050505b6001600160a01b0383166000908152601f602052604090205460019060ff168061278757506001600160a01b0383166000908152601f602052604090205460ff165b15612790575060005b8015612904576001600160a01b038416600090815260208052604090205460ff16806127d357506001600160a01b038316600090815260208052604090205460ff165b15612904576001600160a01b0384166000908152602080526040812054819060ff161561287c5761281a6064612814601154876130c690919063ffffffff16565b9061311f565b91506128366064612814600e54876130c690919063ffffffff16565b9050612843863084612bef565b61284d86826129ad565b61287461286b601154612814601854866130c690919063ffffffff16565b60175490612467565b6017556128eb565b6128966064612814601654876130c690919063ffffffff16565b91506128b26064612814601354876130c690919063ffffffff16565b90506128bf863084612bef565b6128c986826129ad565b6128e761286b601654612814601854866130c690919063ffffffff16565b6017555b6128ff816128f98685613161565b90613161565b935050505b61290f848484612bef565b505b505050565b600081848411156129a55760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561296a578181015183820152602001612952565b50505050905090810190601f1680156129975780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6001600160a01b0382166129f25760405162461bcd60e51b815260040180806020018281038252602181526020018061377d6021913960400191505060405180910390fd5b612a2f8160405180606001604052806022815260200161379e602291396001600160a01b0385166000908152600160205260409020549190612916565b6001600160a01b038316600090815260016020526040902055600354612a559082613161565b6003556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6001600160a01b03821660009081526021602052604090205460ff1615158115151415612afb5760405162461bcd60e51b81526004018080602001828103825260388152602001806135cb6038913960400191505060405180910390fd5b6001600160a01b038216600081815260216020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6001600160a01b038116612b945760405162461bcd60e51b81526004018080602001828103825260268152602001806135a56026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038316612c345760405162461bcd60e51b815260040180806020018281038252602581526020018061355c6025913960400191505060405180910390fd5b6001600160a01b038216612c795760405162461bcd60e51b81526004018080602001828103825260238152602001806137356023913960400191505060405180910390fd5b612cb68160405180606001604052806026815260200161370f602691396001600160a01b0386166000908152600160205260409020549190612916565b6001600160a01b038085166000908152600160205260408082209390935590841681522054612ce59082612467565b6001600160a01b0380841660008181526001602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b604080516002808252606080830184526000938493919290602083019080368337019050509050600660019054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015612db657600080fd5b505afa158015612dca573d6000803e3d6000fd5b505050506040513d6020811015612de057600080fd5b505181518290600090612def57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110612e1d57fe5b6001600160a01b03928316602091820292909201810191909152600654600c546040805163d06ca61f60e01b815260048101838152602482019283528751604483015287516060976101009096049095169563d06ca61f958994929360640191858101910280838360005b83811015612ea0578181015183820152602001612e88565b50505050905001935050505060006040518083038186803b158015612ec457600080fd5b505afa158015612ed8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015612f0157600080fd5b8101908080516040519392919084640100000000821115612f2157600080fd5b908301906020820185811115612f3657600080fd5b8251866020820283011164010000000082111715612f5357600080fd5b82525081516020918201928201910280838360005b83811015612f80578181015183820152602001612f68565b50505050905001604052505050905080600181518110612f9c57fe5b6020026020010151925082935050505090565b6000612fcb612fbd3061186a565b6017546128149085906130c6565b90506000612fea601c54612814601954866130c690919063ffffffff16565b90506000612ff88483613161565b9050613003816131a3565b4760006130148361281484886130c6565b90506130208282613161565b6017549092506130309086613161565b601755601c5460195460009161304b916128149086906130c6565b9050600061306a601c54612814601b54876130c690919063ffffffff16565b9050600061307c826128f98786613161565b9050831561308d5761308d84613387565b861561309d5761309d87846133c1565b81156130ac576130ac82613482565b80156130bb576130bb816134bc565b505050505050505050565b6000826130d557506000610f18565b828202828482816130e257fe5b04146124c15760405162461bcd60e51b81526004018080602001828103825260218152602001806136a26021913960400191505060405180910390fd5b60006124c183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506134f6565b60006124c183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612916565b604080516002808252606080830184529260208301908036833701905050905030816000815181106131d157fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600660019054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561323f57600080fd5b505afa158015613253573d6000803e3d6000fd5b505050506040513d602081101561326957600080fd5b505181518290600190811061327a57fe5b6001600160a01b0392831660209182029290920101526006546132a5913091610100900416846124cc565b600660019054906101000a90046001600160a01b03166001600160a01b031663791ac9478360008430426078016040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b8381101561334257818101518382015260200161332a565b505050509050019650505050505050600060405180830381600087803b15801561336b57600080fd5b505af115801561337f573d6000803e3d6000fd5b505050505050565b600b546040516001600160a01b039091169082156108fc029083906000818181858888f193505050501580156115e0573d6000803e3d6000fd5b6006546133de90309061010090046001600160a01b0316846124cc565b6006546008546040805163f305d71960e01b81523060048201526024810186905260006044820181905260648201526001600160a01b0392831660848201524260a482015290516101009093049091169163f305d71991849160c480830192606092919082900301818588803b15801561345757600080fd5b505af115801561346b573d6000803e3d6000fd5b50505050506040513d606081101561290f57600080fd5b600a546040516001600160a01b039091169082156108fc029083906000818181858888f193505050501580156115e0573d6000803e3d6000fd5b6009546040516001600160a01b039091169082156108fc029083906000818181858888f193505050501580156115e0573d6000803e3d6000fd5b600081836135455760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561296a578181015183820152602001612952565b50600083858161355157fe5b049594505050505056fe42455032303a207472616e736665722066726f6d20746865207a65726f206164647265737342455032303a20617070726f76652066726f6d20746865207a65726f20616464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734175746f6d61746564206d61726b6574206d616b6572207061697220697320616c72656164792073657420746f20746861742076616c756554686520726f7574657220616c7265616479206861732074686174206164647265737342455032303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654163636f756e7420697320616c7265616479207468652076616c7565206f66202769734765744665652754686520726577617264732077616c6c657420697320616c726561647920746869732061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572546865206c69717569646974792057616c6c657420697320616c72656164792074686973206164647265737342455032303a207472616e7366657220616d6f756e7420657863656564732062616c616e636542455032303a207472616e7366657220746f20746865207a65726f206164647265737342455032303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f42455032303a206275726e2066726f6d20746865207a65726f206164647265737342455032303a206275726e20616d6f756e7420657863656564732062616c616e6365546865206465766d61726b6574696e672077616c6c657420697320616c72656164792074686973206164647265737342455032303a20617070726f766520746f20746865207a65726f2061646472657373a26469706673582212203aef074ef74fe107f809b6a13a658c24b021c9437dd6209794740cf43ede345864736f6c634300060c00334175746f6d61746564206d61726b6574206d616b6572207061697220697320616c72656164792073657420746f20746861742076616c7565

Deployed Bytecode

0x60806040526004361061039b5760003560e01c80638768a9cd116101dc578063b24db8f811610102578063cfc0d024116100a0578063dd62ed3e1161006f578063dd62ed3e14610c5d578063e37ba8f914610c98578063e4893fdc14610ccb578063f2fde38b14610ce0576103a2565b8063cfc0d02414610bd0578063d469801614610c03578063d837df0514610c18578063da21bcbc14610c2d576103a2565b8063c0246668116100dc578063c024666814610aad578063c13b3def14610ae8578063c492f04614610b1b578063cb61b42d14610b9a576103a2565b8063b24db8f814610a50578063b62496f514610a65578063b94315ff14610a98576103a2565b8063989a124f1161017a578063a457c2d711610149578063a457c2d71461098e578063a4de3c19146109c7578063a9059cbb14610a02578063a938d1c914610a3b576103a2565b8063989a124f146108ff5780639a7a23d6146109145780639c4afbbd1461094f578063a254b41e14610964576103a2565b80638c0b5e22116101b65780638c0b5e22146108ab5780638da5cb5b146108c05780639372881b146108d557806395d89b41146108ea576103a2565b80638768a9cd1461084e578063893d20e8146108815780638abdf5aa14610896576103a2565b806342659d97116102c15780636256d1811161025f578063715018a61161022e578063715018a6146107fa578063766ea4151461080f57806377a6b369146108245780637b3c83b114610839576103a2565b80636256d181146107415780636836f9591461076b57806368b4cac91461079b57806370a08231146107c7576103a2565b80635641f3c31161029b5780635641f3c3146106cf5780635b35f9c9146106e45780635c4907c9146106f95780635d01ff3d1461072c576103a2565b806342659d971461065d57806342966c68146106725780634fbee1931461069c576103a2565b806318160ddd11610339578063337270771161030857806333727077146105e557806339509351146105fa5780633a98ef3914610633578063423ce9cc14610648576103a2565b806318160ddd1461054d57806323b872dd146105625780632ce86fbf146105a5578063313ce567146105ba576103a2565b8063095ea7b311610375578063095ea7b31461048a5780630b504da3146104d75780630d9dd4dc1461050757806315291cd414610538576103a2565b80630664fd92146103a757806306fdde03146103d9578063087ed97214610463576103a2565b366103a257005b600080fd5b3480156103b357600080fd5b506103d7600480360360408110156103ca57600080fd5b5080359060200135610d13565b005b3480156103e557600080fd5b506103ee610e64565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610428578181015183820152602001610410565b50505050905090810190601f1680156104555780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561046f57600080fd5b50610478610efa565b60408051918252519081900360200190f35b34801561049657600080fd5b506104c3600480360360408110156104ad57600080fd5b506001600160a01b038135169060200135610f00565b604080519115158252519081900360200190f35b3480156104e357600080fd5b506103d7600480360360408110156104fa57600080fd5b5080359060200135610f1e565b34801561051357600080fd5b5061051c611015565b604080516001600160a01b039092168252519081900360200190f35b34801561054457600080fd5b50610478611024565b34801561055957600080fd5b5061047861102a565b34801561056e57600080fd5b506104c36004803603606081101561058557600080fd5b506001600160a01b03813581169160208101359091169060400135611030565b3480156105b157600080fd5b506104786110b7565b3480156105c657600080fd5b506105cf6110bd565b6040805160ff9092168252519081900360200190f35b3480156105f157600080fd5b506104786110c6565b34801561060657600080fd5b506104c36004803603604081101561061d57600080fd5b506001600160a01b0381351690602001356110cc565b34801561063f57600080fd5b5061047861111a565b34801561065457600080fd5b506104c3611120565b34801561066957600080fd5b50610478611129565b34801561067e57600080fd5b506104c36004803603602081101561069557600080fd5b503561112f565b3480156106a857600080fd5b506104c3600480360360208110156106bf57600080fd5b50356001600160a01b031661114a565b3480156106db57600080fd5b5061051c611168565b3480156106f057600080fd5b5061051c611177565b34801561070557600080fd5b506103d76004803603602081101561071c57600080fd5b50356001600160a01b0316611186565b34801561073857600080fd5b5061051c6115e4565b34801561074d57600080fd5b506103d76004803603602081101561076457600080fd5b50356115f8565b34801561077757600080fd5b506103d76004803603604081101561078e57600080fd5b508035906020013561168b565b3480156107a757600080fd5b506103d7600480360360208110156107be57600080fd5b503515156117cb565b3480156107d357600080fd5b50610478600480360360208110156107ea57600080fd5b50356001600160a01b031661186a565b34801561080657600080fd5b506103d7611885565b34801561081b57600080fd5b50610478611927565b34801561083057600080fd5b5061047861192d565b34801561084557600080fd5b50610478611933565b34801561085a57600080fd5b506104c36004803603602081101561087157600080fd5b50356001600160a01b0316611939565b34801561088d57600080fd5b5061051c61194d565b3480156108a257600080fd5b5061047861195c565b3480156108b757600080fd5b50610478611962565b3480156108cc57600080fd5b5061051c611968565b3480156108e157600080fd5b50610478611977565b3480156108f657600080fd5b506103ee61197d565b34801561090b57600080fd5b506104786119de565b34801561092057600080fd5b506103d76004803603604081101561093757600080fd5b506001600160a01b03813516906020013515156119e4565b34801561095b57600080fd5b50610478611a46565b34801561097057600080fd5b506103d76004803603602081101561098757600080fd5b5035611a4c565b34801561099a57600080fd5b506104c3600480360360408110156109b157600080fd5b506001600160a01b038135169060200135611adf565b3480156109d357600080fd5b506103d7600480360360408110156109ea57600080fd5b506001600160a01b0381351690602001351515611b47565b348015610a0e57600080fd5b506104c360048036036040811015610a2557600080fd5b506001600160a01b038135169060200135611c5a565b348015610a4757600080fd5b50610478611c6e565b348015610a5c57600080fd5b50610478611c74565b348015610a7157600080fd5b506104c360048036036020811015610a8857600080fd5b50356001600160a01b0316611c7a565b348015610aa457600080fd5b50610478611c8f565b348015610ab957600080fd5b506103d760048036036040811015610ad057600080fd5b506001600160a01b0381351690602001351515611c95565b348015610af457600080fd5b506103d760048036036020811015610b0b57600080fd5b50356001600160a01b0316611d4d565b348015610b2757600080fd5b506103d760048036036040811015610b3e57600080fd5b810190602081018135640100000000811115610b5957600080fd5b820183602082011115610b6b57600080fd5b80359060200191846020830284011164010000000083111715610b8d57600080fd5b9193509150351515611e71565b348015610ba657600080fd5b506103d760048036036060811015610bbd57600080fd5b5080359060208101359060400135611f91565b348015610bdc57600080fd5b506103d760048036036020811015610bf357600080fd5b50356001600160a01b031661204e565b348015610c0f57600080fd5b5061051c612164565b348015610c2457600080fd5b5061051c612173565b348015610c3957600080fd5b506103d760048036036040811015610c5057600080fd5b5080359060200135612182565b348015610c6957600080fd5b5061047860048036036040811015610c8057600080fd5b506001600160a01b03813581169160200135166122c5565b348015610ca457600080fd5b506103d760048036036020811015610cbb57600080fd5b50356001600160a01b03166122f0565b348015610cd757600080fd5b506104786123fd565b348015610cec57600080fd5b506103d760048036036020811015610d0357600080fd5b50356001600160a01b0316612403565b610d1b6124c8565b6000546001600160a01b03908116911614610d6b576040805162461bcd60e51b815260206004820181905260248201526000805160206136c3833981519152604482015290519081900360640190fd5b600a8211158015610d7d5750600a8111155b610dce576040805162461bcd60e51b815260206004820152601760248201527f496e76616c6964206465766d61726b6574696e67466565000000000000000000604482015290519081900360640190fd5b600d8290556012819055601854600f54601454610df99291610df39182908790612467565b90612467565b601181905550610e22601854610df3601054610df360155460125461246790919063ffffffff16565b601655604080518381526020810183905281517fcd545670799e0a627eebb91afce3bbbb9a91b706c87df4806f881feedd6a251d929181900390910190a15050565b60048054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610ef05780601f10610ec557610100808354040283529160200191610ef0565b820191906000526020600020905b815481529060010190602001808311610ed357829003601f168201915b5050505050905090565b60165481565b6000610f14610f0d6124c8565b84846124cc565b5060015b92915050565b610f266124c8565b6000546001600160a01b03908116911614610f76576040805162461bcd60e51b815260206004820181905260248201526000805160206136c3833981519152604482015290519081900360640190fd5b600a8211158015610f885750600a8111155b610fcc576040805162461bcd60e51b815260206004820152601060248201526f496e76616c6964204275726e2046656560801b604482015290519081900360640190fd5b600e8290556013819055604080518381526020810183905281517f845a2030e65ce67ab0b9dce718144ca03b9ad4b8f2a4de64c8bb15b60f73841b929181900390910190a15050565b6009546001600160a01b031681565b60195481565b60035490565b600061103d8484846125b8565b6110ad846110496124c8565b6110a885604051806060016040528060288152602001613626602891396001600160a01b038a166000908152600260205260408120906110876124c8565b6001600160a01b031681526020810191909152604001600020549190612916565b6124cc565b5060019392505050565b60155481565b60065460ff1690565b601b5481565b6000610f146110d96124c8565b846110a885600260006110ea6124c8565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490612467565b601c5481565b601d5460ff1681565b600d5481565b600061114261113c6124c8565b836129ad565b506001919050565b6001600160a01b03166000908152601f602052604090205460ff1690565b600b546001600160a01b031681565b600a546001600160a01b031681565b61118e6124c8565b6000546001600160a01b039081169116146111de576040805162461bcd60e51b815260206004820181905260248201526000805160206136c3833981519152604482015290519081900360640190fd5b6006546001600160a01b038281166101009092041614156112305760405162461bcd60e51b81526004018080602001828103825260238152602001806136036023913960400191505060405180910390fd5b6006546040516001600160a01b036101009092048216918316907fc6d84343deeef130694d651cf50fba44dac10b82787d805d3996e031dde6cc6190600090a380600660016101000a8154816001600160a01b0302191690836001600160a01b031602179055506000600660019054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156112e757600080fd5b505afa1580156112fb573d6000803e3d6000fd5b505050506040513d602081101561131157600080fd5b5051600654604080516315ab88c960e31b815290516001600160a01b039384169363e6a439059330936101009091049091169163ad5c464891600480820192602092909190829003018186803b15801561136a57600080fd5b505afa15801561137e573d6000803e3d6000fd5b505050506040513d602081101561139457600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b039384166004820152929091166024830152516044808301926020929190829003018186803b1580156113e457600080fd5b505afa1580156113f8573d6000803e3d6000fd5b505050506040513d602081101561140e57600080fd5b505190506001600160a01b03811661159c57600660019054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801561146e57600080fd5b505afa158015611482573d6000803e3d6000fd5b505050506040513d602081101561149857600080fd5b5051600654604080516315ab88c960e31b815290516001600160a01b039384169363c9c653969330936101009091049091169163ad5c464891600480820192602092909190829003018186803b1580156114f157600080fd5b505afa158015611505573d6000803e3d6000fd5b505050506040513d602081101561151b57600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301525160448083019260209291908290030181600087803b15801561156d57600080fd5b505af1158015611581573d6000803e3d6000fd5b505050506040513d602081101561159757600080fd5b505190505b6007546115b3906001600160a01b03166000612a9d565b600780546001600160a01b0319166001600160a01b0383811691909117918290556115e091166001612a9d565b5050565b60065461010090046001600160a01b031681565b6116006124c8565b6000546001600160a01b03908116911614611650576040805162461bcd60e51b815260206004820181905260248201526000805160206136c3833981519152604482015290519081900360640190fd5b601e8190556040805182815290517faa3699eefc959af0349072633ce13d21ce9c6fe475e5818b99da990ee39645a19181900360200190a150565b6116936124c8565b6000546001600160a01b039081169116146116e3576040805162461bcd60e51b815260206004820181905260248201526000805160206136c3833981519152604482015290519081900360640190fd5b600a82111580156116f55750600a8111155b61173b576040805162461bcd60e51b8152602060048201526012602482015271496e76616c6964207265776172647346656560701b604482015290519081900360640190fd5b600f8290556010819055601854601454600d546117609291610df39182908790612467565b601181905550611789601854610df3601554610df360125460105461246790919063ffffffff16565b601655604080518381526020810183905281517fedf08c12b059669fcdbffabbc3c123b9eb39dd2d8ed9afc63a3b300b6584d203929181900390910190a15050565b6117d36124c8565b6000546001600160a01b03908116911614611823576040805162461bcd60e51b815260206004820181905260248201526000805160206136c3833981519152604482015290519081900360640190fd5b601d805482151560ff19909116811790915560408051918252517f701507a13d5701687328d70ea5a717a33a062f46c229a785b315fb4517fef0699181900360200190a150565b6001600160a01b031660009081526001602052604090205490565b61188d6124c8565b6000546001600160a01b039081169116146118dd576040805162461bcd60e51b815260206004820181905260248201526000805160206136c3833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60115481565b60175481565b60145481565b602080526000908152604090205460ff1681565b6000611957611968565b905090565b60185481565b601e5481565b6000546001600160a01b031690565b60125481565b60058054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610ef05780601f10610ec557610100808354040283529160200191610ef0565b60135481565b6119ec6124c8565b6000546001600160a01b03908116911614611a3c576040805162461bcd60e51b815260206004820181905260248201526000805160206136c3833981519152604482015290519081900360640190fd5b6115e08282612a9d565b600c5481565b611a546124c8565b6000546001600160a01b03908116911614611aa4576040805162461bcd60e51b815260206004820181905260248201526000805160206136c3833981519152604482015290519081900360640190fd5b600c8190556040805182815290517f7c57306552f9ca1d69c9c779932ef43e8bc6f04d7718d9e1fbf6a877013ececd9181900360200190a150565b6000610f14611aec6124c8565b846110a8856040518060600160405280602581526020016137586025913960026000611b166124c8565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190612916565b611b4f6124c8565b6000546001600160a01b03908116911614611b9f576040805162461bcd60e51b815260206004820181905260248201526000805160206136c3833981519152604482015290519081900360640190fd5b6001600160a01b038216600090815260208052604090205460ff1615158115151415611bfc5760405162461bcd60e51b815260040180806020018281038252602a81526020018061364e602a913960400191505060405180910390fd5b6001600160a01b03821660008181526020808052604091829020805460ff1916851515908117909155825190815291517fd3d1fab5db42ae85293059c69e12bf01ffffb1dd5ff4caa5e5568f99fc387f249281900390910190a25050565b6000610f14611c676124c8565b84846125b8565b600e5481565b601a5481565b60216020526000908152604090205460ff1681565b60105481565b611c9d6124c8565b6000546001600160a01b03908116911614611ced576040805162461bcd60e51b815260206004820181905260248201526000805160206136c3833981519152604482015290519081900360640190fd5b6001600160a01b0382166000818152601f6020908152604091829020805460ff1916851515908117909155825190815291517f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df79281900390910190a25050565b611d556124c8565b6000546001600160a01b03908116911614611da5576040805162461bcd60e51b815260206004820181905260248201526000805160206136c3833981519152604482015290519081900360640190fd5b6009546001600160a01b0382811691161415611df25760405162461bcd60e51b815260040180806020018281038252602f8152602001806137c0602f913960400191505060405180910390fd5b611dfd816001611c95565b600954611e14906001600160a01b03166000611c95565b6009546040516001600160a01b03918216918316907fbff926882094c380d5379f3e72d6d8391654afd5bc68e2a3c4a12f38ad379ac390600090a3600980546001600160a01b0319166001600160a01b0392909216919091179055565b611e796124c8565b6000546001600160a01b03908116911614611ec9576040805162461bcd60e51b815260206004820181905260248201526000805160206136c3833981519152604482015290519081900360640190fd5b60005b82811015611f1e5781601f6000868685818110611ee557fe5b602090810292909201356001600160a01b0316835250810191909152604001600020805460ff1916911515919091179055600101611ecc565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b35838383604051808060200183151581526020018281038252858582818152602001925060200280828437600083820152604051601f909101601f1916909201829003965090945050505050a1505050565b611f996124c8565b6000546001600160a01b03908116911614611fe9576040805162461bcd60e51b815260206004820181905260248201526000805160206136c3833981519152604482015290519081900360640190fd5b6019839055601a829055601b81905561200681610df38585612467565b601c55604080518481526020810184905280820183905290517fcc891d40504d5b798e9edf203f13fad7a7e3db2585689577e22c7529a474fc099181900360600190a1505050565b6120566124c8565b6000546001600160a01b039081169116146120a6576040805162461bcd60e51b815260206004820181905260248201526000805160206136c3833981519152604482015290519081900360640190fd5b600a546001600160a01b03828116911614156120f35760405162461bcd60e51b815260040180806020018281038252602a815260200180613678602a913960400191505060405180910390fd5b6120fe816001611c95565b600a54612115906001600160a01b03166000611c95565b600a80546001600160a01b0319166001600160a01b03838116918217928390556040519216917f85710b1053f40e0d492d81001a623cd191d251fed32881e7bb80fc1b66a6e46390600090a350565b6008546001600160a01b031681565b6007546001600160a01b031681565b61218a6124c8565b6000546001600160a01b039081169116146121da576040805162461bcd60e51b815260206004820181905260248201526000805160206136c3833981519152604482015290519081900360640190fd5b600a82111580156121ec5750600a8111155b612235576040805162461bcd60e51b8152602060048201526015602482015274496e76616c6964204c69717569646974792046656560581b604482015290519081900360640190fd5b60148290556015819055601854600f54600d5461225a9291610df39182908790612467565b601181905550612283601854610df3601054610df360125460155461246790919063ffffffff16565b601655604080518381526020810183905281517fdcabb673b8004b29667370cf7e48059178985da4fa97105c1532cdfb5bbc5c0d929181900390910190a15050565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b6122f86124c8565b6000546001600160a01b03908116911614612348576040805162461bcd60e51b815260206004820181905260248201526000805160206136c3833981519152604482015290519081900360640190fd5b6008546001600160a01b03828116911614156123955760405162461bcd60e51b815260040180806020018281038252602c8152602001806136e3602c913960400191505060405180910390fd5b6123a0816001611c95565b6008546040516001600160a01b03918216918316907f6080503d1da552ae8eb4b7b8a20245d9fabed014180510e7d1a05ea08fdb0f3e90600090a3600880546001600160a01b0319166001600160a01b0392909216919091179055565b600f5481565b61240b6124c8565b6000546001600160a01b0390811691161461245b576040805162461bcd60e51b815260206004820181905260248201526000805160206136c3833981519152604482015290519081900360640190fd5b61246481612b4f565b50565b6000828201838110156124c1576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b3390565b6001600160a01b0383166125115760405162461bcd60e51b81526004018080602001828103825260248152602001806135816024913960400191505060405180910390fd5b6001600160a01b0382166125565760405162461bcd60e51b81526004018080602001828103825260228152602001806137ef6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260026020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b0383166125fd5760405162461bcd60e51b815260040180806020018281038252602581526020018061355c6025913960400191505060405180910390fd5b6001600160a01b0382166126425760405162461bcd60e51b81526004018080602001828103825260238152602001806137356023913960400191505060405180910390fd5b601e54811115612692576040805162461bcd60e51b81526020600482015260166024820152756d61782d74782d616d6f756e742d6f766572666c6f7760501b604482015290519081900360640190fd5b806126a8576126a383836000612bef565b612911565b601d5460ff16156127455760006126be3061186a565b905060006126ca612d41565b905080821080159081906126e85750600754600160a01b900460ff16155b801561270d57506001600160a01b03861660009081526021602052604090205460ff16155b15612741576007805460ff60a01b1916600160a01b179055909150819061273382612faf565b6007805460ff60a01b191690555b5050505b6001600160a01b0383166000908152601f602052604090205460019060ff168061278757506001600160a01b0383166000908152601f602052604090205460ff165b15612790575060005b8015612904576001600160a01b038416600090815260208052604090205460ff16806127d357506001600160a01b038316600090815260208052604090205460ff165b15612904576001600160a01b0384166000908152602080526040812054819060ff161561287c5761281a6064612814601154876130c690919063ffffffff16565b9061311f565b91506128366064612814600e54876130c690919063ffffffff16565b9050612843863084612bef565b61284d86826129ad565b61287461286b601154612814601854866130c690919063ffffffff16565b60175490612467565b6017556128eb565b6128966064612814601654876130c690919063ffffffff16565b91506128b26064612814601354876130c690919063ffffffff16565b90506128bf863084612bef565b6128c986826129ad565b6128e761286b601654612814601854866130c690919063ffffffff16565b6017555b6128ff816128f98685613161565b90613161565b935050505b61290f848484612bef565b505b505050565b600081848411156129a55760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561296a578181015183820152602001612952565b50505050905090810190601f1680156129975780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6001600160a01b0382166129f25760405162461bcd60e51b815260040180806020018281038252602181526020018061377d6021913960400191505060405180910390fd5b612a2f8160405180606001604052806022815260200161379e602291396001600160a01b0385166000908152600160205260409020549190612916565b6001600160a01b038316600090815260016020526040902055600354612a559082613161565b6003556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6001600160a01b03821660009081526021602052604090205460ff1615158115151415612afb5760405162461bcd60e51b81526004018080602001828103825260388152602001806135cb6038913960400191505060405180910390fd5b6001600160a01b038216600081815260216020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6001600160a01b038116612b945760405162461bcd60e51b81526004018080602001828103825260268152602001806135a56026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038316612c345760405162461bcd60e51b815260040180806020018281038252602581526020018061355c6025913960400191505060405180910390fd5b6001600160a01b038216612c795760405162461bcd60e51b81526004018080602001828103825260238152602001806137356023913960400191505060405180910390fd5b612cb68160405180606001604052806026815260200161370f602691396001600160a01b0386166000908152600160205260409020549190612916565b6001600160a01b038085166000908152600160205260408082209390935590841681522054612ce59082612467565b6001600160a01b0380841660008181526001602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b604080516002808252606080830184526000938493919290602083019080368337019050509050600660019054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015612db657600080fd5b505afa158015612dca573d6000803e3d6000fd5b505050506040513d6020811015612de057600080fd5b505181518290600090612def57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110612e1d57fe5b6001600160a01b03928316602091820292909201810191909152600654600c546040805163d06ca61f60e01b815260048101838152602482019283528751604483015287516060976101009096049095169563d06ca61f958994929360640191858101910280838360005b83811015612ea0578181015183820152602001612e88565b50505050905001935050505060006040518083038186803b158015612ec457600080fd5b505afa158015612ed8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015612f0157600080fd5b8101908080516040519392919084640100000000821115612f2157600080fd5b908301906020820185811115612f3657600080fd5b8251866020820283011164010000000082111715612f5357600080fd5b82525081516020918201928201910280838360005b83811015612f80578181015183820152602001612f68565b50505050905001604052505050905080600181518110612f9c57fe5b6020026020010151925082935050505090565b6000612fcb612fbd3061186a565b6017546128149085906130c6565b90506000612fea601c54612814601954866130c690919063ffffffff16565b90506000612ff88483613161565b9050613003816131a3565b4760006130148361281484886130c6565b90506130208282613161565b6017549092506130309086613161565b601755601c5460195460009161304b916128149086906130c6565b9050600061306a601c54612814601b54876130c690919063ffffffff16565b9050600061307c826128f98786613161565b9050831561308d5761308d84613387565b861561309d5761309d87846133c1565b81156130ac576130ac82613482565b80156130bb576130bb816134bc565b505050505050505050565b6000826130d557506000610f18565b828202828482816130e257fe5b04146124c15760405162461bcd60e51b81526004018080602001828103825260218152602001806136a26021913960400191505060405180910390fd5b60006124c183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506134f6565b60006124c183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612916565b604080516002808252606080830184529260208301908036833701905050905030816000815181106131d157fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600660019054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561323f57600080fd5b505afa158015613253573d6000803e3d6000fd5b505050506040513d602081101561326957600080fd5b505181518290600190811061327a57fe5b6001600160a01b0392831660209182029290920101526006546132a5913091610100900416846124cc565b600660019054906101000a90046001600160a01b03166001600160a01b031663791ac9478360008430426078016040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b8381101561334257818101518382015260200161332a565b505050509050019650505050505050600060405180830381600087803b15801561336b57600080fd5b505af115801561337f573d6000803e3d6000fd5b505050505050565b600b546040516001600160a01b039091169082156108fc029083906000818181858888f193505050501580156115e0573d6000803e3d6000fd5b6006546133de90309061010090046001600160a01b0316846124cc565b6006546008546040805163f305d71960e01b81523060048201526024810186905260006044820181905260648201526001600160a01b0392831660848201524260a482015290516101009093049091169163f305d71991849160c480830192606092919082900301818588803b15801561345757600080fd5b505af115801561346b573d6000803e3d6000fd5b50505050506040513d606081101561290f57600080fd5b600a546040516001600160a01b039091169082156108fc029083906000818181858888f193505050501580156115e0573d6000803e3d6000fd5b6009546040516001600160a01b039091169082156108fc029083906000818181858888f193505050501580156115e0573d6000803e3d6000fd5b600081836135455760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561296a578181015183820152602001612952565b50600083858161355157fe5b049594505050505056fe42455032303a207472616e736665722066726f6d20746865207a65726f206164647265737342455032303a20617070726f76652066726f6d20746865207a65726f20616464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734175746f6d61746564206d61726b6574206d616b6572207061697220697320616c72656164792073657420746f20746861742076616c756554686520726f7574657220616c7265616479206861732074686174206164647265737342455032303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654163636f756e7420697320616c7265616479207468652076616c7565206f66202769734765744665652754686520726577617264732077616c6c657420697320616c726561647920746869732061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572546865206c69717569646974792057616c6c657420697320616c72656164792074686973206164647265737342455032303a207472616e7366657220616d6f756e7420657863656564732062616c616e636542455032303a207472616e7366657220746f20746865207a65726f206164647265737342455032303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f42455032303a206275726e2066726f6d20746865207a65726f206164647265737342455032303a206275726e20616d6f756e7420657863656564732062616c616e6365546865206465766d61726b6574696e672077616c6c657420697320616c72656164792074686973206164647265737342455032303a20617070726f766520746f20746865207a65726f2061646472657373a26469706673582212203aef074ef74fe107f809b6a13a658c24b021c9437dd6209794740cf43ede345864736f6c634300060c0033

Deployed Bytecode Sourcemap

37656:18333:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43261:624;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43261:624:0;;;;;;;:::i;:::-;;18373:92;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38693:30;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;19860:161;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;19860:161:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;45095:258;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45095:258:0;;;;;;;:::i;37972:104::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;37972:104:0;;;;;;;;;;;;;;38806:33;;;;;;;;;;;;;:::i;18849:100::-;;;;;;;;;;;;;:::i;20492:397::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;20492:397:0;;;;;;;;;;;;;;;;;:::i;38653:33::-;;;;;;;;;;;;;:::i;18532:92::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;38889:31;;;;;;;;;;;;;:::i;21297:210::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21297:210:0;;;;;;;;:::i;38927:31::-;;;;;;;;;;;;;:::i;38967:41::-;;;;;;;;;;;;;:::i;38349:35::-;;;;;;;;;;;;;:::i;22440:120::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22440:120:0;;:::i;49768:126::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49768:126:0;-1:-1:-1;;;;;49768:126:0;;:::i;38189:99::-;;;;;;;;;;;;;:::i;38083:::-;;;;;;;;;;;;;:::i;45779:843::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45779:843:0;-1:-1:-1;;;;;45779:843:0;;:::i;37762:33::-;;;;;;;;;;;;;:::i;49617:143::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49617:143:0;;:::i;43893:576::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43893:576:0;;;;;;;:::i;43102:151::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43102:151:0;;;;:::i;19011:119::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19011:119:0;-1:-1:-1;;;;;19011:119:0;;:::i;1755:140::-;;;;;;;;;;;;;:::i;38500:29::-;;;;;;;;;;;;;:::i;38730:33::-;;;;;;;;;;;;;:::i;38614:32::-;;;;;;;;;;;;;:::i;39237:42::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39237:42:0;-1:-1:-1;;;;;39237:42:0;;:::i;18216:94::-;;;;;;;;;;;;;:::i;38770:29::-;;;;;;;;;;;;;:::i;39015:44::-;;;;;;;;;;;;;:::i;1113:79::-;;;;;;;;;;;;;:::i;38536:36::-;;;;;;;;;;;;;:::i;18689:96::-;;;;;;;;;;;;;:::i;38579:28::-;;;;;;;;;;;;;:::i;47466:163::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;47466:163:0;;;;;;;;;;:::i;38297:43::-;;;;;;;;;;;;;:::i;47990:181::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47990:181:0;;:::i;22009:311::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;22009:311:0;;;;;;;;:::i;46822:298::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;46822:298:0;;;;;;;;;;:::i;19342:167::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;19342:167:0;;;;;;;;:::i;38391:27::-;;;;;;;;;;;;;:::i;38846:36::-;;;;;;;;;;;;;:::i;39437:57::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39437:57:0;-1:-1:-1;;;;;39437:57:0;;:::i;38462:31::-;;;;;;;;;;;;;:::i;46630:184::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;46630:184:0;;;;;;;;;;:::i;48179:555::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48179:555:0;-1:-1:-1;;;;;48179:555:0;;:::i;47128:330::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47128:330:0;-1:-1:-1;47128:330:0;;;;:::i;45361:410::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45361:410:0;;;;;;;;;;;;:::i;49174:435::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49174:435:0;-1:-1:-1;;;;;49174:435:0;;:::i;37865:98::-;;;;;;;;;;;;;:::i;37802:26::-;;;;;;;;;;;;;:::i;44477:610::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44477:610:0;;;;;;;:::i;19571:143::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;19571:143:0;;;;;;;;;;:::i;48742:424::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48742:424:0;-1:-1:-1;;;;;48742:424:0;;:::i;38425:30::-;;;;;;;;;;;;;:::i;2050:109::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2050:109:0;-1:-1:-1;;;;;2050:109:0;;:::i;43261:624::-;1335:12;:10;:12::i;:::-;1325:6;;-1:-1:-1;;;;;1325:6:0;;;:22;;;1317:67;;;;;-1:-1:-1;;;1317:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1317:67:0;;;;;;;;;;;;;;;43393:2:::1;43383:6;:12;;:29;;;;;43410:2;43399:7;:13;;43383:29;43375:65;;;::::0;;-1:-1:-1;;;43375:65:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;43451:20;:29:::0;;;43491:21:::1;:31:::0;;;43661:10:::1;::::0;43626:15:::1;::::0;43589:17:::1;::::0;43550:122:::1;::::0;43661:10;43550:92:::1;::::0;;;43474:6;;43550:38:::1;:57::i;:::-;:75:::0;::::1;:92::i;:122::-;43533:14;:139;;;;43701:125;43815:10;;43701:95;43779:16;;43701:59;43741:18;;43701:21;;:39;;:59;;;;:::i;:125::-;43683:15;:143:::0;43842:35:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;;;;;;;;::::1;43261:624:::0;;:::o;18373:92::-;18452:5;18445:12;;;;;;;;-1:-1:-1;;18445:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18419:13;;18445:12;;18452:5;;18445:12;;18452:5;18445:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18373:92;:::o;38693:30::-;;;;:::o;19860:161::-;19935:4;19952:39;19961:12;:10;:12::i;:::-;19975:7;19984:6;19952:8;:39::i;:::-;-1:-1:-1;20009:4:0;19860:161;;;;;:::o;45095:258::-;1335:12;:10;:12::i;:::-;1325:6;;-1:-1:-1;;;;;1325:6:0;;;:22;;;1317:67;;;;;-1:-1:-1;;;1317:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1317:67:0;;;;;;;;;;;;;;;45196:2:::1;45186:6;:12;;:29;;;;;45213:2;45202:7;:13;;45186:29;45178:58;;;::::0;;-1:-1:-1;;;45178:58:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;45178:58:0;;;;;;;;;;;;;::::1;;45247:12;:21:::0;;;45279:13:::1;:23:::0;;;45318:27:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;;;;;;;;::::1;45095:258:::0;;:::o;37972:104::-;;;-1:-1:-1;;;;;37972:104:0;;:::o;38806:33::-;;;;:::o;18849:100::-;18929:12;;18849:100;:::o;20492:397::-;20624:4;20641:36;20651:6;20659:9;20670:6;20641:9;:36::i;:::-;20688:171;20711:6;20732:12;:10;:12::i;:::-;20759:89;20797:6;20759:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20759:19:0;;;;;;:11;:19;;;;;;20779:12;:10;:12::i;:::-;-1:-1:-1;;;;;20759:33:0;;;;;;;;;;;;-1:-1:-1;20759:33:0;;;:89;:37;:89::i;:::-;20688:8;:171::i;:::-;-1:-1:-1;20877:4:0;20492:397;;;;;:::o;38653:33::-;;;;:::o;18532:92::-;18607:9;;;;18532:92;:::o;38889:31::-;;;;:::o;21297:210::-;21377:4;21394:83;21403:12;:10;:12::i;:::-;21417:7;21426:50;21465:10;21426:11;:25;21438:12;:10;:12::i;:::-;-1:-1:-1;;;;;21426:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;21426:25:0;;;:34;;;;;;;;;;;:38;:50::i;38927:31::-;;;;:::o;38967:41::-;;;;;;:::o;38349:35::-;;;;:::o;22440:120::-;22486:4;22503:27;22509:12;:10;:12::i;:::-;22523:6;22503:5;:27::i;:::-;-1:-1:-1;22548:4:0;22440:120;;;:::o;49768:126::-;-1:-1:-1;;;;;49858:28:0;49834:4;49858:28;;;:19;:28;;;;;;;;;49768:126::o;38189:99::-;;;-1:-1:-1;;;;;38189:99:0;;:::o;38083:::-;;;-1:-1:-1;;;;;38083:99:0;;:::o;45779:843::-;1335:12;:10;:12::i;:::-;1325:6;;-1:-1:-1;;;;;1325:6:0;;;:22;;;1317:67;;;;;-1:-1:-1;;;1317:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1317:67:0;;;;;;;;;;;;;;;45900:13:::1;::::0;-1:-1:-1;;;;;45878:36:0;;::::1;45900:13;::::0;;::::1;;45878:36;;45856:121;;;;-1:-1:-1::0;;;45856:121:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46033:13;::::0;45993:55:::1;::::0;-1:-1:-1;;;;;46033:13:0::1;::::0;;::::1;::::0;::::1;::::0;45993:55;::::1;::::0;::::1;::::0;;;::::1;46088:10;46059:13;;:40;;;;;-1:-1:-1::0;;;;;46059:40:0::1;;;;;-1:-1:-1::0;;;;;46059:40:0::1;;;;;;46110:20;46168:13;;;;;;;;;-1:-1:-1::0;;;;;46168:13:0::1;-1:-1:-1::0;;;;;46168:21:0::1;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;46168:23:0;46243:13:::1;::::0;:20:::1;::::0;;-1:-1:-1;;;46243:20:0;;;;-1:-1:-1;;;;;46156:44:0;;::::1;::::0;::::1;::::0;46223:4:::1;::::0;46243:13:::1;::::0;;::::1;::::0;;::::1;::::0;:18:::1;::::0;:20:::1;::::0;;::::1;::::0;46168:23:::1;::::0;46243:20;;;;;;;;:13;:20;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;46243:20:0;46156:118:::1;::::0;;-1:-1:-1;;;;;;46156:118:0::1;::::0;;;;;;-1:-1:-1;;;;;46156:118:0;;::::1;;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;46243:20:::1;::::0;46156:118;;;;;;;;;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;46156:118:0;;-1:-1:-1;;;;;;46289:26:0;::::1;46285:176;;46359:13;;;;;;;;;-1:-1:-1::0;;;;;46359:13:0::1;-1:-1:-1::0;;;;;46359:21:0::1;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;46359:23:0;46428:13:::1;::::0;:20:::1;::::0;;-1:-1:-1;;;46428:20:0;;;;-1:-1:-1;;;;;46347:65:0;;::::1;::::0;::::1;::::0;46421:4:::1;::::0;46428:13:::1;::::0;;::::1;::::0;;::::1;::::0;:18:::1;::::0;:20:::1;::::0;;::::1;::::0;46359:23:::1;::::0;46428:20;;;;;;;;:13;:20;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;46428:20:0;46347:102:::1;::::0;;-1:-1:-1;;;;;;46347:102:0::1;::::0;;;;;;-1:-1:-1;;;;;46347:102:0;;::::1;;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;46428:20:::1;::::0;46347:102;;;;;;;-1:-1:-1;46347:102:0;;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;46347:102:0;;-1:-1:-1;46285:176:0::1;46500:11;::::0;46471:48:::1;::::0;-1:-1:-1;;;;;46500:11:0::1;;46471:28;:48::i;:::-;46530:11;:26:::0;;-1:-1:-1;;;;;;46530:26:0::1;-1:-1:-1::0;;;;;46530:26:0;;::::1;::::0;;;::::1;::::0;;;;46567:47:::1;::::0;46596:11:::1;-1:-1:-1::0;46567:28:0::1;:47::i;:::-;1395:1;45779:843:::0;:::o;37762:33::-;;;;;;-1:-1:-1;;;;;37762:33:0;;:::o;49617:143::-;1335:12;:10;:12::i;:::-;1325:6;;-1:-1:-1;;;;;1325:6:0;;;:22;;;1317:67;;;;;-1:-1:-1;;;1317:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1317:67:0;;;;;;;;;;;;;;;49689:11:::1;:21:::0;;;49726:26:::1;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;49617:143:::0;:::o;43893:576::-;1335:12;:10;:12::i;:::-;1325:6;;-1:-1:-1;;;;;1325:6:0;;;:22;;;1317:67;;;;;-1:-1:-1;;;1317:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1317:67:0;;;;;;;;;;;;;;;43997:2:::1;43987:6;:12;;:29;;;;;44014:2;44003:7;:13;;43987:29;43979:60;;;::::0;;-1:-1:-1;;;43979:60:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;43979:60:0;;;;;;;;;;;;;::::1;;44050:15;:24:::0;;;44085:16:::1;:26:::0;;;44250:10:::1;::::0;44213:17:::1;::::0;44173:20:::1;::::0;44139:122:::1;::::0;44250:10;44139:92:::1;::::0;;;44068:6;;44139:33:::1;:55::i;:122::-;44122:14;:139;;;;44290:125;44404:10;;44290:95;44366:18;;44290:57;44325:21;;44290:16;;:34;;:57;;;;:::i;:125::-;44272:15;:143:::0;44431:30:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;;;;;;;;::::1;43893:576:::0;;:::o;43102:151::-;1335:12;:10;:12::i;:::-;1325:6;;-1:-1:-1;;;;;1325:6:0;;;:22;;;1317:67;;;;;-1:-1:-1;;;1317:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1317:67:0;;;;;;;;;;;;;;;43173:21:::1;:29:::0;;;::::1;;-1:-1:-1::0;;43173:29:0;;::::1;::::0;::::1;::::0;;;43218:27:::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;43102:151:::0;:::o;19011:119::-;-1:-1:-1;;;;;19104:18:0;19077:7;19104:18;;;:9;:18;;;;;;;19011:119::o;1755:140::-;1335:12;:10;:12::i;:::-;1325:6;;-1:-1:-1;;;;;1325:6:0;;;:22;;;1317:67;;;;;-1:-1:-1;;;1317:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1317:67:0;;;;;;;;;;;;;;;1854:1:::1;1838:6:::0;;1817:40:::1;::::0;-1:-1:-1;;;;;1838:6:0;;::::1;::::0;1817:40:::1;::::0;1854:1;;1817:40:::1;1885:1;1868:19:::0;;-1:-1:-1;;;;;;1868:19:0::1;::::0;;1755:140::o;38500:29::-;;;;:::o;38730:33::-;;;;:::o;38614:32::-;;;;:::o;39237:42::-;;;;;;;;;;;;;;;:::o;18216:94::-;18268:7;18295;:5;:7::i;:::-;18288:14;;18216:94;:::o;38770:29::-;;;;:::o;39015:44::-;;;;:::o;1113:79::-;1151:7;1178:6;-1:-1:-1;;;;;1178:6:0;1113:79;:::o;38536:36::-;;;;:::o;18689:96::-;18770:7;18763:14;;;;;;;;-1:-1:-1;;18763:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18737:13;;18763:14;;18770:7;;18763:14;;18770:7;18763:14;;;;;;;;;;;;;;;;;;;;;;;;38579:28;;;;:::o;47466:163::-;1335:12;:10;:12::i;:::-;1325:6;;-1:-1:-1;;;;;1325:6:0;;;:22;;;1317:67;;;;;-1:-1:-1;;;1317:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1317:67:0;;;;;;;;;;;;;;;47580:41:::1;47609:4;47615:5;47580:28;:41::i;38297:43::-:0;;;;:::o;47990:181::-;1335:12;:10;:12::i;:::-;1325:6;;-1:-1:-1;;;;;1325:6:0;;;:22;;;1317:67;;;;;-1:-1:-1;;;1317:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1317:67:0;;;;;;;;;;;;;;;48072:18:::1;:34:::0;;;48122:41:::1;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;47990:181:::0;:::o;22009:311::-;22094:4;22111:179;22134:12;:10;:12::i;:::-;22161:7;22183:96;22222:15;22183:96;;;;;;;;;;;;;;;;;:11;:25;22195:12;:10;:12::i;:::-;-1:-1:-1;;;;;22183:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;22183:25:0;;;:34;;;;;;;;;;;:96;:38;:96::i;46822:298::-;1335:12;:10;:12::i;:::-;1325:6;;-1:-1:-1;;;;;1325:6:0;;;:22;;;1317:67;;;;;-1:-1:-1;;;1317:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1317:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;46927:19:0;::::1;;::::0;;;:10:::1;:19:::0;;;;;;::::1;;:31;;::::0;::::1;;;;46905:123;;;;-1:-1:-1::0;;;46905:123:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;47039:19:0;::::1;;::::0;;;:10:::1;:19:::0;;;;;;;;:30;;-1:-1:-1;;47039:30:0::1;::::0;::::1;;::::0;;::::1;::::0;;;47087:25;;;;;;;::::1;::::0;;;;;;;;::::1;46822:298:::0;;:::o;19342:167::-;19420:4;19437:42;19447:12;:10;:12::i;:::-;19461:9;19472:6;19437:9;:42::i;38391:27::-;;;;:::o;38846:36::-;;;;:::o;39437:57::-;;;;;;;;;;;;;;;:::o;38462:31::-;;;;:::o;46630:184::-;1335:12;:10;:12::i;:::-;1325:6;;-1:-1:-1;;;;;1325:6:0;;;:22;;;1317:67;;;;;-1:-1:-1;;;1317:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1317:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;46715:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;46715:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;46772:34;;;;;;;::::1;::::0;;;;;;;;::::1;46630:184:::0;;:::o;48179:555::-;1335:12;:10;:12::i;:::-;1325:6;;-1:-1:-1;;;;;1325:6:0;;;:22;;;1317:67;;;;;-1:-1:-1;;;1317:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1317:67:0;;;;;;;;;;;;;;;48342:18:::1;::::0;-1:-1:-1;;;;;48317:43:0;;::::1;48342:18:::0;::::1;48317:43;;48295:140;;;;-1:-1:-1::0;;;48295:140:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48446:44;48462:21;48485:4;48446:15;:44::i;:::-;48517:18;::::0;48501:42:::1;::::0;-1:-1:-1;;;;;48517:18:0::1;;48501:15;:42::i;:::-;48635:18;::::0;48559:105:::1;::::0;-1:-1:-1;;;;;48635:18:0;;::::1;::::0;48559:105;::::1;::::0;::::1;::::0;48635:18:::1;::::0;48559:105:::1;48675:18;:51:::0;;-1:-1:-1;;;;;;48675:51:0::1;-1:-1:-1::0;;;;;48675:51:0;;;::::1;::::0;;;::::1;::::0;;48179:555::o;47128:330::-;1335:12;:10;:12::i;:::-;1325:6;;-1:-1:-1;;;;;1325:6:0;;;:22;;;1317:67;;;;;-1:-1:-1;;;1317:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1317:67:0;;;;;;;;;;;;;;;47271:9:::1;47266:116;47286:19:::0;;::::1;47266:116;;;47362:8;47327:19;:32;47347:8;;47356:1;47347:11;;;;;;;;::::0;;::::1;::::0;;;::::1;;-1:-1:-1::0;;;;;47347:11:0::1;47327:32:::0;;-1:-1:-1;47327:32:0;::::1;::::0;;;;;;-1:-1:-1;47327:32:0;:43;;-1:-1:-1;;47327:43:0::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;47307:3:0::1;47266:116;;;;47399:51;47431:8;;47441;47399:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;47399:51:0::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;47399:51:0;;-1:-1:-1;;;;;47399:51:0::1;47128:330:::0;;;:::o;45361:410::-;1335:12;:10;:12::i;:::-;1325:6;;-1:-1:-1;;;;;1325:6:0;;;:22;;;1317:67;;;;;-1:-1:-1;;;1317:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1317:67:0;;;;;;;;;;;;;;;45508:14:::1;:27:::0;;;45546:17:::1;:33:::0;;;45590:12:::1;:23:::0;;;45638:55:::1;45605:8:::0;45638:37:::1;45525:10:::0;45566:13;45638:18:::1;:37::i;:55::-;45624:11;:69:::0;45711:52:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;::::1;::::0;;;;;;;::::1;45361:410:::0;;;:::o;49174:435::-;1335:12;:10;:12::i;:::-;1325:6;;-1:-1:-1;;;;;1325:6:0;;;:22;;;1317:67;;;;;-1:-1:-1;;;1317:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1317:67:0;;;;;;;;;;;;;;;49299:13:::1;::::0;-1:-1:-1;;;;;49279:33:0;;::::1;49299:13:::0;::::1;49279:33;;49257:125;;;;-1:-1:-1::0;;;49257:125:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49393:39;49409:16;49427:4;49393:15;:39::i;:::-;49459:13;::::0;49443:37:::1;::::0;-1:-1:-1;;;;;49459:13:0::1;;49443:15;:37::i;:::-;49491:13;:41:::0;;-1:-1:-1;;;;;;49491:41:0::1;-1:-1:-1::0;;;;;49491:41:0;;::::1;::::0;;::::1;::::0;;;;49548:53:::1;::::0;49587:13;::::1;::::0;49548:53:::1;::::0;-1:-1:-1;;49548:53:0::1;49174:435:::0;:::o;37865:98::-;;;-1:-1:-1;;;;;37865:98:0;;:::o;37802:26::-;;;-1:-1:-1;;;;;37802:26:0;;:::o;44477:610::-;1335:12;:10;:12::i;:::-;1325:6;;-1:-1:-1;;;;;1325:6:0;;;:22;;;1317:67;;;;;-1:-1:-1;;;1317:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1317:67:0;;;;;;;;;;;;;;;44606:2:::1;44596:6;:12;;:29;;;;;44623:2;44612:7;:13;;44596:29;44588:63;;;::::0;;-1:-1:-1;;;44588:63:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;44588:63:0;;;;;;;;;;;;;::::1;;44662:17;:26:::0;;;44699:18:::1;:28:::0;;;44866:10:::1;::::0;44831:15:::1;::::0;44791:20:::1;::::0;44755:122:::1;::::0;44866:10;44755:92:::1;::::0;;;44682:6;;44755:35:::1;:57::i;:122::-;44738:14;:139;;;;44906:125;45020:10;;44906:95;44984:16;;44906:59;44943:21;;44906:18;;:36;;:59;;;;:::i;:125::-;44888:15;:143:::0;45047:32:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;;;;;;;;::::1;44477:610:::0;;:::o;19571:143::-;-1:-1:-1;;;;;19679:18:0;;;19652:7;19679:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;19571:143::o;48742:424::-;1335:12;:10;:12::i;:::-;1325:6;;-1:-1:-1;;;;;1325:6:0;;;:22;;;1317:67;;;;;-1:-1:-1;;;1317:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1317:67:0;;;;;;;;;;;;;;;48894:15:::1;::::0;-1:-1:-1;;;;;48874:35:0;;::::1;48894:15:::0;::::1;48874:35;;48852:129;;;;-1:-1:-1::0;;;48852:129:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48992:39;49008:16;49026:4;48992:15;:39::i;:::-;49088:15;::::0;49047:57:::1;::::0;-1:-1:-1;;;;;49088:15:0;;::::1;::::0;49047:57;::::1;::::0;::::1;::::0;49088:15:::1;::::0;49047:57:::1;49115:15;:43:::0;;-1:-1:-1;;;;;;49115:43:0::1;-1:-1:-1::0;;;;;49115:43:0;;;::::1;::::0;;;::::1;::::0;;48742:424::o;38425:30::-;;;;:::o;2050:109::-;1335:12;:10;:12::i;:::-;1325:6;;-1:-1:-1;;;;;1325:6:0;;;:22;;;1317:67;;;;;-1:-1:-1;;;1317:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1317:67:0;;;;;;;;;;;;;;;2123:28:::1;2142:8;2123:18;:28::i;:::-;2050:109:::0;:::o;5913:181::-;5971:7;6003:5;;;6027:6;;;;6019:46;;;;;-1:-1:-1;;;6019:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;6085:1;5913:181;-1:-1:-1;;;5913:181:0:o;275:98::-;355:10;275:98;:::o;25272:372::-;-1:-1:-1;;;;;25400:19:0;;25392:68;;;;-1:-1:-1;;;25392:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25479:21:0;;25471:68;;;;-1:-1:-1;;;25471:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25552:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;25604:32;;;;;;;;;;;;;;;;;25272:372;;;:::o;49902:2587::-;-1:-1:-1;;;;;50034:18:0;;50026:68;;;;-1:-1:-1;;;50026:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;50113:16:0;;50105:64;;;;-1:-1:-1;;;50105:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50198:11;;50188:6;:21;;50180:56;;;;;-1:-1:-1;;;50180:56:0;;;;;;;;;;;;-1:-1:-1;;;50180:56:0;;;;;;;;;;;;;;;50253:11;50249:93;;50281:28;50297:4;50303:2;50307:1;50281:15;:28::i;:::-;50324:7;;50249:93;50358:21;;;;50354:595;;;50396:28;50427:24;50445:4;50427:9;:24::i;:::-;50396:55;;50466:25;50494:27;:25;:27::i;:::-;50466:55;-1:-1:-1;50553:41:0;;;;;;;;50615:20;;-1:-1:-1;50627:8:0;;-1:-1:-1;;;50627:8:0;;;;50626:9;50615:20;:56;;;;-1:-1:-1;;;;;;50640:31:0;;;;;;:25;:31;;;;;;;;50639:32;50615:56;50611:327;;;50692:8;:15;;-1:-1:-1;;;;50692:15:0;-1:-1:-1;;;50692:15:0;;;50819:17;;-1:-1:-1;50819:17:0;;50855:32;50819:17;50855:10;:32::i;:::-;50906:8;:16;;-1:-1:-1;;;;50906:16:0;;;50611:327;50354:595;;;;-1:-1:-1;;;;;51144:25:0;;51023:12;51144:25;;;:19;:25;;;;;;51038:4;;51144:25;;;:52;;-1:-1:-1;;;;;;51173:23:0;;;;;;:19;:23;;;;;;;;51144:52;51140:100;;;-1:-1:-1;51223:5:0;51140:100;51256:7;51252:1184;;;-1:-1:-1;;;;;51284:16:0;;;;;;:10;:16;;;;;;;;;:34;;-1:-1:-1;;;;;;51304:14:0;;;;;;:10;:14;;;;;;;;51284:34;51280:1145;;;-1:-1:-1;;;;;51412:16:0;;51339:12;51412:16;;;:10;:16;;;;;;51339:12;;51412:16;;51408:925;;;51464:35;51495:3;51464:26;51475:14;;51464:6;:10;;:26;;;;:::i;:::-;:30;;:35::i;:::-;51457:42;;51536:33;51565:3;51536:24;51547:12;;51536:6;:10;;:24;;;;:::i;:33::-;51526:43;;51596:42;51612:4;51626;51633;51596:15;:42::i;:::-;51665:20;51671:4;51677:7;51665:5;:20::i;:::-;51733:120;51786:40;51811:14;;51786:20;51795:10;;51786:4;:8;;:20;;;;:::i;:40::-;51733:18;;;:22;:120::i;:::-;51712:18;:141;51408:925;;;51917:36;51949:3;51917:27;51928:15;;51917:6;:10;;:27;;;;:::i;:36::-;51910:43;;51990:34;52020:3;51990:25;52001:13;;51990:6;:10;;:25;;;;:::i;:34::-;51980:44;;52051:42;52067:4;52081;52088;52051:15;:42::i;:::-;52120:20;52126:4;52132:7;52120:5;:20::i;:::-;52188:121;52241:41;52266:15;;52241:20;52250:10;;52241:4;:8;;:20;;;;:::i;52188:121::-;52167:18;:142;51408:925;52380:29;52401:7;52380:16;:6;52391:4;52380:10;:16::i;:::-;:20;;:29::i;:::-;52371:38;;51280:1145;;;52448:33;52464:4;52470:2;52474:6;52448:15;:33::i;:::-;49902:2587;;;;;:::o;6816:226::-;6936:7;6972:12;6964:6;;;;6956:29;;;;-1:-1:-1;;;6956:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;7008:5:0;;;6816:226::o;24484:348::-;-1:-1:-1;;;;;24560:21:0;;24552:67;;;;-1:-1:-1;;;24552:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24653:68;24676:6;24653:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24653:18:0;;;;;;:9;:18;;;;;;;:68;:22;:68::i;:::-;-1:-1:-1;;;;;24632:18:0;;;;;;:9;:18;;;;;:89;24747:12;;:24;;24764:6;24747:16;:24::i;:::-;24732:12;:39;24787:37;;;;;;;;24813:1;;-1:-1:-1;;;;;24787:37:0;;;;;;;;;;;;24484:348;;:::o;47637:345::-;-1:-1:-1;;;;;47742:31:0;;;;;;:25;:31;;;;;;;;:40;;;;;;;47720:146;;;;-1:-1:-1;;;47720:146:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47877:31:0;;;;;;:25;:31;;;;;;:39;;-1:-1:-1;;47877:39:0;;;;;;;;;;47934:40;;47877:39;;:31;47934:40;;;47637:345;;:::o;2265:229::-;-1:-1:-1;;;;;2339:22:0;;2331:73;;;;-1:-1:-1;;;2331:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2441:6;;;2420:38;;-1:-1:-1;;;;;2420:38:0;;;;2441:6;;;2420:38;;;2469:6;:17;;-1:-1:-1;;;;;;2469:17:0;-1:-1:-1;;;;;2469:17:0;;;;;;;;;;2265:229::o;23050:513::-;-1:-1:-1;;;;;23190:20:0;;23182:70;;;;-1:-1:-1;;;23182:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23271:23:0;;23263:71;;;;-1:-1:-1;;;23263:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23367;23389:6;23367:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23367:17:0;;;;;;:9;:17;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;23347:17:0;;;;;;;:9;:17;;;;;;:91;;;;23472:20;;;;;;;:32;;23497:6;23472:24;:32::i;:::-;-1:-1:-1;;;;;23449:20:0;;;;;;;:9;:20;;;;;;;;;:55;;;;23520:35;;;;;;;23449:20;;23520:35;;;;;;;;;;;;;23050:513;;;:::o;55191:425::-;55325:16;;;55339:1;55325:16;;;55301:21;55325:16;;;;;55251:7;;;;55301:21;;55339:1;55325:16;;;;;;;;;;-1:-1:-1;55325:16:0;55301:40;;55362:13;;;;;;;;;-1:-1:-1;;;;;55362:13:0;-1:-1:-1;;;;;55362:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55362:20:0;55352:7;;:4;;55357:1;;55352:7;;;;;;;;;:30;-1:-1:-1;;;;;55352:30:0;;;-1:-1:-1;;;;;55352:30:0;;;;;55411:4;55393;55398:1;55393:7;;;;;;;;-1:-1:-1;;;;;55393:23:0;;;:7;;;;;;;;;;:23;;;;55454:13;;55496:18;;55454:90;;;-1:-1:-1;;;55454:90:0;;;;;;;;;;;;;;;;;;;;;;55427:24;;55454:13;;;;;;;;:27;;55529:4;;55454:90;;;;;;;;;;;;;-1:-1:-1;55454:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;55454:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55454:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55427:117;;55569:7;55577:1;55569:10;;;;;;;;;;;;;;55555:24;;55597:11;55590:18;;;;;55191:425;:::o;52497:1514::-;52557:25;52585:95;52639:30;52663:4;52639:15;:30::i;:::-;52601:18;;52585:35;;:11;;:15;:35::i;:95::-;52557:123;;52691:26;52720:72;52770:11;;52720:31;52736:14;;52720:11;:15;;:31;;;;:::i;:72::-;52691:101;-1:-1:-1;52803:23:0;52829:35;:11;52691:101;52829:15;:35::i;:::-;52803:61;;52875:36;52895:15;52875:19;:36::i;:::-;52946:21;52922;53002:81;53057:15;53002:36;52946:21;53020:17;53002;:36::i;:81::-;52978:105;-1:-1:-1;53110:32:0;:13;52978:105;53110:17;:32::i;:::-;53174:18;;53094:48;;-1:-1:-1;53174:41:0;;53197:17;53174:22;:41::i;:::-;53153:18;:62;53307:11;;53273:14;;53226:26;;53255:74;;:33;;:13;;:17;:33::i;:74::-;53226:103;;53340:24;53367:48;53403:11;;53367:31;53385:12;;53367:13;:17;;:31;;;;:::i;:48::-;53340:75;-1:-1:-1;53426:29:0;53458:87;53340:75;53458:51;:13;53490:18;53458:31;:51::i;:87::-;53426:119;-1:-1:-1;53562:17:0;;53558:94;;53596:44;53626:13;53596:29;:44::i;:::-;53666:22;;53662:107;;53705:52;53718:18;53738;53705:12;:52::i;:::-;53783:20;;53779:100;;53820:47;53850:16;53820:29;:47::i;:::-;53893:25;;53889:115;;53935:57;53970:21;53935:34;:57::i;:::-;52497:1514;;;;;;;;;:::o;7301:471::-;7359:7;7604:6;7600:47;;-1:-1:-1;7634:1:0;7627:8;;7600:47;7671:5;;;7675:1;7671;:5;:1;7695:5;;;;;:10;7687:56;;;;-1:-1:-1;;;7687:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8248:132;8306:7;8333:39;8337:1;8340;8333:39;;;;;;;;;;;;;;;;;:3;:39::i;6377:136::-;6435:7;6462:43;6466:1;6469;6462:43;;;;;;;;;;;;;;;;;:3;:43::i;54584:595::-;54737:16;;;54751:1;54737:16;;;54713:21;54737:16;;;;;54713:21;54737:16;;;;;;;;;;-1:-1:-1;54737:16:0;54713:40;;54782:4;54764;54769:1;54764:7;;;;;;;;;;;;;:23;-1:-1:-1;;;;;54764:23:0;;;-1:-1:-1;;;;;54764:23:0;;;;;54808:13;;;;;;;;;-1:-1:-1;;;;;54808:13:0;-1:-1:-1;;;;;54808:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54808:20:0;54798:7;;:4;;54803:1;;54798:7;;;;;;-1:-1:-1;;;;;54798:30:0;;;:7;;;;;;;;;:30;54873:13;;54841:60;;54858:4;;54873:13;;;;54889:11;54841:8;:60::i;:::-;54940:13;;;;;;;;;-1:-1:-1;;;;;54940:13:0;-1:-1:-1;;;;;54940:64:0;;55019:11;55045:1;55092:4;55119;55139:15;55157:3;55139:21;54940:231;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;54940:231:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54584:595;;:::o;55874:112::-;55948:13;;:30;;-1:-1:-1;;;;;55948:13:0;;;;:30;;;;;55971:6;;55948:13;:30;:13;:30;55971:6;55948:13;:30;;;;;;;;;;;;;;;;;;;54019:523;54202:13;;54170:60;;54187:4;;54202:13;;;-1:-1:-1;;;;;54202:13:0;54218:11;54170:8;:60::i;:::-;54273:13;;54478:15;;54273:261;;;-1:-1:-1;;;54273:261:0;;54346:4;54273:261;;;;;;;;;;-1:-1:-1;54273:261:0;;;;;;;;;;-1:-1:-1;;;;;54478:15:0;;;54273:261;;;;54508:15;54273:261;;;;;;:13;;;;;;;;:29;;54310:12;;54273:261;;;;;;;;;;;;;;54310:12;54273:13;:261;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55754:112;55828:13;;:30;;-1:-1:-1;;;;;55828:13:0;;;;:30;;;;;55851:6;;55828:13;:30;:13;:30;55851:6;55828:13;:30;;;;;;;;;;;;;;;;;;;55624:122;55703:18;;:35;;-1:-1:-1;;;;;55703:18:0;;;;:35;;;;;55731:6;;55703:18;:35;:18;:35;55731:6;55703:18;:35;;;;;;;;;;;;;;;;;;;8876:312;8996:7;9031:12;9024:5;9016:28;;;;-1:-1:-1;;;9016:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9055:9;9071:1;9067;:5;;;;;;;8876:312;-1:-1:-1;;;;;8876:312:0:o

Swarm Source

ipfs://3aef074ef74fe107f809b6a13a658c24b021c9437dd6209794740cf43ede3458
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.