Token Kripton

Loans 
 

Overview ERC-20

Price
$0.00 @ 0.000078 MATIC
Fully Diluted Market Cap
Total Supply:
500,000,000 LPK

Holders:
192 addresses

Transfers:
-

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

OVERVIEW

Kripton (LPK), a native crypto-fiat token along with a full-fledged financial inclusion platform with hybrid crypto-fiat and self credit scoring.

Market

Volume (24H):$0.00
Market Capitalization:$54,259.00
Circulating Supply:901,653,398.00 LPK
Market Data Source: Coinmarketcap


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

Contract Source Code Verified (Exact Match)

Contract Name:
Kripton

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-07-07
*/

pragma solidity ^0.8.0;
// SPDX-License-Identifier: UNLICENSED

/**
 * @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 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.
 */
 
 /**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
 

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

pragma solidity ^0.8.0;


contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

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

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

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

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

/**
 * @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 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 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() {
        _setOwner(_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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

/**
 * @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 Kripton is ERC20, ERC20Burnable, ERC20Snapshot, Ownable, Pausable {
    constructor() ERC20("Kripton", "LPK") {
        _mint(msg.sender, 500000000 * 10 ** decimals());
    }

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

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

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

    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":[],"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"}]

60806040523480156200001157600080fd5b506040518060400160405280600781526020017f4b726970746f6e000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f4c504b000000000000000000000000000000000000000000000000000000000081525081600390805190602001906200009692919062000718565b508060049080519060200190620000af92919062000718565b505050620000d2620000c66200013360201b60201c565b6200013b60201b60201c565b6000600960146101000a81548160ff0219169083151502179055506200012d33620001026200020160201b60201c565b600a62000110919062000987565b631dcd650062000121919062000ac4565b6200020a60201b60201c565b62000c18565b600033905090565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006012905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200027d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000274906200087f565b60405180910390fd5b62000291600083836200038360201b60201c565b8060026000828254620002a59190620008cf565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620002fc9190620008cf565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620003639190620008a1565b60405180910390a36200037f60008383620003f360201b60201c565b5050565b62000393620003f860201b60201c565b15620003d6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003cd906200085d565b60405180910390fd5b620003ee8383836200040f60201b62000d7c1760201c565b505050565b505050565b6000600960149054906101000a900460ff16905090565b620004278383836200050a60201b62000e361760201c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141562000484576200046e826200050f60201b60201c565b6200047e6200057260201b60201c565b62000505565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620004e157620004cb836200050f60201b60201c565b620004db6200057260201b60201c565b62000504565b620004f2836200050f60201b60201c565b62000503826200050f60201b60201c565b5b5b505050565b505050565b6200056f600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002062000563836200059660201b60201c565b620005de60201b60201c565b50565b620005946006620005886200066a60201b60201c565b620005de60201b60201c565b565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000620005f06200067460201b60201c565b90508062000607846000016200069260201b60201c565b1015620006655782600001819080600181540180825580915050600190039060005260206000200160009091909190915055826001018290806001815401808255809150506001900390600052602060002001600090919091909150555b505050565b6000600254905090565b60006200068d60086200070a60201b62000e3b1760201c565b905090565b60008082805490501415620006ab576000905062000705565b8160018380549050620006bf919062000b25565b81548110620006f7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490505b919050565b600081600001549050919050565b828054620007269062000b77565b90600052602060002090601f0160209004810192826200074a576000855562000796565b82601f106200076557805160ff191683800117855562000796565b8280016001018555821562000796579182015b828111156200079557825182559160200191906001019062000778565b5b509050620007a59190620007a9565b5090565b5b80821115620007c4576000816000905550600101620007aa565b5090565b6000620007d7601083620008be565b91507f5061757361626c653a20706175736564000000000000000000000000000000006000830152602082019050919050565b600062000819601f83620008be565b91507f45524332303a206d696e7420746f20746865207a65726f2061646472657373006000830152602082019050919050565b620008578162000b60565b82525050565b600060208201905081810360008301526200087881620007c8565b9050919050565b600060208201905081810360008301526200089a816200080a565b9050919050565b6000602082019050620008b860008301846200084c565b92915050565b600082825260208201905092915050565b6000620008dc8262000b60565b9150620008e98362000b60565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000921576200092062000bad565b5b828201905092915050565b6000808291508390505b60018511156200097e5780860481111562000956576200095562000bad565b5b6001851615620009665780820291505b8081029050620009768562000c0b565b945062000936565b94509492505050565b6000620009948262000b60565b9150620009a18362000b6a565b9250620009d07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484620009d8565b905092915050565b600082620009ea576001905062000abd565b81620009fa576000905062000abd565b816001811462000a13576002811462000a1e5762000a54565b600191505062000abd565b60ff84111562000a335762000a3262000bad565b5b8360020a91508482111562000a4d5762000a4c62000bad565b5b5062000abd565b5060208310610133831016604e8410600b841016171562000a8e5782820a90508381111562000a885762000a8762000bad565b5b62000abd565b62000a9d84848460016200092c565b9250905081840481111562000ab75762000ab662000bad565b5b81810290505b9392505050565b600062000ad18262000b60565b915062000ade8362000b60565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562000b1a5762000b1962000bad565b5b828202905092915050565b600062000b328262000b60565b915062000b3f8362000b60565b92508282101562000b555762000b5462000bad565b5b828203905092915050565b6000819050919050565b600060ff82169050919050565b6000600282049050600182168062000b9057607f821691505b6020821081141562000ba75762000ba662000bdc565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60008160011c9050919050565b6128038062000c286000396000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c8063715018a6116100b85780639711715a1161007c5780639711715a14610341578063981b24d01461034b578063a457c2d71461037b578063a9059cbb146103ab578063dd62ed3e146103db578063f2fde38b1461040b57610142565b8063715018a6146102d557806379cc6790146102df5780638456cb59146102fb5780638da5cb5b1461030557806395d89b411461032357610142565b8063395093511161010a57806339509351146102015780633f4ba83a1461023157806342966c681461023b5780634ee2cd7e146102575780635c975abb1461028757806370a08231146102a557610142565b806306fdde0314610147578063095ea7b31461016557806318160ddd1461019557806323b872dd146101b3578063313ce567146101e3575b600080fd5b61014f610427565b60405161015c91906122e7565b60405180910390f35b61017f600480360381019061017a9190611c35565b6104b9565b60405161018c91906122cc565b60405180910390f35b61019d6104d7565b6040516101aa9190612509565b60405180910390f35b6101cd60048036038101906101c89190611be6565b6104e1565b6040516101da91906122cc565b60405180910390f35b6101eb6105d9565b6040516101f89190612524565b60405180910390f35b61021b60048036038101906102169190611c35565b6105e2565b60405161022891906122cc565b60405180910390f35b61023961068e565b005b61025560048036038101906102509190611c71565b610714565b005b610271600480360381019061026c9190611c35565b610728565b60405161027e9190612509565b60405180910390f35b61028f610798565b60405161029c91906122cc565b60405180910390f35b6102bf60048036038101906102ba9190611b81565b6107af565b6040516102cc9190612509565b60405180910390f35b6102dd6107f7565b005b6102f960048036038101906102f49190611c35565b61087f565b005b6103036108fa565b005b61030d610980565b60405161031a91906122b1565b60405180910390f35b61032b6109aa565b60405161033891906122e7565b60405180910390f35b610349610a3c565b005b61036560048036038101906103609190611c71565b610ac3565b6040516103729190612509565b60405180910390f35b61039560048036038101906103909190611c35565b610af4565b6040516103a291906122cc565b60405180910390f35b6103c560048036038101906103c09190611c35565b610bdf565b6040516103d291906122cc565b60405180910390f35b6103f560048036038101906103f09190611baa565b610bfd565b6040516104029190612509565b60405180910390f35b61042560048036038101906104209190611b81565b610c84565b005b6060600380546104369061269e565b80601f01602080910402602001604051908101604052809291908181526020018280546104629061269e565b80156104af5780601f10610484576101008083540402835291602001916104af565b820191906000526020600020905b81548152906001019060200180831161049257829003601f168201915b5050505050905090565b60006104cd6104c6610e49565b8484610e51565b6001905092915050565b6000600254905090565b60006104ee84848461101c565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610539610e49565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156105b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105b090612409565b60405180910390fd5b6105cd856105c5610e49565b858403610e51565b60019150509392505050565b60006012905090565b60006106846105ef610e49565b8484600160006105fd610e49565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461067f919061255b565b610e51565b6001905092915050565b610696610e49565b73ffffffffffffffffffffffffffffffffffffffff166106b4610980565b73ffffffffffffffffffffffffffffffffffffffff161461070a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070190612429565b60405180910390fd5b61071261129d565b565b61072561071f610e49565b8261133f565b50565b600080600061077584600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611516565b915091508161078c57610787856107af565b61078e565b805b9250505092915050565b6000600960149054906101000a900460ff16905090565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6107ff610e49565b73ffffffffffffffffffffffffffffffffffffffff1661081d610980565b73ffffffffffffffffffffffffffffffffffffffff1614610873576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086a90612429565b60405180910390fd5b61087d6000611632565b565b60006108928361088d610e49565b610bfd565b9050818110156108d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ce90612449565b60405180910390fd5b6108eb836108e3610e49565b848403610e51565b6108f5838361133f565b505050565b610902610e49565b73ffffffffffffffffffffffffffffffffffffffff16610920610980565b73ffffffffffffffffffffffffffffffffffffffff1614610976576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096d90612429565b60405180910390fd5b61097e6116f8565b565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546109b99061269e565b80601f01602080910402602001604051908101604052809291908181526020018280546109e59061269e565b8015610a325780601f10610a0757610100808354040283529160200191610a32565b820191906000526020600020905b815481529060010190602001808311610a1557829003601f168201915b5050505050905090565b610a44610e49565b73ffffffffffffffffffffffffffffffffffffffff16610a62610980565b73ffffffffffffffffffffffffffffffffffffffff1614610ab8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aaf90612429565b60405180910390fd5b610ac061179b565b50565b6000806000610ad3846006611516565b9150915081610ae957610ae46104d7565b610aeb565b805b92505050919050565b60008060016000610b03610e49565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610bc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb7906124e9565b60405180910390fd5b610bd4610bcb610e49565b85858403610e51565b600191505092915050565b6000610bf3610bec610e49565b848461101c565b6001905092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610c8c610e49565b73ffffffffffffffffffffffffffffffffffffffff16610caa610980565b73ffffffffffffffffffffffffffffffffffffffff1614610d00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf790612429565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6790612389565b60405180910390fd5b610d7981611632565b50565b610d87838383610e36565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610dd257610dc5826117f1565b610dcd611844565b610e31565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e1d57610e10836117f1565b610e18611844565b610e30565b610e26836117f1565b610e2f826117f1565b5b5b505050565b505050565b600081600001549050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ec1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb8906124a9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f28906123a9565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161100f9190612509565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561108c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108390612489565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f390612329565b60405180910390fd5b611107838383611858565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561118d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611184906123c9565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611220919061255b565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516112849190612509565b60405180910390a36112978484846118b0565b50505050565b6112a5610798565b6112e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112db90612349565b60405180910390fd5b6000600960146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611328610e49565b60405161133591906122b1565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a690612469565b60405180910390fd5b6113bb82600083611858565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611441576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143890612369565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816002600082825461149891906125e2565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516114fd9190612509565b60405180910390a3611511836000846118b0565b505050565b6000806000841161155c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611553906124c9565b60405180910390fd5b6115646118b5565b8411156115a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159d90612309565b60405180910390fd5b60006115be85856000016118c690919063ffffffff16565b905083600001805490508114156115dc57600080925092505061162b565b600184600101828154811061161a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015492509250505b9250929050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611700610798565b15611740576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611737906123e9565b60405180910390fd5b6001600960146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611784610e49565b60405161179191906122b1565b60405180910390a1565b60006117a760086119ec565b60006117b16118b5565b90507f8030e83b04d87bef53480e26263266d6ca66863aa8506aca6f2559d18aa1cb67816040516117e29190612509565b60405180910390a18091505090565b611841600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061183c836107af565b611a02565b50565b61185660066118516104d7565b611a02565b565b611860610798565b156118a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611897906123e9565b60405180910390fd5b6118ab838383610d7c565b505050565b505050565b60006118c16008610e3b565b905090565b600080838054905014156118dd57600090506119e6565b600080848054905090505b808210156119675760006118fc8383611a7d565b905084868281548110611938577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154111561195157809150611961565b60018161195e919061255b565b92505b506118e8565b6000821180156119c55750838560018461198191906125e2565b815481106119b8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154145b156119e0576001826119d791906125e2565b925050506119e6565b81925050505b92915050565b6001816000016000828254019250508190555050565b6000611a0c6118b5565b905080611a1b84600001611ae4565b1015611a785782600001819080600181540180825580915050600190039060005260206000200160009091909190915055826001018290806001815401808255809150506001900390600052602060002001600090919091909150555b505050565b600060028083611a8d91906126d0565b600285611a9a91906126d0565b611aa4919061255b565b611aae91906125b1565b600283611abb91906125b1565b600285611ac891906125b1565b611ad2919061255b565b611adc919061255b565b905092915050565b60008082805490501415611afb5760009050611b52565b8160018380549050611b0d91906125e2565b81548110611b44577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490505b919050565b600081359050611b668161279f565b92915050565b600081359050611b7b816127b6565b92915050565b600060208284031215611b9357600080fd5b6000611ba184828501611b57565b91505092915050565b60008060408385031215611bbd57600080fd5b6000611bcb85828601611b57565b9250506020611bdc85828601611b57565b9150509250929050565b600080600060608486031215611bfb57600080fd5b6000611c0986828701611b57565b9350506020611c1a86828701611b57565b9250506040611c2b86828701611b6c565b9150509250925092565b60008060408385031215611c4857600080fd5b6000611c5685828601611b57565b9250506020611c6785828601611b6c565b9150509250929050565b600060208284031215611c8357600080fd5b6000611c9184828501611b6c565b91505092915050565b611ca381612616565b82525050565b611cb281612628565b82525050565b6000611cc38261253f565b611ccd818561254a565b9350611cdd81856020860161266b565b611ce68161278e565b840191505092915050565b6000611cfe601d8361254a565b91507f4552433230536e617073686f743a206e6f6e6578697374656e742069640000006000830152602082019050919050565b6000611d3e60238361254a565b91507f45524332303a207472616e7366657220746f20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000611da460148361254a565b91507f5061757361626c653a206e6f74207061757365640000000000000000000000006000830152602082019050919050565b6000611de460228361254a565b91507f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008301527f63650000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000611e4a60268361254a565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000611eb060228361254a565b91507f45524332303a20617070726f766520746f20746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000611f1660268361254a565b91507f45524332303a207472616e7366657220616d6f756e742065786365656473206260008301527f616c616e636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000611f7c60108361254a565b91507f5061757361626c653a20706175736564000000000000000000000000000000006000830152602082019050919050565b6000611fbc60288361254a565b91507f45524332303a207472616e7366657220616d6f756e742065786365656473206160008301527f6c6c6f77616e63650000000000000000000000000000000000000000000000006020830152604082019050919050565b600061202260208361254a565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b600061206260248361254a565b91507f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f7760008301527f616e6365000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006120c860218361254a565b91507f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061212e60258361254a565b91507f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061219460248361254a565b91507f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006121fa60168361254a565b91507f4552433230536e617073686f743a2069642069732030000000000000000000006000830152602082019050919050565b600061223a60258361254a565b91507f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008301527f207a65726f0000000000000000000000000000000000000000000000000000006020830152604082019050919050565b61229c81612654565b82525050565b6122ab8161265e565b82525050565b60006020820190506122c66000830184611c9a565b92915050565b60006020820190506122e16000830184611ca9565b92915050565b600060208201905081810360008301526123018184611cb8565b905092915050565b6000602082019050818103600083015261232281611cf1565b9050919050565b6000602082019050818103600083015261234281611d31565b9050919050565b6000602082019050818103600083015261236281611d97565b9050919050565b6000602082019050818103600083015261238281611dd7565b9050919050565b600060208201905081810360008301526123a281611e3d565b9050919050565b600060208201905081810360008301526123c281611ea3565b9050919050565b600060208201905081810360008301526123e281611f09565b9050919050565b6000602082019050818103600083015261240281611f6f565b9050919050565b6000602082019050818103600083015261242281611faf565b9050919050565b6000602082019050818103600083015261244281612015565b9050919050565b6000602082019050818103600083015261246281612055565b9050919050565b60006020820190508181036000830152612482816120bb565b9050919050565b600060208201905081810360008301526124a281612121565b9050919050565b600060208201905081810360008301526124c281612187565b9050919050565b600060208201905081810360008301526124e2816121ed565b9050919050565b600060208201905081810360008301526125028161222d565b9050919050565b600060208201905061251e6000830184612293565b92915050565b600060208201905061253960008301846122a2565b92915050565b600081519050919050565b600082825260208201905092915050565b600061256682612654565b915061257183612654565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156125a6576125a5612701565b5b828201905092915050565b60006125bc82612654565b91506125c783612654565b9250826125d7576125d6612730565b5b828204905092915050565b60006125ed82612654565b91506125f883612654565b92508282101561260b5761260a612701565b5b828203905092915050565b600061262182612634565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b8381101561268957808201518184015260208101905061266e565b83811115612698576000848401525b50505050565b600060028204905060018216806126b657607f821691505b602082108114156126ca576126c961275f565b5b50919050565b60006126db82612654565b91506126e683612654565b9250826126f6576126f5612730565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b6127a881612616565b81146127b357600080fd5b50565b6127bf81612654565b81146127ca57600080fd5b5056fea2646970667358221220492bc0f48f88e0630c23bd29fe0b56f467937b72c2e456e76db329bf764b40cb64736f6c63430008000033

Deployed ByteCode Sourcemap

34504:635:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6331:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8498:169;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7451:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9149:492;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7293:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10050:215;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34842:65;;;:::i;:::-;;16671:91;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26243:266;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33315:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7622:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31703:94;;;:::i;:::-;;17081:368;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34773:61;;;:::i;:::-;;31052:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6550:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34698:67;;;:::i;:::-;;26613:234;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10768:413;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7962:175;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8200:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31952:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6331:100;6385:13;6418:5;6411:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6331:100;:::o;8498:169::-;8581:4;8598:39;8607:12;:10;:12::i;:::-;8621:7;8630:6;8598:8;:39::i;:::-;8655:4;8648:11;;8498:169;;;;:::o;7451:108::-;7512:7;7539:12;;7532:19;;7451:108;:::o;9149:492::-;9289:4;9306:36;9316:6;9324:9;9335:6;9306:9;:36::i;:::-;9355:24;9382:11;:19;9394:6;9382:19;;;;;;;;;;;;;;;:33;9402:12;:10;:12::i;:::-;9382:33;;;;;;;;;;;;;;;;9355:60;;9454:6;9434:16;:26;;9426:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;9541:57;9550:6;9558:12;:10;:12::i;:::-;9591:6;9572:16;:25;9541:8;:57::i;:::-;9629:4;9622:11;;;9149:492;;;;;:::o;7293:93::-;7351:5;7376:2;7369:9;;7293:93;:::o;10050:215::-;10138:4;10155:80;10164:12;:10;:12::i;:::-;10178:7;10224:10;10187:11;:25;10199:12;:10;:12::i;:::-;10187:25;;;;;;;;;;;;;;;:34;10213:7;10187:34;;;;;;;;;;;;;;;;:47;;;;:::i;:::-;10155:8;:80::i;:::-;10253:4;10246:11;;10050:215;;;;:::o;34842:65::-;31283:12;:10;:12::i;:::-;31272:23;;:7;:5;:7::i;:::-;:23;;;31264:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34889:10:::1;:8;:10::i;:::-;34842:65::o:0;16671:91::-;16727:27;16733:12;:10;:12::i;:::-;16747:6;16727:5;:27::i;:::-;16671:91;:::o;26243:266::-;26330:7;26351:16;26369:13;26386:55;26395:10;26407:24;:33;26432:7;26407:33;;;;;;;;;;;;;;;26386:8;:55::i;:::-;26350:91;;;;26461:11;:40;;26483:18;26493:7;26483:9;:18::i;:::-;26461:40;;;26475:5;26461:40;26454:47;;;;26243:266;;;;:::o;33315:86::-;33362:4;33386:7;;;;;;;;;;;33379:14;;33315:86;:::o;7622:127::-;7696:7;7723:9;:18;7733:7;7723:18;;;;;;;;;;;;;;;;7716:25;;7622:127;;;:::o;31703:94::-;31283:12;:10;:12::i;:::-;31272:23;;:7;:5;:7::i;:::-;:23;;;31264:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;31768:21:::1;31786:1;31768:9;:21::i;:::-;31703:94::o:0;17081:368::-;17158:24;17185:32;17195:7;17204:12;:10;:12::i;:::-;17185:9;:32::i;:::-;17158:59;;17256:6;17236:16;:26;;17228:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;17339:58;17348:7;17357:12;:10;:12::i;:::-;17390:6;17371:16;:25;17339:8;:58::i;:::-;17419:22;17425:7;17434:6;17419:5;:22::i;:::-;17081:368;;;:::o;34773:61::-;31283:12;:10;:12::i;:::-;31272:23;;:7;:5;:7::i;:::-;:23;;;31264:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34818:8:::1;:6;:8::i;:::-;34773:61::o:0;31052:87::-;31098:7;31125:6;;;;;;;;;;;31118:13;;31052:87;:::o;6550:104::-;6606:13;6639:7;6632:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6550:104;:::o;34698:67::-;31283:12;:10;:12::i;:::-;31272:23;;:7;:5;:7::i;:::-;:23;;;31264:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34746:11:::1;:9;:11::i;:::-;;34698:67::o:0;26613:234::-;26685:7;26706:16;26724:13;26741:43;26750:10;26762:21;26741:8;:43::i;:::-;26705:79;;;;26804:11;:35;;26826:13;:11;:13::i;:::-;26804:35;;;26818:5;26804:35;26797:42;;;;26613:234;;;:::o;10768:413::-;10861:4;10878:24;10905:11;:25;10917:12;:10;:12::i;:::-;10905:25;;;;;;;;;;;;;;;:34;10931:7;10905:34;;;;;;;;;;;;;;;;10878:61;;10978:15;10958:16;:35;;10950:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;11071:67;11080:12;:10;:12::i;:::-;11094:7;11122:15;11103:16;:34;11071:8;:67::i;:::-;11169:4;11162:11;;;10768:413;;;;:::o;7962:175::-;8048:4;8065:42;8075:12;:10;:12::i;:::-;8089:9;8100:6;8065:9;:42::i;:::-;8125:4;8118:11;;7962:175;;;;:::o;8200:151::-;8289:7;8316:11;:18;8328:5;8316:18;;;;;;;;;;;;;;;:27;8335:7;8316:27;;;;;;;;;;;;;;;;8309:34;;8200:151;;;;:::o;31952:192::-;31283:12;:10;:12::i;:::-;31272:23;;:7;:5;:7::i;:::-;:23;;;31264:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;32061:1:::1;32041:22;;:8;:22;;;;32033:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;32117:19;32127:8;32117:9;:19::i;:::-;31952:192:::0;:::o;27064:622::-;27207:44;27234:4;27240:2;27244:6;27207:26;:44::i;:::-;27284:1;27268:18;;:4;:18;;;27264:415;;;27324:26;27347:2;27324:22;:26::i;:::-;27365:28;:26;:28::i;:::-;27264:415;;;27429:1;27415:16;;:2;:16;;;27411:268;;;27469:28;27492:4;27469:22;:28::i;:::-;27512;:26;:28::i;:::-;27411:268;;;27598:28;27621:4;27598:22;:28::i;:::-;27641:26;27664:2;27641:22;:26::i;:::-;27411:268;27264:415;27064:622;;;:::o;15432:125::-;;;;:::o;20803:114::-;20868:7;20895;:14;;;20888:21;;20803:114;;;:::o;4016:98::-;4069:7;4096:10;4089:17;;4016:98;:::o;14452:380::-;14605:1;14588:19;;:5;:19;;;;14580:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14686:1;14667:21;;:7;:21;;;;14659:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14770:6;14740:11;:18;14752:5;14740:18;;;;;;;;;;;;;;;:27;14759:7;14740:27;;;;;;;;;;;;;;;:36;;;;14808:7;14792:32;;14801:5;14792:32;;;14817:6;14792:32;;;;;;:::i;:::-;;;;;;;;14452:380;;;:::o;11671:733::-;11829:1;11811:20;;:6;:20;;;;11803:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;11913:1;11892:23;;:9;:23;;;;11884:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;11968:47;11989:6;11997:9;12008:6;11968:20;:47::i;:::-;12028:21;12052:9;:17;12062:6;12052:17;;;;;;;;;;;;;;;;12028:41;;12105:6;12088:13;:23;;12080:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;12226:6;12210:13;:22;12190:9;:17;12200:6;12190:17;;;;;;;;;;;;;;;:42;;;;12278:6;12254:9;:20;12264:9;12254:20;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;12319:9;12302:35;;12311:6;12302:35;;;12330:6;12302:35;;;;;;:::i;:::-;;;;;;;;12350:46;12370:6;12378:9;12389:6;12350:19;:46::i;:::-;11671:733;;;;:::o;34374:120::-;33918:8;:6;:8::i;:::-;33910:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;34443:5:::1;34433:7;;:15;;;;;;;;;;;;;;;;;;34464:22;34473:12;:10;:12::i;:::-;34464:22;;;;;;:::i;:::-;;;;;;;;34374:120::o:0;13423:591::-;13526:1;13507:21;;:7;:21;;;;13499:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;13579:49;13600:7;13617:1;13621:6;13579:20;:49::i;:::-;13641:22;13666:9;:18;13676:7;13666:18;;;;;;;;;;;;;;;;13641:43;;13721:6;13703:14;:24;;13695:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;13840:6;13823:14;:23;13802:9;:18;13812:7;13802:18;;;;;;;;;;;;;;;:44;;;;13884:6;13868:12;;:22;;;;;;;:::i;:::-;;;;;;;;13934:1;13908:37;;13917:7;13908:37;;;13938:6;13908:37;;;;;;:::i;:::-;;;;;;;;13958:48;13978:7;13995:1;13999:6;13958:19;:48::i;:::-;13423:591;;;:::o;27694:1619::-;27783:4;27789:7;27830:1;27817:10;:14;27809:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;27891:23;:21;:23::i;:::-;27877:10;:37;;27869:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;29087:13;29103:40;29132:10;29103:9;:13;;:28;;:40;;;;:::i;:::-;29087:56;;29169:9;:13;;:20;;;;29160:5;:29;29156:150;;;29214:5;29221:1;29206:17;;;;;;;29156:150;29264:4;29270:9;:16;;29287:5;29270:23;;;;;;;;;;;;;;;;;;;;;;;;29256:38;;;;;27694:1619;;;;;;:::o;32152:173::-;32208:16;32227:6;;;;;;;;;;;32208:25;;32253:8;32244:6;;:17;;;;;;;;;;;;;;;;;;32308:8;32277:40;;32298:8;32277:40;;;;;;;;;;;;32152:173;;:::o;34115:118::-;33641:8;:6;:8::i;:::-;33640:9;33632:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;34185:4:::1;34175:7;;:14;;;;;;;;;;;;;;;;;;34205:20;34212:12;:10;:12::i;:::-;34205:20;;;;;;:::i;:::-;;;;;;;;34115:118::o:0;25715:223::-;25762:7;25782:30;:18;:28;:30::i;:::-;25825:17;25845:23;:21;:23::i;:::-;25825:43;;25884:19;25893:9;25884:19;;;;;;:::i;:::-;;;;;;;;25921:9;25914:16;;;25715:223;:::o;29321:146::-;29389:70;29405:24;:33;29430:7;29405:33;;;;;;;;;;;;;;;29440:18;29450:7;29440:9;:18::i;:::-;29389:15;:70::i;:::-;29321:146;:::o;29475:118::-;29532:53;29548:21;29571:13;:11;:13::i;:::-;29532:15;:53::i;:::-;29475:118::o;34915:221::-;33641:8;:6;:8::i;:::-;33640:9;33632:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;35084:44:::1;35111:4;35117:2;35121:6;35084:26;:44::i;:::-;34915:221:::0;;;:::o;16161:124::-;;;;:::o;26004:127::-;26068:7;26095:28;:18;:26;:28::i;:::-;26088:35;;26004:127;:::o;19147:918::-;19236:7;19276:1;19260:5;:12;;;;:17;19256:58;;;19301:1;19294:8;;;;19256:58;19326:11;19352:12;19367:5;:12;;;;19352:27;;19392:424;19405:4;19399:3;:10;19392:424;;;19426:11;19440:23;19453:3;19458:4;19440:12;:23::i;:::-;19426:37;;19697:7;19684:5;19690:3;19684:10;;;;;;;;;;;;;;;;;;;;;;;;:20;19680:125;;;19732:3;19725:10;;19680:125;;;19788:1;19782:3;:7;;;;:::i;:::-;19776:13;;19680:125;19392:424;;;;19942:1;19936:3;:7;:36;;;;;19965:7;19947:5;19959:1;19953:3;:7;;;;:::i;:::-;19947:14;;;;;;;;;;;;;;;;;;;;;;;;:25;19936:36;19932:126;;;20002:1;19996:3;:7;;;;:::i;:::-;19989:14;;;;;;19932:126;20043:3;20036:10;;;;19147:918;;;;;:::o;20925:127::-;21032:1;21014:7;:14;;;:19;;;;;;;;;;;20925:127;:::o;29601:310::-;29696:17;29716:23;:21;:23::i;:::-;29696:43;;29787:9;29754:30;29770:9;:13;;29754:15;:30::i;:::-;:42;29750:154;;;29813:9;:13;;29832:9;29813:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29857:9;:16;;29879:12;29857:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29750:154;29601:310;;;:::o;18028:198::-;18090:7;18216:1;18210;18206;:5;;;;:::i;:::-;18200:1;18196;:5;;;;:::i;:::-;18195:17;;;;:::i;:::-;18194:23;;;;:::i;:::-;18188:1;18184;:5;;;;:::i;:::-;18178:1;18174;:5;;;;:::i;:::-;18173:17;;;;:::i;:::-;:45;;;;:::i;:::-;18166:52;;18028:198;;;;:::o;29919:212::-;29989:7;30027:1;30013:3;:10;;;;:15;30009:115;;;30052:1;30045:8;;;;30009:115;30093:3;30110:1;30097:3;:10;;;;:14;;;;:::i;:::-;30093:19;;;;;;;;;;;;;;;;;;;;;;;;30086:26;;29919: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:327::-;;2989:67;3053:2;3048:3;2989:67;:::i;:::-;2982:74;;3086:31;3082:1;3077:3;3073:11;3066:52;3144:2;3139:3;3135:12;3128:19;;2972:181;;;:::o;3159:367::-;;3322:67;3386:2;3381:3;3322:67;:::i;:::-;3315:74;;3419:34;3415:1;3410:3;3406:11;3399:55;3485:5;3480:2;3475:3;3471:12;3464:27;3517:2;3512:3;3508:12;3501:19;;3305:221;;;:::o;3532:318::-;;3695:67;3759:2;3754:3;3695:67;:::i;:::-;3688:74;;3792:22;3788:1;3783:3;3779:11;3772:43;3841:2;3836:3;3832:12;3825:19;;3678:172;;;:::o;3856:366::-;;4019:67;4083:2;4078:3;4019:67;:::i;:::-;4012:74;;4116:34;4112:1;4107:3;4103:11;4096:55;4182:4;4177:2;4172:3;4168:12;4161:26;4213:2;4208:3;4204:12;4197:19;;4002:220;;;:::o;4228:370::-;;4391:67;4455:2;4450:3;4391:67;:::i;:::-;4384:74;;4488:34;4484:1;4479:3;4475:11;4468:55;4554:8;4549:2;4544:3;4540:12;4533:30;4589:2;4584:3;4580:12;4573:19;;4374:224;;;:::o;4604:366::-;;4767:67;4831:2;4826:3;4767:67;:::i;:::-;4760:74;;4864:34;4860:1;4855:3;4851:11;4844:55;4930:4;4925:2;4920:3;4916:12;4909:26;4961:2;4956:3;4952:12;4945:19;;4750:220;;;:::o;4976:370::-;;5139:67;5203:2;5198:3;5139:67;:::i;:::-;5132:74;;5236:34;5232:1;5227:3;5223:11;5216:55;5302:8;5297:2;5292:3;5288:12;5281:30;5337:2;5332:3;5328:12;5321:19;;5122:224;;;:::o;5352:314::-;;5515:67;5579:2;5574:3;5515:67;:::i;:::-;5508:74;;5612:18;5608:1;5603:3;5599:11;5592:39;5657:2;5652:3;5648:12;5641:19;;5498:168;;;:::o;5672:372::-;;5835:67;5899:2;5894:3;5835:67;:::i;:::-;5828:74;;5932:34;5928:1;5923:3;5919:11;5912:55;5998:10;5993:2;5988:3;5984:12;5977:32;6035:2;6030:3;6026:12;6019:19;;5818:226;;;:::o;6050:330::-;;6213:67;6277:2;6272:3;6213:67;:::i;:::-;6206:74;;6310:34;6306:1;6301:3;6297:11;6290:55;6371:2;6366:3;6362:12;6355:19;;6196:184;;;:::o;6386:368::-;;6549:67;6613:2;6608:3;6549:67;:::i;:::-;6542:74;;6646:34;6642:1;6637:3;6633:11;6626:55;6712:6;6707:2;6702:3;6698:12;6691:28;6745:2;6740:3;6736:12;6729:19;;6532:222;;;:::o;6760:365::-;;6923:67;6987:2;6982:3;6923:67;:::i;:::-;6916:74;;7020:34;7016:1;7011:3;7007:11;7000:55;7086:3;7081:2;7076:3;7072:12;7065:25;7116:2;7111:3;7107:12;7100:19;;6906:219;;;:::o;7131:369::-;;7294:67;7358:2;7353:3;7294:67;:::i;:::-;7287:74;;7391:34;7387:1;7382:3;7378:11;7371:55;7457:7;7452:2;7447:3;7443:12;7436:29;7491:2;7486:3;7482:12;7475:19;;7277:223;;;:::o;7506:368::-;;7669:67;7733:2;7728:3;7669:67;:::i;:::-;7662:74;;7766:34;7762:1;7757:3;7753:11;7746:55;7832:6;7827:2;7822:3;7818:12;7811:28;7865:2;7860:3;7856:12;7849:19;;7652:222;;;:::o;7880:320::-;;8043:67;8107:2;8102:3;8043:67;:::i;:::-;8036:74;;8140:24;8136:1;8131:3;8127:11;8120:45;8191:2;8186:3;8182:12;8175:19;;8026:174;;;:::o;8206:369::-;;8369:67;8433:2;8428:3;8369:67;:::i;:::-;8362:74;;8466:34;8462:1;8457:3;8453:11;8446:55;8532:7;8527:2;8522:3;8518:12;8511:29;8566:2;8561:3;8557:12;8550:19;;8352:223;;;:::o;8581:118::-;8668:24;8686:5;8668:24;:::i;:::-;8663:3;8656:37;8646:53;;:::o;8705:112::-;8788:22;8804:5;8788:22;:::i;:::-;8783:3;8776:35;8766:51;;:::o;8823:222::-;;8954:2;8943:9;8939:18;8931:26;;8967:71;9035:1;9024:9;9020:17;9011:6;8967:71;:::i;:::-;8921:124;;;;:::o;9051:210::-;;9176:2;9165:9;9161:18;9153:26;;9189:65;9251:1;9240:9;9236:17;9227:6;9189:65;:::i;:::-;9143:118;;;;:::o;9267:313::-;;9418:2;9407:9;9403:18;9395:26;;9467:9;9461:4;9457:20;9453:1;9442:9;9438:17;9431:47;9495:78;9568:4;9559:6;9495:78;:::i;:::-;9487:86;;9385:195;;;;:::o;9586:419::-;;9790:2;9779:9;9775:18;9767:26;;9839:9;9833:4;9829:20;9825:1;9814:9;9810:17;9803:47;9867:131;9993:4;9867:131;:::i;:::-;9859:139;;9757:248;;;:::o;10011:419::-;;10215:2;10204:9;10200:18;10192:26;;10264:9;10258:4;10254:20;10250:1;10239:9;10235:17;10228:47;10292:131;10418:4;10292:131;:::i;:::-;10284:139;;10182:248;;;:::o;10436:419::-;;10640:2;10629:9;10625:18;10617:26;;10689:9;10683:4;10679:20;10675:1;10664:9;10660:17;10653:47;10717:131;10843:4;10717:131;:::i;:::-;10709:139;;10607:248;;;:::o;10861:419::-;;11065:2;11054:9;11050:18;11042:26;;11114:9;11108:4;11104:20;11100:1;11089:9;11085:17;11078:47;11142:131;11268:4;11142:131;:::i;:::-;11134:139;;11032:248;;;:::o;11286:419::-;;11490:2;11479:9;11475:18;11467:26;;11539:9;11533:4;11529:20;11525:1;11514:9;11510:17;11503:47;11567:131;11693:4;11567:131;:::i;:::-;11559:139;;11457:248;;;:::o;11711:419::-;;11915:2;11904:9;11900:18;11892:26;;11964:9;11958:4;11954:20;11950:1;11939:9;11935:17;11928:47;11992:131;12118:4;11992:131;:::i;:::-;11984:139;;11882:248;;;:::o;12136:419::-;;12340:2;12329:9;12325:18;12317:26;;12389:9;12383:4;12379:20;12375:1;12364:9;12360:17;12353:47;12417:131;12543:4;12417:131;:::i;:::-;12409:139;;12307:248;;;:::o;12561:419::-;;12765:2;12754:9;12750:18;12742:26;;12814:9;12808:4;12804:20;12800:1;12789:9;12785:17;12778:47;12842:131;12968:4;12842:131;:::i;:::-;12834:139;;12732:248;;;:::o;12986:419::-;;13190:2;13179:9;13175:18;13167:26;;13239:9;13233:4;13229:20;13225:1;13214:9;13210:17;13203:47;13267:131;13393:4;13267:131;:::i;:::-;13259:139;;13157:248;;;:::o;13411:419::-;;13615:2;13604:9;13600:18;13592:26;;13664:9;13658:4;13654:20;13650:1;13639:9;13635:17;13628:47;13692:131;13818:4;13692:131;:::i;:::-;13684:139;;13582:248;;;:::o;13836:419::-;;14040:2;14029:9;14025:18;14017:26;;14089:9;14083:4;14079:20;14075:1;14064:9;14060:17;14053:47;14117:131;14243:4;14117:131;:::i;:::-;14109:139;;14007:248;;;:::o;14261:419::-;;14465:2;14454:9;14450:18;14442:26;;14514:9;14508:4;14504:20;14500:1;14489:9;14485:17;14478:47;14542:131;14668:4;14542:131;:::i;:::-;14534:139;;14432:248;;;:::o;14686:419::-;;14890:2;14879:9;14875:18;14867:26;;14939:9;14933:4;14929:20;14925:1;14914:9;14910:17;14903:47;14967:131;15093:4;14967:131;:::i;:::-;14959:139;;14857:248;;;:::o;15111:419::-;;15315:2;15304:9;15300:18;15292:26;;15364:9;15358:4;15354:20;15350:1;15339:9;15335:17;15328:47;15392:131;15518:4;15392:131;:::i;:::-;15384:139;;15282:248;;;:::o;15536:419::-;;15740:2;15729:9;15725:18;15717:26;;15789:9;15783:4;15779:20;15775:1;15764:9;15760:17;15753:47;15817:131;15943:4;15817:131;:::i;:::-;15809:139;;15707:248;;;:::o;15961:419::-;;16165:2;16154:9;16150:18;16142:26;;16214:9;16208:4;16204:20;16200:1;16189:9;16185:17;16178:47;16242:131;16368:4;16242:131;:::i;:::-;16234:139;;16132:248;;;:::o;16386:222::-;;16517:2;16506:9;16502:18;16494:26;;16530:71;16598:1;16587:9;16583:17;16574:6;16530:71;:::i;:::-;16484:124;;;;:::o;16614:214::-;;16741:2;16730:9;16726:18;16718:26;;16754:67;16818:1;16807:9;16803:17;16794:6;16754:67;:::i;:::-;16708:120;;;;:::o;16834:99::-;;16920:5;16914:12;16904:22;;16893:40;;;:::o;16939:169::-;;17057:6;17052:3;17045:19;17097:4;17092:3;17088:14;17073:29;;17035:73;;;;:::o;17114:305::-;;17173:20;17191:1;17173:20;:::i;:::-;17168:25;;17207:20;17225:1;17207:20;:::i;:::-;17202:25;;17361:1;17293:66;17289:74;17286:1;17283:81;17280:2;;;17367:18;;:::i;:::-;17280:2;17411:1;17408;17404:9;17397:16;;17158:261;;;;:::o;17425:185::-;;17482:20;17500:1;17482:20;:::i;:::-;17477:25;;17516:20;17534:1;17516:20;:::i;:::-;17511:25;;17555:1;17545:2;;17560:18;;:::i;:::-;17545:2;17602:1;17599;17595:9;17590:14;;17467:143;;;;:::o;17616:191::-;;17676:20;17694:1;17676:20;:::i;:::-;17671:25;;17710:20;17728:1;17710:20;:::i;:::-;17705:25;;17749:1;17746;17743:8;17740:2;;;17754:18;;:::i;:::-;17740:2;17799:1;17796;17792:9;17784:17;;17661:146;;;;:::o;17813:96::-;;17879:24;17897:5;17879:24;:::i;:::-;17868:35;;17858:51;;;:::o;17915:90::-;;17992:5;17985:13;17978:21;17967:32;;17957:48;;;:::o;18011:126::-;;18088:42;18081:5;18077:54;18066:65;;18056:81;;;:::o;18143:77::-;;18209:5;18198:16;;18188:32;;;:::o;18226:86::-;;18301:4;18294:5;18290:16;18279:27;;18269:43;;;:::o;18318:307::-;18386:1;18396:113;18410:6;18407:1;18404:13;18396:113;;;18495:1;18490:3;18486:11;18480:18;18476:1;18471:3;18467:11;18460:39;18432:2;18429:1;18425:10;18420:15;;18396:113;;;18527:6;18524:1;18521:13;18518:2;;;18607:1;18598:6;18593:3;18589:16;18582:27;18518:2;18367:258;;;;:::o;18631:320::-;;18712:1;18706:4;18702:12;18692:22;;18759:1;18753:4;18749:12;18780:18;18770:2;;18836:4;18828:6;18824:17;18814:27;;18770:2;18898;18890:6;18887:14;18867:18;18864:38;18861:2;;;18917:18;;:::i;:::-;18861:2;18682:269;;;;:::o;18957:176::-;;19006:20;19024:1;19006:20;:::i;:::-;19001:25;;19040:20;19058:1;19040:20;:::i;:::-;19035:25;;19079:1;19069:2;;19084:18;;:::i;:::-;19069:2;19125:1;19122;19118:9;19113:14;;18991:142;;;;:::o;19139:180::-;19187:77;19184:1;19177:88;19284:4;19281:1;19274:15;19308:4;19305:1;19298:15;19325:180;19373:77;19370:1;19363:88;19470:4;19467:1;19460:15;19494:4;19491:1;19484:15;19511:180;19559:77;19556:1;19549:88;19656:4;19653:1;19646:15;19680:4;19677:1;19670:15;19697:102;;19789:2;19785:7;19780:2;19773:5;19769:14;19765:28;19755:38;;19745:54;;;:::o;19805:122::-;19878:24;19896:5;19878:24;:::i;:::-;19871:5;19868:35;19858:2;;19917:1;19914;19907:12;19858:2;19848:79;:::o;19933:122::-;20006:24;20024:5;20006:24;:::i;:::-;19999:5;19996:35;19986:2;;20045:1;20042;20035:12;19986:2;19976:79;:::o

Swarm Source

ipfs://492bc0f48f88e0630c23bd29fe0b56f467937b72c2e456e76db329bf764b40cb
Loading