Token Anura DAO

Overview ERC20

Price
$0.00 @ 0.000000 AVAX
Fully Diluted Market Cap
Total Supply:
1,000,000,000 ANURA

Holders:
110 addresses

Transfers:
-

Contract:
0x7f82a91c214b50c6179a8806ae0f4b7415e9b7d70x7f82a91C214B50c6179A8806Ae0F4B7415E9b7D7

Decimals:
18

Social Profiles:
Not Available, Update ?

Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
AnuraDAO

Compiler Version
v0.8.2+commit.661d1103

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at snowtrace.io on 2021-12-18
*/

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

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

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

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

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a / b + (a % b == 0 ? 0 : 1);
    }
}

/**
 * @dev Collection of functions related to array types.
 */
library Arrays {
    /**
     * @dev Searches a sorted `array` and returns the first index that contains
     * a value greater or equal to `element`. If no such index exists (i.e. all
     * values in the array are strictly less than `element`), the array length is
     * returned. Time complexity O(log n).
     *
     * `array` is expected to be sorted in ascending order, and to contain no
     * repeated elements.
     */
    function findUpperBound(uint256[] storage array, uint256 element) internal view returns (uint256) {
        if (array.length == 0) {
            return 0;
        }

        uint256 low = 0;
        uint256 high = array.length;

        while (low < high) {
            uint256 mid = Math.average(low, high);

            // Note that mid will always be strictly less than high (i.e. it will be a valid array index)
            // because Math.average rounds down (it does integer division with truncation).
            if (array[mid] > element) {
                high = mid;
            } else {
                low = mid + 1;
            }
        }

        // At this point `low` is the exclusive upper bound. We will return the inclusive upper bound.
        if (low > 0 && array[low - 1] == element) {
            return low - 1;
        } else {
            return low;
        }
    }
}


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

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _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 `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

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

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

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

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

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

/**
 * @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:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

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

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

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - 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) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][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) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(_msgSender(), 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:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `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 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 {}
}

/**
 * @dev This contract extends an ERC20 token with a snapshot mechanism. When a snapshot is created, the balances and
 * total supply at the time are recorded for later access.
 *
 * This can be used to safely create mechanisms based on token balances such as trustless dividends or weighted voting.
 * In naive implementations it's possible to perform a "double spend" attack by reusing the same balance from different
 * accounts. By using snapshots to calculate dividends or voting power, those attacks no longer apply. It can also be
 * used to create an efficient ERC20 forking mechanism.
 *
 * Snapshots are created by the internal {_snapshot} function, which will emit the {Snapshot} event and return a
 * snapshot id. To get the total supply at the time of a snapshot, call the function {totalSupplyAt} with the snapshot
 * id. To get the balance of an account at the time of a snapshot, call the {balanceOfAt} function with the snapshot id
 * and the account address.
 *
 * NOTE: Snapshot policy can be customized by overriding the {_getCurrentSnapshotId} method. For example, having it
 * return `block.number` will trigger the creation of snapshot at the begining of each new block. When overridding this
 * function, be careful about the monotonicity of its result. Non-monotonic snapshot ids will break the contract.
 *
 * Implementing snapshots for every block using this method will incur significant gas costs. For a gas-efficient
 * alternative consider {ERC20Votes}.
 *
 * ==== Gas Costs
 *
 * Snapshots are efficient. Snapshot creation is _O(1)_. Retrieval of balances or total supply from a snapshot is _O(log
 * n)_ in the number of snapshots that have been created, although _n_ for a specific account will generally be much
 * smaller since identical balances in subsequent snapshots are stored as a single entry.
 *
 * There is a constant overhead for normal ERC20 transfers due to the additional snapshot bookkeeping. This overhead is
 * only significant for the first transfer that immediately follows a snapshot for a particular account. Subsequent
 * transfers will have normal cost until the next snapshot, and so on.
 */

abstract contract ERC20Snapshot is ERC20 {
    // Inspired by Jordi Baylina's MiniMeToken to record historical balances:
    // https://github.com/Giveth/minimd/blob/ea04d950eea153a04c51fa510b068b9dded390cb/contracts/MiniMeToken.sol

    using Arrays for uint256[];
    using Counters for Counters.Counter;

    // Snapshotted values have arrays of ids and the value corresponding to that id. These could be an array of a
    // Snapshot struct, but that would impede usage of functions that work on an array.
    struct Snapshots {
        uint256[] ids;
        uint256[] values;
    }

    mapping(address => Snapshots) private _accountBalanceSnapshots;
    Snapshots private _totalSupplySnapshots;

    // Snapshot ids increase monotonically, with the first value being 1. An id of 0 is invalid.
    Counters.Counter private _currentSnapshotId;

    /**
     * @dev Emitted by {_snapshot} when a snapshot identified by `id` is created.
     */
    event Snapshot(uint256 id);

    /**
     * @dev Creates a new snapshot and returns its snapshot id.
     *
     * Emits a {Snapshot} event that contains the same id.
     *
     * {_snapshot} is `internal` and you have to decide how to expose it externally. Its usage may be restricted to a
     * set of accounts, for example using {AccessControl}, or it may be open to the public.
     *
     * [WARNING]
     * ====
     * While an open way of calling {_snapshot} is required for certain trust minimization mechanisms such as forking,
     * you must consider that it can potentially be used by attackers in two ways.
     *
     * First, it can be used to increase the cost of retrieval of values from snapshots, although it will grow
     * logarithmically thus rendering this attack ineffective in the long term. Second, it can be used to target
     * specific accounts and increase the cost of ERC20 transfers for them, in the ways specified in the Gas Costs
     * section above.
     *
     * We haven't measured the actual numbers; if this is something you're interested in please reach out to us.
     * ====
     */
    function _snapshot() internal virtual returns (uint256) {
        _currentSnapshotId.increment();

        uint256 currentId = _getCurrentSnapshotId();
        emit Snapshot(currentId);
        return currentId;
    }

    /**
     * @dev Get the current snapshotId
     */
    function _getCurrentSnapshotId() internal view virtual returns (uint256) {
        return _currentSnapshotId.current();
    }

    /**
     * @dev Retrieves the balance of `account` at the time `snapshotId` was created.
     */
    function balanceOfAt(address account, uint256 snapshotId) public view virtual returns (uint256) {
        (bool snapshotted, uint256 value) = _valueAt(snapshotId, _accountBalanceSnapshots[account]);

        return snapshotted ? value : balanceOf(account);
    }

    /**
     * @dev Retrieves the total supply at the time `snapshotId` was created.
     */
    function totalSupplyAt(uint256 snapshotId) public view virtual returns (uint256) {
        (bool snapshotted, uint256 value) = _valueAt(snapshotId, _totalSupplySnapshots);

        return snapshotted ? value : totalSupply();
    }

    // Update balance and/or total supply snapshots before the values are modified. This is implemented
    // in the _beforeTokenTransfer hook, which is executed for _mint, _burn, and _transfer operations.
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, amount);

        if (from == address(0)) {
            // mint
            _updateAccountSnapshot(to);
            _updateTotalSupplySnapshot();
        } else if (to == address(0)) {
            // burn
            _updateAccountSnapshot(from);
            _updateTotalSupplySnapshot();
        } else {
            // transfer
            _updateAccountSnapshot(from);
            _updateAccountSnapshot(to);
        }
    }

    function _valueAt(uint256 snapshotId, Snapshots storage snapshots) private view returns (bool, uint256) {
        require(snapshotId > 0, "ERC20Snapshot: id is 0");
        require(snapshotId <= _getCurrentSnapshotId(), "ERC20Snapshot: nonexistent id");

        // When a valid snapshot is queried, there are three possibilities:
        //  a) The queried value was not modified after the snapshot was taken. Therefore, a snapshot entry was never
        //  created for this id, and all stored snapshot ids are smaller than the requested one. The value that corresponds
        //  to this id is the current one.
        //  b) The queried value was modified after the snapshot was taken. Therefore, there will be an entry with the
        //  requested id, and its value is the one to return.
        //  c) More snapshots were created after the requested one, and the queried value was later modified. There will be
        //  no entry for the requested id: the value that corresponds to it is that of the smallest snapshot id that is
        //  larger than the requested one.
        //
        // In summary, we need to find an element in an array, returning the index of the smallest value that is larger if
        // it is not found, unless said value doesn't exist (e.g. when all values are smaller). Arrays.findUpperBound does
        // exactly this.

        uint256 index = snapshots.ids.findUpperBound(snapshotId);

        if (index == snapshots.ids.length) {
            return (false, 0);
        } else {
            return (true, snapshots.values[index]);
        }
    }

    function _updateAccountSnapshot(address account) private {
        _updateSnapshot(_accountBalanceSnapshots[account], balanceOf(account));
    }

    function _updateTotalSupplySnapshot() private {
        _updateSnapshot(_totalSupplySnapshots, totalSupply());
    }

    function _updateSnapshot(Snapshots storage snapshots, uint256 currentValue) private {
        uint256 currentId = _getCurrentSnapshotId();
        if (_lastSnapshotId(snapshots.ids) < currentId) {
            snapshots.ids.push(currentId);
            snapshots.values.push(currentValue);
        }
    }

    function _lastSnapshotId(uint256[] storage ids) private view returns (uint256) {
        if (ids.length == 0) {
            return 0;
        } else {
            return ids[ids.length - 1];
        }
    }
}

