Token Comb Finance

 

Overview ERC-20

Price
$0.00 @ 0.000000 FTM
Fully Diluted Market Cap
Total Supply:
185,356.491683 COMB

Holders:
3,138 addresses

Transfers:
-

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

OVERVIEW

COMB Finance is a hybrid protocol for blockchain services.


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:
COMB

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
// import "@openzeppelin/contracts/utils/math/SafeMath.sol";
// import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
// import "@openzeppelin/contracts/access/AccessControl.sol";

// COMB FINANCE COMB FINANCE COMB FINANCE COMB FINANCE COMB FINANCE COMB FINANCE COMB FINANCE
//
//                        ....
//                    .,,,,,,,,,,...
//              ..,.,,,,,,,,,,,,,,,.,,..
//          ..,,,,,,,,,,,,,,,,,,,,,.,,,,,,..
//       .,.,,,,,,,.,,,,..     .,,,.,,,,,,,.,,,
//   ,,,,,,,,,,,,,,..              ..,,,,,,,,,,,,,,,         ,*,,,,,
// .,,,,,,,,,,,..                       .,,,,,,,,,,.,,  .******,,,,,,,,,.
// .,,,,,,,,.                               .,,,,,,,,*///******,,,,,,,,,,,,..
// .,,,.,,,                                  .,.,,,.,////******,,,,,,,,.,,,.,,,..
// .,,,,,,,                                  .,,,,,,,////**,.        ,,,,,,,,,,,,,,
// .,,,,,,,                                  .,,,,,.,//,.                .,,,,,,,,,
// .,,,,,,,                                  .,,,,,,,*                    ..,,,,,,,
// .,,,,,,,                                  .,,,,,.,,                     .,,,,,,,
// .,,,,,,,                                  .,,,,,,,,                     .,,,,,,,
// .,,,,,,,                                  .,,,,,.,,                     .,,,,,,,
// .,,,,,,,.                                 .,,,,,,,,.                   .,,,,,,,,
// .,.,.,.,...                            ..,.,.,.,.,.,..               ..,.,.,.,.,
// .,,,,,,..,,,,,,                    .,,,,,,,,,,,,,,,,,,,,,,       .,,,,,,,,,,,,,.
//    .,...,,,,,,,,,,,.           ,.,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,.,,,,,,,,,,..
//        .,,,,,,,,*******,  .,,,,,.,,,,,,,,,,       ..,,,,,,,,,,,,.,,,,,,..
//            .,,,*********,,,,,,,,.,,,,,******,,,.       ,.,,,,,,,.,,.
//                 ,***,,,,,,,,,,,,,,*********,,,,,,,           ,.
//                   ,,,,,,,,,,,,        ..,,,,,,,,.,,
//                   .,,,,,,,,               ,,,,,,,,,
//                   .,.,,,.,                 ..,,,.,,
//                   .,,,,,,,                 .,,,,,,,
//                   .,,,,,,,                .,,,,,.,,
//                   .,,,,,,,,,.            .,,,,,,,,,
//                   .,,,,,.,,,,,,... ...,,.,,,,,,,.,,
//                     ..,,,,,,,,,,.,,,,,,,,,,,,,,,.
//                         ..,,,,,,.,,,,,,,,,,,.
//                              .,,.,,,,,..
//
// COMB FINANCE COMB FINANCE COMB FINANCE COMB FINANCE COMB FINANCE COMB FINANCE COMB FINANCE

pragma solidity ^0.8.3;

library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length)
        internal
        pure
        returns (string memory)
    {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

interface IAccessControl {
    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(
        bytes32 indexed role,
        bytes32 indexed previousAdminRole,
        bytes32 indexed newAdminRole
    );

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {AccessControl-_setupRole}.
     */
    event RoleGranted(
        bytes32 indexed role,
        address indexed account,
        address indexed sender
    );

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(
        bytes32 indexed role,
        address indexed account,
        address indexed sender
    );

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account)
        external
        view
        returns (bool);

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {AccessControl-_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) external;
}

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

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

interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override
        returns (bool)
    {
        return interfaceId == type(IERC165).interfaceId;
    }
}

abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with a standardized message including the required role.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     *
     * _Available since v4.1._
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role, _msgSender());
        _;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override
        returns (bool)
    {
        return
            interfaceId == type(IAccessControl).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account)
        public
        view
        override
        returns (bool)
    {
        return _roles[role].members[account];
    }

    /**
     * @dev Revert with a standard message if `account` is missing `role`.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     */
    function _checkRole(bytes32 role, address account) internal view {
        if (!hasRole(role, account)) {
            revert(
                string(
                    abi.encodePacked(
                        "AccessControl: account ",
                        Strings.toHexString(uint160(account), 20),
                        " is missing role ",
                        Strings.toHexString(uint256(role), 32)
                    )
                )
            );
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view override returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account)
        public
        virtual
        override
        onlyRole(getRoleAdmin(role))
    {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account)
        public
        virtual
        override
        onlyRole(getRoleAdmin(role))
    {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been revoked `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account)
        public
        virtual
        override
    {
        require(
            account == _msgSender(),
            "AccessControl: can only renounce roles for self"
        );

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     *
     * NOTE: This function is deprecated in favor of {_grantRole}.
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        bytes32 previousAdminRole = getRoleAdmin(role);
        _roles[role].adminRole = adminRole;
        emit RoleAdminChanged(role, previousAdminRole, adminRole);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * Internal function without access restriction.
     */
    function _grantRole(bytes32 role, address account) internal virtual {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * Internal function without access restriction.
     */
    function _revokeRole(bytes32 role, address account) internal virtual {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}

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
    );
}

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);
}

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 {}
}

library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

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

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

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

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

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

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

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

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

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

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

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

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

// COMB FINANCE START COMB FINANCE START COMB FINANCE START COMB FINANCE START COMB FINANCE START
//
//                        ....
//                    .,,,,,,,,,,...
//              ..,.,,,,,,,,,,,,,,,.,,..
//          ..,,,,,,,,,,,,,,,,,,,,,.,,,,,,..
//       .,.,,,,,,,.,,,,..     .,,,.,,,,,,,.,,,
//   ,,,,,,,,,,,,,,..              ..,,,,,,,,,,,,,,,         ,*,,,,,
// .,,,,,,,,,,,..                       .,,,,,,,,,,.,,  .******,,,,,,,,,.
// .,,,,,,,,.                               .,,,,,,,,*///******,,,,,,,,,,,,..
// .,,,.,,,                                  .,.,,,.,////******,,,,,,,,.,,,.,,,..
// .,,,,,,,                                  .,,,,,,,////**,.        ,,,,,,,,,,,,,,
// .,,,,,,,                                  .,,,,,.,//,.                .,,,,,,,,,
// .,,,,,,,                                  .,,,,,,,*                    ..,,,,,,,
// .,,,,,,,                                  .,,,,,.,,                     .,,,,,,,
// .,,,,,,,                                  .,,,,,,,,                     .,,,,,,,
// .,,,,,,,                                  .,,,,,.,,                     .,,,,,,,
// .,,,,,,,.                                 .,,,,,,,,.                   .,,,,,,,,
// .,.,.,.,...                            ..,.,.,.,.,.,..               ..,.,.,.,.,
// .,,,,,,..,,,,,,                    .,,,,,,,,,,,,,,,,,,,,,,       .,,,,,,,,,,,,,.
//    .,...,,,,,,,,,,,.           ,.,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,.,,,,,,,,,,..
//        .,,,,,,,,*******,  .,,,,,.,,,,,,,,,,       ..,,,,,,,,,,,,.,,,,,,..
//            .,,,*********,,,,,,,,.,,,,,******,,,.       ,.,,,,,,,.,,.
//                 ,***,,,,,,,,,,,,,,*********,,,,,,,           ,.
//                   ,,,,,,,,,,,,        ..,,,,,,,,.,,
//                   .,,,,,,,,               ,,,,,,,,,
//                   .,.,,,.,                 ..,,,.,,
//                   .,,,,,,,                 .,,,,,,,
//                   .,,,,,,,                .,,,,,.,,
//                   .,,,,,,,,,.            .,,,,,,,,,
//                   .,,,,,.,,,,,,... ...,,.,,,,,,,.,,
//                     ..,,,,,,,,,,.,,,,,,,,,,,,,,,.
//                         ..,,,,,,.,,,,,,,,,,,.
//                              .,,.,,,,,..
//
// COMB FINANCE START COMB FINANCE START COMB FINANCE START COMB FINANCE START COMB FINANCE START

contract COMB is ERC20, AccessControl {
    using SafeMath for uint256;

    bytes32 public constant SENTRY_ROLE = keccak256("SENTRY_ROLE");

    mapping(address => bool) public blacklist;
    mapping(address => bool) public whitelist;
    // Maps the last epoch that was claimed
    mapping(address => uint256) public timeout;

    bool public hasAntiWhale = false;
    uint256 public antiWhaleValue = 64 * (10**18);
    uint256 public overThreshold = 20 * (10**18);
    uint256 public antiWhaleTimeout = 300;

    constructor() ERC20("Comb Finance", "COMB") {
        _setupRole(DEFAULT_ADMIN_ROLE, msg.sender);
    }

    /**
    Blacklist and whale setters
     */

    function blacklistMalicious(address account, bool value)
        external
        onlyRole(DEFAULT_ADMIN_ROLE)
    {
        blacklist[account] = value;
    }

    function whitelistBypass(address account, bool value)
        external
        onlyRole(DEFAULT_ADMIN_ROLE)
    {
        whitelist[account] = value;
    }

    /**
    Add blacklist and whale functionality
     */

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(!blacklist[from] && !blacklist[to], "Go away.");
        if (hasAntiWhale && !whitelist[to]) {
            require(
                amount <= antiWhaleValue,
                "Antiwhale is currently on. Please reduce the amount or wait a bit longer."
            );
        }

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

    /**
    Allow the minting and burning of tokens from authority
     */

    function mint(address to, uint256 amount) public {
        require(
            hasRole(SENTRY_ROLE, msg.sender) ||
                hasRole(DEFAULT_ADMIN_ROLE, msg.sender),
            "Caller is not a minter"
        );
        _mint(to, amount);
    }

    function burn(address from, uint256 amount) public {
        require(
            hasRole(SENTRY_ROLE, msg.sender) ||
                hasRole(DEFAULT_ADMIN_ROLE, msg.sender),
            "Caller is not a burner"
        );
        _burn(from, amount);
    }

    /**
    Anti-whale setters
     */

    function changeAntiWhaleValue(uint256 value)
        public
        onlyRole(DEFAULT_ADMIN_ROLE)
    {
        antiWhaleValue = value;
    }

    function changeAntiWhaleTimeout(uint256 value)
        public
        onlyRole(DEFAULT_ADMIN_ROLE)
    {
        antiWhaleTimeout = value;
    }

    function changeHasAntiWhale(bool value)
        public
        onlyRole(DEFAULT_ADMIN_ROLE)
    {
        hasAntiWhale = value;
    }

    /**
    Provide contracts a way of modifying roles.
     */

    function originGrant(bytes32 role, address account) public {
        require(hasRole(DEFAULT_ADMIN_ROLE, tx.origin), "No access");
        _grantRole(role, account);
    }

    function originRevoke(bytes32 role, address account) public {
        require(hasRole(DEFAULT_ADMIN_ROLE, tx.origin), "No access");
        _revokeRole(role, account);
    }
}

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":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SENTRY_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"antiWhaleTimeout","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"antiWhaleValue","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":"","type":"address"}],"name":"blacklist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"blacklistMalicious","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"changeAntiWhaleTimeout","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"changeAntiWhaleValue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"changeHasAntiWhale","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":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"hasAntiWhale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"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":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"originGrant","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"originRevoke","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"overThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"timeout","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"whitelistBypass","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600960006101000a81548160ff0219169083151502179055506803782dace9d9000000600a556801158e460913d00000600b5561012c600c553480156200004c57600080fd5b506040518060400160405280600c81526020017f436f6d622046696e616e636500000000000000000000000000000000000000008152506040518060400160405280600481526020017f434f4d42000000000000000000000000000000000000000000000000000000008152508160039080519060200190620000d192919062000283565b508060049080519060200190620000ea92919062000283565b505050620001026000801b336200010860201b60201c565b62000398565b6200011a82826200011e60201b60201c565b5050565b6200013082826200021060201b60201c565b6200020c5760016005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620001b16200027b60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600033905090565b828054620002919062000362565b90600052602060002090601f016020900481019282620002b5576000855562000301565b82601f10620002d057805160ff191683800117855562000301565b8280016001018555821562000301579182015b8281111562000300578251825591602001919060010190620002e3565b5b50905062000310919062000314565b5090565b5b808211156200032f57600081600090555060010162000315565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200037b57607f821691505b6020821081141562000392576200039162000333565b5b50919050565b6130ea80620003a86000396000f3fe608060405234801561001057600080fd5b50600436106102115760003560e01c806391d1485411610125578063a9059cbb116100ad578063d547741f1161007c578063d547741f1461064e578063d89293421461066a578063dd62ed3e14610686578063e6e44761146106b6578063f9f92be4146106d257610211565b8063a9059cbb146105b2578063aedd18dc146105e2578063d18f717514610612578063d320ca341461063057610211565b80639a2b29dd116100f45780639a2b29dd146104fc5780639b19251a146105185780639dc29fac14610548578063a217fddf14610564578063a457c2d71461058257610211565b806391d148541461047457806394bc1b1c146104a457806395d89b41146104c257806395db7614146104e057610211565b8063313ce567116101a857806349db26d51161017757806349db26d5146103d057806369e863bb146103ec57806370a08231146104085780637a9ad019146104385780638143d3381461045657610211565b8063313ce5671461034a57806336568abe14610368578063395093511461038457806340c10f19146103b457610211565b806318160ddd116101e457806318160ddd146102b057806323b872dd146102ce578063248a9ca3146102fe5780632f2ff15d1461032e57610211565b806301c18b9a1461021657806301ffc9a71461023257806306fdde0314610262578063095ea7b314610280575b600080fd5b610230600480360381019061022b9190611fee565b610702565b005b61024c60048036038101906102479190612073565b610722565b60405161025991906120bb565b60405180910390f35b61026a61079c565b604051610277919061216f565b60405180910390f35b61029a600480360381019061029591906121ef565b61082e565b6040516102a791906120bb565b60405180910390f35b6102b861084c565b6040516102c5919061223e565b60405180910390f35b6102e860048036038101906102e39190612259565b610856565b6040516102f591906120bb565b60405180910390f35b610318600480360381019061031391906122e2565b61094e565b604051610325919061231e565b60405180910390f35b61034860048036038101906103439190612339565b61096e565b005b610352610997565b60405161035f9190612395565b60405180910390f35b610382600480360381019061037d9190612339565b6109a0565b005b61039e600480360381019061039991906121ef565b610a23565b6040516103ab91906120bb565b60405180910390f35b6103ce60048036038101906103c991906121ef565b610acf565b005b6103ea60048036038101906103e59190611fee565b610b5a565b005b61040660048036038101906104019190612339565b610b7a565b005b610422600480360381019061041d91906123b0565b610bd4565b60405161042f919061223e565b60405180910390f35b610440610c1c565b60405161044d919061231e565b60405180910390f35b61045e610c40565b60405161046b919061223e565b60405180910390f35b61048e60048036038101906104899190612339565b610c46565b60405161049b91906120bb565b60405180910390f35b6104ac610cb1565b6040516104b991906120bb565b60405180910390f35b6104ca610cc4565b6040516104d7919061216f565b60405180910390f35b6104fa60048036038101906104f59190612339565b610d56565b005b61051660048036038101906105119190612409565b610db0565b005b610532600480360381019061052d91906123b0565b610e21565b60405161053f91906120bb565b60405180910390f35b610562600480360381019061055d91906121ef565b610e41565b005b61056c610ecc565b604051610579919061231e565b60405180910390f35b61059c600480360381019061059791906121ef565b610ed3565b6040516105a991906120bb565b60405180910390f35b6105cc60048036038101906105c791906121ef565b610fbe565b6040516105d991906120bb565b60405180910390f35b6105fc60048036038101906105f791906123b0565b610fdc565b604051610609919061223e565b60405180910390f35b61061a610ff4565b604051610627919061223e565b60405180910390f35b610638610ffa565b604051610645919061223e565b60405180910390f35b61066860048036038101906106639190612339565b611000565b005b610684600480360381019061067f9190612409565b611029565b005b6106a0600480360381019061069b9190612449565b61109a565b6040516106ad919061223e565b60405180910390f35b6106d060048036038101906106cb9190612489565b611121565b005b6106ec60048036038101906106e791906123b0565b611154565b6040516106f991906120bb565b60405180910390f35b6000801b61071781610712611174565b61117c565b81600c819055505050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610795575061079482611219565b5b9050919050565b6060600380546107ab906124e5565b80601f01602080910402602001604051908101604052809291908181526020018280546107d7906124e5565b80156108245780601f106107f957610100808354040283529160200191610824565b820191906000526020600020905b81548152906001019060200180831161080757829003601f168201915b5050505050905090565b600061084261083b611174565b8484611283565b6001905092915050565b6000600254905090565b600061086384848461144e565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006108ae611174565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508281101561092e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092590612589565b60405180910390fd5b6109428561093a611174565b858403611283565b60019150509392505050565b600060056000838152602001908152602001600020600101549050919050565b6109778261094e565b61098881610983611174565b61117c565b61099283836115f2565b505050565b60006012905090565b6109a8611174565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0c9061261b565b60405180910390fd5b610a1f82826116d3565b5050565b6000610ac5610a30611174565b848460016000610a3e611174565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610ac0919061266a565b611283565b6001905092915050565b610af97f5bea60102f2a7acc9e82b1af0e3bd4069661102bb5dd143a6051cd1980dded1c33610c46565b80610b0d5750610b0c6000801b33610c46565b5b610b4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b439061270c565b60405180910390fd5b610b5682826117b5565b5050565b6000801b610b6f81610b6a611174565b61117c565b81600a819055505050565b610b876000801b32610c46565b610bc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbd90612778565b60405180910390fd5b610bd082826115f2565b5050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b7f5bea60102f2a7acc9e82b1af0e3bd4069661102bb5dd143a6051cd1980dded1c81565b600a5481565b60006005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600960009054906101000a900460ff1681565b606060048054610cd3906124e5565b80601f0160208091040260200160405190810160405280929190818152602001828054610cff906124e5565b8015610d4c5780601f10610d2157610100808354040283529160200191610d4c565b820191906000526020600020905b815481529060010190602001808311610d2f57829003601f168201915b5050505050905090565b610d636000801b32610c46565b610da2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9990612778565b60405180910390fd5b610dac82826116d3565b5050565b6000801b610dc581610dc0611174565b61117c565b81600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550505050565b60076020528060005260406000206000915054906101000a900460ff1681565b610e6b7f5bea60102f2a7acc9e82b1af0e3bd4069661102bb5dd143a6051cd1980dded1c33610c46565b80610e7f5750610e7e6000801b33610c46565b5b610ebe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb5906127e4565b60405180910390fd5b610ec88282611915565b5050565b6000801b81565b60008060016000610ee2611174565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610f9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9690612876565b60405180910390fd5b610fb3610faa611174565b85858403611283565b600191505092915050565b6000610fd2610fcb611174565b848461144e565b6001905092915050565b60086020528060005260406000206000915090505481565b600c5481565b600b5481565b6110098261094e565b61101a81611015611174565b61117c565b61102483836116d3565b505050565b6000801b61103e81611039611174565b61117c565b81600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000801b61113681611131611174565b61117c565b81600960006101000a81548160ff0219169083151502179055505050565b60066020528060005260406000206000915054906101000a900460ff1681565b600033905090565b6111868282610c46565b611215576111ab8173ffffffffffffffffffffffffffffffffffffffff166014611aec565b6111b98360001c6020611aec565b6040516020016111ca92919061296a565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120c919061216f565b60405180910390fd5b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156112f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ea90612a16565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611363576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135a90612aa8565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611441919061223e565b60405180910390a3505050565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156114f25750600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b611531576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152890612b14565b60405180910390fd5b600960009054906101000a900460ff1680156115975750600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156115e257600a548111156115e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d890612bcc565b60405180910390fd5b5b6115ed838383611d28565b505050565b6115fc8282610c46565b6116cf5760016005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611674611174565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6116dd8282610c46565b156117b15760006005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611756611174565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611825576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181c90612c38565b60405180910390fd5b61183160008383611fa9565b8060026000828254611843919061266a565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611898919061266a565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516118fd919061223e565b60405180910390a361191160008383611fae565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611985576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197c90612cca565b60405180910390fd5b61199182600083611fa9565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611a17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0e90612d5c565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160026000828254611a6e9190612d7c565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611ad3919061223e565b60405180910390a3611ae783600084611fae565b505050565b606060006002836002611aff9190612db0565b611b09919061266a565b67ffffffffffffffff811115611b2257611b21612e0a565b5b6040519080825280601f01601f191660200182016040528015611b545781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611b8c57611b8b612e39565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611bf057611bef612e39565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002611c309190612db0565b611c3a919061266a565b90505b6001811115611cda577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110611c7c57611c7b612e39565b5b1a60f81b828281518110611c9357611c92612e39565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080611cd390612e68565b9050611c3d565b5060008414611d1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1590612ede565b60405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611d98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8f90612f70565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dff90613002565b60405180910390fd5b611e13838383611fa9565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611e99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9090613094565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f2c919061266a565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611f90919061223e565b60405180910390a3611fa3848484611fae565b50505050565b505050565b505050565b600080fd5b6000819050919050565b611fcb81611fb8565b8114611fd657600080fd5b50565b600081359050611fe881611fc2565b92915050565b60006020828403121561200457612003611fb3565b5b600061201284828501611fd9565b91505092915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6120508161201b565b811461205b57600080fd5b50565b60008135905061206d81612047565b92915050565b60006020828403121561208957612088611fb3565b5b60006120978482850161205e565b91505092915050565b60008115159050919050565b6120b5816120a0565b82525050565b60006020820190506120d060008301846120ac565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156121105780820151818401526020810190506120f5565b8381111561211f576000848401525b50505050565b6000601f19601f8301169050919050565b6000612141826120d6565b61214b81856120e1565b935061215b8185602086016120f2565b61216481612125565b840191505092915050565b600060208201905081810360008301526121898184612136565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006121bc82612191565b9050919050565b6121cc816121b1565b81146121d757600080fd5b50565b6000813590506121e9816121c3565b92915050565b6000806040838503121561220657612205611fb3565b5b6000612214858286016121da565b925050602061222585828601611fd9565b9150509250929050565b61223881611fb8565b82525050565b6000602082019050612253600083018461222f565b92915050565b60008060006060848603121561227257612271611fb3565b5b6000612280868287016121da565b9350506020612291868287016121da565b92505060406122a286828701611fd9565b9150509250925092565b6000819050919050565b6122bf816122ac565b81146122ca57600080fd5b50565b6000813590506122dc816122b6565b92915050565b6000602082840312156122f8576122f7611fb3565b5b6000612306848285016122cd565b91505092915050565b612318816122ac565b82525050565b6000602082019050612333600083018461230f565b92915050565b600080604083850312156123505761234f611fb3565b5b600061235e858286016122cd565b925050602061236f858286016121da565b9150509250929050565b600060ff82169050919050565b61238f81612379565b82525050565b60006020820190506123aa6000830184612386565b92915050565b6000602082840312156123c6576123c5611fb3565b5b60006123d4848285016121da565b91505092915050565b6123e6816120a0565b81146123f157600080fd5b50565b600081359050612403816123dd565b92915050565b600080604083850312156124205761241f611fb3565b5b600061242e858286016121da565b925050602061243f858286016123f4565b9150509250929050565b600080604083850312156124605761245f611fb3565b5b600061246e858286016121da565b925050602061247f858286016121da565b9150509250929050565b60006020828403121561249f5761249e611fb3565b5b60006124ad848285016123f4565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806124fd57607f821691505b60208210811415612511576125106124b6565b5b50919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b60006125736028836120e1565b915061257e82612517565b604082019050919050565b600060208201905081810360008301526125a281612566565b9050919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000612605602f836120e1565b9150612610826125a9565b604082019050919050565b60006020820190508181036000830152612634816125f8565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061267582611fb8565b915061268083611fb8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156126b5576126b461263b565b5b828201905092915050565b7f43616c6c6572206973206e6f742061206d696e74657200000000000000000000600082015250565b60006126f66016836120e1565b9150612701826126c0565b602082019050919050565b60006020820190508181036000830152612725816126e9565b9050919050565b7f4e6f206163636573730000000000000000000000000000000000000000000000600082015250565b60006127626009836120e1565b915061276d8261272c565b602082019050919050565b6000602082019050818103600083015261279181612755565b9050919050565b7f43616c6c6572206973206e6f742061206275726e657200000000000000000000600082015250565b60006127ce6016836120e1565b91506127d982612798565b602082019050919050565b600060208201905081810360008301526127fd816127c1565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006128606025836120e1565b915061286b82612804565b604082019050919050565b6000602082019050818103600083015261288f81612853565b9050919050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b60006128d7601783612896565b91506128e2826128a1565b601782019050919050565b60006128f8826120d6565b6129028185612896565b93506129128185602086016120f2565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000612954601183612896565b915061295f8261291e565b601182019050919050565b6000612975826128ca565b915061298182856128ed565b915061298c82612947565b915061299882846128ed565b91508190509392505050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612a006024836120e1565b9150612a0b826129a4565b604082019050919050565b60006020820190508181036000830152612a2f816129f3565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000612a926022836120e1565b9150612a9d82612a36565b604082019050919050565b60006020820190508181036000830152612ac181612a85565b9050919050565b7f476f20617761792e000000000000000000000000000000000000000000000000600082015250565b6000612afe6008836120e1565b9150612b0982612ac8565b602082019050919050565b60006020820190508181036000830152612b2d81612af1565b9050919050565b7f416e74697768616c652069732063757272656e746c79206f6e2e20506c65617360008201527f65207265647563652074686520616d6f756e74206f722077616974206120626960208201527f74206c6f6e6765722e0000000000000000000000000000000000000000000000604082015250565b6000612bb66049836120e1565b9150612bc182612b34565b606082019050919050565b60006020820190508181036000830152612be581612ba9565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000612c22601f836120e1565b9150612c2d82612bec565b602082019050919050565b60006020820190508181036000830152612c5181612c15565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000612cb46021836120e1565b9150612cbf82612c58565b604082019050919050565b60006020820190508181036000830152612ce381612ca7565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000612d466022836120e1565b9150612d5182612cea565b604082019050919050565b60006020820190508181036000830152612d7581612d39565b9050919050565b6000612d8782611fb8565b9150612d9283611fb8565b925082821015612da557612da461263b565b5b828203905092915050565b6000612dbb82611fb8565b9150612dc683611fb8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612dff57612dfe61263b565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000612e7382611fb8565b91506000821415612e8757612e8661263b565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000612ec86020836120e1565b9150612ed382612e92565b602082019050919050565b60006020820190508181036000830152612ef781612ebb565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000612f5a6025836120e1565b9150612f6582612efe565b604082019050919050565b60006020820190508181036000830152612f8981612f4d565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000612fec6023836120e1565b9150612ff782612f90565b604082019050919050565b6000602082019050818103600083015261301b81612fdf565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b600061307e6026836120e1565b915061308982613022565b604082019050919050565b600060208201905081810360008301526130ad81613071565b905091905056fea2646970667358221220009d2dae83bbb3a165108e5ffa6754aee53a039eb60182b443592f42e0df3c6164736f6c634300080a0033

Deployed ByteCode Sourcemap

37898:3122:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40287:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9340:280;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18525:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20833:210;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19645:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21525:529;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10868:123;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11253:188;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19487:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12383:287;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22463:297;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39550:260;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40134:145;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40659:174;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19816:177;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37978:62;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38280:45;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9712:180;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38241:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18744:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40841:176;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38766:160;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38097:41;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39818:264;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8727:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23263:482;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20206:216;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38190:42;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38383:37;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38332:44;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11686:190;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38595:163;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20485:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40444:138;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38049:41;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40287:149;8772:4;40368:18;;9218:30;9229:4;9235:12;:10;:12::i;:::-;9218:10;:30::i;:::-;40423:5:::1;40404:16;:24;;;;40287:149:::0;;:::o;9340:280::-;9470:4;9527:32;9512:47;;;:11;:47;;;;:100;;;;9576:36;9600:11;9576:23;:36::i;:::-;9512:100;9492:120;;9340:280;;;:::o;18525:100::-;18579:13;18612:5;18605:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18525:100;:::o;20833:210::-;20952:4;20974:39;20983:12;:10;:12::i;:::-;20997:7;21006:6;20974:8;:39::i;:::-;21031:4;21024:11;;20833:210;;;;:::o;19645:108::-;19706:7;19733:12;;19726:19;;19645:108;:::o;21525:529::-;21665:4;21682:36;21692:6;21700:9;21711:6;21682:9;:36::i;:::-;21731:24;21758:11;:19;21770:6;21758:19;;;;;;;;;;;;;;;:33;21778:12;:10;:12::i;:::-;21758:33;;;;;;;;;;;;;;;;21731:60;;21844:6;21824:16;:26;;21802:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;21954:57;21963:6;21971:12;:10;:12::i;:::-;22004:6;21985:16;:25;21954:8;:57::i;:::-;22042:4;22035:11;;;21525:529;;;;;:::o;10868:123::-;10934:7;10961:6;:12;10968:4;10961:12;;;;;;;;;;;:22;;;10954:29;;10868:123;;;:::o;11253:188::-;11372:18;11385:4;11372:12;:18::i;:::-;9218:30;9229:4;9235:12;:10;:12::i;:::-;9218:10;:30::i;:::-;11408:25:::1;11419:4;11425:7;11408:10;:25::i;:::-;11253:188:::0;;;:::o;19487:93::-;19545:5;19570:2;19563:9;;19487:93;:::o;12383:287::-;12536:12;:10;:12::i;:::-;12525:23;;:7;:23;;;12503:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;12636:26;12648:4;12654:7;12636:11;:26::i;:::-;12383:287;;:::o;22463:297::-;22578:4;22600:130;22623:12;:10;:12::i;:::-;22650:7;22709:10;22672:11;:25;22684:12;:10;:12::i;:::-;22672:25;;;;;;;;;;;;;;;:34;22698:7;22672:34;;;;;;;;;;;;;;;;:47;;;;:::i;:::-;22600:8;:130::i;:::-;22748:4;22741:11;;22463:297;;;;:::o;39550:260::-;39632:32;38016:24;39653:10;39632:7;:32::i;:::-;:92;;;;39685:39;8772:4;39693:18;;39713:10;39685:7;:39::i;:::-;39632:92;39610:164;;;;;;;;;;;;:::i;:::-;;;;;;;;;39785:17;39791:2;39795:6;39785:5;:17::i;:::-;39550:260;;:::o;40134:145::-;8772:4;40213:18;;9218:30;9229:4;9235:12;:10;:12::i;:::-;9218:10;:30::i;:::-;40266:5:::1;40249:14;:22;;;;40134:145:::0;;:::o;40659:174::-;40737:38;8772:4;40745:18;;40765:9;40737:7;:38::i;:::-;40729:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;40800:25;40811:4;40817:7;40800:10;:25::i;:::-;40659:174;;:::o;19816:177::-;19935:7;19967:9;:18;19977:7;19967:18;;;;;;;;;;;;;;;;19960:25;;19816:177;;;:::o;37978:62::-;38016:24;37978:62;:::o;38280:45::-;;;;:::o;9712:180::-;9826:4;9855:6;:12;9862:4;9855:12;;;;;;;;;;;:20;;:29;9876:7;9855:29;;;;;;;;;;;;;;;;;;;;;;;;;9848:36;;9712:180;;;;:::o;38241:32::-;;;;;;;;;;;;;:::o;18744:104::-;18800:13;18833:7;18826:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18744:104;:::o;40841:176::-;40920:38;8772:4;40928:18;;40948:9;40920:7;:38::i;:::-;40912:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;40983:26;40995:4;41001:7;40983:11;:26::i;:::-;40841:176;;:::o;38766:160::-;8772:4;38856:18;;9218:30;9229:4;9235:12;:10;:12::i;:::-;9218:10;:30::i;:::-;38913:5:::1;38892:9;:18;38902:7;38892:18;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;38766:160:::0;;;:::o;38097:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;39818:264::-;39902:32;38016:24;39923:10;39902:7;:32::i;:::-;:92;;;;39955:39;8772:4;39963:18;;39983:10;39955:7;:39::i;:::-;39902:92;39880:164;;;;;;;;;;;;:::i;:::-;;;;;;;;;40055:19;40061:4;40067:6;40055:5;:19::i;:::-;39818:264;;:::o;8727:49::-;8772:4;8727:49;;;:::o;23263:482::-;23383:4;23405:24;23432:11;:25;23444:12;:10;:12::i;:::-;23432:25;;;;;;;;;;;;;;;:34;23458:7;23432:34;;;;;;;;;;;;;;;;23405:61;;23519:15;23499:16;:35;;23477:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;23635:67;23644:12;:10;:12::i;:::-;23658:7;23686:15;23667:16;:34;23635:8;:67::i;:::-;23733:4;23726:11;;;23263:482;;;;:::o;20206:216::-;20328:4;20350:42;20360:12;:10;:12::i;:::-;20374:9;20385:6;20350:9;:42::i;:::-;20410:4;20403:11;;20206:216;;;;:::o;38190:42::-;;;;;;;;;;;;;;;;;:::o;38383:37::-;;;;:::o;38332:44::-;;;;:::o;11686:190::-;11806:18;11819:4;11806:12;:18::i;:::-;9218:30;9229:4;9235:12;:10;:12::i;:::-;9218:10;:30::i;:::-;11842:26:::1;11854:4;11860:7;11842:11;:26::i;:::-;11686:190:::0;;;:::o;38595:163::-;8772:4;38688:18;;9218:30;9229:4;9235:12;:10;:12::i;:::-;9218:10;:30::i;:::-;38745:5:::1;38724:9;:18;38734:7;38724:18;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;38595:163:::0;;;:::o;20485:201::-;20619:7;20651:11;:18;20663:5;20651:18;;;;;;;;;;;;;;;:27;20670:7;20651:27;;;;;;;;;;;;;;;;20644:34;;20485:201;;;;:::o;40444:138::-;8772:4;40518:18;;9218:30;9229:4;9235:12;:10;:12::i;:::-;9218:10;:30::i;:::-;40569:5:::1;40554:12;;:20;;;;;;;;;;;;;;;;;;40444:138:::0;;:::o;38049:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;7502:98::-;7555:7;7582:10;7575:17;;7502:98;:::o;10182:497::-;10263:22;10271:4;10277:7;10263;:22::i;:::-;10258:414;;10451:41;10479:7;10451:41;;10489:2;10451:19;:41::i;:::-;10565:38;10593:4;10585:13;;10600:2;10565:19;:38::i;:::-;10356:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;10302:358;;;;;;;;;;;:::i;:::-;;;;;;;;10258:414;10182:497;;:::o;8284:207::-;8414:4;8458:25;8443:40;;;:11;:40;;;;8436:47;;8284:207;;;:::o;27053:380::-;27206:1;27189:19;;:5;:19;;;;27181:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;27287:1;27268:21;;:7;:21;;;;27260:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;27371:6;27341:11;:18;27353:5;27341:18;;;;;;;;;;;;;;;:27;27360:7;27341:27;;;;;;;;;;;;;;;:36;;;;27409:7;27393:32;;27402:5;27393:32;;;27418:6;27393:32;;;;;;:::i;:::-;;;;;;;;27053:380;;;:::o;38997:465::-;39130:9;:15;39140:4;39130:15;;;;;;;;;;;;;;;;;;;;;;;;;39129:16;:34;;;;;39150:9;:13;39160:2;39150:13;;;;;;;;;;;;;;;;;;;;;;;;;39149:14;39129:34;39121:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;39191:12;;;;;;;;;;;:30;;;;;39208:9;:13;39218:2;39208:13;;;;;;;;;;;;;;;;;;;;;;;;;39207:14;39191:30;39187:222;;;39274:14;;39264:6;:24;;39238:159;;;;;;;;;;;;:::i;:::-;;;;;;;;;39187:222;39421:33;39437:4;39443:2;39447:6;39421:15;:33::i;:::-;38997:465;;;:::o;13953:238::-;14037:22;14045:4;14051:7;14037;:22::i;:::-;14032:152;;14108:4;14076:6;:12;14083:4;14076:12;;;;;;;;;;;:20;;:29;14097:7;14076:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;14159:12;:10;:12::i;:::-;14132:40;;14150:7;14132:40;;14144:4;14132:40;;;;;;;;;;14032:152;13953:238;;:::o;14323:239::-;14407:22;14415:4;14421:7;14407;:22::i;:::-;14403:152;;;14478:5;14446:6;:12;14453:4;14446:12;;;;;;;;;;;:20;;:29;14467:7;14446:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;14530:12;:10;:12::i;:::-;14503:40;;14521:7;14503:40;;14515:4;14503:40;;;;;;;;;;14403:152;14323:239;;:::o;25292:399::-;25395:1;25376:21;;:7;:21;;;;25368:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;25446:49;25475:1;25479:7;25488:6;25446:20;:49::i;:::-;25524:6;25508:12;;:22;;;;;;;:::i;:::-;;;;;;;;25563:6;25541:9;:18;25551:7;25541:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;25606:7;25585:37;;25602:1;25585:37;;;25615:6;25585:37;;;;;;:::i;:::-;;;;;;;;25635:48;25663:1;25667:7;25676:6;25635:19;:48::i;:::-;25292:399;;:::o;26024:591::-;26127:1;26108:21;;:7;:21;;;;26100:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;26180:49;26201:7;26218:1;26222:6;26180:20;:49::i;:::-;26242:22;26267:9;:18;26277:7;26267:18;;;;;;;;;;;;;;;;26242:43;;26322:6;26304:14;:24;;26296:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;26441:6;26424:14;:23;26403:9;:18;26413:7;26403:18;;;;;;;;;;;;;;;:44;;;;26485:6;26469:12;;:22;;;;;;;:::i;:::-;;;;;;;;26535:1;26509:37;;26518:7;26509:37;;;26539:6;26509:37;;;;;;:::i;:::-;;;;;;;;26559:48;26579:7;26596:1;26600:6;26559:19;:48::i;:::-;26089:526;26024:591;;:::o;4057:483::-;4159:13;4190:19;4235:1;4226:6;4222:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;4212:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4190:47;;4248:15;:6;4255:1;4248:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;4274;:6;4281:1;4274:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;4305:9;4330:1;4321:6;4317:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;4305:26;;4300:135;4337:1;4333;:5;4300:135;;;4372:12;4393:3;4385:5;:11;4372:25;;;;;;;:::i;:::-;;;;;4360:6;4367:1;4360:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;4422:1;4412:11;;;;;4340:3;;;;:::i;:::-;;;4300:135;;;;4462:1;4453:5;:10;4445:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;4525:6;4511:21;;;4057:483;;;;:::o;24235:770::-;24393:1;24375:20;;:6;:20;;;;24367:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;24477:1;24456:23;;:9;:23;;;;24448:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;24532:47;24553:6;24561:9;24572:6;24532:20;:47::i;:::-;24592:21;24616:9;:17;24626:6;24616:17;;;;;;;;;;;;;;;;24592:41;;24683:6;24666:13;:23;;24644:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;24827:6;24811:13;:22;24791:9;:17;24801:6;24791:17;;;;;;;;;;;;;;;:42;;;;24879:6;24855:9;:20;24865:9;24855:20;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;24920:9;24903:35;;24912:6;24903:35;;;24931:6;24903:35;;;;;;:::i;:::-;;;;;;;;24951:46;24971:6;24979:9;24990:6;24951:19;:46::i;:::-;24356:649;24235:770;;;:::o;28033:125::-;;;;:::o;28762:124::-;;;;:::o;88:117:1:-;197:1;194;187:12;334:77;371:7;400:5;389:16;;334:77;;;:::o;417:122::-;490:24;508:5;490:24;:::i;:::-;483:5;480:35;470:63;;529:1;526;519:12;470:63;417:122;:::o;545:139::-;591:5;629:6;616:20;607:29;;645:33;672:5;645:33;:::i;:::-;545:139;;;;:::o;690:329::-;749:6;798:2;786:9;777:7;773:23;769:32;766:119;;;804:79;;:::i;:::-;766:119;924:1;949:53;994:7;985:6;974:9;970:22;949:53;:::i;:::-;939:63;;895:117;690:329;;;;:::o;1025:149::-;1061:7;1101:66;1094:5;1090:78;1079:89;;1025:149;;;:::o;1180:120::-;1252:23;1269:5;1252:23;:::i;:::-;1245:5;1242:34;1232:62;;1290:1;1287;1280:12;1232:62;1180:120;:::o;1306:137::-;1351:5;1389:6;1376:20;1367:29;;1405:32;1431:5;1405:32;:::i;:::-;1306:137;;;;:::o;1449:327::-;1507:6;1556:2;1544:9;1535:7;1531:23;1527:32;1524:119;;;1562:79;;:::i;:::-;1524:119;1682:1;1707:52;1751:7;1742:6;1731:9;1727:22;1707:52;:::i;:::-;1697:62;;1653:116;1449:327;;;;:::o;1782:90::-;1816:7;1859:5;1852:13;1845:21;1834:32;;1782:90;;;:::o;1878:109::-;1959:21;1974:5;1959:21;:::i;:::-;1954:3;1947:34;1878:109;;:::o;1993:210::-;2080:4;2118:2;2107:9;2103:18;2095:26;;2131:65;2193:1;2182:9;2178:17;2169:6;2131:65;:::i;:::-;1993:210;;;;:::o;2209:99::-;2261:6;2295:5;2289:12;2279:22;;2209:99;;;:::o;2314:169::-;2398:11;2432:6;2427:3;2420:19;2472:4;2467:3;2463:14;2448:29;;2314:169;;;;:::o;2489:307::-;2557:1;2567:113;2581:6;2578:1;2575:13;2567:113;;;2666:1;2661:3;2657:11;2651:18;2647:1;2642:3;2638:11;2631:39;2603:2;2600:1;2596:10;2591:15;;2567:113;;;2698:6;2695:1;2692:13;2689:101;;;2778:1;2769:6;2764:3;2760:16;2753:27;2689:101;2538:258;2489:307;;;:::o;2802:102::-;2843:6;2894:2;2890:7;2885:2;2878:5;2874:14;2870:28;2860:38;;2802:102;;;:::o;2910:364::-;2998:3;3026:39;3059:5;3026:39;:::i;:::-;3081:71;3145:6;3140:3;3081:71;:::i;:::-;3074:78;;3161:52;3206:6;3201:3;3194:4;3187:5;3183:16;3161:52;:::i;:::-;3238:29;3260:6;3238:29;:::i;:::-;3233:3;3229:39;3222:46;;3002:272;2910:364;;;;:::o;3280:313::-;3393:4;3431:2;3420:9;3416:18;3408:26;;3480:9;3474:4;3470:20;3466:1;3455:9;3451:17;3444:47;3508:78;3581:4;3572:6;3508:78;:::i;:::-;3500:86;;3280:313;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:122::-;3906:24;3924:5;3906:24;:::i;:::-;3899:5;3896:35;3886:63;;3945:1;3942;3935:12;3886:63;3833:122;:::o;3961:139::-;4007:5;4045:6;4032:20;4023:29;;4061:33;4088:5;4061:33;:::i;:::-;3961:139;;;;:::o;4106:474::-;4174:6;4182;4231:2;4219:9;4210:7;4206:23;4202:32;4199:119;;;4237:79;;:::i;:::-;4199:119;4357:1;4382:53;4427:7;4418:6;4407:9;4403:22;4382:53;:::i;:::-;4372:63;;4328:117;4484:2;4510:53;4555:7;4546:6;4535:9;4531:22;4510:53;:::i;:::-;4500:63;;4455:118;4106:474;;;;;:::o;4586:118::-;4673:24;4691:5;4673:24;:::i;:::-;4668:3;4661:37;4586:118;;:::o;4710:222::-;4803:4;4841:2;4830:9;4826:18;4818:26;;4854:71;4922:1;4911:9;4907:17;4898:6;4854:71;:::i;:::-;4710:222;;;;:::o;4938:619::-;5015:6;5023;5031;5080:2;5068:9;5059:7;5055:23;5051:32;5048:119;;;5086:79;;:::i;:::-;5048:119;5206:1;5231:53;5276:7;5267:6;5256:9;5252:22;5231:53;:::i;:::-;5221:63;;5177:117;5333:2;5359:53;5404:7;5395:6;5384:9;5380:22;5359:53;:::i;:::-;5349:63;;5304:118;5461:2;5487:53;5532:7;5523:6;5512:9;5508:22;5487:53;:::i;:::-;5477:63;;5432:118;4938:619;;;;;:::o;5563:77::-;5600:7;5629:5;5618:16;;5563:77;;;:::o;5646:122::-;5719:24;5737:5;5719:24;:::i;:::-;5712:5;5709:35;5699:63;;5758:1;5755;5748:12;5699:63;5646:122;:::o;5774:139::-;5820:5;5858:6;5845:20;5836:29;;5874:33;5901:5;5874:33;:::i;:::-;5774:139;;;;:::o;5919:329::-;5978:6;6027:2;6015:9;6006:7;6002:23;5998:32;5995:119;;;6033:79;;:::i;:::-;5995:119;6153:1;6178:53;6223:7;6214:6;6203:9;6199:22;6178:53;:::i;:::-;6168:63;;6124:117;5919:329;;;;:::o;6254:118::-;6341:24;6359:5;6341:24;:::i;:::-;6336:3;6329:37;6254:118;;:::o;6378:222::-;6471:4;6509:2;6498:9;6494:18;6486:26;;6522:71;6590:1;6579:9;6575:17;6566:6;6522:71;:::i;:::-;6378:222;;;;:::o;6606:474::-;6674:6;6682;6731:2;6719:9;6710:7;6706:23;6702:32;6699:119;;;6737:79;;:::i;:::-;6699:119;6857:1;6882:53;6927:7;6918:6;6907:9;6903:22;6882:53;:::i;:::-;6872:63;;6828:117;6984:2;7010:53;7055:7;7046:6;7035:9;7031:22;7010:53;:::i;:::-;7000:63;;6955:118;6606:474;;;;;:::o;7086:86::-;7121:7;7161:4;7154:5;7150:16;7139:27;;7086:86;;;:::o;7178:112::-;7261:22;7277:5;7261:22;:::i;:::-;7256:3;7249:35;7178:112;;:::o;7296:214::-;7385:4;7423:2;7412:9;7408:18;7400:26;;7436:67;7500:1;7489:9;7485:17;7476:6;7436:67;:::i;:::-;7296:214;;;;:::o;7516:329::-;7575:6;7624:2;7612:9;7603:7;7599:23;7595:32;7592:119;;;7630:79;;:::i;:::-;7592:119;7750:1;7775:53;7820:7;7811:6;7800:9;7796:22;7775:53;:::i;:::-;7765:63;;7721:117;7516:329;;;;:::o;7851:116::-;7921:21;7936:5;7921:21;:::i;:::-;7914:5;7911:32;7901:60;;7957:1;7954;7947:12;7901:60;7851:116;:::o;7973:133::-;8016:5;8054:6;8041:20;8032:29;;8070:30;8094:5;8070:30;:::i;:::-;7973:133;;;;:::o;8112:468::-;8177:6;8185;8234:2;8222:9;8213:7;8209:23;8205:32;8202:119;;;8240:79;;:::i;:::-;8202:119;8360:1;8385:53;8430:7;8421:6;8410:9;8406:22;8385:53;:::i;:::-;8375:63;;8331:117;8487:2;8513:50;8555:7;8546:6;8535:9;8531:22;8513:50;:::i;:::-;8503:60;;8458:115;8112:468;;;;;:::o;8586:474::-;8654:6;8662;8711:2;8699:9;8690:7;8686:23;8682:32;8679:119;;;8717:79;;:::i;:::-;8679:119;8837:1;8862:53;8907:7;8898:6;8887:9;8883:22;8862:53;:::i;:::-;8852:63;;8808:117;8964:2;8990:53;9035:7;9026:6;9015:9;9011:22;8990:53;:::i;:::-;8980:63;;8935:118;8586:474;;;;;:::o;9066:323::-;9122:6;9171:2;9159:9;9150:7;9146:23;9142:32;9139:119;;;9177:79;;:::i;:::-;9139:119;9297:1;9322:50;9364:7;9355:6;9344:9;9340:22;9322:50;:::i;:::-;9312:60;;9268:114;9066:323;;;;:::o;9395:180::-;9443:77;9440:1;9433:88;9540:4;9537:1;9530:15;9564:4;9561:1;9554:15;9581:320;9625:6;9662:1;9656:4;9652:12;9642:22;;9709:1;9703:4;9699:12;9730:18;9720:81;;9786:4;9778:6;9774:17;9764:27;;9720:81;9848:2;9840:6;9837:14;9817:18;9814:38;9811:84;;;9867:18;;:::i;:::-;9811:84;9632:269;9581:320;;;:::o;9907:227::-;10047:34;10043:1;10035:6;10031:14;10024:58;10116:10;10111:2;10103:6;10099:15;10092:35;9907:227;:::o;10140:366::-;10282:3;10303:67;10367:2;10362:3;10303:67;:::i;:::-;10296:74;;10379:93;10468:3;10379:93;:::i;:::-;10497:2;10492:3;10488:12;10481:19;;10140:366;;;:::o;10512:419::-;10678:4;10716:2;10705:9;10701:18;10693:26;;10765:9;10759:4;10755:20;10751:1;10740:9;10736:17;10729:47;10793:131;10919:4;10793:131;:::i;:::-;10785:139;;10512:419;;;:::o;10937:234::-;11077:34;11073:1;11065:6;11061:14;11054:58;11146:17;11141:2;11133:6;11129:15;11122:42;10937:234;:::o;11177:366::-;11319:3;11340:67;11404:2;11399:3;11340:67;:::i;:::-;11333:74;;11416:93;11505:3;11416:93;:::i;:::-;11534:2;11529:3;11525:12;11518:19;;11177:366;;;:::o;11549:419::-;11715:4;11753:2;11742:9;11738:18;11730:26;;11802:9;11796:4;11792:20;11788:1;11777:9;11773:17;11766:47;11830:131;11956:4;11830:131;:::i;:::-;11822:139;;11549:419;;;:::o;11974:180::-;12022:77;12019:1;12012:88;12119:4;12116:1;12109:15;12143:4;12140:1;12133:15;12160:305;12200:3;12219:20;12237:1;12219:20;:::i;:::-;12214:25;;12253:20;12271:1;12253:20;:::i;:::-;12248:25;;12407:1;12339:66;12335:74;12332:1;12329:81;12326:107;;;12413:18;;:::i;:::-;12326:107;12457:1;12454;12450:9;12443:16;;12160:305;;;;:::o;12471:172::-;12611:24;12607:1;12599:6;12595:14;12588:48;12471:172;:::o;12649:366::-;12791:3;12812:67;12876:2;12871:3;12812:67;:::i;:::-;12805:74;;12888:93;12977:3;12888:93;:::i;:::-;13006:2;13001:3;12997:12;12990:19;;12649:366;;;:::o;13021:419::-;13187:4;13225:2;13214:9;13210:18;13202:26;;13274:9;13268:4;13264:20;13260:1;13249:9;13245:17;13238:47;13302:131;13428:4;13302:131;:::i;:::-;13294:139;;13021:419;;;:::o;13446:159::-;13586:11;13582:1;13574:6;13570:14;13563:35;13446:159;:::o;13611:365::-;13753:3;13774:66;13838:1;13833:3;13774:66;:::i;:::-;13767:73;;13849:93;13938:3;13849:93;:::i;:::-;13967:2;13962:3;13958:12;13951:19;;13611:365;;;:::o;13982:419::-;14148:4;14186:2;14175:9;14171:18;14163:26;;14235:9;14229:4;14225:20;14221:1;14210:9;14206:17;14199:47;14263:131;14389:4;14263:131;:::i;:::-;14255:139;;13982:419;;;:::o;14407:172::-;14547:24;14543:1;14535:6;14531:14;14524:48;14407:172;:::o;14585:366::-;14727:3;14748:67;14812:2;14807:3;14748:67;:::i;:::-;14741:74;;14824:93;14913:3;14824:93;:::i;:::-;14942:2;14937:3;14933:12;14926:19;;14585:366;;;:::o;14957:419::-;15123:4;15161:2;15150:9;15146:18;15138:26;;15210:9;15204:4;15200:20;15196:1;15185:9;15181:17;15174:47;15238:131;15364:4;15238:131;:::i;:::-;15230:139;;14957:419;;;:::o;15382:224::-;15522:34;15518:1;15510:6;15506:14;15499:58;15591:7;15586:2;15578:6;15574:15;15567:32;15382:224;:::o;15612:366::-;15754:3;15775:67;15839:2;15834:3;15775:67;:::i;:::-;15768:74;;15851:93;15940:3;15851:93;:::i;:::-;15969:2;15964:3;15960:12;15953:19;;15612:366;;;:::o;15984:419::-;16150:4;16188:2;16177:9;16173:18;16165:26;;16237:9;16231:4;16227:20;16223:1;16212:9;16208:17;16201:47;16265:131;16391:4;16265:131;:::i;:::-;16257:139;;15984:419;;;:::o;16409:148::-;16511:11;16548:3;16533:18;;16409:148;;;;:::o;16563:173::-;16703:25;16699:1;16691:6;16687:14;16680:49;16563:173;:::o;16742:402::-;16902:3;16923:85;17005:2;17000:3;16923:85;:::i;:::-;16916:92;;17017:93;17106:3;17017:93;:::i;:::-;17135:2;17130:3;17126:12;17119:19;;16742:402;;;:::o;17150:377::-;17256:3;17284:39;17317:5;17284:39;:::i;:::-;17339:89;17421:6;17416:3;17339:89;:::i;:::-;17332:96;;17437:52;17482:6;17477:3;17470:4;17463:5;17459:16;17437:52;:::i;:::-;17514:6;17509:3;17505:16;17498:23;;17260:267;17150:377;;;;:::o;17533:167::-;17673:19;17669:1;17661:6;17657:14;17650:43;17533:167;:::o;17706:402::-;17866:3;17887:85;17969:2;17964:3;17887:85;:::i;:::-;17880:92;;17981:93;18070:3;17981:93;:::i;:::-;18099:2;18094:3;18090:12;18083:19;;17706:402;;;:::o;18114:967::-;18496:3;18518:148;18662:3;18518:148;:::i;:::-;18511:155;;18683:95;18774:3;18765:6;18683:95;:::i;:::-;18676:102;;18795:148;18939:3;18795:148;:::i;:::-;18788:155;;18960:95;19051:3;19042:6;18960:95;:::i;:::-;18953:102;;19072:3;19065:10;;18114:967;;;;;:::o;19087:223::-;19227:34;19223:1;19215:6;19211:14;19204:58;19296:6;19291:2;19283:6;19279:15;19272:31;19087:223;:::o;19316:366::-;19458:3;19479:67;19543:2;19538:3;19479:67;:::i;:::-;19472:74;;19555:93;19644:3;19555:93;:::i;:::-;19673:2;19668:3;19664:12;19657:19;;19316:366;;;:::o;19688:419::-;19854:4;19892:2;19881:9;19877:18;19869:26;;19941:9;19935:4;19931:20;19927:1;19916:9;19912:17;19905:47;19969:131;20095:4;19969:131;:::i;:::-;19961:139;;19688:419;;;:::o;20113:221::-;20253:34;20249:1;20241:6;20237:14;20230:58;20322:4;20317:2;20309:6;20305:15;20298:29;20113:221;:::o;20340:366::-;20482:3;20503:67;20567:2;20562:3;20503:67;:::i;:::-;20496:74;;20579:93;20668:3;20579:93;:::i;:::-;20697:2;20692:3;20688:12;20681:19;;20340:366;;;:::o;20712:419::-;20878:4;20916:2;20905:9;20901:18;20893:26;;20965:9;20959:4;20955:20;20951:1;20940:9;20936:17;20929:47;20993:131;21119:4;20993:131;:::i;:::-;20985:139;;20712:419;;;:::o;21137:158::-;21277:10;21273:1;21265:6;21261:14;21254:34;21137:158;:::o;21301:365::-;21443:3;21464:66;21528:1;21523:3;21464:66;:::i;:::-;21457:73;;21539:93;21628:3;21539:93;:::i;:::-;21657:2;21652:3;21648:12;21641:19;;21301:365;;;:::o;21672:419::-;21838:4;21876:2;21865:9;21861:18;21853:26;;21925:9;21919:4;21915:20;21911:1;21900:9;21896:17;21889:47;21953:131;22079:4;21953:131;:::i;:::-;21945:139;;21672:419;;;:::o;22097:297::-;22237:34;22233:1;22225:6;22221:14;22214:58;22306:34;22301:2;22293:6;22289:15;22282:59;22375:11;22370:2;22362:6;22358:15;22351:36;22097:297;:::o;22400:366::-;22542:3;22563:67;22627:2;22622:3;22563:67;:::i;:::-;22556:74;;22639:93;22728:3;22639:93;:::i;:::-;22757:2;22752:3;22748:12;22741:19;;22400:366;;;:::o;22772:419::-;22938:4;22976:2;22965:9;22961:18;22953:26;;23025:9;23019:4;23015:20;23011:1;23000:9;22996:17;22989:47;23053:131;23179:4;23053:131;:::i;:::-;23045:139;;22772:419;;;:::o;23197:181::-;23337:33;23333:1;23325:6;23321:14;23314:57;23197:181;:::o;23384:366::-;23526:3;23547:67;23611:2;23606:3;23547:67;:::i;:::-;23540:74;;23623:93;23712:3;23623:93;:::i;:::-;23741:2;23736:3;23732:12;23725:19;;23384:366;;;:::o;23756:419::-;23922:4;23960:2;23949:9;23945:18;23937:26;;24009:9;24003:4;23999:20;23995:1;23984:9;23980:17;23973:47;24037:131;24163:4;24037:131;:::i;:::-;24029:139;;23756:419;;;:::o;24181:220::-;24321:34;24317:1;24309:6;24305:14;24298:58;24390:3;24385:2;24377:6;24373:15;24366:28;24181:220;:::o;24407:366::-;24549:3;24570:67;24634:2;24629:3;24570:67;:::i;:::-;24563:74;;24646:93;24735:3;24646:93;:::i;:::-;24764:2;24759:3;24755:12;24748:19;;24407:366;;;:::o;24779:419::-;24945:4;24983:2;24972:9;24968:18;24960:26;;25032:9;25026:4;25022:20;25018:1;25007:9;25003:17;24996:47;25060:131;25186:4;25060:131;:::i;:::-;25052:139;;24779:419;;;:::o;25204:221::-;25344:34;25340:1;25332:6;25328:14;25321:58;25413:4;25408:2;25400:6;25396:15;25389:29;25204:221;:::o;25431:366::-;25573:3;25594:67;25658:2;25653:3;25594:67;:::i;:::-;25587:74;;25670:93;25759:3;25670:93;:::i;:::-;25788:2;25783:3;25779:12;25772:19;;25431:366;;;:::o;25803:419::-;25969:4;26007:2;25996:9;25992:18;25984:26;;26056:9;26050:4;26046:20;26042:1;26031:9;26027:17;26020:47;26084:131;26210:4;26084:131;:::i;:::-;26076:139;;25803:419;;;:::o;26228:191::-;26268:4;26288:20;26306:1;26288:20;:::i;:::-;26283:25;;26322:20;26340:1;26322:20;:::i;:::-;26317:25;;26361:1;26358;26355:8;26352:34;;;26366:18;;:::i;:::-;26352:34;26411:1;26408;26404:9;26396:17;;26228:191;;;;:::o;26425:348::-;26465:7;26488:20;26506:1;26488:20;:::i;:::-;26483:25;;26522:20;26540:1;26522:20;:::i;:::-;26517:25;;26710:1;26642:66;26638:74;26635:1;26632:81;26627:1;26620:9;26613:17;26609:105;26606:131;;;26717:18;;:::i;:::-;26606:131;26765:1;26762;26758:9;26747:20;;26425:348;;;;:::o;26779:180::-;26827:77;26824:1;26817:88;26924:4;26921:1;26914:15;26948:4;26945:1;26938:15;26965:180;27013:77;27010:1;27003:88;27110:4;27107:1;27100:15;27134:4;27131:1;27124:15;27151:171;27190:3;27213:24;27231:5;27213:24;:::i;:::-;27204:33;;27259:4;27252:5;27249:15;27246:41;;;27267:18;;:::i;:::-;27246:41;27314:1;27307:5;27303:13;27296:20;;27151:171;;;:::o;27328:182::-;27468:34;27464:1;27456:6;27452:14;27445:58;27328:182;:::o;27516:366::-;27658:3;27679:67;27743:2;27738:3;27679:67;:::i;:::-;27672:74;;27755:93;27844:3;27755:93;:::i;:::-;27873:2;27868:3;27864:12;27857:19;;27516:366;;;:::o;27888:419::-;28054:4;28092:2;28081:9;28077:18;28069:26;;28141:9;28135:4;28131:20;28127:1;28116:9;28112:17;28105:47;28169:131;28295:4;28169:131;:::i;:::-;28161:139;;27888:419;;;:::o;28313:224::-;28453:34;28449:1;28441:6;28437:14;28430:58;28522:7;28517:2;28509:6;28505:15;28498:32;28313:224;:::o;28543:366::-;28685:3;28706:67;28770:2;28765:3;28706:67;:::i;:::-;28699:74;;28782:93;28871:3;28782:93;:::i;:::-;28900:2;28895:3;28891:12;28884:19;;28543:366;;;:::o;28915:419::-;29081:4;29119:2;29108:9;29104:18;29096:26;;29168:9;29162:4;29158:20;29154:1;29143:9;29139:17;29132:47;29196:131;29322:4;29196:131;:::i;:::-;29188:139;;28915:419;;;:::o;29340:222::-;29480:34;29476:1;29468:6;29464:14;29457:58;29549:5;29544:2;29536:6;29532:15;29525:30;29340:222;:::o;29568:366::-;29710:3;29731:67;29795:2;29790:3;29731:67;:::i;:::-;29724:74;;29807:93;29896:3;29807:93;:::i;:::-;29925:2;29920:3;29916:12;29909:19;;29568:366;;;:::o;29940:419::-;30106:4;30144:2;30133:9;30129:18;30121:26;;30193:9;30187:4;30183:20;30179:1;30168:9;30164:17;30157:47;30221:131;30347:4;30221:131;:::i;:::-;30213:139;;29940:419;;;:::o;30365:225::-;30505:34;30501:1;30493:6;30489:14;30482:58;30574:8;30569:2;30561:6;30557:15;30550:33;30365:225;:::o;30596:366::-;30738:3;30759:67;30823:2;30818:3;30759:67;:::i;:::-;30752:74;;30835:93;30924:3;30835:93;:::i;:::-;30953:2;30948:3;30944:12;30937:19;;30596:366;;;:::o;30968:419::-;31134:4;31172:2;31161:9;31157:18;31149:26;;31221:9;31215:4;31211:20;31207:1;31196:9;31192:17;31185:47;31249:131;31375:4;31249:131;:::i;:::-;31241:139;;30968:419;;;:::o

Swarm Source

ipfs://009d2dae83bbb3a165108e5ffa6754aee53a039eb60182b443592f42e0df3c61
Loading