ETH Price: $2,618.41 (+0.75%)

Token

Requiem (REQUIEM)
 

Overview

Max Total Supply

100,000 REQUIEM

Holders

36

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.531433428522280581 REQUIEM

Value
$0.00
0x5a8562c5192f1d0fba678006c57b60ac50bbCB94
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:
Requiem

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

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

// Website: https://requiemtoken.com

// SPDX-License-Identifier: UNLICENSED

pragma solidity >=0.8.10;

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

    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        external
        returns (
            uint256 amountA,
            uint256 amountB,
            uint256 liquidity
        );

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (
            uint256 amountToken,
            uint256 amountETH,
            uint256 liquidity
        );

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETH(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountToken, uint256 amountETH);

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETHWithPermit(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountToken, uint256 amountETH);

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactETHForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function swapTokensForExactETH(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactTokensForETH(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapETHForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function quote(
        uint256 amountA,
        uint256 reserveA,
        uint256 reserveB
    ) external pure returns (uint256 amountB);

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountOut);

    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountIn);

    function getAmountsOut(uint256 amountIn, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);

    function getAmountsIn(uint256 amountOut, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountETH);

    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable;

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;
}

interface IUniswapV2Pair {
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
    event Transfer(address indexed from, address indexed to, uint256 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 (uint256);

    function balanceOf(address owner) external view returns (uint256);

    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    function approve(address spender, uint256 value) external returns (bool);

    function transfer(address to, uint256 value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 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 (uint256);

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    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 (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

    function mint(address to) external returns (uint256 liquidity);

    function burn(address to)
        external
        returns (uint256 amount0, uint256 amount1);

    function swap(
        uint256 amount0Out,
        uint256 amount1Out,
        address to,
        bytes calldata data
    ) external;

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

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

    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(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

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

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

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

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

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

    /**
     * @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 a - b;
    }

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

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

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

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

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * 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) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

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

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

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

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

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

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

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

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

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

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

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, 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 `from` to `to` 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 from,
        address to,
        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
    );
}

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

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

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

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

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

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

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

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

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

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

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

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

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

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

        return true;
    }

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

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(
            fromBalance >= amount,
            "ERC20: transfer amount exceeds balance"
        );
        unchecked {
            _balances[from] = fromBalance - amount;
        }
        _balances[to] += amount;

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

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

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

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

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

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

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

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

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

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

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

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

contract Requiem is ERC20, Ownable {
    using SafeMath for uint256;

    address private immutable pair;
    IUniswapV2Router02 private immutable router;

    address public marketingWallet;

    uint256 public maxTx;
    uint256 public maxWallet;

    uint256 private _initialTax=7;
    uint256 private _finalTax=5;
    uint256 private _reduceTaxAt=40;
    uint256 private _preventSwapBefore=40;
    uint256 private _buyCount=0;
    uint256 public _taxSwap=1000 * 1e18;

    mapping(address => bool) private excludedFromLimits;

    mapping(address => bool) private excludedFromFees;

    bool private swapping;

    mapping(address => uint256) private addressLastTxBlock;

    constructor() ERC20("Requiem", "REQUIEM") {
        uint256 totalSupply = 100000 * 1e18;

        maxTx = 1001 * 1e18;
        maxWallet = 1501 * 1e18;

        marketingWallet = address(owner());

        router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        pair = IUniswapV2Factory(router.factory()).createPair(
            address(this),
            router.WETH()
        );

        _excludeFromLimits(address(router), true);
        _excludeFromLimits(pair, true);

        _excludeFromLimits(owner(), true);
        _excludeFromLimits(address(this), true);
        _excludeFromLimits(address(0xdead), true);

        _excludeFromFees(owner(), true);
        _excludeFromFees(address(this), true);
        _excludeFromFees(address(0xdead), true);
        _approve(msg.sender, address(router), type(uint256).max);
        _mint(msg.sender, totalSupply);
    }

    receive() external payable {}

    function updateMaxTx(uint256 _maxTxAmount) external onlyOwner {
        require(_maxTxAmount * 1e18 >= maxTx, "Max tx can not be lowered");
        maxTx = _maxTxAmount * 1e18;
    }

    function updateMaxWallet(uint256 _maxWalletAmount) external onlyOwner {
        require(
            _maxWalletAmount * 1e18 >= maxWallet,
            "Max wallet can not be lowered"
        );
        maxWallet = _maxWalletAmount * 1e18;
    }

    function updateFees(uint256 _fee) external onlyOwner {
        require(_fee <= 5, "Tax can not be set higher than 5%");
        _finalTax = _fee;
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        if (amount == 0) {
            super._transfer(from, to, 0);
            return;
        }

        if (
            from != owner() &&
            to != owner() &&
            to != address(0) &&
            to != address(0xdead)
        ) {
            _checkTx(to);

            if (_isBuy(from) && !_excludedFromLimits(to)) {
                _maxTxCheck(amount);
                _maxWalletCheck(to, amount);
            } else if (_isSell(to) && !_excludedFromLimits(from)) {
                _maxTxCheck(amount);
            } else if (!_excludedFromLimits(to)) {
                _maxWalletCheck(to, amount);
            }
        }

        uint256 contractTokenBalance = balanceOf(address(this));
        bool canSwap = contractTokenBalance>_taxSwap && _buyCount>_preventSwapBefore;

        if (
            canSwap &&
            !swapping &&
            pair != from &&
            !_excludedFromFees(from) &&
            !_excludedFromFees(to)
        ) {
            swapping = true;

            _swapBack();

            swapping = false;
        }

        bool takeFee = !swapping;

        if (_excludedFromFees(from) || _excludedFromFees(to)) {
            takeFee = false;
        }

        if (takeFee) {

            if (from == pair) {
                _buyCount++;
            }

            uint256 fees = 0;

            fees = amount.mul((_buyCount>_reduceTaxAt)?_finalTax:_initialTax).div(100);

            if (fees > 0) {
                super._transfer(from, address(this), fees);
            }

            amount -= fees;
        }

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

    function _checkTx(address _to) internal {
        if (_to != owner() && _to != pair && _to != address(router)) {
            require(
                addressLastTxBlock[tx.origin] != block.number,
                "Only one purchase per block allowed"
            );
            addressLastTxBlock[tx.origin] = block.number;
        }
    }

    function _swapBack() internal {
        uint256 contractBalance = balanceOf(address(this));

        if (contractBalance == 0) {
            return;
        }

        _swapTokensForEth(_taxSwap);
    }

    function _isSell(address _to) internal view returns (bool) {
        return _to == pair;
    }

    function _isBuy(address _from) internal view returns (bool) {
        return _from == pair;
    }

    function _excludeFromFees(address _addr, bool _doesBypass) internal {
        excludedFromFees[_addr] = _doesBypass;
    }

    function _excludedFromFees(address _addr) internal view returns (bool) {
        return excludedFromFees[_addr];
    }

    function _excludeFromLimits(address _addr, bool _doesBypass) internal {
        excludedFromLimits[_addr] = _doesBypass;
    }

    function _excludedFromLimits(address _addr) internal view returns (bool) {
        return excludedFromLimits[_addr];
    }

    function _maxTxCheck(uint256 _amount) internal view {
        require(_amount <= maxTx, "Max transaction limit reached");
    }

    function _maxWalletCheck(address _addr, uint256 _amount) internal view {
        require(
            _amount + balanceOf(_addr) <= maxWallet,
            "Max wallet limit reached"
        );
    }

    function _swapTokensForEth(uint256 _tokenAmount) internal {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = router.WETH();

        _approve(address(this), address(router), _tokenAmount);

        router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            _tokenAmount,
            0,
            path,
            address(marketingWallet),
            block.timestamp
        );
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_taxSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","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":[{"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":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","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":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"updateFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxTxAmount","type":"uint256"}],"name":"updateMaxTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxWalletAmount","type":"uint256"}],"name":"updateMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c060405260076009556005600a556028600b556028600c556000600d55683635c9adc5dea00000600e553480156200003757600080fd5b506040518060400160405280600781526020017f5265717569656d000000000000000000000000000000000000000000000000008152506040518060400160405280600781526020017f5245515549454d000000000000000000000000000000000000000000000000008152508160039080519060200190620000bc9291906200096b565b508060049080519060200190620000d59291906200096b565b505050620000f8620000ec6200046760201b60201c565b6200046f60201b60201c565b600069152d02c7e14af68000009050683643aa64798604000060078190555068515e8f3b5c75540000600881905550620001376200053560201b60201c565b600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff168152505060a05173ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200020d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000233919062000a85565b73ffffffffffffffffffffffffffffffffffffffff1663c9c653963060a05173ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200029d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002c3919062000a85565b6040518363ffffffff1660e01b8152600401620002e292919062000ac8565b6020604051808303816000875af115801562000302573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000328919062000a85565b73ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250506200037060a05160016200055f60201b60201c565b6200038560805160016200055f60201b60201c565b620003a7620003996200053560201b60201c565b60016200055f60201b60201c565b620003ba3060016200055f60201b60201c565b620003cf61dead60016200055f60201b60201c565b620003f1620003e36200053560201b60201c565b6001620005ba60201b60201c565b62000404306001620005ba60201b60201c565b6200041961dead6001620005ba60201b60201c565b6200044e3360a0517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6200061560201b60201c565b620004603382620007e860201b60201c565b5062000dd1565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b80600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b80601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141562000688576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200067f9062000b7c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620006fb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006f29062000c14565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051620007db919062000c51565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200085b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008529062000cbe565b60405180910390fd5b6200086f600083836200096160201b60201c565b806002600082825462000883919062000d0f565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620008da919062000d0f565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000941919062000c51565b60405180910390a36200095d600083836200096660201b60201c565b5050565b505050565b505050565b828054620009799062000d9b565b90600052602060002090601f0160209004810192826200099d5760008555620009e9565b82601f10620009b857805160ff1916838001178555620009e9565b82800160010185558215620009e9579182015b82811115620009e8578251825591602001919060010190620009cb565b5b509050620009f89190620009fc565b5090565b5b8082111562000a17576000816000905550600101620009fd565b5090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000a4d8262000a20565b9050919050565b62000a5f8162000a40565b811462000a6b57600080fd5b50565b60008151905062000a7f8162000a54565b92915050565b60006020828403121562000a9e5762000a9d62000a1b565b5b600062000aae8482850162000a6e565b91505092915050565b62000ac28162000a40565b82525050565b600060408201905062000adf600083018562000ab7565b62000aee602083018462000ab7565b9392505050565b600082825260208201905092915050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600062000b6460248362000af5565b915062000b718262000b06565b604082019050919050565b6000602082019050818103600083015262000b978162000b55565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b600062000bfc60228362000af5565b915062000c098262000b9e565b604082019050919050565b6000602082019050818103600083015262000c2f8162000bed565b9050919050565b6000819050919050565b62000c4b8162000c36565b82525050565b600060208201905062000c68600083018462000c40565b92915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062000ca6601f8362000af5565b915062000cb38262000c6e565b602082019050919050565b6000602082019050818103600083015262000cd98162000c97565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000d1c8262000c36565b915062000d298362000c36565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000d615762000d6062000ce0565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000db457607f821691505b6020821081141562000dcb5762000dca62000d6c565b5b50919050565b60805160a051612ccd62000e28600039600081816117b301528181611bd101528181611cb20152611cd9015260008181611210015281816112f00152818161175b015281816118d50152611a270152612ccd6000f3fe60806040526004361061012e5760003560e01c80637437681e116100ab578063a457c2d71161006f578063a457c2d7146103ef578063a9059cbb1461042c578063c2d0ffca14610469578063dd62ed3e14610492578063f2fde38b146104cf578063f8b45b05146104f857610135565b80637437681e1461031a57806375f0a8741461034557806378dacee1146103705780638da5cb5b1461039957806395d89b41146103c457610135565b8063313ce567116100f2578063313ce5671461023357806334376f3b1461025e578063395093511461028957806370a08231146102c6578063715018a61461030357610135565b806306fdde031461013a578063095ea7b31461016557806318160ddd146101a25780631c499ab0146101cd57806323b872dd146101f657610135565b3661013557005b600080fd5b34801561014657600080fd5b5061014f610523565b60405161015c9190611e2a565b60405180910390f35b34801561017157600080fd5b5061018c60048036038101906101879190611ee5565b6105b5565b6040516101999190611f40565b60405180910390f35b3480156101ae57600080fd5b506101b76105d8565b6040516101c49190611f6a565b60405180910390f35b3480156101d957600080fd5b506101f460048036038101906101ef9190611f85565b6105e2565b005b34801561020257600080fd5b5061021d60048036038101906102189190611fb2565b6106d3565b60405161022a9190611f40565b60405180910390f35b34801561023f57600080fd5b50610248610702565b6040516102559190612021565b60405180910390f35b34801561026a57600080fd5b5061027361070b565b6040516102809190611f6a565b60405180910390f35b34801561029557600080fd5b506102b060048036038101906102ab9190611ee5565b610711565b6040516102bd9190611f40565b60405180910390f35b3480156102d257600080fd5b506102ed60048036038101906102e8919061203c565b6107bb565b6040516102fa9190611f6a565b60405180910390f35b34801561030f57600080fd5b50610318610803565b005b34801561032657600080fd5b5061032f61088b565b60405161033c9190611f6a565b60405180910390f35b34801561035157600080fd5b5061035a610891565b6040516103679190612078565b60405180910390f35b34801561037c57600080fd5b5061039760048036038101906103929190611f85565b6108b7565b005b3480156103a557600080fd5b506103ae610981565b6040516103bb9190612078565b60405180910390f35b3480156103d057600080fd5b506103d96109ab565b6040516103e69190611e2a565b60405180910390f35b3480156103fb57600080fd5b5061041660048036038101906104119190611ee5565b610a3d565b6040516104239190611f40565b60405180910390f35b34801561043857600080fd5b50610453600480360381019061044e9190611ee5565b610b27565b6040516104609190611f40565b60405180910390f35b34801561047557600080fd5b50610490600480360381019061048b9190611f85565b610b4a565b005b34801561049e57600080fd5b506104b960048036038101906104b49190612093565b610c3b565b6040516104c69190611f6a565b60405180910390f35b3480156104db57600080fd5b506104f660048036038101906104f1919061203c565b610cc2565b005b34801561050457600080fd5b5061050d610dba565b60405161051a9190611f6a565b60405180910390f35b60606003805461053290612102565b80601f016020809104026020016040519081016040528092919081815260200182805461055e90612102565b80156105ab5780601f10610580576101008083540402835291602001916105ab565b820191906000526020600020905b81548152906001019060200180831161058e57829003601f168201915b5050505050905090565b6000806105c0610dc0565b90506105cd818585610dc8565b600191505092915050565b6000600254905090565b6105ea610dc0565b73ffffffffffffffffffffffffffffffffffffffff16610608610981565b73ffffffffffffffffffffffffffffffffffffffff161461065e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065590612180565b60405180910390fd5b600854670de0b6b3a76400008261067591906121cf565b10156106b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106ad90612275565b60405180910390fd5b670de0b6b3a7640000816106ca91906121cf565b60088190555050565b6000806106de610dc0565b90506106eb858285610f93565b6106f685858561101f565b60019150509392505050565b60006012905090565b600e5481565b60008061071c610dc0565b90506107b0818585600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546107ab9190612295565b610dc8565b600191505092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61080b610dc0565b73ffffffffffffffffffffffffffffffffffffffff16610829610981565b73ffffffffffffffffffffffffffffffffffffffff161461087f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087690612180565b60405180910390fd5b61088960006113d4565b565b60075481565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6108bf610dc0565b73ffffffffffffffffffffffffffffffffffffffff166108dd610981565b73ffffffffffffffffffffffffffffffffffffffff1614610933576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092a90612180565b60405180910390fd5b6005811115610977576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096e9061235d565b60405180910390fd5b80600a8190555050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546109ba90612102565b80601f01602080910402602001604051908101604052809291908181526020018280546109e690612102565b8015610a335780601f10610a0857610100808354040283529160200191610a33565b820191906000526020600020905b815481529060010190602001808311610a1657829003601f168201915b5050505050905090565b600080610a48610dc0565b90506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015610b0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b05906123ef565b60405180910390fd5b610b1b8286868403610dc8565b60019250505092915050565b600080610b32610dc0565b9050610b3f81858561101f565b600191505092915050565b610b52610dc0565b73ffffffffffffffffffffffffffffffffffffffff16610b70610981565b73ffffffffffffffffffffffffffffffffffffffff1614610bc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbd90612180565b60405180910390fd5b600754670de0b6b3a764000082610bdd91906121cf565b1015610c1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c159061245b565b60405180910390fd5b670de0b6b3a764000081610c3291906121cf565b60078190555050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610cca610dc0565b73ffffffffffffffffffffffffffffffffffffffff16610ce8610981565b73ffffffffffffffffffffffffffffffffffffffff1614610d3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3590612180565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610dae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da5906124ed565b60405180910390fd5b610db7816113d4565b50565b60085481565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2f9061257f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ea8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9f90612611565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610f869190611f6a565b60405180910390a3505050565b6000610f9f8484610c3b565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611019578181101561100b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110029061267d565b60405180910390fd5b6110188484848403610dc8565b5b50505050565b6000811415611039576110348383600061149a565b6113cf565b611041610981565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156110af575061107f610981565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b80156110e85750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015611122575061dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b156111b1576111308261171b565b611139836118d1565b801561114b575061114982611929565b155b15611168576111598161197f565b61116382826119c7565b6111b0565b61117182611a23565b8015611183575061118183611929565b155b15611196576111918161197f565b6111af565b61119f82611929565b6111ae576111ad82826119c7565b5b5b5b5b60006111bc306107bb565b90506000600e54821180156111d45750600c54600d54115b90508080156111f05750601160009054906101000a900460ff16155b801561124857508473ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614155b801561125a575061125885611a7b565b155b801561126c575061126a84611a7b565b155b156112b0576001601160006101000a81548160ff021916908315150217905550611294611ad1565b6000601160006101000a81548160ff0219169083151502179055505b6000601160009054906101000a900460ff161590506112ce86611a7b565b806112de57506112dd85611a7b565b5b156112e857600090505b80156113c0577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16141561135b57600d60008154809291906113559061269d565b91905055505b6000611399606461138b600b54600d54116113785760095461137c565b600a545b88611afc90919063ffffffff16565b611b1290919063ffffffff16565b905060008111156113b0576113af87308361149a565b5b80856113bc91906126e6565b9450505b6113cb86868661149a565b5050505b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561150a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115019061278c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561157a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115719061281e565b60405180910390fd5b611585838383611b28565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561160b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611602906128b0565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461169e9190612295565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516117029190611f6a565b60405180910390a3611715848484611b2d565b50505050565b611723610981565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156117aa57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561180257507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b156118ce5743601260003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541415611889576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188090612942565b60405180910390fd5b43601260003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b50565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6007548111156119c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bb906129ae565b60405180910390fd5b50565b6008546119d3836107bb565b826119de9190612295565b1115611a1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1690612a1a565b60405180910390fd5b5050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b6000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000611adc306107bb565b90506000811415611aed5750611afa565b611af8600e54611b32565b505b565b60008183611b0a91906121cf565b905092915050565b60008183611b209190612a69565b905092915050565b505050565b505050565b6000600267ffffffffffffffff811115611b4f57611b4e612a9a565b5b604051908082528060200260200182016040528015611b7d5781602001602082028036833780820191505090505b5090503081600081518110611b9557611b94612ac9565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c5e9190612b0d565b81600181518110611c7257611c71612ac9565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050611cd7307f000000000000000000000000000000000000000000000000000000000000000084610dc8565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663791ac94783600084600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518663ffffffff1660e01b8152600401611d5b959493929190612c3d565b600060405180830381600087803b158015611d7557600080fd5b505af1158015611d89573d6000803e3d6000fd5b505050505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611dcb578082015181840152602081019050611db0565b83811115611dda576000848401525b50505050565b6000601f19601f8301169050919050565b6000611dfc82611d91565b611e068185611d9c565b9350611e16818560208601611dad565b611e1f81611de0565b840191505092915050565b60006020820190508181036000830152611e448184611df1565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611e7c82611e51565b9050919050565b611e8c81611e71565b8114611e9757600080fd5b50565b600081359050611ea981611e83565b92915050565b6000819050919050565b611ec281611eaf565b8114611ecd57600080fd5b50565b600081359050611edf81611eb9565b92915050565b60008060408385031215611efc57611efb611e4c565b5b6000611f0a85828601611e9a565b9250506020611f1b85828601611ed0565b9150509250929050565b60008115159050919050565b611f3a81611f25565b82525050565b6000602082019050611f556000830184611f31565b92915050565b611f6481611eaf565b82525050565b6000602082019050611f7f6000830184611f5b565b92915050565b600060208284031215611f9b57611f9a611e4c565b5b6000611fa984828501611ed0565b91505092915050565b600080600060608486031215611fcb57611fca611e4c565b5b6000611fd986828701611e9a565b9350506020611fea86828701611e9a565b9250506040611ffb86828701611ed0565b9150509250925092565b600060ff82169050919050565b61201b81612005565b82525050565b60006020820190506120366000830184612012565b92915050565b60006020828403121561205257612051611e4c565b5b600061206084828501611e9a565b91505092915050565b61207281611e71565b82525050565b600060208201905061208d6000830184612069565b92915050565b600080604083850312156120aa576120a9611e4c565b5b60006120b885828601611e9a565b92505060206120c985828601611e9a565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061211a57607f821691505b6020821081141561212e5761212d6120d3565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061216a602083611d9c565b915061217582612134565b602082019050919050565b600060208201905081810360008301526121998161215d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006121da82611eaf565b91506121e583611eaf565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561221e5761221d6121a0565b5b828202905092915050565b7f4d61782077616c6c65742063616e206e6f74206265206c6f7765726564000000600082015250565b600061225f601d83611d9c565b915061226a82612229565b602082019050919050565b6000602082019050818103600083015261228e81612252565b9050919050565b60006122a082611eaf565b91506122ab83611eaf565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156122e0576122df6121a0565b5b828201905092915050565b7f5461782063616e206e6f742062652073657420686967686572207468616e203560008201527f2500000000000000000000000000000000000000000000000000000000000000602082015250565b6000612347602183611d9c565b9150612352826122eb565b604082019050919050565b600060208201905081810360008301526123768161233a565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006123d9602583611d9c565b91506123e48261237d565b604082019050919050565b60006020820190508181036000830152612408816123cc565b9050919050565b7f4d61782074782063616e206e6f74206265206c6f776572656400000000000000600082015250565b6000612445601983611d9c565b91506124508261240f565b602082019050919050565b6000602082019050818103600083015261247481612438565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006124d7602683611d9c565b91506124e28261247b565b604082019050919050565b60006020820190508181036000830152612506816124ca565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612569602483611d9c565b91506125748261250d565b604082019050919050565b600060208201905081810360008301526125988161255c565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006125fb602283611d9c565b91506126068261259f565b604082019050919050565b6000602082019050818103600083015261262a816125ee565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000612667601d83611d9c565b915061267282612631565b602082019050919050565b600060208201905081810360008301526126968161265a565b9050919050565b60006126a882611eaf565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156126db576126da6121a0565b5b600182019050919050565b60006126f182611eaf565b91506126fc83611eaf565b92508282101561270f5761270e6121a0565b5b828203905092915050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000612776602583611d9c565b91506127818261271a565b604082019050919050565b600060208201905081810360008301526127a581612769565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000612808602383611d9c565b9150612813826127ac565b604082019050919050565b60006020820190508181036000830152612837816127fb565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b600061289a602683611d9c565b91506128a58261283e565b604082019050919050565b600060208201905081810360008301526128c98161288d565b9050919050565b7f4f6e6c79206f6e652070757263686173652070657220626c6f636b20616c6c6f60008201527f7765640000000000000000000000000000000000000000000000000000000000602082015250565b600061292c602383611d9c565b9150612937826128d0565b604082019050919050565b6000602082019050818103600083015261295b8161291f565b9050919050565b7f4d6178207472616e73616374696f6e206c696d69742072656163686564000000600082015250565b6000612998601d83611d9c565b91506129a382612962565b602082019050919050565b600060208201905081810360008301526129c78161298b565b9050919050565b7f4d61782077616c6c6574206c696d697420726561636865640000000000000000600082015250565b6000612a04601883611d9c565b9150612a0f826129ce565b602082019050919050565b60006020820190508181036000830152612a33816129f7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612a7482611eaf565b9150612a7f83611eaf565b925082612a8f57612a8e612a3a565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050612b0781611e83565b92915050565b600060208284031215612b2357612b22611e4c565b5b6000612b3184828501612af8565b91505092915050565b6000819050919050565b6000819050919050565b6000612b69612b64612b5f84612b3a565b612b44565b611eaf565b9050919050565b612b7981612b4e565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612bb481611e71565b82525050565b6000612bc68383612bab565b60208301905092915050565b6000602082019050919050565b6000612bea82612b7f565b612bf48185612b8a565b9350612bff83612b9b565b8060005b83811015612c30578151612c178882612bba565b9750612c2283612bd2565b925050600181019050612c03565b5085935050505092915050565b600060a082019050612c526000830188611f5b565b612c5f6020830187612b70565b8181036040830152612c718186612bdf565b9050612c806060830185612069565b612c8d6080830184611f5b565b969550505050505056fea2646970667358221220b28c65d5e5095db1038a774d7b5f5028e947395a2ed6445f4b4222b73d6f180364736f6c634300080a0033

Deployed Bytecode

0x60806040526004361061012e5760003560e01c80637437681e116100ab578063a457c2d71161006f578063a457c2d7146103ef578063a9059cbb1461042c578063c2d0ffca14610469578063dd62ed3e14610492578063f2fde38b146104cf578063f8b45b05146104f857610135565b80637437681e1461031a57806375f0a8741461034557806378dacee1146103705780638da5cb5b1461039957806395d89b41146103c457610135565b8063313ce567116100f2578063313ce5671461023357806334376f3b1461025e578063395093511461028957806370a08231146102c6578063715018a61461030357610135565b806306fdde031461013a578063095ea7b31461016557806318160ddd146101a25780631c499ab0146101cd57806323b872dd146101f657610135565b3661013557005b600080fd5b34801561014657600080fd5b5061014f610523565b60405161015c9190611e2a565b60405180910390f35b34801561017157600080fd5b5061018c60048036038101906101879190611ee5565b6105b5565b6040516101999190611f40565b60405180910390f35b3480156101ae57600080fd5b506101b76105d8565b6040516101c49190611f6a565b60405180910390f35b3480156101d957600080fd5b506101f460048036038101906101ef9190611f85565b6105e2565b005b34801561020257600080fd5b5061021d60048036038101906102189190611fb2565b6106d3565b60405161022a9190611f40565b60405180910390f35b34801561023f57600080fd5b50610248610702565b6040516102559190612021565b60405180910390f35b34801561026a57600080fd5b5061027361070b565b6040516102809190611f6a565b60405180910390f35b34801561029557600080fd5b506102b060048036038101906102ab9190611ee5565b610711565b6040516102bd9190611f40565b60405180910390f35b3480156102d257600080fd5b506102ed60048036038101906102e8919061203c565b6107bb565b6040516102fa9190611f6a565b60405180910390f35b34801561030f57600080fd5b50610318610803565b005b34801561032657600080fd5b5061032f61088b565b60405161033c9190611f6a565b60405180910390f35b34801561035157600080fd5b5061035a610891565b6040516103679190612078565b60405180910390f35b34801561037c57600080fd5b5061039760048036038101906103929190611f85565b6108b7565b005b3480156103a557600080fd5b506103ae610981565b6040516103bb9190612078565b60405180910390f35b3480156103d057600080fd5b506103d96109ab565b6040516103e69190611e2a565b60405180910390f35b3480156103fb57600080fd5b5061041660048036038101906104119190611ee5565b610a3d565b6040516104239190611f40565b60405180910390f35b34801561043857600080fd5b50610453600480360381019061044e9190611ee5565b610b27565b6040516104609190611f40565b60405180910390f35b34801561047557600080fd5b50610490600480360381019061048b9190611f85565b610b4a565b005b34801561049e57600080fd5b506104b960048036038101906104b49190612093565b610c3b565b6040516104c69190611f6a565b60405180910390f35b3480156104db57600080fd5b506104f660048036038101906104f1919061203c565b610cc2565b005b34801561050457600080fd5b5061050d610dba565b60405161051a9190611f6a565b60405180910390f35b60606003805461053290612102565b80601f016020809104026020016040519081016040528092919081815260200182805461055e90612102565b80156105ab5780601f10610580576101008083540402835291602001916105ab565b820191906000526020600020905b81548152906001019060200180831161058e57829003601f168201915b5050505050905090565b6000806105c0610dc0565b90506105cd818585610dc8565b600191505092915050565b6000600254905090565b6105ea610dc0565b73ffffffffffffffffffffffffffffffffffffffff16610608610981565b73ffffffffffffffffffffffffffffffffffffffff161461065e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065590612180565b60405180910390fd5b600854670de0b6b3a76400008261067591906121cf565b10156106b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106ad90612275565b60405180910390fd5b670de0b6b3a7640000816106ca91906121cf565b60088190555050565b6000806106de610dc0565b90506106eb858285610f93565b6106f685858561101f565b60019150509392505050565b60006012905090565b600e5481565b60008061071c610dc0565b90506107b0818585600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546107ab9190612295565b610dc8565b600191505092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61080b610dc0565b73ffffffffffffffffffffffffffffffffffffffff16610829610981565b73ffffffffffffffffffffffffffffffffffffffff161461087f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087690612180565b60405180910390fd5b61088960006113d4565b565b60075481565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6108bf610dc0565b73ffffffffffffffffffffffffffffffffffffffff166108dd610981565b73ffffffffffffffffffffffffffffffffffffffff1614610933576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092a90612180565b60405180910390fd5b6005811115610977576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096e9061235d565b60405180910390fd5b80600a8190555050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546109ba90612102565b80601f01602080910402602001604051908101604052809291908181526020018280546109e690612102565b8015610a335780601f10610a0857610100808354040283529160200191610a33565b820191906000526020600020905b815481529060010190602001808311610a1657829003601f168201915b5050505050905090565b600080610a48610dc0565b90506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015610b0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b05906123ef565b60405180910390fd5b610b1b8286868403610dc8565b60019250505092915050565b600080610b32610dc0565b9050610b3f81858561101f565b600191505092915050565b610b52610dc0565b73ffffffffffffffffffffffffffffffffffffffff16610b70610981565b73ffffffffffffffffffffffffffffffffffffffff1614610bc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbd90612180565b60405180910390fd5b600754670de0b6b3a764000082610bdd91906121cf565b1015610c1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c159061245b565b60405180910390fd5b670de0b6b3a764000081610c3291906121cf565b60078190555050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610cca610dc0565b73ffffffffffffffffffffffffffffffffffffffff16610ce8610981565b73ffffffffffffffffffffffffffffffffffffffff1614610d3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3590612180565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610dae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da5906124ed565b60405180910390fd5b610db7816113d4565b50565b60085481565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2f9061257f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ea8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9f90612611565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610f869190611f6a565b60405180910390a3505050565b6000610f9f8484610c3b565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611019578181101561100b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110029061267d565b60405180910390fd5b6110188484848403610dc8565b5b50505050565b6000811415611039576110348383600061149a565b6113cf565b611041610981565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156110af575061107f610981565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b80156110e85750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015611122575061dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b156111b1576111308261171b565b611139836118d1565b801561114b575061114982611929565b155b15611168576111598161197f565b61116382826119c7565b6111b0565b61117182611a23565b8015611183575061118183611929565b155b15611196576111918161197f565b6111af565b61119f82611929565b6111ae576111ad82826119c7565b5b5b5b5b60006111bc306107bb565b90506000600e54821180156111d45750600c54600d54115b90508080156111f05750601160009054906101000a900460ff16155b801561124857508473ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000cd830698c08a33b7ea5089693705db6f333ad55073ffffffffffffffffffffffffffffffffffffffff1614155b801561125a575061125885611a7b565b155b801561126c575061126a84611a7b565b155b156112b0576001601160006101000a81548160ff021916908315150217905550611294611ad1565b6000601160006101000a81548160ff0219169083151502179055505b6000601160009054906101000a900460ff161590506112ce86611a7b565b806112de57506112dd85611a7b565b5b156112e857600090505b80156113c0577f000000000000000000000000cd830698c08a33b7ea5089693705db6f333ad55073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16141561135b57600d60008154809291906113559061269d565b91905055505b6000611399606461138b600b54600d54116113785760095461137c565b600a545b88611afc90919063ffffffff16565b611b1290919063ffffffff16565b905060008111156113b0576113af87308361149a565b5b80856113bc91906126e6565b9450505b6113cb86868661149a565b5050505b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561150a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115019061278c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561157a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115719061281e565b60405180910390fd5b611585838383611b28565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561160b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611602906128b0565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461169e9190612295565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516117029190611f6a565b60405180910390a3611715848484611b2d565b50505050565b611723610981565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156117aa57507f000000000000000000000000cd830698c08a33b7ea5089693705db6f333ad55073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561180257507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b156118ce5743601260003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541415611889576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188090612942565b60405180910390fd5b43601260003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b50565b60007f000000000000000000000000cd830698c08a33b7ea5089693705db6f333ad55073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6007548111156119c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bb906129ae565b60405180910390fd5b50565b6008546119d3836107bb565b826119de9190612295565b1115611a1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1690612a1a565b60405180910390fd5b5050565b60007f000000000000000000000000cd830698c08a33b7ea5089693705db6f333ad55073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b6000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000611adc306107bb565b90506000811415611aed5750611afa565b611af8600e54611b32565b505b565b60008183611b0a91906121cf565b905092915050565b60008183611b209190612a69565b905092915050565b505050565b505050565b6000600267ffffffffffffffff811115611b4f57611b4e612a9a565b5b604051908082528060200260200182016040528015611b7d5781602001602082028036833780820191505090505b5090503081600081518110611b9557611b94612ac9565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c5e9190612b0d565b81600181518110611c7257611c71612ac9565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050611cd7307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84610dc8565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac94783600084600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518663ffffffff1660e01b8152600401611d5b959493929190612c3d565b600060405180830381600087803b158015611d7557600080fd5b505af1158015611d89573d6000803e3d6000fd5b505050505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611dcb578082015181840152602081019050611db0565b83811115611dda576000848401525b50505050565b6000601f19601f8301169050919050565b6000611dfc82611d91565b611e068185611d9c565b9350611e16818560208601611dad565b611e1f81611de0565b840191505092915050565b60006020820190508181036000830152611e448184611df1565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611e7c82611e51565b9050919050565b611e8c81611e71565b8114611e9757600080fd5b50565b600081359050611ea981611e83565b92915050565b6000819050919050565b611ec281611eaf565b8114611ecd57600080fd5b50565b600081359050611edf81611eb9565b92915050565b60008060408385031215611efc57611efb611e4c565b5b6000611f0a85828601611e9a565b9250506020611f1b85828601611ed0565b9150509250929050565b60008115159050919050565b611f3a81611f25565b82525050565b6000602082019050611f556000830184611f31565b92915050565b611f6481611eaf565b82525050565b6000602082019050611f7f6000830184611f5b565b92915050565b600060208284031215611f9b57611f9a611e4c565b5b6000611fa984828501611ed0565b91505092915050565b600080600060608486031215611fcb57611fca611e4c565b5b6000611fd986828701611e9a565b9350506020611fea86828701611e9a565b9250506040611ffb86828701611ed0565b9150509250925092565b600060ff82169050919050565b61201b81612005565b82525050565b60006020820190506120366000830184612012565b92915050565b60006020828403121561205257612051611e4c565b5b600061206084828501611e9a565b91505092915050565b61207281611e71565b82525050565b600060208201905061208d6000830184612069565b92915050565b600080604083850312156120aa576120a9611e4c565b5b60006120b885828601611e9a565b92505060206120c985828601611e9a565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061211a57607f821691505b6020821081141561212e5761212d6120d3565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061216a602083611d9c565b915061217582612134565b602082019050919050565b600060208201905081810360008301526121998161215d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006121da82611eaf565b91506121e583611eaf565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561221e5761221d6121a0565b5b828202905092915050565b7f4d61782077616c6c65742063616e206e6f74206265206c6f7765726564000000600082015250565b600061225f601d83611d9c565b915061226a82612229565b602082019050919050565b6000602082019050818103600083015261228e81612252565b9050919050565b60006122a082611eaf565b91506122ab83611eaf565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156122e0576122df6121a0565b5b828201905092915050565b7f5461782063616e206e6f742062652073657420686967686572207468616e203560008201527f2500000000000000000000000000000000000000000000000000000000000000602082015250565b6000612347602183611d9c565b9150612352826122eb565b604082019050919050565b600060208201905081810360008301526123768161233a565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006123d9602583611d9c565b91506123e48261237d565b604082019050919050565b60006020820190508181036000830152612408816123cc565b9050919050565b7f4d61782074782063616e206e6f74206265206c6f776572656400000000000000600082015250565b6000612445601983611d9c565b91506124508261240f565b602082019050919050565b6000602082019050818103600083015261247481612438565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006124d7602683611d9c565b91506124e28261247b565b604082019050919050565b60006020820190508181036000830152612506816124ca565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612569602483611d9c565b91506125748261250d565b604082019050919050565b600060208201905081810360008301526125988161255c565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006125fb602283611d9c565b91506126068261259f565b604082019050919050565b6000602082019050818103600083015261262a816125ee565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000612667601d83611d9c565b915061267282612631565b602082019050919050565b600060208201905081810360008301526126968161265a565b9050919050565b60006126a882611eaf565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156126db576126da6121a0565b5b600182019050919050565b60006126f182611eaf565b91506126fc83611eaf565b92508282101561270f5761270e6121a0565b5b828203905092915050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000612776602583611d9c565b91506127818261271a565b604082019050919050565b600060208201905081810360008301526127a581612769565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000612808602383611d9c565b9150612813826127ac565b604082019050919050565b60006020820190508181036000830152612837816127fb565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b600061289a602683611d9c565b91506128a58261283e565b604082019050919050565b600060208201905081810360008301526128c98161288d565b9050919050565b7f4f6e6c79206f6e652070757263686173652070657220626c6f636b20616c6c6f60008201527f7765640000000000000000000000000000000000000000000000000000000000602082015250565b600061292c602383611d9c565b9150612937826128d0565b604082019050919050565b6000602082019050818103600083015261295b8161291f565b9050919050565b7f4d6178207472616e73616374696f6e206c696d69742072656163686564000000600082015250565b6000612998601d83611d9c565b91506129a382612962565b602082019050919050565b600060208201905081810360008301526129c78161298b565b9050919050565b7f4d61782077616c6c6574206c696d697420726561636865640000000000000000600082015250565b6000612a04601883611d9c565b9150612a0f826129ce565b602082019050919050565b60006020820190508181036000830152612a33816129f7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612a7482611eaf565b9150612a7f83611eaf565b925082612a8f57612a8e612a3a565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050612b0781611e83565b92915050565b600060208284031215612b2357612b22611e4c565b5b6000612b3184828501612af8565b91505092915050565b6000819050919050565b6000819050919050565b6000612b69612b64612b5f84612b3a565b612b44565b611eaf565b9050919050565b612b7981612b4e565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612bb481611e71565b82525050565b6000612bc68383612bab565b60208301905092915050565b6000602082019050919050565b6000612bea82612b7f565b612bf48185612b8a565b9350612bff83612b9b565b8060005b83811015612c30578151612c178882612bba565b9750612c2283612bd2565b925050600181019050612c03565b5085935050505092915050565b600060a082019050612c526000830188611f5b565b612c5f6020830187612b70565b8181036040830152612c718186612bdf565b9050612c806060830185612069565b612c8d6080830184611f5b565b969550505050505056fea2646970667358221220b28c65d5e5095db1038a774d7b5f5028e947395a2ed6445f4b4222b73d6f180364736f6c634300080a0033

Deployed Bytecode Sourcemap

36157:6276:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24993:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27485:242;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26113:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38018:250;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28307:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25955:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36608:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29011:272;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26284:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18839:103;;;;;;;;;;;;;:::i;:::-;;36362:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36323:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38276:154;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18188:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25212:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29786:507;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26667:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37825:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26964:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19097:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36389:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24993:100;25047:13;25080:5;25073:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24993:100;:::o;27485:242::-;27604:4;27626:13;27642:12;:10;:12::i;:::-;27626:28;;27665:32;27674:5;27681:7;27690:6;27665:8;:32::i;:::-;27715:4;27708:11;;;27485:242;;;;:::o;26113:108::-;26174:7;26201:12;;26194:19;;26113:108;:::o;38018:250::-;18419:12;:10;:12::i;:::-;18408:23;;:7;:5;:7::i;:::-;:23;;;18400:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38148:9:::1;;38140:4;38121:16;:23;;;;:::i;:::-;:36;;38099:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;38256:4;38237:16;:23;;;;:::i;:::-;38225:9;:35;;;;38018:250:::0;:::o;28307:295::-;28438:4;28455:15;28473:12;:10;:12::i;:::-;28455:30;;28496:38;28512:4;28518:7;28527:6;28496:15;:38::i;:::-;28545:27;28555:4;28561:2;28565:6;28545:9;:27::i;:::-;28590:4;28583:11;;;28307:295;;;;;:::o;25955:93::-;26013:5;26038:2;26031:9;;25955:93;:::o;36608:35::-;;;;:::o;29011:272::-;29126:4;29148:13;29164:12;:10;:12::i;:::-;29148:28;;29187:66;29196:5;29203:7;29242:10;29212:11;:18;29224:5;29212:18;;;;;;;;;;;;;;;:27;29231:7;29212:27;;;;;;;;;;;;;;;;:40;;;;:::i;:::-;29187:8;:66::i;:::-;29271:4;29264:11;;;29011:272;;;;:::o;26284:177::-;26403:7;26435:9;:18;26445:7;26435:18;;;;;;;;;;;;;;;;26428:25;;26284:177;;;:::o;18839:103::-;18419:12;:10;:12::i;:::-;18408:23;;:7;:5;:7::i;:::-;:23;;;18400:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18904:30:::1;18931:1;18904:18;:30::i;:::-;18839:103::o:0;36362:20::-;;;;:::o;36323:30::-;;;;;;;;;;;;;:::o;38276:154::-;18419:12;:10;:12::i;:::-;18408:23;;:7;:5;:7::i;:::-;:23;;;18400:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38356:1:::1;38348:4;:9;;38340:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;38418:4;38406:9;:16;;;;38276:154:::0;:::o;18188:87::-;18234:7;18261:6;;;;;;;;;;;18254:13;;18188:87;:::o;25212:104::-;25268:13;25301:7;25294:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25212:104;:::o;29786:507::-;29906:4;29928:13;29944:12;:10;:12::i;:::-;29928:28;;29967:24;29994:11;:18;30006:5;29994:18;;;;;;;;;;;;;;;:27;30013:7;29994:27;;;;;;;;;;;;;;;;29967:54;;30074:15;30054:16;:35;;30032:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;30190:60;30199:5;30206:7;30234:15;30215:16;:34;30190:8;:60::i;:::-;30281:4;30274:11;;;;29786:507;;;;:::o;26667:234::-;26782:4;26804:13;26820:12;:10;:12::i;:::-;26804:28;;26843;26853:5;26860:2;26864:6;26843:9;:28::i;:::-;26889:4;26882:11;;;26667:234;;;;:::o;37825:185::-;18419:12;:10;:12::i;:::-;18408:23;;:7;:5;:7::i;:::-;:23;;;18400:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37929:5:::1;;37921:4;37906:12;:19;;;;:::i;:::-;:28;;37898:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;37998:4;37983:12;:19;;;;:::i;:::-;37975:5;:27;;;;37825:185:::0;:::o;26964:201::-;27098:7;27130:11;:18;27142:5;27130:18;;;;;;;;;;;;;;;:27;27149:7;27130:27;;;;;;;;;;;;;;;;27123:34;;26964:201;;;;:::o;19097:238::-;18419:12;:10;:12::i;:::-;18408:23;;:7;:5;:7::i;:::-;:23;;;18400:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19220:1:::1;19200:22;;:8;:22;;;;19178:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;19299:28;19318:8;19299:18;:28::i;:::-;19097:238:::0;:::o;36389:24::-;;;;:::o;17030:98::-;17083:7;17110:10;17103:17;;17030:98;:::o;33528:380::-;33681:1;33664:19;;:5;:19;;;;33656:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;33762:1;33743:21;;:7;:21;;;;33735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;33846:6;33816:11;:18;33828:5;33816:18;;;;;;;;;;;;;;;:27;33835:7;33816:27;;;;;;;;;;;;;;;:36;;;;33884:7;33868:32;;33877:5;33868:32;;;33893:6;33868:32;;;;;;:::i;:::-;;;;;;;;33528:380;;;:::o;34195:502::-;34330:24;34357:25;34367:5;34374:7;34357:9;:25::i;:::-;34330:52;;34417:17;34397:16;:37;34393:297;;34497:6;34477:16;:26;;34451:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;34612:51;34621:5;34628:7;34656:6;34637:16;:25;34612:8;:51::i;:::-;34393:297;34319:378;34195:502;;;:::o;38438:1800::-;38576:1;38566:6;:11;38562:93;;;38594:28;38610:4;38616:2;38620:1;38594:15;:28::i;:::-;38637:7;;38562:93;38693:7;:5;:7::i;:::-;38685:15;;:4;:15;;;;:45;;;;;38723:7;:5;:7::i;:::-;38717:13;;:2;:13;;;;38685:45;:78;;;;;38761:1;38747:16;;:2;:16;;;;38685:78;:116;;;;;38794:6;38780:21;;:2;:21;;;;38685:116;38667:552;;;38828:12;38837:2;38828:8;:12::i;:::-;38861;38868:4;38861:6;:12::i;:::-;:40;;;;;38878:23;38898:2;38878:19;:23::i;:::-;38877:24;38861:40;38857:351;;;38922:19;38934:6;38922:11;:19::i;:::-;38960:27;38976:2;38980:6;38960:15;:27::i;:::-;38857:351;;;39013:11;39021:2;39013:7;:11::i;:::-;:41;;;;;39029:25;39049:4;39029:19;:25::i;:::-;39028:26;39013:41;39009:199;;;39075:19;39087:6;39075:11;:19::i;:::-;39009:199;;;39121:23;39141:2;39121:19;:23::i;:::-;39116:92;;39165:27;39181:2;39185:6;39165:15;:27::i;:::-;39116:92;39009:199;38857:351;38667:552;39231:28;39262:24;39280:4;39262:9;:24::i;:::-;39231:55;;39297:12;39333:8;;39312:20;:29;:61;;;;;39355:18;;39345:9;;:28;39312:61;39297:76;;39404:7;:33;;;;;39429:8;;;;;;;;;;;39428:9;39404:33;:62;;;;;39462:4;39454:12;;:4;:12;;;;39404:62;:103;;;;;39484:23;39502:4;39484:17;:23::i;:::-;39483:24;39404:103;:142;;;;;39525:21;39543:2;39525:17;:21::i;:::-;39524:22;39404:142;39386:275;;;39584:4;39573:8;;:15;;;;;;;;;;;;;;;;;;39605:11;:9;:11::i;:::-;39644:5;39633:8;;:16;;;;;;;;;;;;;;;;;;39386:275;39673:12;39689:8;;;;;;;;;;;39688:9;39673:24;;39714:23;39732:4;39714:17;:23::i;:::-;:48;;;;39741:21;39759:2;39741:17;:21::i;:::-;39714:48;39710:96;;;39789:5;39779:15;;39710:96;39822:7;39818:367;;;39860:4;39852:12;;:4;:12;;;39848:64;;;39885:9;;:11;;;;;;;;;:::i;:::-;;;;;;39848:64;39928:12;39968:67;40031:3;39968:58;39990:12;;39980:9;;:22;39979:46;;40014:11;;39979:46;;;40004:9;;39979:46;39968:6;:10;;:58;;;;:::i;:::-;:62;;:67;;;;:::i;:::-;39961:74;;40063:1;40056:4;:8;40052:91;;;40085:42;40101:4;40115;40122;40085:15;:42::i;:::-;40052:91;40169:4;40159:14;;;;;:::i;:::-;;;39831:354;39818:367;40197:33;40213:4;40219:2;40223:6;40197:15;:33::i;:::-;38551:1687;;;38438:1800;;;;:::o;19495:191::-;19569:16;19588:6;;;;;;;;;;;19569:25;;19614:8;19605:6;;:17;;;;;;;;;;;;;;;;;;19669:8;19638:40;;19659:8;19638:40;;;;;;;;;;;;19558:128;19495:191;:::o;30772:708::-;30919:1;30903:18;;:4;:18;;;;30895:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;30996:1;30982:16;;:2;:16;;;;30974:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;31051:38;31072:4;31078:2;31082:6;31051:20;:38::i;:::-;31102:19;31124:9;:15;31134:4;31124:15;;;;;;;;;;;;;;;;31102:37;;31187:6;31172:11;:21;;31150:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;31327:6;31313:11;:20;31295:9;:15;31305:4;31295:15;;;;;;;;;;;;;;;:38;;;;31372:6;31355:9;:13;31365:2;31355:13;;;;;;;;;;;;;;;;:23;;;;;;;:::i;:::-;;;;;;;;31411:2;31396:26;;31405:4;31396:26;;;31415:6;31396:26;;;;;;:::i;:::-;;;;;;;;31435:37;31455:4;31461:2;31465:6;31435:19;:37::i;:::-;30884:596;30772:708;;;:::o;40246:347::-;40308:7;:5;:7::i;:::-;40301:14;;:3;:14;;;;:29;;;;;40326:4;40319:11;;:3;:11;;;;40301:29;:55;;;;;40349:6;40334:22;;:3;:22;;;;40301:55;40297:289;;;40432:12;40399:18;:29;40418:9;40399:29;;;;;;;;;;;;;;;;:45;;40373:142;;;;;;;;;;;;:::i;:::-;;;;;;;;;40562:12;40530:18;:29;40549:9;40530:29;;;;;;;;;;;;;;;:44;;;;40297:289;40246:347;:::o;40923:99::-;40977:4;41010;41001:13;;:5;:13;;;40994:20;;40923:99;;;:::o;41426:124::-;41493:4;41517:18;:25;41536:5;41517:25;;;;;;;;;;;;;;;;;;;;;;;;;41510:32;;41426:124;;;:::o;41558:129::-;41640:5;;41629:7;:16;;41621:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;41558:129;:::o;41695:203::-;41829:9;;41809:16;41819:5;41809:9;:16::i;:::-;41799:7;:26;;;;:::i;:::-;:39;;41777:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;41695:203;;:::o;40819:96::-;40872:4;40903;40896:11;;:3;:11;;;40889:18;;40819:96;;;:::o;41162:120::-;41227:4;41251:16;:23;41268:5;41251:23;;;;;;;;;;;;;;;;;;;;;;;;;41244:30;;41162:120;;;:::o;40601:210::-;40642:23;40668:24;40686:4;40668:9;:24::i;:::-;40642:50;;40728:1;40709:15;:20;40705:59;;;40746:7;;;40705:59;40776:27;40794:8;;40776:17;:27::i;:::-;40631:180;40601:210;:::o;13063:98::-;13121:7;13152:1;13148;:5;;;;:::i;:::-;13141:12;;13063:98;;;;:::o;13462:::-;13520:7;13551:1;13547;:5;;;;:::i;:::-;13540:12;;13462:98;;;;:::o;35297:125::-;;;;:::o;36026:124::-;;;;:::o;41906:524::-;42035:21;42073:1;42059:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42035:40;;42104:4;42086;42091:1;42086:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;42130:6;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42120:4;42125:1;42120:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;42156:54;42173:4;42188:6;42197:12;42156:8;:54::i;:::-;42223:6;:57;;;42295:12;42322:1;42338:4;42365:15;;;;;;;;;;;42396;42223:199;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41964:466;41906:524;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:307::-;355:1;365:113;379:6;376:1;373:13;365:113;;;464:1;459:3;455:11;449:18;445:1;440:3;436:11;429:39;401:2;398:1;394:10;389:15;;365:113;;;496:6;493:1;490:13;487:101;;;576:1;567:6;562:3;558:16;551:27;487:101;336:258;287:307;;;:::o;600:102::-;641:6;692:2;688:7;683:2;676:5;672:14;668:28;658:38;;600:102;;;:::o;708:364::-;796:3;824:39;857:5;824:39;:::i;:::-;879:71;943:6;938:3;879:71;:::i;:::-;872:78;;959:52;1004:6;999:3;992:4;985:5;981:16;959:52;:::i;:::-;1036:29;1058:6;1036:29;:::i;:::-;1031:3;1027:39;1020:46;;800:272;708:364;;;;:::o;1078:313::-;1191:4;1229:2;1218:9;1214:18;1206:26;;1278:9;1272:4;1268:20;1264:1;1253:9;1249:17;1242:47;1306:78;1379:4;1370:6;1306:78;:::i;:::-;1298:86;;1078:313;;;;:::o;1478:117::-;1587:1;1584;1577:12;1724:126;1761:7;1801:42;1794:5;1790:54;1779:65;;1724:126;;;:::o;1856:96::-;1893:7;1922:24;1940:5;1922:24;:::i;:::-;1911:35;;1856:96;;;:::o;1958:122::-;2031:24;2049:5;2031:24;:::i;:::-;2024:5;2021:35;2011:63;;2070:1;2067;2060:12;2011:63;1958:122;:::o;2086:139::-;2132:5;2170:6;2157:20;2148:29;;2186:33;2213:5;2186:33;:::i;:::-;2086:139;;;;:::o;2231:77::-;2268:7;2297:5;2286:16;;2231:77;;;:::o;2314:122::-;2387:24;2405:5;2387:24;:::i;:::-;2380:5;2377:35;2367:63;;2426:1;2423;2416:12;2367:63;2314:122;:::o;2442:139::-;2488:5;2526:6;2513:20;2504:29;;2542:33;2569:5;2542:33;:::i;:::-;2442:139;;;;:::o;2587:474::-;2655:6;2663;2712:2;2700:9;2691:7;2687:23;2683:32;2680:119;;;2718:79;;:::i;:::-;2680:119;2838:1;2863:53;2908:7;2899:6;2888:9;2884:22;2863:53;:::i;:::-;2853:63;;2809:117;2965:2;2991:53;3036:7;3027:6;3016:9;3012:22;2991:53;:::i;:::-;2981:63;;2936:118;2587:474;;;;;:::o;3067:90::-;3101:7;3144:5;3137:13;3130:21;3119:32;;3067:90;;;:::o;3163:109::-;3244:21;3259:5;3244:21;:::i;:::-;3239:3;3232:34;3163:109;;:::o;3278:210::-;3365:4;3403:2;3392:9;3388:18;3380:26;;3416:65;3478:1;3467:9;3463:17;3454:6;3416:65;:::i;:::-;3278:210;;;;:::o;3494:118::-;3581:24;3599:5;3581:24;:::i;:::-;3576:3;3569:37;3494:118;;:::o;3618:222::-;3711:4;3749:2;3738:9;3734:18;3726:26;;3762:71;3830:1;3819:9;3815:17;3806:6;3762:71;:::i;:::-;3618:222;;;;:::o;3846:329::-;3905:6;3954:2;3942:9;3933:7;3929:23;3925:32;3922:119;;;3960:79;;:::i;:::-;3922:119;4080:1;4105:53;4150:7;4141:6;4130:9;4126:22;4105:53;:::i;:::-;4095:63;;4051:117;3846:329;;;;:::o;4181:619::-;4258:6;4266;4274;4323:2;4311:9;4302:7;4298:23;4294:32;4291:119;;;4329:79;;:::i;:::-;4291:119;4449:1;4474:53;4519:7;4510:6;4499:9;4495:22;4474:53;:::i;:::-;4464:63;;4420:117;4576:2;4602:53;4647:7;4638:6;4627:9;4623:22;4602:53;:::i;:::-;4592:63;;4547:118;4704:2;4730:53;4775:7;4766:6;4755:9;4751:22;4730:53;:::i;:::-;4720:63;;4675:118;4181:619;;;;;:::o;4806:86::-;4841:7;4881:4;4874:5;4870:16;4859:27;;4806:86;;;:::o;4898:112::-;4981:22;4997:5;4981:22;:::i;:::-;4976:3;4969:35;4898:112;;:::o;5016:214::-;5105:4;5143:2;5132:9;5128:18;5120:26;;5156:67;5220:1;5209:9;5205:17;5196:6;5156:67;:::i;:::-;5016:214;;;;:::o;5236:329::-;5295:6;5344:2;5332:9;5323:7;5319:23;5315:32;5312:119;;;5350:79;;:::i;:::-;5312:119;5470:1;5495:53;5540:7;5531:6;5520:9;5516:22;5495:53;:::i;:::-;5485:63;;5441:117;5236:329;;;;:::o;5571:118::-;5658:24;5676:5;5658:24;:::i;:::-;5653:3;5646:37;5571:118;;:::o;5695:222::-;5788:4;5826:2;5815:9;5811:18;5803:26;;5839:71;5907:1;5896:9;5892:17;5883:6;5839:71;:::i;:::-;5695:222;;;;:::o;5923:474::-;5991:6;5999;6048:2;6036:9;6027:7;6023:23;6019:32;6016:119;;;6054:79;;:::i;:::-;6016:119;6174:1;6199:53;6244:7;6235:6;6224:9;6220:22;6199:53;:::i;:::-;6189:63;;6145:117;6301:2;6327:53;6372:7;6363:6;6352:9;6348:22;6327:53;:::i;:::-;6317:63;;6272:118;5923:474;;;;;:::o;6403:180::-;6451:77;6448:1;6441:88;6548:4;6545:1;6538:15;6572:4;6569:1;6562:15;6589:320;6633:6;6670:1;6664:4;6660:12;6650:22;;6717:1;6711:4;6707:12;6738:18;6728:81;;6794:4;6786:6;6782:17;6772:27;;6728:81;6856:2;6848:6;6845:14;6825:18;6822:38;6819:84;;;6875:18;;:::i;:::-;6819:84;6640:269;6589:320;;;:::o;6915:182::-;7055:34;7051:1;7043:6;7039:14;7032:58;6915:182;:::o;7103:366::-;7245:3;7266:67;7330:2;7325:3;7266:67;:::i;:::-;7259:74;;7342:93;7431:3;7342:93;:::i;:::-;7460:2;7455:3;7451:12;7444:19;;7103:366;;;:::o;7475:419::-;7641:4;7679:2;7668:9;7664:18;7656:26;;7728:9;7722:4;7718:20;7714:1;7703:9;7699:17;7692:47;7756:131;7882:4;7756:131;:::i;:::-;7748:139;;7475:419;;;:::o;7900:180::-;7948:77;7945:1;7938:88;8045:4;8042:1;8035:15;8069:4;8066:1;8059:15;8086:348;8126:7;8149:20;8167:1;8149:20;:::i;:::-;8144:25;;8183:20;8201:1;8183:20;:::i;:::-;8178:25;;8371:1;8303:66;8299:74;8296:1;8293:81;8288:1;8281:9;8274:17;8270:105;8267:131;;;8378:18;;:::i;:::-;8267:131;8426:1;8423;8419:9;8408:20;;8086:348;;;;:::o;8440:179::-;8580:31;8576:1;8568:6;8564:14;8557:55;8440:179;:::o;8625:366::-;8767:3;8788:67;8852:2;8847:3;8788:67;:::i;:::-;8781:74;;8864:93;8953:3;8864:93;:::i;:::-;8982:2;8977:3;8973:12;8966:19;;8625:366;;;:::o;8997:419::-;9163:4;9201:2;9190:9;9186:18;9178:26;;9250:9;9244:4;9240:20;9236:1;9225:9;9221:17;9214:47;9278:131;9404:4;9278:131;:::i;:::-;9270:139;;8997:419;;;:::o;9422:305::-;9462:3;9481:20;9499:1;9481:20;:::i;:::-;9476:25;;9515:20;9533:1;9515:20;:::i;:::-;9510:25;;9669:1;9601:66;9597:74;9594:1;9591:81;9588:107;;;9675:18;;:::i;:::-;9588:107;9719:1;9716;9712:9;9705:16;;9422:305;;;;:::o;9733:220::-;9873:34;9869:1;9861:6;9857:14;9850:58;9942:3;9937:2;9929:6;9925:15;9918:28;9733:220;:::o;9959:366::-;10101:3;10122:67;10186:2;10181:3;10122:67;:::i;:::-;10115:74;;10198:93;10287:3;10198:93;:::i;:::-;10316:2;10311:3;10307:12;10300:19;;9959:366;;;:::o;10331:419::-;10497:4;10535:2;10524:9;10520:18;10512:26;;10584:9;10578:4;10574:20;10570:1;10559:9;10555:17;10548:47;10612:131;10738:4;10612:131;:::i;:::-;10604:139;;10331:419;;;:::o;10756:224::-;10896:34;10892:1;10884:6;10880:14;10873:58;10965:7;10960:2;10952:6;10948:15;10941:32;10756:224;:::o;10986:366::-;11128:3;11149:67;11213:2;11208:3;11149:67;:::i;:::-;11142:74;;11225:93;11314:3;11225:93;:::i;:::-;11343:2;11338:3;11334:12;11327:19;;10986:366;;;:::o;11358:419::-;11524:4;11562:2;11551:9;11547:18;11539:26;;11611:9;11605:4;11601:20;11597:1;11586:9;11582:17;11575:47;11639:131;11765:4;11639:131;:::i;:::-;11631:139;;11358:419;;;:::o;11783:175::-;11923:27;11919:1;11911:6;11907:14;11900:51;11783:175;:::o;11964:366::-;12106:3;12127:67;12191:2;12186:3;12127:67;:::i;:::-;12120:74;;12203:93;12292:3;12203:93;:::i;:::-;12321:2;12316:3;12312:12;12305:19;;11964:366;;;:::o;12336:419::-;12502:4;12540:2;12529:9;12525:18;12517:26;;12589:9;12583:4;12579:20;12575:1;12564:9;12560:17;12553:47;12617:131;12743:4;12617:131;:::i;:::-;12609:139;;12336:419;;;:::o;12761:225::-;12901:34;12897:1;12889:6;12885:14;12878:58;12970:8;12965:2;12957:6;12953:15;12946:33;12761:225;:::o;12992:366::-;13134:3;13155:67;13219:2;13214:3;13155:67;:::i;:::-;13148:74;;13231:93;13320:3;13231:93;:::i;:::-;13349:2;13344:3;13340:12;13333:19;;12992:366;;;:::o;13364:419::-;13530:4;13568:2;13557:9;13553:18;13545:26;;13617:9;13611:4;13607:20;13603:1;13592:9;13588:17;13581:47;13645:131;13771:4;13645:131;:::i;:::-;13637:139;;13364:419;;;:::o;13789:223::-;13929:34;13925:1;13917:6;13913:14;13906:58;13998:6;13993:2;13985:6;13981:15;13974:31;13789:223;:::o;14018:366::-;14160:3;14181:67;14245:2;14240:3;14181:67;:::i;:::-;14174:74;;14257:93;14346:3;14257:93;:::i;:::-;14375:2;14370:3;14366:12;14359:19;;14018:366;;;:::o;14390:419::-;14556:4;14594:2;14583:9;14579:18;14571:26;;14643:9;14637:4;14633:20;14629:1;14618:9;14614:17;14607:47;14671:131;14797:4;14671:131;:::i;:::-;14663:139;;14390:419;;;:::o;14815:221::-;14955:34;14951:1;14943:6;14939:14;14932:58;15024:4;15019:2;15011:6;15007:15;15000:29;14815:221;:::o;15042:366::-;15184:3;15205:67;15269:2;15264:3;15205:67;:::i;:::-;15198:74;;15281:93;15370:3;15281:93;:::i;:::-;15399:2;15394:3;15390:12;15383:19;;15042:366;;;:::o;15414:419::-;15580:4;15618:2;15607:9;15603:18;15595:26;;15667:9;15661:4;15657:20;15653:1;15642:9;15638:17;15631:47;15695:131;15821:4;15695:131;:::i;:::-;15687:139;;15414:419;;;:::o;15839:179::-;15979:31;15975:1;15967:6;15963:14;15956:55;15839:179;:::o;16024:366::-;16166:3;16187:67;16251:2;16246:3;16187:67;:::i;:::-;16180:74;;16263:93;16352:3;16263:93;:::i;:::-;16381:2;16376:3;16372:12;16365:19;;16024:366;;;:::o;16396:419::-;16562:4;16600:2;16589:9;16585:18;16577:26;;16649:9;16643:4;16639:20;16635:1;16624:9;16620:17;16613:47;16677:131;16803:4;16677:131;:::i;:::-;16669:139;;16396:419;;;:::o;16821:233::-;16860:3;16883:24;16901:5;16883:24;:::i;:::-;16874:33;;16929:66;16922:5;16919:77;16916:103;;;16999:18;;:::i;:::-;16916:103;17046:1;17039:5;17035:13;17028:20;;16821:233;;;:::o;17060:191::-;17100:4;17120:20;17138:1;17120:20;:::i;:::-;17115:25;;17154:20;17172:1;17154:20;:::i;:::-;17149:25;;17193:1;17190;17187:8;17184:34;;;17198:18;;:::i;:::-;17184:34;17243:1;17240;17236:9;17228:17;;17060:191;;;;:::o;17257:224::-;17397:34;17393:1;17385:6;17381:14;17374:58;17466:7;17461:2;17453:6;17449:15;17442:32;17257:224;:::o;17487:366::-;17629:3;17650:67;17714:2;17709:3;17650:67;:::i;:::-;17643:74;;17726:93;17815:3;17726:93;:::i;:::-;17844:2;17839:3;17835:12;17828:19;;17487:366;;;:::o;17859:419::-;18025:4;18063:2;18052:9;18048:18;18040:26;;18112:9;18106:4;18102:20;18098:1;18087:9;18083:17;18076:47;18140:131;18266:4;18140:131;:::i;:::-;18132:139;;17859:419;;;:::o;18284:222::-;18424:34;18420:1;18412:6;18408:14;18401:58;18493:5;18488:2;18480:6;18476:15;18469:30;18284:222;:::o;18512:366::-;18654:3;18675:67;18739:2;18734:3;18675:67;:::i;:::-;18668:74;;18751:93;18840:3;18751:93;:::i;:::-;18869:2;18864:3;18860:12;18853:19;;18512:366;;;:::o;18884:419::-;19050:4;19088:2;19077:9;19073:18;19065:26;;19137:9;19131:4;19127:20;19123:1;19112:9;19108:17;19101:47;19165:131;19291:4;19165:131;:::i;:::-;19157:139;;18884:419;;;:::o;19309:225::-;19449:34;19445:1;19437:6;19433:14;19426:58;19518:8;19513:2;19505:6;19501:15;19494:33;19309:225;:::o;19540:366::-;19682:3;19703:67;19767:2;19762:3;19703:67;:::i;:::-;19696:74;;19779:93;19868:3;19779:93;:::i;:::-;19897:2;19892:3;19888:12;19881:19;;19540:366;;;:::o;19912:419::-;20078:4;20116:2;20105:9;20101:18;20093:26;;20165:9;20159:4;20155:20;20151:1;20140:9;20136:17;20129:47;20193:131;20319:4;20193:131;:::i;:::-;20185:139;;19912:419;;;:::o;20337:222::-;20477:34;20473:1;20465:6;20461:14;20454:58;20546:5;20541:2;20533:6;20529:15;20522:30;20337:222;:::o;20565:366::-;20707:3;20728:67;20792:2;20787:3;20728:67;:::i;:::-;20721:74;;20804:93;20893:3;20804:93;:::i;:::-;20922:2;20917:3;20913:12;20906:19;;20565:366;;;:::o;20937:419::-;21103:4;21141:2;21130:9;21126:18;21118:26;;21190:9;21184:4;21180:20;21176:1;21165:9;21161:17;21154:47;21218:131;21344:4;21218:131;:::i;:::-;21210:139;;20937:419;;;:::o;21362:179::-;21502:31;21498:1;21490:6;21486:14;21479:55;21362:179;:::o;21547:366::-;21689:3;21710:67;21774:2;21769:3;21710:67;:::i;:::-;21703:74;;21786:93;21875:3;21786:93;:::i;:::-;21904:2;21899:3;21895:12;21888:19;;21547:366;;;:::o;21919:419::-;22085:4;22123:2;22112:9;22108:18;22100:26;;22172:9;22166:4;22162:20;22158:1;22147:9;22143:17;22136:47;22200:131;22326:4;22200:131;:::i;:::-;22192:139;;21919:419;;;:::o;22344:174::-;22484:26;22480:1;22472:6;22468:14;22461:50;22344:174;:::o;22524:366::-;22666:3;22687:67;22751:2;22746:3;22687:67;:::i;:::-;22680:74;;22763:93;22852:3;22763:93;:::i;:::-;22881:2;22876:3;22872:12;22865:19;;22524:366;;;:::o;22896:419::-;23062:4;23100:2;23089:9;23085:18;23077:26;;23149:9;23143:4;23139:20;23135:1;23124:9;23120:17;23113:47;23177:131;23303:4;23177:131;:::i;:::-;23169:139;;22896:419;;;:::o;23321:180::-;23369:77;23366:1;23359:88;23466:4;23463:1;23456:15;23490:4;23487:1;23480:15;23507:185;23547:1;23564:20;23582:1;23564:20;:::i;:::-;23559:25;;23598:20;23616:1;23598:20;:::i;:::-;23593:25;;23637:1;23627:35;;23642:18;;:::i;:::-;23627:35;23684:1;23681;23677:9;23672:14;;23507:185;;;;:::o;23698:180::-;23746:77;23743:1;23736:88;23843:4;23840:1;23833:15;23867:4;23864:1;23857:15;23884:180;23932:77;23929:1;23922:88;24029:4;24026:1;24019:15;24053:4;24050:1;24043:15;24070:143;24127:5;24158:6;24152:13;24143:22;;24174:33;24201:5;24174:33;:::i;:::-;24070:143;;;;:::o;24219:351::-;24289:6;24338:2;24326:9;24317:7;24313:23;24309:32;24306:119;;;24344:79;;:::i;:::-;24306:119;24464:1;24489:64;24545:7;24536:6;24525:9;24521:22;24489:64;:::i;:::-;24479:74;;24435:128;24219:351;;;;:::o;24576:85::-;24621:7;24650:5;24639:16;;24576:85;;;:::o;24667:60::-;24695:3;24716:5;24709:12;;24667:60;;;:::o;24733:158::-;24791:9;24824:61;24842:42;24851:32;24877:5;24851:32;:::i;:::-;24842:42;:::i;:::-;24824:61;:::i;:::-;24811:74;;24733:158;;;:::o;24897:147::-;24992:45;25031:5;24992:45;:::i;:::-;24987:3;24980:58;24897:147;;:::o;25050:114::-;25117:6;25151:5;25145:12;25135:22;;25050:114;;;:::o;25170:184::-;25269:11;25303:6;25298:3;25291:19;25343:4;25338:3;25334:14;25319:29;;25170:184;;;;:::o;25360:132::-;25427:4;25450:3;25442:11;;25480:4;25475:3;25471:14;25463:22;;25360:132;;;:::o;25498:108::-;25575:24;25593:5;25575:24;:::i;:::-;25570:3;25563:37;25498:108;;:::o;25612:179::-;25681:10;25702:46;25744:3;25736:6;25702:46;:::i;:::-;25780:4;25775:3;25771:14;25757:28;;25612:179;;;;:::o;25797:113::-;25867:4;25899;25894:3;25890:14;25882:22;;25797:113;;;:::o;25946:732::-;26065:3;26094:54;26142:5;26094:54;:::i;:::-;26164:86;26243:6;26238:3;26164:86;:::i;:::-;26157:93;;26274:56;26324:5;26274:56;:::i;:::-;26353:7;26384:1;26369:284;26394:6;26391:1;26388:13;26369:284;;;26470:6;26464:13;26497:63;26556:3;26541:13;26497:63;:::i;:::-;26490:70;;26583:60;26636:6;26583:60;:::i;:::-;26573:70;;26429:224;26416:1;26413;26409:9;26404:14;;26369:284;;;26373:14;26669:3;26662:10;;26070:608;;;25946:732;;;;:::o;26684:831::-;26947:4;26985:3;26974:9;26970:19;26962:27;;26999:71;27067:1;27056:9;27052:17;27043:6;26999:71;:::i;:::-;27080:80;27156:2;27145:9;27141:18;27132:6;27080:80;:::i;:::-;27207:9;27201:4;27197:20;27192:2;27181:9;27177:18;27170:48;27235:108;27338:4;27329:6;27235:108;:::i;:::-;27227:116;;27353:72;27421:2;27410:9;27406:18;27397:6;27353:72;:::i;:::-;27435:73;27503:3;27492:9;27488:19;27479:6;27435:73;:::i;:::-;26684:831;;;;;;;;:::o

Swarm Source

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