/**
 * @dev Extension of {ERC20} that allows token holders to destroy both their own
 * tokens and those that they have an allowance for, in a way that can be
 * recognized off-chain (via event analysis).
 */
abstract contract ERC20Burnable is Context, ERC20 {
    /**
     * @dev Destroys `amount` tokens from the caller.
     *
     * See {ERC20-_burn}.
     */
    function burn(uint256 amount) public virtual {
        _burn(_msgSender(), amount);
    }

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

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}


contract AnuraDAO is ERC20, ERC20Burnable, ERC20Snapshot, Ownable, Pausable {
    constructor() ERC20("Anura DAO", "ANURA") {}

    function snapshot() public onlyOwner {
        _snapshot();
    }

    function pause() public onlyOwner {
        _pause();
    }

    function unpause() public onlyOwner {
        _unpause();
    }

    function mint(address to, uint256 amount) public onlyOwner {
        _mint(to, amount);
    }

    function _beforeTokenTransfer(address from, address to, uint256 amount)
        internal
        whenNotPaused
        override(ERC20, ERC20Snapshot)
    {
        super._beforeTokenTransfer(from, to, amount);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Snapshot","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"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":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"snapshotId","type":"uint256"}],"name":"balanceOfAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"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":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","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":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"snapshot","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":"uint256","name":"snapshotId","type":"uint256"}],"name":"totalSupplyAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040518060400160405280600981526020017f416e7572612044414f00000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f414e555241000000000000000000000000000000000000000000000000000000815250816003908051906020019062000096929190620001c1565b508060049080519060200190620000af929190620001c1565b505050620000d2620000c6620000f360201b60201c565b620000fb60201b60201c565b6000600960146101000a81548160ff021916908315150217905550620002d6565b600033905090565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001cf9062000271565b90600052602060002090601f016020900481019282620001f357600085556200023f565b82601f106200020e57805160ff19168380011785556200023f565b828001600101855582156200023f579182015b828111156200023e57825182559160200191906001019062000221565b5b5090506200024e919062000252565b5090565b5b808211156200026d57600081600090555060010162000253565b5090565b600060028204905060018216806200028a57607f821691505b60208210811415620002a157620002a0620002a7565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b612ace80620002e66000396000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c806370a08231116100c35780639711715a1161007c5780639711715a14610368578063981b24d014610372578063a457c2d7146103a2578063a9059cbb146103d2578063dd62ed3e14610402578063f2fde38b146104325761014d565b806370a08231146102cc578063715018a6146102fc57806379cc6790146103065780638456cb59146103225780638da5cb5b1461032c57806395d89b411461034a5761014d565b80633950935111610115578063395093511461020c5780633f4ba83a1461023c57806340c10f191461024657806342966c68146102625780634ee2cd7e1461027e5780635c975abb146102ae5761014d565b806306fdde0314610152578063095ea7b31461017057806318160ddd146101a057806323b872dd146101be578063313ce567146101ee575b600080fd5b61015a61044e565b6040516101679190612168565b60405180910390f35b61018a60048036038101906101859190611e05565b6104e0565b604051610197919061214d565b60405180910390f35b6101a86104fe565b6040516101b591906123aa565b60405180910390f35b6101d860048036038101906101d39190611db6565b610508565b6040516101e5919061214d565b60405180910390f35b6101f6610600565b60405161020391906123c5565b60405180910390f35b61022660048036038101906102219190611e05565b610609565b604051610233919061214d565b60405180910390f35b6102446106b5565b005b610260600480360381019061025b9190611e05565b61073b565b005b61027c60048036038101906102779190611e41565b6107c5565b005b61029860048036038101906102939190611e05565b6107d9565b6040516102a591906123aa565b60405180910390f35b6102b6610849565b6040516102c3919061214d565b60405180910390f35b6102e660048036038101906102e19190611d51565b610860565b6040516102f391906123aa565b60405180910390f35b6103046108a8565b005b610320600480360381019061031b9190611e05565b610930565b005b61032a6109ab565b005b610334610a31565b6040516103419190612132565b60405180910390f35b610352610a5b565b60405161035f9190612168565b60405180910390f35b610370610aed565b005b61038c60048036038101906103879190611e41565b610b74565b60405161039991906123aa565b60405180910390f35b6103bc60048036038101906103b79190611e05565b610ba5565b6040516103c9919061214d565b60405180910390f35b6103ec60048036038101906103e79190611e05565b610c90565b6040516103f9919061214d565b60405180910390f35b61041c60048036038101906104179190611d7a565b610cae565b60405161042991906123aa565b60405180910390f35b61044c60048036038101906104479190611d51565b610d35565b005b60606003805461045d9061253f565b80601f01602080910402602001604051908101604052809291908181526020018280546104899061253f565b80156104d65780601f106104ab576101008083540402835291602001916104d6565b820191906000526020600020905b8154815290600101906020018083116104b957829003601f168201915b5050505050905090565b60006104f46104ed610e2d565b8484610e35565b6001905092915050565b6000600254905090565b6000610515848484611000565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610560610e2d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156105e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d79061228a565b60405180910390fd5b6105f4856105ec610e2d565b858403610e35565b60019150509392505050565b60006012905090565b60006106ab610616610e2d565b848460016000610624610e2d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546106a691906123fc565b610e35565b6001905092915050565b6106bd610e2d565b73ffffffffffffffffffffffffffffffffffffffff166106db610a31565b73ffffffffffffffffffffffffffffffffffffffff1614610731576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610728906122aa565b60405180910390fd5b610739611281565b565b610743610e2d565b73ffffffffffffffffffffffffffffffffffffffff16610761610a31565b73ffffffffffffffffffffffffffffffffffffffff16146107b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ae906122aa565b60405180910390fd5b6107c18282611323565b5050565b6107d66107d0610e2d565b82611483565b50565b600080600061082684600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061165a565b915091508161083d5761083885610860565b61083f565b805b9250505092915050565b6000600960149054906101000a900460ff16905090565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6108b0610e2d565b73ffffffffffffffffffffffffffffffffffffffff166108ce610a31565b73ffffffffffffffffffffffffffffffffffffffff1614610924576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091b906122aa565b60405180910390fd5b61092e6000611776565b565b60006109438361093e610e2d565b610cae565b905081811015610988576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097f906122ca565b60405180910390fd5b61099c83610994610e2d565b848403610e35565b6109a68383611483565b505050565b6109b3610e2d565b73ffffffffffffffffffffffffffffffffffffffff166109d1610a31565b73ffffffffffffffffffffffffffffffffffffffff1614610a27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1e906122aa565b60405180910390fd5b610a2f61183c565b565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610a6a9061253f565b80601f0160208091040260200160405190810160405280929190818152602001828054610a969061253f565b8015610ae35780601f10610ab857610100808354040283529160200191610ae3565b820191906000526020600020905b815481529060010190602001808311610ac657829003601f168201915b5050505050905090565b610af5610e2d565b73ffffffffffffffffffffffffffffffffffffffff16610b13610a31565b73ffffffffffffffffffffffffffffffffffffffff1614610b69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b60906122aa565b60405180910390fd5b610b716118df565b50565b6000806000610b8484600661165a565b9150915081610b9a57610b956104fe565b610b9c565b805b92505050919050565b60008060016000610bb4610e2d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610c71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c689061236a565b60405180910390fd5b610c85610c7c610e2d565b85858403610e35565b600191505092915050565b6000610ca4610c9d610e2d565b8484611000565b6001905092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610d3d610e2d565b73ffffffffffffffffffffffffffffffffffffffff16610d5b610a31565b73ffffffffffffffffffffffffffffffffffffffff1614610db1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da8906122aa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e189061220a565b60405180910390fd5b610e2a81611776565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ea5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9c9061232a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0c9061222a565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610ff391906123aa565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611070576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110679061230a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d7906121aa565b60405180910390fd5b6110eb838383611935565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611171576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111689061224a565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461120491906123fc565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161126891906123aa565b60405180910390a361127b84848461198d565b50505050565b611289610849565b6112c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112bf906121ca565b60405180910390fd5b6000600960146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61130c610e2d565b6040516113199190612132565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611393576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138a9061238a565b60405180910390fd5b61139f60008383611935565b80600260008282546113b191906123fc565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461140691906123fc565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161146b91906123aa565b60405180910390a361147f6000838361198d565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ea906122ea565b60405180910390fd5b6114ff82600083611935565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611585576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157c906121ea565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282546115dc9190612483565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161164191906123aa565b60405180910390a36116558360008461198d565b505050565b600080600084116116a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116979061234a565b60405180910390fd5b6116a8611992565b8411156116ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e19061218a565b60405180910390fd5b600061170285856000016119a390919063ffffffff16565b9050836000018054905081141561172057600080925092505061176f565b600184600101828154811061175e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015492509250505b9250929050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611844610849565b15611884576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187b9061226a565b60405180910390fd5b6001600960146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586118c8610e2d565b6040516118d59190612132565b60405180910390a1565b60006118eb6008611ac9565b60006118f5611992565b90507f8030e83b04d87bef53480e26263266d6ca66863aa8506aca6f2559d18aa1cb678160405161192691906123aa565b60405180910390a18091505090565b61193d610849565b1561197d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119749061226a565b60405180910390fd5b611988838383611adf565b505050565b505050565b600061199e6008611b99565b905090565b600080838054905014156119ba5760009050611ac3565b600080848054905090505b80821015611a445760006119d98383611ba7565b905084868281548110611a15577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001541115611a2e57809150611a3e565b600181611a3b91906123fc565b92505b506119c5565b600082118015611aa257508385600184611a5e9190612483565b81548110611a95577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154145b15611abd57600182611ab49190612483565b92505050611ac3565b81925050505b92915050565b6001816000016000828254019250508190555050565b611aea838383611bcd565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611b3557611b2882611bd2565b611b30611c25565b611b94565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b8057611b7383611bd2565b611b7b611c25565b611b93565b611b8983611bd2565b611b9282611bd2565b5b5b505050565b600081600001549050919050565b60006002828418611bb89190612452565b828416611bc591906123fc565b905092915050565b505050565b611c22600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611c1d83610860565b611c39565b50565b611c376006611c326104fe565b611c39565b565b6000611c43611992565b905080611c5284600001611cb4565b1015611caf5782600001819080600181540180825580915050600190039060005260206000200160009091909190915055826001018290806001815401808255809150506001900390600052602060002001600090919091909150555b505050565b60008082805490501415611ccb5760009050611d22565b8160018380549050611cdd9190612483565b81548110611d14577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490505b919050565b600081359050611d3681612a6a565b92915050565b600081359050611d4b81612a81565b92915050565b600060208284031215611d6357600080fd5b6000611d7184828501611d27565b91505092915050565b60008060408385031215611d8d57600080fd5b6000611d9b85828601611d27565b9250506020611dac85828601611d27565b9150509250929050565b600080600060608486031215611dcb57600080fd5b6000611dd986828701611d27565b9350506020611dea86828701611d27565b9250506040611dfb86828701611d3c565b9150509250925092565b60008060408385031215611e1857600080fd5b6000611e2685828601611d27565b9250506020611e3785828601611d3c565b9150509250929050565b600060208284031215611e5357600080fd5b6000611e6184828501611d3c565b91505092915050565b611e73816124b7565b82525050565b611e82816124c9565b82525050565b6000611e93826123e0565b611e9d81856123eb565b9350611ead81856020860161250c565b611eb6816125fe565b840191505092915050565b6000611ece601d836123eb565b9150611ed98261260f565b602082019050919050565b6000611ef16023836123eb565b9150611efc82612638565b604082019050919050565b6000611f146014836123eb565b9150611f1f82612687565b602082019050919050565b6000611f376022836123eb565b9150611f42826126b0565b604082019050919050565b6000611f5a6026836123eb565b9150611f65826126ff565b604082019050919050565b6000611f7d6022836123eb565b9150611f888261274e565b604082019050919050565b6000611fa06026836123eb565b9150611fab8261279d565b604082019050919050565b6000611fc36010836123eb565b9150611fce826127ec565b602082019050919050565b6000611fe66028836123eb565b9150611ff182612815565b604082019050919050565b60006120096020836123eb565b915061201482612864565b602082019050919050565b600061202c6024836123eb565b91506120378261288d565b604082019050919050565b600061204f6021836123eb565b915061205a826128dc565b604082019050919050565b60006120726025836123eb565b915061207d8261292b565b604082019050919050565b60006120956024836123eb565b91506120a08261297a565b604082019050919050565b60006120b86016836123eb565b91506120c3826129c9565b602082019050919050565b60006120db6025836123eb565b91506120e6826129f2565b604082019050919050565b60006120fe601f836123eb565b915061210982612a41565b602082019050919050565b61211d816124f5565b82525050565b61212c816124ff565b82525050565b60006020820190506121476000830184611e6a565b92915050565b60006020820190506121626000830184611e79565b92915050565b600060208201905081810360008301526121828184611e88565b905092915050565b600060208201905081810360008301526121a381611ec1565b9050919050565b600060208201905081810360008301526121c381611ee4565b9050919050565b600060208201905081810360008301526121e381611f07565b9050919050565b6000602082019050818103600083015261220381611f2a565b9050919050565b6000602082019050818103600083015261222381611f4d565b9050919050565b6000602082019050818103600083015261224381611f70565b9050919050565b6000602082019050818103600083015261226381611f93565b9050919050565b6000602082019050818103600083015261228381611fb6565b9050919050565b600060208201905081810360008301526122a381611fd9565b9050919050565b600060208201905081810360008301526122c381611ffc565b9050919050565b600060208201905081810360008301526122e38161201f565b9050919050565b6000602082019050818103600083015261230381612042565b9050919050565b6000602082019050818103600083015261232381612065565b9050919050565b6000602082019050818103600083015261234381612088565b9050919050565b60006020820190508181036000830152612363816120ab565b9050919050565b60006020820190508181036000830152612383816120ce565b9050919050565b600060208201905081810360008301526123a3816120f1565b9050919050565b60006020820190506123bf6000830184612114565b92915050565b60006020820190506123da6000830184612123565b92915050565b600081519050919050565b600082825260208201905092915050565b6000612407826124f5565b9150612412836124f5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561244757612446612571565b5b828201905092915050565b600061245d826124f5565b9150612468836124f5565b925082612478576124776125a0565b5b828204905092915050565b600061248e826124f5565b9150612499836124f5565b9250828210156124ac576124ab612571565b5b828203905092915050565b60006124c2826124d5565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b8381101561252a57808201518184015260208101905061250f565b83811115612539576000848401525b50505050565b6000600282049050600182168061255757607f821691505b6020821081141561256b5761256a6125cf565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b7f4552433230536e617073686f743a206e6f6e6578697374656e74206964000000600082015250565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f7760008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433230536e617073686f743a206964206973203000000000000000000000600082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b612a73816124b7565b8114612a7e57600080fd5b50565b612a8a816124f5565b8114612a9557600080fd5b5056fea2646970667358221220d24abfa058793616c7a25ecf888d272f705b2397d96ae170a1965cd7d51d304464736f6c63430008020033

Deployed ByteCode Sourcemap

34410:679:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12372:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14539:169;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13492:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15190:492;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13334:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16091:215;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34689:65;;;:::i;:::-;;34762:95;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31454:91;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27180:266;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33222:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13663:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6284:103;;;:::i;:::-;;31864:368;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34620:61;;;:::i;:::-;;5633:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12591:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34545:67;;;:::i;:::-;;27550:234;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16809:413;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14003:175;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14241:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6542:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12372:100;12426:13;12459:5;12452:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12372:100;:::o;14539:169::-;14622:4;14639:39;14648:12;:10;:12::i;:::-;14662:7;14671:6;14639:8;:39::i;:::-;14696:4;14689:11;;14539:169;;;;:::o;13492:108::-;13553:7;13580:12;;13573:19;;13492:108;:::o;15190:492::-;15330:4;15347:36;15357:6;15365:9;15376:6;15347:9;:36::i;:::-;15396:24;15423:11;:19;15435:6;15423:19;;;;;;;;;;;;;;;:33;15443:12;:10;:12::i;:::-;15423:33;;;;;;;;;;;;;;;;15396:60;;15495:6;15475:16;:26;;15467:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;15582:57;15591:6;15599:12;:10;:12::i;:::-;15632:6;15613:16;:25;15582:8;:57::i;:::-;15670:4;15663:11;;;15190:492;;;;;:::o;13334:93::-;13392:5;13417:2;13410:9;;13334:93;:::o;16091:215::-;16179:4;16196:80;16205:12;:10;:12::i;:::-;16219:7;16265:10;16228:11;:25;16240:12;:10;:12::i;:::-;16228:25;;;;;;;;;;;;;;;:34;16254:7;16228:34;;;;;;;;;;;;;;;;:47;;;;:::i;:::-;16196:8;:80::i;:::-;16294:4;16287:11;;16091:215;;;;:::o;34689:65::-;5864:12;:10;:12::i;:::-;5853:23;;:7;:5;:7::i;:::-;:23;;;5845:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34736:10:::1;:8;:10::i;:::-;34689:65::o:0;34762:95::-;5864:12;:10;:12::i;:::-;5853:23;;:7;:5;:7::i;:::-;:23;;;5845:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34832:17:::1;34838:2;34842:6;34832:5;:17::i;:::-;34762:95:::0;;:::o;31454:91::-;31510:27;31516:12;:10;:12::i;:::-;31530:6;31510:5;:27::i;:::-;31454:91;:::o;27180:266::-;27267:7;27288:16;27306:13;27323:55;27332:10;27344:24;:33;27369:7;27344:33;;;;;;;;;;;;;;;27323:8;:55::i;:::-;27287:91;;;;27398:11;:40;;27420:18;27430:7;27420:9;:18::i;:::-;27398:40;;;27412:5;27398:40;27391:47;;;;27180:266;;;;:::o;33222:86::-;33269:4;33293:7;;;;;;;;;;;33286:14;;33222:86;:::o;13663:127::-;13737:7;13764:9;:18;13774:7;13764:18;;;;;;;;;;;;;;;;13757:25;;13663:127;;;:::o;6284:103::-;5864:12;:10;:12::i;:::-;5853:23;;:7;:5;:7::i;:::-;:23;;;5845:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6349:30:::1;6376:1;6349:18;:30::i;:::-;6284:103::o:0;31864:368::-;31941:24;31968:32;31978:7;31987:12;:10;:12::i;:::-;31968:9;:32::i;:::-;31941:59;;32039:6;32019:16;:26;;32011:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;32122:58;32131:7;32140:12;:10;:12::i;:::-;32173:6;32154:16;:25;32122:8;:58::i;:::-;32202:22;32208:7;32217:6;32202:5;:22::i;:::-;31864:368;;;:::o;34620:61::-;5864:12;:10;:12::i;:::-;5853:23;;:7;:5;:7::i;:::-;:23;;;5845:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34665:8:::1;:6;:8::i;:::-;34620:61::o:0;5633:87::-;5679:7;5706:6;;;;;;;;;;;5699:13;;5633:87;:::o;12591:104::-;12647:13;12680:7;12673:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12591:104;:::o;34545:67::-;5864:12;:10;:12::i;:::-;5853:23;;:7;:5;:7::i;:::-;:23;;;5845:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34593:11:::1;:9;:11::i;:::-;;34545:67::o:0;27550:234::-;27622:7;27643:16;27661:13;27678:43;27687:10;27699:21;27678:8;:43::i;:::-;27642:79;;;;27741:11;:35;;27763:13;:11;:13::i;:::-;27741:35;;;27755:5;27741:35;27734:42;;;;27550:234;;;:::o;16809:413::-;16902:4;16919:24;16946:11;:25;16958:12;:10;:12::i;:::-;16946:25;;;;;;;;;;;;;;;:34;16972:7;16946:34;;;;;;;;;;;;;;;;16919:61;;17019:15;16999:16;:35;;16991:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;17112:67;17121:12;:10;:12::i;:::-;17135:7;17163:15;17144:16;:34;17112:8;:67::i;:::-;17210:4;17203:11;;;16809:413;;;;:::o;14003:175::-;14089:4;14106:42;14116:12;:10;:12::i;:::-;14130:9;14141:6;14106:9;:42::i;:::-;14166:4;14159:11;;14003:175;;;;:::o;14241:151::-;14330:7;14357:11;:18;14369:5;14357:18;;;;;;;;;;;;;;;:27;14376:7;14357:27;;;;;;;;;;;;;;;;14350:34;;14241:151;;;;:::o;6542:201::-;5864:12;:10;:12::i;:::-;5853:23;;:7;:5;:7::i;:::-;:23;;;5845:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6651:1:::1;6631:22;;:8;:22;;;;6623:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;6707:28;6726:8;6707:18;:28::i;:::-;6542:201:::0;:::o;3176:98::-;3229:7;3256:10;3249:17;;3176:98;:::o;20493:380::-;20646:1;20629:19;;:5;:19;;;;20621:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;20727:1;20708:21;;:7;:21;;;;20700:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;20811:6;20781:11;:18;20793:5;20781:18;;;;;;;;;;;;;;;:27;20800:7;20781:27;;;;;;;;;;;;;;;:36;;;;20849:7;20833:32;;20842:5;20833:32;;;20858:6;20833:32;;;;;;:::i;:::-;;;;;;;;20493:380;;;:::o;17712:733::-;17870:1;17852:20;;:6;:20;;;;17844:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;17954:1;17933:23;;:9;:23;;;;17925:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;18009:47;18030:6;18038:9;18049:6;18009:20;:47::i;:::-;18069:21;18093:9;:17;18103:6;18093:17;;;;;;;;;;;;;;;;18069:41;;18146:6;18129:13;:23;;18121:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;18267:6;18251:13;:22;18231:9;:17;18241:6;18231:17;;;;;;;;;;;;;;;:42;;;;18319:6;18295:9;:20;18305:9;18295:20;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;18360:9;18343:35;;18352:6;18343:35;;;18371:6;18343:35;;;;;;:::i;:::-;;;;;;;;18391:46;18411:6;18419:9;18430:6;18391:19;:46::i;:::-;17712:733;;;;:::o;34281:120::-;33825:8;:6;:8::i;:::-;33817:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;34350:5:::1;34340:7;;:15;;;;;;;;;;;;;;;;;;34371:22;34380:12;:10;:12::i;:::-;34371:22;;;;;;:::i;:::-;;;;;;;;34281:120::o:0;18732:399::-;18835:1;18816:21;;:7;:21;;;;18808:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;18886:49;18915:1;18919:7;18928:6;18886:20;:49::i;:::-;18964:6;18948:12;;:22;;;;;;;:::i;:::-;;;;;;;;19003:6;18981:9;:18;18991:7;18981:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;19046:7;19025:37;;19042:1;19025:37;;;19055:6;19025:37;;;;;;:::i;:::-;;;;;;;;19075:48;19103:1;19107:7;19116:6;19075:19;:48::i;:::-;18732:399;;:::o;19464:591::-;19567:1;19548:21;;:7;:21;;;;19540:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;19620:49;19641:7;19658:1;19662:6;19620:20;:49::i;:::-;19682:22;19707:9;:18;19717:7;19707:18;;;;;;;;;;;;;;;;19682:43;;19762:6;19744:14;:24;;19736:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;19881:6;19864:14;:23;19843:9;:18;19853:7;19843:18;;;;;;;;;;;;;;;:44;;;;19925:6;19909:12;;:22;;;;;;;:::i;:::-;;;;;;;;19975:1;19949:37;;19958:7;19949:37;;;19979:6;19949:37;;;;;;:::i;:::-;;;;;;;;19999:48;20019:7;20036:1;20040:6;19999:19;:48::i;:::-;19464:591;;;:::o;28631:1619::-;28720:4;28726:7;28767:1;28754:10;:14;28746:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;28828:23;:21;:23::i;:::-;28814:10;:37;;28806:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;30024:13;30040:40;30069:10;30040:9;:13;;:28;;:40;;;;:::i;:::-;30024:56;;30106:9;:13;;:20;;;;30097:5;:29;30093:150;;;30151:5;30158:1;30143:17;;;;;;;30093:150;30201:4;30207:9;:16;;30224:5;30207:23;;;;;;;;;;;;;;;;;;;;;;;;30193:38;;;;;28631:1619;;;;;;:::o;6903:191::-;6977:16;6996:6;;;;;;;;;;;6977:25;;7022:8;7013:6;;:17;;;;;;;;;;;;;;;;;;7077:8;7046:40;;7067:8;7046:40;;;;;;;;;;;;6903:191;;:::o;34022:118::-;33548:8;:6;:8::i;:::-;33547:9;33539:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;34092:4:::1;34082:7;;:14;;;;;;;;;;;;;;;;;;34112:20;34119:12;:10;:12::i;:::-;34112:20;;;;;;:::i;:::-;;;;;;;;34022:118::o:0;26652:223::-;26699:7;26719:30;:18;:28;:30::i;:::-;26762:17;26782:23;:21;:23::i;:::-;26762:43;;26821:19;26830:9;26821:19;;;;;;:::i;:::-;;;;;;;;26858:9;26851:16;;;26652:223;:::o;34865:221::-;33548:8;:6;:8::i;:::-;33547:9;33539:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;35034:44:::1;35061:4;35067:2;35071:6;35034:26;:44::i;:::-;34865:221:::0;;;:::o;22202:124::-;;;;:::o;26941:127::-;27005:7;27032:28;:18;:26;:28::i;:::-;27025:35;;26941:127;:::o;1709:918::-;1798:7;1838:1;1822:5;:12;;;;:17;1818:58;;;1863:1;1856:8;;;;1818:58;1888:11;1914:12;1929:5;:12;;;;1914:27;;1954:424;1967:4;1961:3;:10;1954:424;;;1988:11;2002:23;2015:3;2020:4;2002:12;:23::i;:::-;1988:37;;2259:7;2246:5;2252:3;2246:10;;;;;;;;;;;;;;;;;;;;;;;;:20;2242:125;;;2294:3;2287:10;;2242:125;;;2350:1;2344:3;:7;;;;:::i;:::-;2338:13;;2242:125;1954:424;;;;2504:1;2498:3;:7;:36;;;;;2527:7;2509:5;2521:1;2515:3;:7;;;;:::i;:::-;2509:14;;;;;;;;;;;;;;;;;;;;;;;;:25;2498:36;2494:126;;;2564:1;2558:3;:7;;;;:::i;:::-;2551:14;;;;;;2494:126;2605:3;2598:10;;;;1709:918;;;;;:::o;4243:127::-;4350:1;4332:7;:14;;;:19;;;;;;;;;;;4243:127;:::o;28001:622::-;28144:44;28171:4;28177:2;28181:6;28144:26;:44::i;:::-;28221:1;28205:18;;:4;:18;;;28201:415;;;28261:26;28284:2;28261:22;:26::i;:::-;28302:28;:26;:28::i;:::-;28201:415;;;28366:1;28352:16;;:2;:16;;;28348:268;;;28406:28;28429:4;28406:22;:28::i;:::-;28449;:26;:28::i;:::-;28348:268;;;28535:28;28558:4;28535:22;:28::i;:::-;28578:26;28601:2;28578:22;:26::i;:::-;28348:268;28201:415;28001:622;;;:::o;4121:114::-;4186:7;4213;:14;;;4206:21;;4121:114;;;:::o;632:156::-;694:7;779:1;774;770;:5;769:11;;;;:::i;:::-;764:1;760;:5;759:21;;;;:::i;:::-;752:28;;632:156;;;;:::o;21473:125::-;;;;:::o;30258:146::-;30326:70;30342:24;:33;30367:7;30342:33;;;;;;;;;;;;;;;30377:18;30387:7;30377:9;:18::i;:::-;30326:15;:70::i;:::-;30258:146;:::o;30412:118::-;30469:53;30485:21;30508:13;:11;:13::i;:::-;30469:15;:53::i;:::-;30412:118::o;30538:310::-;30633:17;30653:23;:21;:23::i;:::-;30633:43;;30724:9;30691:30;30707:9;:13;;30691:15;:30::i;:::-;:42;30687:154;;;30750:9;:13;;30769:9;30750:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30794:9;:16;;30816:12;30794:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30687:154;30538:310;;;:::o;30856:212::-;30926:7;30964:1;30950:3;:10;;;;:15;30946:115;;;30989:1;30982:8;;;;30946:115;31030:3;31047:1;31034:3;:10;;;;:14;;;;:::i;:::-;31030:19;;;;;;;;;;;;;;;;;;;;;;;;31023:26;;30856:212;;;;:::o;7:139:1:-;;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;59:87;;;;:::o;152:139::-;;236:6;223:20;214:29;;252:33;279:5;252:33;:::i;:::-;204:87;;;;:::o;297:262::-;;405:2;393:9;384:7;380:23;376:32;373:2;;;421:1;418;411:12;373:2;464:1;489:53;534:7;525:6;514:9;510:22;489:53;:::i;:::-;479:63;;435:117;363:196;;;;:::o;565:407::-;;;690:2;678:9;669:7;665:23;661:32;658:2;;;706:1;703;696:12;658:2;749:1;774:53;819:7;810:6;799:9;795:22;774:53;:::i;:::-;764:63;;720:117;876:2;902:53;947:7;938:6;927:9;923:22;902:53;:::i;:::-;892:63;;847:118;648:324;;;;;:::o;978:552::-;;;;1120:2;1108:9;1099:7;1095:23;1091:32;1088:2;;;1136:1;1133;1126:12;1088:2;1179:1;1204:53;1249:7;1240:6;1229:9;1225:22;1204:53;:::i;:::-;1194:63;;1150:117;1306:2;1332:53;1377:7;1368:6;1357:9;1353:22;1332:53;:::i;:::-;1322:63;;1277:118;1434:2;1460:53;1505:7;1496:6;1485:9;1481:22;1460:53;:::i;:::-;1450:63;;1405:118;1078:452;;;;;:::o;1536:407::-;;;1661:2;1649:9;1640:7;1636:23;1632:32;1629:2;;;1677:1;1674;1667:12;1629:2;1720:1;1745:53;1790:7;1781:6;1770:9;1766:22;1745:53;:::i;:::-;1735:63;;1691:117;1847:2;1873:53;1918:7;1909:6;1898:9;1894:22;1873:53;:::i;:::-;1863:63;;1818:118;1619:324;;;;;:::o;1949:262::-;;2057:2;2045:9;2036:7;2032:23;2028:32;2025:2;;;2073:1;2070;2063:12;2025:2;2116:1;2141:53;2186:7;2177:6;2166:9;2162:22;2141:53;:::i;:::-;2131:63;;2087:117;2015:196;;;;:::o;2217:118::-;2304:24;2322:5;2304:24;:::i;:::-;2299:3;2292:37;2282:53;;:::o;2341:109::-;2422:21;2437:5;2422:21;:::i;:::-;2417:3;2410:34;2400:50;;:::o;2456:364::-;;2572:39;2605:5;2572:39;:::i;:::-;2627:71;2691:6;2686:3;2627:71;:::i;:::-;2620:78;;2707:52;2752:6;2747:3;2740:4;2733:5;2729:16;2707:52;:::i;:::-;2784:29;2806:6;2784:29;:::i;:::-;2779:3;2775:39;2768:46;;2548:272;;;;;:::o;2826:366::-;;2989:67;3053:2;3048:3;2989:67;:::i;:::-;2982:74;;3065:93;3154:3;3065:93;:::i;:::-;3183:2;3178:3;3174:12;3167:19;;2972:220;;;:::o;3198:366::-;;3361:67;3425:2;3420:3;3361:67;:::i;:::-;3354:74;;3437:93;3526:3;3437:93;:::i;:::-;3555:2;3550:3;3546:12;3539:19;;3344:220;;;:::o;3570:366::-;;3733:67;3797:2;3792:3;3733:67;:::i;:::-;3726:74;;3809:93;3898:3;3809:93;:::i;:::-;3927:2;3922:3;3918:12;3911:19;;3716:220;;;:::o;3942:366::-;;4105:67;4169:2;4164:3;4105:67;:::i;:::-;4098:74;;4181:93;4270:3;4181:93;:::i;:::-;4299:2;4294:3;4290:12;4283:19;;4088:220;;;:::o;4314:366::-;;4477:67;4541:2;4536:3;4477:67;:::i;:::-;4470:74;;4553:93;4642:3;4553:93;:::i;:::-;4671:2;4666:3;4662:12;4655:19;;4460:220;;;:::o;4686:366::-;;4849:67;4913:2;4908:3;4849:67;:::i;:::-;4842:74;;4925:93;5014:3;4925:93;:::i;:::-;5043:2;5038:3;5034:12;5027:19;;4832:220;;;:::o;5058:366::-;;5221:67;5285:2;5280:3;5221:67;:::i;:::-;5214:74;;5297:93;5386:3;5297:93;:::i;:::-;5415:2;5410:3;5406:12;5399:19;;5204:220;;;:::o;5430:366::-;;5593:67;5657:2;5652:3;5593:67;:::i;:::-;5586:74;;5669:93;5758:3;5669:93;:::i;:::-;5787:2;5782:3;5778:12;5771:19;;5576:220;;;:::o;5802:366::-;;5965:67;6029:2;6024:3;5965:67;:::i;:::-;5958:74;;6041:93;6130:3;6041:93;:::i;:::-;6159:2;6154:3;6150:12;6143:19;;5948:220;;;:::o;6174:366::-;;6337:67;6401:2;6396:3;6337:67;:::i;:::-;6330:74;;6413:93;6502:3;6413:93;:::i;:::-;6531:2;6526:3;6522:12;6515:19;;6320:220;;;:::o;6546:366::-;;6709:67;6773:2;6768:3;6709:67;:::i;:::-;6702:74;;6785:93;6874:3;6785:93;:::i;:::-;6903:2;6898:3;6894:12;6887:19;;6692:220;;;:::o;6918:366::-;;7081:67;7145:2;7140:3;7081:67;:::i;:::-;7074:74;;7157:93;7246:3;7157:93;:::i;:::-;7275:2;7270:3;7266:12;7259:19;;7064:220;;;:::o;7290:366::-;;7453:67;7517:2;7512:3;7453:67;:::i;:::-;7446:74;;7529:93;7618:3;7529:93;:::i;:::-;7647:2;7642:3;7638:12;7631:19;;7436:220;;;:::o;7662:366::-;;7825:67;7889:2;7884:3;7825:67;:::i;:::-;7818:74;;7901:93;7990:3;7901:93;:::i;:::-;8019:2;8014:3;8010:12;8003:19;;7808:220;;;:::o;8034:366::-;;8197:67;8261:2;8256:3;8197:67;:::i;:::-;8190:74;;8273:93;8362:3;8273:93;:::i;:::-;8391:2;8386:3;8382:12;8375:19;;8180:220;;;:::o;8406:366::-;;8569:67;8633:2;8628:3;8569:67;:::i;:::-;8562:74;;8645:93;8734:3;8645:93;:::i;:::-;8763:2;8758:3;8754:12;8747:19;;8552:220;;;:::o;8778:366::-;;8941:67;9005:2;9000:3;8941:67;:::i;:::-;8934:74;;9017:93;9106:3;9017:93;:::i;:::-;9135:2;9130:3;9126:12;9119:19;;8924:220;;;:::o;9150:118::-;9237:24;9255:5;9237:24;:::i;:::-;9232:3;9225:37;9215:53;;:::o;9274:112::-;9357:22;9373:5;9357:22;:::i;:::-;9352:3;9345:35;9335:51;;:::o;9392:222::-;;9523:2;9512:9;9508:18;9500:26;;9536:71;9604:1;9593:9;9589:17;9580:6;9536:71;:::i;:::-;9490:124;;;;:::o;9620:210::-;;9745:2;9734:9;9730:18;9722:26;;9758:65;9820:1;9809:9;9805:17;9796:6;9758:65;:::i;:::-;9712:118;;;;:::o;9836:313::-;;9987:2;9976:9;9972:18;9964:26;;10036:9;10030:4;10026:20;10022:1;10011:9;10007:17;10000:47;10064:78;10137:4;10128:6;10064:78;:::i;:::-;10056:86;;9954:195;;;;:::o;10155:419::-;;10359:2;10348:9;10344:18;10336:26;;10408:9;10402:4;10398:20;10394:1;10383:9;10379:17;10372:47;10436:131;10562:4;10436:131;:::i;:::-;10428:139;;10326:248;;;:::o;10580:419::-;;10784:2;10773:9;10769:18;10761:26;;10833:9;10827:4;10823:20;10819:1;10808:9;10804:17;10797:47;10861:131;10987:4;10861:131;:::i;:::-;10853:139;;10751:248;;;:::o;11005:419::-;;11209:2;11198:9;11194:18;11186:26;;11258:9;11252:4;11248:20;11244:1;11233:9;11229:17;11222:47;11286:131;11412:4;11286:131;:::i;:::-;11278:139;;11176:248;;;:::o;11430:419::-;;11634:2;11623:9;11619:18;11611:26;;11683:9;11677:4;11673:20;11669:1;11658:9;11654:17;11647:47;11711:131;11837:4;11711:131;:::i;:::-;11703:139;;11601:248;;;:::o;11855:419::-;;12059:2;12048:9;12044:18;12036:26;;12108:9;12102:4;12098:20;12094:1;12083:9;12079:17;12072:47;12136:131;12262:4;12136:131;:::i;:::-;12128:139;;12026:248;;;:::o;12280:419::-;;12484:2;12473:9;12469:18;12461:26;;12533:9;12527:4;12523:20;12519:1;12508:9;12504:17;12497:47;12561:131;12687:4;12561:131;:::i;:::-;12553:139;;12451:248;;;:::o;12705:419::-;;12909:2;12898:9;12894:18;12886:26;;12958:9;12952:4;12948:20;12944:1;12933:9;12929:17;12922:47;12986:131;13112:4;12986:131;:::i;:::-;12978:139;;12876:248;;;:::o;13130:419::-;;13334:2;13323:9;13319:18;13311:26;;13383:9;13377:4;13373:20;13369:1;13358:9;13354:17;13347:47;13411:131;13537:4;13411:131;:::i;:::-;13403:139;;13301:248;;;:::o;13555:419::-;;13759:2;13748:9;13744:18;13736:26;;13808:9;13802:4;13798:20;13794:1;13783:9;13779:17;13772:47;13836:131;13962:4;13836:131;:::i;:::-;13828:139;;13726:248;;;:::o;13980:419::-;;14184:2;14173:9;14169:18;14161:26;;14233:9;14227:4;14223:20;14219:1;14208:9;14204:17;14197:47;14261:131;14387:4;14261:131;:::i;:::-;14253:139;;14151:248;;;:::o;14405:419::-;;14609:2;14598:9;14594:18;14586:26;;14658:9;14652:4;14648:20;14644:1;14633:9;14629:17;14622:47;14686:131;14812:4;14686:131;:::i;:::-;14678:139;;14576:248;;;:::o;14830:419::-;;15034:2;15023:9;15019:18;15011:26;;15083:9;15077:4;15073:20;15069:1;15058:9;15054:17;15047:47;15111:131;15237:4;15111:131;:::i;:::-;15103:139;;15001:248;;;:::o;15255:419::-;;15459:2;15448:9;15444:18;15436:26;;15508:9;15502:4;15498:20;15494:1;15483:9;15479:17;15472:47;15536:131;15662:4;15536:131;:::i;:::-;15528:139;;15426:248;;;:::o;15680:419::-;;15884:2;15873:9;15869:18;15861:26;;15933:9;15927:4;15923:20;15919:1;15908:9;15904:17;15897:47;15961:131;16087:4;15961:131;:::i;:::-;15953:139;;15851:248;;;:::o;16105:419::-;;16309:2;16298:9;16294:18;16286:26;;16358:9;16352:4;16348:20;16344:1;16333:9;16329:17;16322:47;16386:131;16512:4;16386:131;:::i;:::-;16378:139;;16276:248;;;:::o;16530:419::-;;16734:2;16723:9;16719:18;16711:26;;16783:9;16777:4;16773:20;16769:1;16758:9;16754:17;16747:47;16811:131;16937:4;16811:131;:::i;:::-;16803:139;;16701:248;;;:::o;16955:419::-;;17159:2;17148:9;17144:18;17136:26;;17208:9;17202:4;17198:20;17194:1;17183:9;17179:17;17172:47;17236:131;17362:4;17236:131;:::i;:::-;17228:139;;17126:248;;;:::o;17380:222::-;;17511:2;17500:9;17496:18;17488:26;;17524:71;17592:1;17581:9;17577:17;17568:6;17524:71;:::i;:::-;17478:124;;;;:::o;17608:214::-;;17735:2;17724:9;17720:18;17712:26;;17748:67;17812:1;17801:9;17797:17;17788:6;17748:67;:::i;:::-;17702:120;;;;:::o;17828:99::-;;17914:5;17908:12;17898:22;;17887:40;;;:::o;17933:169::-;;18051:6;18046:3;18039:19;18091:4;18086:3;18082:14;18067:29;;18029:73;;;;:::o;18108:305::-;;18167:20;18185:1;18167:20;:::i;:::-;18162:25;;18201:20;18219:1;18201:20;:::i;:::-;18196:25;;18355:1;18287:66;18283:74;18280:1;18277:81;18274:2;;;18361:18;;:::i;:::-;18274:2;18405:1;18402;18398:9;18391:16;;18152:261;;;;:::o;18419:185::-;;18476:20;18494:1;18476:20;:::i;:::-;18471:25;;18510:20;18528:1;18510:20;:::i;:::-;18505:25;;18549:1;18539:2;;18554:18;;:::i;:::-;18539:2;18596:1;18593;18589:9;18584:14;;18461:143;;;;:::o;18610:191::-;;18670:20;18688:1;18670:20;:::i;:::-;18665:25;;18704:20;18722:1;18704:20;:::i;:::-;18699:25;;18743:1;18740;18737:8;18734:2;;;18748:18;;:::i;:::-;18734:2;18793:1;18790;18786:9;18778:17;;18655:146;;;;:::o;18807:96::-;;18873:24;18891:5;18873:24;:::i;:::-;18862:35;;18852:51;;;:::o;18909:90::-;;18986:5;18979:13;18972:21;18961:32;;18951:48;;;:::o;19005:126::-;;19082:42;19075:5;19071:54;19060:65;;19050:81;;;:::o;19137:77::-;;19203:5;19192:16;;19182:32;;;:::o;19220:86::-;;19295:4;19288:5;19284:16;19273:27;;19263:43;;;:::o;19312:307::-;19380:1;19390:113;19404:6;19401:1;19398:13;19390:113;;;19489:1;19484:3;19480:11;19474:18;19470:1;19465:3;19461:11;19454:39;19426:2;19423:1;19419:10;19414:15;;19390:113;;;19521:6;19518:1;19515:13;19512:2;;;19601:1;19592:6;19587:3;19583:16;19576:27;19512:2;19361:258;;;;:::o;19625:320::-;;19706:1;19700:4;19696:12;19686:22;;19753:1;19747:4;19743:12;19774:18;19764:2;;19830:4;19822:6;19818:17;19808:27;;19764:2;19892;19884:6;19881:14;19861:18;19858:38;19855:2;;;19911:18;;:::i;:::-;19855:2;19676:269;;;;:::o;19951:180::-;19999:77;19996:1;19989:88;20096:4;20093:1;20086:15;20120:4;20117:1;20110:15;20137:180;20185:77;20182:1;20175:88;20282:4;20279:1;20272:15;20306:4;20303:1;20296:15;20323:180;20371:77;20368:1;20361:88;20468:4;20465:1;20458:15;20492:4;20489:1;20482:15;20509:102;;20601:2;20597:7;20592:2;20585:5;20581:14;20577:28;20567:38;;20557:54;;;:::o;20617:179::-;20757:31;20753:1;20745:6;20741:14;20734:55;20723:73;:::o;20802:222::-;20942:34;20938:1;20930:6;20926:14;20919:58;21011:5;21006:2;20998:6;20994:15;20987:30;20908:116;:::o;21030:170::-;21170:22;21166:1;21158:6;21154:14;21147:46;21136:64;:::o;21206:221::-;21346:34;21342:1;21334:6;21330:14;21323:58;21415:4;21410:2;21402:6;21398:15;21391:29;21312:115;:::o;21433:225::-;21573:34;21569:1;21561:6;21557:14;21550:58;21642:8;21637:2;21629:6;21625:15;21618:33;21539:119;:::o;21664:221::-;21804:34;21800:1;21792:6;21788:14;21781:58;21873:4;21868:2;21860:6;21856:15;21849:29;21770:115;:::o;21891:225::-;22031:34;22027:1;22019:6;22015:14;22008:58;22100:8;22095:2;22087:6;22083:15;22076:33;21997:119;:::o;22122:166::-;22262:18;22258:1;22250:6;22246:14;22239:42;22228:60;:::o;22294:227::-;22434:34;22430:1;22422:6;22418:14;22411:58;22503:10;22498:2;22490:6;22486:15;22479:35;22400:121;:::o;22527:182::-;22667:34;22663:1;22655:6;22651:14;22644:58;22633:76;:::o;22715:223::-;22855:34;22851:1;22843:6;22839:14;22832:58;22924:6;22919:2;22911:6;22907:15;22900:31;22821:117;:::o;22944:220::-;23084:34;23080:1;23072:6;23068:14;23061:58;23153:3;23148:2;23140:6;23136:15;23129:28;23050:114;:::o;23170:224::-;23310:34;23306:1;23298:6;23294:14;23287:58;23379:7;23374:2;23366:6;23362:15;23355:32;23276:118;:::o;23400:223::-;23540:34;23536:1;23528:6;23524:14;23517:58;23609:6;23604:2;23596:6;23592:15;23585:31;23506:117;:::o;23629:172::-;23769:24;23765:1;23757:6;23753:14;23746:48;23735:66;:::o;23807:224::-;23947:34;23943:1;23935:6;23931:14;23924:58;24016:7;24011:2;24003:6;23999:15;23992:32;23913:118;:::o;24037:181::-;24177:33;24173:1;24165:6;24161:14;24154:57;24143:75;:::o;24224:122::-;24297:24;24315:5;24297:24;:::i;:::-;24290:5;24287:35;24277:2;;24336:1;24333;24326:12;24277:2;24267:79;:::o;24352:122::-;24425:24;24443:5;24425:24;:::i;:::-;24418:5;24415:35;24405:2;;24464:1;24461;24454:12;24405:2;24395:79;:::o

Swarm Source

ipfs://d24abfa058793616c7a25ecf888d272f705b2397d96ae170a1965cd7d51d3044
Loading