Token SpookyToken

 

Overview ERC-20

Price
$0.00 @ 0.000000 FTM
Fully Diluted Market Cap
Total Supply:
11,399,304.361967 BOO

Holders:
78,232 addresses
Balance
2,522,471.608521892200477769 BOO

Value
$3,632,359.12 ( ~14,471,550.2789 FTM) [22.1283%]
0xec7178f4c41f346b2721907f5cf7628e388a7a58
Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

OVERVIEW

SpookySwap is an automated market-making (AMM) decentralized exchange (DEX) for the Fantom Opera network.


Update? Click here to update the token ICO / general information
# Exchange Pair Price  24H Volume % Volume
1
BKEX
BOO-USDT$1.4400
0.0000836 Btc
$522,697.0000
362,489.210 BOO
34.0756%
2
SpookySwap
0X841FAD6EAE12C286D1FD18D1D525DFFA75C7EFFE-0X21BE370D5312F44CB42CE377BC9B8A0CEF1A4C83$1.4300
0.0000830 Btc
$211,314.0000
144,755.626 0X841FAD6EAE12C286D1FD18D1D525DFFA75C7EFFE
13.6077%
3
OpenOcean
FTM-BOO$1.4500
0.0000855 Btc
$103,835.0000
400,000.000 FTM
37.6017%
4
MEXC Global
BOO-USDT$1.4400
0.0000834 Btc
$65,161.0000
45,310.580 BOO
4.2594%
5
Bitget
BOO-USDT$1.4400
0.0000833 Btc
$64,117.0000
44,531.196 BOO
4.1861%
6
SpookySwap
0X841FAD6EAE12C286D1FD18D1D525DFFA75C7EFFE-0X04068DA6C83AFCFA0E13BA15A6696662335D5B75$1.4400
0.0000837 Btc
$62,678.0000
43,348.238 0X841FAD6EAE12C286D1FD18D1D525DFFA75C7EFFE
4.0749%
7
OpenOcean
USDC-BOO$1.4700
0.0000870 Btc
$8,310.7800
7,956.529 USDC
0.7479%
8
Uniswap (v3)
0X55AF5865807B196BD0197E0902746F31FBCCFA58-0XC02AAA39B223FE8D0A0E5C4F27EAD9083C756CC2$1.4300
0.0000830 Btc
$6,376.7000
4,428.704 0X55AF5865807B196BD0197E0902746F31FBCCFA58
0.4163%
9
Gate.io
BOO-USDT$1.4400
0.0000836 Btc
$5,829.3000
4,074.223 BOO
0.3830%
10
Gate.io
BOO-ETH$1.4300
0.0000827 Btc
$3,793.0000
2,647.879 BOO
0.2489%
11
CoinEx
BOO-USDT$1.4400
0.0000836 Btc
$3,218.1200
2,229.008 BOO
0.2095%
12
OpenOcean
BOO-WETH$1.3600
0.0000799 Btc
$2,576.2200
1,890.123 BOO
0.1777%
13
Beethoven X
0X841FAD6EAE12C286D1FD18D1D525DFFA75C7EFFE-USDC$1.4500
0.0000843 Btc
$1,699.8600
1,170.801 0X841FAD6EAE12C286D1FD18D1D525DFFA75C7EFFE
0.1101%
14
OpenOcean
MAI-BOO$1.4500
0.0000855 Btc
$1,366.9600
1,377.654 MAI
0.1295%
15
OpenOcean
BOO-FTM$1.6900
0.0000986 Btc
$339.4000
200.528 BOO
0.0189%
16
Beethoven X
0X841FAD6EAE12C286D1FD18D1D525DFFA75C7EFFE-0X21BE370D5312F44CB42CE377BC9B8A0CEF1A4C83$1.4600
0.0000848 Btc
$306.6800
209.968 0X841FAD6EAE12C286D1FD18D1D525DFFA75C7EFFE
0.0197%
17
Beethoven X
0X841FAD6EAE12C286D1FD18D1D525DFFA75C7EFFE-FTM$1.4600
0.0000846 Btc
$306.0700
209.968 0X841FAD6EAE12C286D1FD18D1D525DFFA75C7EFFE
0.0197%
18
OpenOcean
BOO-USDC$1.4300
0.0000828 Btc
$165.8600
115.710 BOO
0.0109%
19
Huobi
BOO-USDT$1.4200
0.0000824 Btc
$45.3400
30.600 BOO
0.0029%
20
Bitfinex
BOO-USDT$1.4300
0.0000828 Btc
$43.5300
30.521 BOO
0.0029%
21
Bitfinex
BOO-USD$1.4600
0.0000848 Btc
$40.2100
27.529 BOO
0.0026%
22
Trader Joe
0XBD83010EB60F12112908774998F65761CF9F6F9A-0XB31F66AA3C1E785363F0875A1B74E27B85FD66C7$1.4300
0.0000837 Btc
$19.3700
13.517 0XBD83010EB60F12112908774998F65761CF9F6F9A
0.0013%
23
OpenOcean
BOO-MAI$0.0132
0.0000008 Btc
$2.6500
200.459 BOO
0.0188%
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SpookyToken

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 999999 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual 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
     * overloaded;
     *
     * 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 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");
        _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");
        _approve(_msgSender(), spender, currentAllowance - subtractedValue);

        return true;
    }

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

        emit Transfer(sender, recipient, amount);
    }

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

    /**
     * @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");
        _balances[account] = accountBalance - amount;
        _totalSupply -= amount;

        emit Transfer(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 to 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 Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        // Check the signature length
        if (signature.length != 65) {
            revert("ECDSA: invalid signature length");
        }

        // Divide the signature in r, s and v variables
        bytes32 r;
        bytes32 s;
        uint8 v;

        // ecrecover takes the signature parameters, and the only way to get them
        // currently is to use assembly.
        // solhint-disable-next-line no-inline-assembly
        assembly {
            r := mload(add(signature, 0x20))
            s := mload(add(signature, 0x40))
            v := byte(0, mload(add(signature, 0x60)))
        }

        return recover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, "ECDSA: invalid signature 's' value");
        require(v == 27 || v == 28, "ECDSA: invalid signature 'v' value");

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        require(signer != address(0), "ECDSA: invalid signature");

        return signer;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}


/**
 * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.
 *
 * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,
 * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding
 * they need in their contracts using a combination of `abi.encode` and `keccak256`.
 *
 * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding
 * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA
 * ({_hashTypedDataV4}).
 *
 * The implementation of the domain separator was designed to be as efficient as possible while still properly updating
 * the chain id to protect against replay attacks on an eventual fork of the chain.
 *
 * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method
 * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].
 *
 * _Available since v3.4._
 */
abstract contract EIP712 {
    /* solhint-disable var-name-mixedcase */
    // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to
    // invalidate the cached domain separator if the chain id changes.
    bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;
    uint256 private immutable _CACHED_CHAIN_ID;

    bytes32 private immutable _HASHED_NAME;
    bytes32 private immutable _HASHED_VERSION;
    bytes32 private immutable _TYPE_HASH;
    /* solhint-enable var-name-mixedcase */

    /**
     * @dev Initializes the domain separator and parameter caches.
     *
     * The meaning of `name` and `version` is specified in
     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:
     *
     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.
     * - `version`: the current major version of the signing domain.
     *
     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart
     * contract upgrade].
     */
    constructor(string memory name, string memory version) {
        bytes32 hashedName = keccak256(bytes(name));
        bytes32 hashedVersion = keccak256(bytes(version));
        bytes32 typeHash = keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)");
        _HASHED_NAME = hashedName;
        _HASHED_VERSION = hashedVersion;
        _CACHED_CHAIN_ID = block.chainid;
        _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);
        _TYPE_HASH = typeHash;
    }

    /**
     * @dev Returns the domain separator for the current chain.
     */
    function _domainSeparatorV4() internal view returns (bytes32) {
        if (block.chainid == _CACHED_CHAIN_ID) {
            return _CACHED_DOMAIN_SEPARATOR;
        } else {
            return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);
        }
    }

    function _buildDomainSeparator(bytes32 typeHash, bytes32 name, bytes32 version) private view returns (bytes32) {
        return keccak256(
            abi.encode(
                typeHash,
                name,
                version,
                block.chainid,
                address(this)
            )
        );
    }

    /**
     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this
     * function returns the hash of the fully encoded EIP712 message for this domain.
     *
     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:
     *
     * ```solidity
     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(
     *     keccak256("Mail(address to,string contents)"),
     *     mailTo,
     *     keccak256(bytes(mailContents))
     * )));
     * address signer = ECDSA.recover(digest, signature);
     * ```
     */
    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {
        return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);
    }
}

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

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

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

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


// This version of ERC20Permit is from OpenZeppelin as of commit
// https://github.com/OpenZeppelin/openzeppelin-contracts/commit/5171e46c47bd6be781aa92315944ca37126d4a73


/**
 * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 */
interface IERC20Permit {
    /**
     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
     * given ``owner``'s signed approval.
     *
     * IMPORTANT: The same issues {IERC20-approve} has related to transaction
     * ordering also apply here.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `deadline` must be a timestamp in the future.
     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
     * over the EIP712-formatted function arguments.
     * - the signature must use ``owner``'s current nonce (see {nonces}).
     *
     * For more information on the signature format, see the
     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
     * section].
     */
    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;

    /**
     * @dev Returns the current nonce for `owner`. This value must be
     * included whenever a signature is generated for {permit}.
     *
     * Every successful call to {permit} increases ``owner``'s nonce by one. This
     * prevents a signature from being used multiple times.
     */
    function nonces(address owner) external view returns (uint256);

    /**
     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

/**
 * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 *
 * _Available since v3.4._
 */
abstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {
    using Counters for Counters.Counter;

    mapping (address => Counters.Counter) private _nonces;

    // solhint-disable-next-line var-name-mixedcase
    bytes32 private immutable _PERMIT_TYPEHASH = keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");

    /**
     * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `"1"`.
     *
     * It's a good idea to use the same `name` that is defined as the ERC20 token name.
     */
    constructor(string memory name) EIP712(name, "1") {
    }

    /**
     * @dev See {IERC20Permit-permit}.
     */
    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public virtual override {
        // solhint-disable-next-line not-rely-on-time
        require(block.timestamp <= deadline, "ERC20Permit: expired deadline");

        bytes32 structHash = keccak256(
            abi.encode(
                _PERMIT_TYPEHASH,
                owner,
                spender,
                value,
                _useNonce(owner),
                deadline
            )
        );

        bytes32 hash = _hashTypedDataV4(structHash);

        address signer = ECDSA.recover(hash, v, r, s);
        require(signer == owner, "ERC20Permit: invalid signature");

        _approve(owner, spender, value);
    }

    /**
     * @dev See {IERC20Permit-nonces}.
     */
    function nonces(address owner) public view virtual override returns (uint256) {
        return _nonces[owner].current();
    }

    /**
     * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view override returns (bytes32) {
        return _domainSeparatorV4();
    }

    /**
     * @dev "Consume a nonce": return the current value and increment.
     */
    function _useNonce(address owner) internal virtual returns (uint256 current) {
        Counters.Counter storage nonce = _nonces[owner];
        current = nonce.current();
        nonce.increment();
    }
}


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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

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

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

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

    constructor() ERC20("SpookyToken", "BOO") ERC20Permit("SpookyToken")
    {

    }

    uint256 constant private _maxTotalSupply = 13666000e18; // 13,666,000 max boos

    function mint(address _to, uint256 _amount) public onlyOwner {
        require(totalSupply() + _amount <= _maxTotalSupply, "ERC20: minting more then MaxTotalSupply");

        _mint(_to, _amount);
        _moveDelegates(address(0), _to, _amount);
    }


    // Returns maximum total supply of the token
    function getMaxTotalSupply() external pure returns (uint256) {
        return _maxTotalSupply;
    }

    // Copied and modified from YAM code:
    // https://github.com/yam-finance/yam-protocol/blob/master/contracts/token/YAMGovernanceStorage.sol
    // https://github.com/yam-finance/yam-protocol/blob/master/contracts/token/YAMGovernance.sol
    // Which is copied and modified from COMPOUND:
    // https://github.com/compound-finance/compound-protocol/blob/master/contracts/Governance/Comp.sol

    // A record of each accounts delegate
    mapping (address => address) internal _delegates;

    /// @notice A checkpoint for marking number of votes from a given block
    struct Checkpoint {
        uint32 fromBlock;
        uint256 votes;
    }

    /// @notice A record of votes checkpoints for each account, by index
    mapping (address => mapping (uint32 => Checkpoint)) public checkpoints;

    /// @notice The number of checkpoints for each account
    mapping (address => uint32) public numCheckpoints;

    /// @notice The EIP-712 typehash for the contract's domain
    bytes32 public constant DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)");

    /// @notice The EIP-712 typehash for the delegation struct used by the contract
    bytes32 public constant DELEGATION_TYPEHASH = keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)");

    // A record of states for signing / validating signatures
    //mapping (address => uint) public nonces;

      /// @notice An event thats emitted when an account changes its delegate
    event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);

    /// @notice An event thats emitted when a delegate account's vote balance changes
    event DelegateVotesChanged(address indexed delegate, uint previousBalance, uint newBalance);
    

    function transferFrom(address sender, address recipient, uint256 amount) 
    public virtual override returns (bool)
    {
        bool result = super.transferFrom(sender, recipient, amount); // Call parent hook
        _moveDelegates(sender, recipient, amount);

        return result;
    }

    function transfer(address recipient, uint256 amount) 
    public virtual override returns (bool)
    {
        bool result = super.transfer(recipient, amount); // Call parent hook
        _moveDelegates(_msgSender(), recipient, amount);

        return result;
    }

    /**
     * @param delegator The address to get delegates for
     */
    function delegates(address delegator)
        external
        view
        returns (address)
    {
        return _delegates[delegator];
    }

   /**
    * @notice Delegate votes from `msg.sender` to `delegatee`
    * @param delegatee The address to delegate votes to
    */
    function delegate(address delegatee) external {
        return _delegate(msg.sender, delegatee);
    }

    /**
     * @notice Delegates votes from signatory to `delegatee`
     * @param delegatee The address to delegate votes to
     * @param nonce The contract state required to match the signature
     * @param expiry The time at which to expire the signature
     * @param v The recovery byte of the signature
     * @param r Half of the ECDSA signature pair
     * @param s Half of the ECDSA signature pair
     */
    function delegateBySig(address delegatee, uint nonce, uint expiry, uint8 v, bytes32 r, bytes32 s ) external {
        bytes32 domainSeparator = keccak256(
            abi.encode(
                DOMAIN_TYPEHASH,
                keccak256(bytes(name())),
                getChainId(),
                address(this)
            )
        );

        bytes32 structHash = keccak256(
            abi.encode(
                DELEGATION_TYPEHASH,
                delegatee,
                nonce,
                expiry
            )
        );

        bytes32 digest = keccak256(
            abi.encodePacked(
                "\x19\x01",
                domainSeparator,
                structHash
            )
        );

        address signatory = ecrecover(digest, v, r, s);
        require(signatory != address(0), "BOO::delegateBySig: invalid signature");
        require(nonce == _useNonce(signatory), "BOO::delegateBySig: invalid nonce");
        require(block.timestamp <= expiry, "BOO::delegateBySig: signature expired");
        return _delegate(signatory, delegatee);
    }

    /**
     * @notice Gets the current votes balance for `account`
     * @param account The address to get votes balance
     * @return The number of current votes for `account`
     */
    function getCurrentVotes(address account)
        external
        view
        returns (uint256)
    {
        uint32 nCheckpoints = numCheckpoints[account];
        return nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0;
    }

    /**
     * @notice Determine the prior number of votes for an account as of a block number
     * @dev Block number must be a finalized block or else this function will revert to prevent misinformation.
     * @param account The address of the account to check
     * @param blockNumber The block number to get the vote balance at
     * @return The number of votes the account had as of the given block
     */
    function getPriorVotes(address account, uint blockNumber)
        external
        view
        returns (uint256)
    {
        require(blockNumber < block.number, "BOO::getPriorVotes: not yet determined");

        uint32 nCheckpoints = numCheckpoints[account];
        if (nCheckpoints == 0) {
            return 0;
        }

        // First check most recent balance
        if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) {
            return checkpoints[account][nCheckpoints - 1].votes;
        }

        // Next check implicit zero balance
        if (checkpoints[account][0].fromBlock > blockNumber) {
            return 0;
        }

        uint32 lower = 0;
        uint32 upper = nCheckpoints - 1;
        while (upper > lower) {
            uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow
            Checkpoint memory cp = checkpoints[account][center];
            if (cp.fromBlock == blockNumber) {
                return cp.votes;
            } else if (cp.fromBlock < blockNumber) {
                lower = center;
            } else {
                upper = center - 1;
            }
        }
        return checkpoints[account][lower].votes;
    }

    function _delegate(address delegator, address delegatee)
        internal
    {
        address currentDelegate = _delegates[delegator];
        uint256 delegatorBalance = balanceOf(delegator); // balance of underlying BOOs (not scaled);
        _delegates[delegator] = delegatee;

        emit DelegateChanged(delegator, currentDelegate, delegatee);

        _moveDelegates(currentDelegate, delegatee, delegatorBalance);
    }

    function _moveDelegates(address srcRep, address dstRep, uint256 amount) internal {
        if (srcRep != dstRep && amount > 0) {
            if (srcRep != address(0)) {
                // decrease old representative
                uint32 srcRepNum = numCheckpoints[srcRep];
                uint256 srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0;
                uint256 srcRepNew = srcRepOld - amount;
                _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew);
            }

            if (dstRep != address(0)) {
                // increase new representative
                uint32 dstRepNum = numCheckpoints[dstRep];
                uint256 dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0;
                uint256 dstRepNew = dstRepOld + amount;
                _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew);
            }
        }
    }

    function _writeCheckpoint(
        address delegatee,
        uint32 nCheckpoints,
        uint256 oldVotes,
        uint256 newVotes
    )
        internal
    {
        uint32 blockNumber = safe32(block.number, "BOO::_writeCheckpoint: block number exceeds 32 bits");

        if (nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber) {
            checkpoints[delegatee][nCheckpoints - 1].votes = newVotes;
        } else {
            checkpoints[delegatee][nCheckpoints] = Checkpoint(blockNumber, newVotes);
            numCheckpoints[delegatee] = nCheckpoints + 1;
        }

        emit DelegateVotesChanged(delegatee, oldVotes, newVotes);
    }

    function safe32(uint n, string memory errorMessage) internal pure returns (uint32) {
        require(n < 2**32, errorMessage);
        return uint32(n);
    }

    function getChainId() internal view returns (uint) {
        uint256 chainId;
        assembly { chainId := chainid() }
        return chainId;
    }



}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DELEGATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_TYPEHASH","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":[{"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"},{"internalType":"uint32","name":"","type":"uint32"}],"name":"checkpoints","outputs":[{"internalType":"uint32","name":"fromBlock","type":"uint32"},{"internalType":"uint256","name":"votes","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"}],"name":"delegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"delegateBySig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegator","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getCurrentVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPriorVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6101406040527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9610120523480156200003757600080fd5b506040518060400160405280600b81526020016a29b837b7b5bcaa37b5b2b760a91b81525080604051806040016040528060018152602001603160f81b8152506040518060400160405280600b81526020016a29b837b7b5bcaa37b5b2b760a91b81525060405180604001604052806003815260200162424f4f60e81b8152508160039080519060200190620000cf929190620001e9565b508051620000e5906004906020840190620001e9565b5050825160208085019190912083519184019190912060c082905260e08190524660a0529091507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6200013a818484620001a9565b60805261010052506000935062000155925050620001e59050565b600680546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350620002f8565b60008383834630604051602001620001c69594939291906200028f565b6040516020818303038152906040528051906020012090509392505050565b3390565b828054620001f790620002bb565b90600052602060002090601f0160209004810192826200021b576000855562000266565b82601f106200023657805160ff191683800117855562000266565b8280016001018555821562000266579182015b828111156200026657825182559160200191906001019062000249565b506200027492915062000278565b5090565b5b8082111562000274576000815560010162000279565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b600281046001821680620002d057607f821691505b60208210811415620002f257634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c05160e05161010051610120516129f0620003486000396000610e53015260006115180152600061155a01526000611539015260006114c6015260006114ef01526129f06000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c8063715018a6116100f9578063b4b5ea5711610097578063dd62ed3e11610071578063dd62ed3e14610387578063e7a324dc1461039a578063f1127ed8146103a2578063f2fde38b146103c3576101c4565b8063b4b5ea571461034e578063c3cda52014610361578063d505accf14610374576101c4565b80638da5cb5b116100d35780638da5cb5b1461031857806395d89b4114610320578063a457c2d714610328578063a9059cbb1461033b576101c4565b8063715018a6146102ea578063782d6fe1146102f25780637ecebe0014610305576101c4565b806339509351116101665780635c19a95c116101405780635c19a95c1461029c5780635db30bb1146102af5780636fcfff45146102b757806370a08231146102d7576101c4565b8063395093511461025457806340c10f1914610267578063587cde1e1461027c576101c4565b806320606b70116101a257806320606b701461021c57806323b872dd14610224578063313ce567146102375780633644e5151461024c576101c4565b806306fdde03146101c9578063095ea7b3146101e757806318160ddd14610207575b600080fd5b6101d16103d6565b6040516101de919061210e565b60405180910390f35b6101fa6101f5366004611eeb565b610469565b6040516101de9190612000565b61020f610487565b6040516101de919061200b565b61020f61048d565b6101fa610232366004611e47565b6104b1565b61023f6104d4565b6040516101de9190612838565b61020f6104d9565b6101fa610262366004611eeb565b6104e8565b61027a610275366004611eeb565b610549565b005b61028f61028a366004611dfb565b610636565b6040516101de9190611fdf565b61027a6102aa366004611dfb565b610664565b61020f610671565b6102ca6102c5366004611dfb565b610680565b6040516101de9190612811565b61020f6102e5366004611dfb565b610698565b61027a6106c0565b61020f610300366004611eeb565b6107a2565b61020f610313366004611dfb565b610a2f565b61028f610a5d565b6101d1610a79565b6101fa610336366004611eeb565b610a88565b6101fa610349366004611eeb565b610b2a565b61020f61035c366004611dfb565b610b52565b61027a61036f366004611f14565b610be0565b61027a610382366004611e82565b610e15565b61020f610395366004611e15565b610f39565b61020f610f71565b6103b56103b0366004611f6b565b610f95565b6040516101de929190612822565b61027a6103d1366004611dfb565b610fc2565b6060600380546103e59061290a565b80601f01602080910402602001604051908101604052809291908181526020018280546104119061290a565b801561045e5780601f106104335761010080835404028352916020019161045e565b820191906000526020600020905b81548152906001019060200180831161044157829003601f168201915b505050505090505b90565b600061047d610476611110565b8484611114565b5060015b92915050565b60025490565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6000806104bf858585611223565b90506104cc8585856112f6565b949350505050565b601290565b60006104e36114c2565b905090565b600061047d6104f5611110565b848460016000610503611110565b73ffffffffffffffffffffffffffffffffffffffff908116825260208083019390935260409182016000908120918b16815292529020546105449190612846565b611114565b610551611110565b73ffffffffffffffffffffffffffffffffffffffff1661056f610a5d565b73ffffffffffffffffffffffffffffffffffffffff16146105c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc906125c6565b60405180910390fd5b6a0b4de3582e7cd659400000816105da610487565b6105e49190612846565b111561061c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc906124d5565b6106268282611585565b610632600083836112f6565b5050565b73ffffffffffffffffffffffffffffffffffffffff808216600090815260076020526040902054165b919050565b61066e3382611686565b50565b6a0b4de3582e7cd65940000090565b60096020526000908152604090205463ffffffff1681565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6106c8611110565b73ffffffffffffffffffffffffffffffffffffffff166106e6610a5d565b73ffffffffffffffffffffffffffffffffffffffff1614610733576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc906125c6565b60065460405160009173ffffffffffffffffffffffffffffffffffffffff16907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600680547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60004382106107dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc906123be565b73ffffffffffffffffffffffffffffffffffffffff831660009081526009602052604090205463ffffffff1680610818576000915050610481565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600860205260408120849161084a6001856128e5565b63ffffffff908116825260208201929092526040016000205416116108c05773ffffffffffffffffffffffffffffffffffffffff841660009081526008602052604081209061089a6001846128e5565b63ffffffff1663ffffffff16815260200190815260200160002060010154915050610481565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260086020908152604080832083805290915290205463ffffffff16831015610908576000915050610481565b6000806109166001846128e5565b90505b8163ffffffff168163ffffffff1611156109eb576000600261093b84846128e5565b6109459190612886565b61094f90836128e5565b73ffffffffffffffffffffffffffffffffffffffff8816600090815260086020908152604080832063ffffffff80861685529083529281902081518083019092528054909316808252600190930154918101919091529192508714156109bf576020015194506104819350505050565b805163ffffffff168711156109d6578193506109e4565b6109e16001836128e5565b92505b5050610919565b5073ffffffffffffffffffffffffffffffffffffffff8516600090815260086020908152604080832063ffffffff9094168352929052206001015491505092915050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604081206104819061174d565b60065473ffffffffffffffffffffffffffffffffffffffff1690565b6060600480546103e59061290a565b60008060016000610a97611110565b73ffffffffffffffffffffffffffffffffffffffff90811682526020808301939093526040918201600090812091881681529252902054905082811015610b0a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc9061276f565b610b20610b15611110565b8561054486856128ce565b5060019392505050565b600080610b378484611751565b9050610b4b610b44611110565b85856112f6565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526009602052604081205463ffffffff1680610b8a576000610b4b565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260086020526040812090610bbb6001846128e5565b63ffffffff1663ffffffff168152602001908152602001600020600101549392505050565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866610c0b6103d6565b80519060200120610c1a611765565b30604051602001610c2e94939291906120bf565b60405160208183030381529060405280519060200120905060007fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf888888604051602001610c7f9493929190612055565b60405160208183030381529060405280519060200120905060008282604051602001610cac929190611fa9565b604051602081830303815290604052805190602001209050600060018288888860405160008152602001604052604051610ce994939291906120f0565b6020604051602081039080840390855afa158015610d0b573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116610d83576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc9061241b565b610d8c81611769565b8914610dc4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc90612658565b87421115610dfe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc90612712565b610e08818b611686565b505050505b505050505050565b83421115610e4f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc906122cd565b60007f0000000000000000000000000000000000000000000000000000000000000000888888610e7e8c611769565b89604051602001610e9496959493929190612014565b6040516020818303038152906040528051906020012090506000610eb7826117a8565b90506000610ec7828787876117bb565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610f2e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc90612532565b610e088a8a8a611114565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b60086020908152600092835260408084209091529082529020805460019091015463ffffffff9091169082565b610fca611110565b73ffffffffffffffffffffffffffffffffffffffff16610fe8610a5d565b73ffffffffffffffffffffffffffffffffffffffff1614611035576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc906125c6565b73ffffffffffffffffffffffffffffffffffffffff8116611082576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc90612213565b60065460405173ffffffffffffffffffffffffffffffffffffffff8084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600680547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b3390565b73ffffffffffffffffffffffffffffffffffffffff8316611161576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc906126b5565b73ffffffffffffffffffffffffffffffffffffffff82166111ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc90612270565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061121690859061200b565b60405180910390a3505050565b600061123084848461192a565b73ffffffffffffffffffffffffffffffffffffffff841660009081526001602052604081208161125e611110565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156112d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc90612569565b6112eb856112e1611110565b61054486856128ce565b506001949350505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156113325750600081115b156114bd5773ffffffffffffffffffffffffffffffffffffffff8316156113fc5773ffffffffffffffffffffffffffffffffffffffff831660009081526009602052604081205463ffffffff16908161138c5760006113dc565b73ffffffffffffffffffffffffffffffffffffffff85166000908152600860205260408120906113bd6001856128e5565b63ffffffff1663ffffffff168152602001908152602001600020600101545b905060006113ea84836128ce565b90506113f886848484611aee565b5050505b73ffffffffffffffffffffffffffffffffffffffff8216156114bd5773ffffffffffffffffffffffffffffffffffffffff821660009081526009602052604081205463ffffffff1690816114515760006114a1565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600860205260408120906114826001856128e5565b63ffffffff1663ffffffff168152602001908152602001600020600101545b905060006114af8483612846565b9050610e0d85848484611aee565b505050565b60007f000000000000000000000000000000000000000000000000000000000000000046141561151357507f0000000000000000000000000000000000000000000000000000000000000000610466565b61157e7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611d06565b9050610466565b73ffffffffffffffffffffffffffffffffffffffff82166115d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc906127cc565b6115de600083836114bd565b80600260008282546115f09190612846565b909155505073ffffffffffffffffffffffffffffffffffffffff82166000908152602081905260408120805483929061162a908490612846565b909155505060405173ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061167a90859061200b565b60405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff808316600090815260076020526040812054909116906116ba84610698565b73ffffffffffffffffffffffffffffffffffffffff85811660008181526007602052604080822080547fffffffffffffffffffffffff000000000000000000000000000000000000000016898616908117909155905194955093928616927f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a46117478284836112f6565b50505050565b5490565b600061047d61175e611110565b848461192a565b4690565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604081206117978161174d565b91506117a281611d40565b50919050565b60006104816117b56114c2565b83611d49565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0821115611817576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc90612361565b8360ff16601b148061182c57508360ff16601c145b611862576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc90612478565b60006001868686866040516000815260200160405260405161188794939291906120f0565b6020604051602081039080840390855afa1580156118a9573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611921576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc9061217f565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff8316611977576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc906125fb565b73ffffffffffffffffffffffffffffffffffffffff82166119c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc906121b6565b6119cf8383836114bd565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015611a2f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc90612304565b611a3982826128ce565b73ffffffffffffffffffffffffffffffffffffffff8086166000908152602081905260408082209390935590851681529081208054849290611a7c908490612846565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611ae0919061200b565b60405180910390a350505050565b6000611b124360405180606001604052806033815260200161298860339139611d7c565b905060008463ffffffff16118015611b79575073ffffffffffffffffffffffffffffffffffffffff8516600090815260086020526040812063ffffffff831691611b5d6001886128e5565b63ffffffff908116825260208201929092526040016000205416145b15611bcf5773ffffffffffffffffffffffffffffffffffffffff851660009081526008602052604081208391611bb06001886128e5565b63ffffffff168152602081019190915260400160002060010155611caf565b60408051808201825263ffffffff8381168252602080830186815273ffffffffffffffffffffffffffffffffffffffff8a166000908152600883528581208a85168252909252939020915182547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001691161781559051600191820155611c5690859061285e565b73ffffffffffffffffffffffffffffffffffffffff8616600090815260096020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff929092169190911790555b8473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248484604051611cf7929190612803565b60405180910390a25050505050565b60008383834630604051602001611d21959493929190612086565b6040516020818303038152906040528051906020012090509392505050565b80546001019055565b60008282604051602001611d5e929190611fa9565b60405160208183030381529060405280519060200120905092915050565b6000816401000000008410611dbe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc919061210e565b509192915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461065f57600080fd5b803560ff8116811461065f57600080fd5b600060208284031215611e0c578081fd5b610b4b82611dc6565b60008060408385031215611e27578081fd5b611e3083611dc6565b9150611e3e60208401611dc6565b90509250929050565b600080600060608486031215611e5b578081fd5b611e6484611dc6565b9250611e7260208501611dc6565b9150604084013590509250925092565b600080600080600080600060e0888a031215611e9c578283fd5b611ea588611dc6565b9650611eb360208901611dc6565b95506040880135945060608801359350611ecf60808901611dea565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215611efd578182fd5b611f0683611dc6565b946020939093013593505050565b60008060008060008060c08789031215611f2c578182fd5b611f3587611dc6565b95506020870135945060408701359350611f5160608801611dea565b92506080870135915060a087013590509295509295509295565b60008060408385031215611f7d578182fd5b611f8683611dc6565b9150602083013563ffffffff81168114611f9e578182fd5b809150509250929050565b7f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b901515815260200190565b90815260200190565b95865273ffffffffffffffffffffffffffffffffffffffff94851660208701529290931660408501526060840152608083019190915260a082015260c00190565b93845273ffffffffffffffffffffffffffffffffffffffff9290921660208401526040830152606082015260800190565b94855260208501939093526040840191909152606083015273ffffffffffffffffffffffffffffffffffffffff16608082015260a00190565b9384526020840192909252604083015273ffffffffffffffffffffffffffffffffffffffff16606082015260800190565b93845260ff9290921660208401526040830152606082015260800190565b6000602080835283518082850152825b8181101561213a5785810183015185820160400152820161211e565b8181111561214b5783604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60208082526018908201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604082015260600190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201527f6573730000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201527f6464726573730000000000000000000000000000000000000000000000000000606082015260800190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560408201527f7373000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601d908201527f45524332305065726d69743a206578706972656420646561646c696e65000000604082015260600190565b60208082526026908201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260408201527f616c616e63650000000000000000000000000000000000000000000000000000606082015260800190565b60208082526022908201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60408201527f7565000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526026908201527f424f4f3a3a6765745072696f72566f7465733a206e6f7420796574206465746560408201527f726d696e65640000000000000000000000000000000000000000000000000000606082015260800190565b60208082526025908201527f424f4f3a3a64656c656761746542795369673a20696e76616c6964207369676e60408201527f6174757265000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526022908201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60408201527f7565000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526027908201527f45524332303a206d696e74696e67206d6f7265207468656e204d6178546f746160408201527f6c537570706c7900000000000000000000000000000000000000000000000000606082015260800190565b6020808252601e908201527f45524332305065726d69743a20696e76616c6964207369676e61747572650000604082015260600190565b60208082526028908201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160408201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460408201527f6472657373000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526021908201527f424f4f3a3a64656c656761746542795369673a20696e76616c6964206e6f6e6360408201527f6500000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460408201527f7265737300000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526025908201527f424f4f3a3a64656c656761746542795369673a207369676e617475726520657860408201527f7069726564000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526025908201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760408201527f207a65726f000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601f908201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604082015260600190565b918252602082015260400190565b63ffffffff91909116815260200190565b63ffffffff929092168252602082015260400190565b60ff91909116815260200190565b6000821982111561285957612859612958565b500190565b600063ffffffff80831681851680830382111561287d5761287d612958565b01949350505050565b600063ffffffff808416806128c2577f4e487b710000000000000000000000000000000000000000000000000000000083526012600452602483fd5b92169190910492915050565b6000828210156128e0576128e0612958565b500390565b600063ffffffff8381169083168181101561290257612902612958565b039392505050565b60028104600182168061291e57607f821691505b602082108114156117a2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfe424f4f3a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473a2646970667358221220bf8270bc64857a15475a63ea95e0795d71707aa052e94063a31e3d1966c1395964736f6c63430008000033

Deployed ByteCode Sourcemap

31732:9694:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5616:91;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7756:169;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;6709:108::-;;;:::i;:::-;;;;;;;:::i;33392:122::-;;;:::i;34234:299::-;;;;;;:::i;:::-;;:::i;6560:84::-;;;:::i;:::-;;;;;;;:::i;29092:115::-;;;:::i;9238:215::-;;;;;;:::i;:::-;;:::i;31964:257::-;;;;;;:::i;:::-;;:::i;:::-;;34898:149;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;35191:104::-;;;;;;:::i;:::-;;:::i;32281:102::-;;;:::i;33270:49::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;6880:127::-;;;;;;:::i;:::-;;:::i;31180:148::-;;;:::i;37730:1252::-;;;;;;:::i;:::-;;:::i;28834:128::-;;;;;;:::i;:::-;;:::i;30529:87::-;;;:::i;5826:95::-;;;:::i;9956:377::-;;;;;;:::i;:::-;;:::i;34541:273::-;;;;;;:::i;:::-;;:::i;37044:255::-;;;;;;:::i;:::-;;:::i;35729:1114::-;;;;;;:::i;:::-;;:::i;27997:771::-;;;;;;:::i;:::-;;:::i;7458:151::-;;;;;;:::i;:::-;;:::i;33608:117::-;;;:::i;33131:70::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;31483:244::-;;;;;;:::i;:::-;;:::i;5616:91::-;5661:13;5694:5;5687:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5616:91;;:::o;7756:169::-;7839:4;7856:39;7865:12;:10;:12::i;:::-;7879:7;7888:6;7856:8;:39::i;:::-;-1:-1:-1;7913:4:0;7756:169;;;;;:::o;6709:108::-;6797:12;;6709:108;:::o;33392:122::-;33434:80;33392:122;:::o;34234:299::-;34346:4;34368:11;34382:45;34401:6;34409:9;34420:6;34382:18;:45::i;:::-;34368:59;;34458:41;34473:6;34481:9;34492:6;34458:14;:41::i;:::-;34519:6;34234:299;-1:-1:-1;;;;34234:299:0:o;6560:84::-;6634:2;6560:84;:::o;29092:115::-;29152:7;29179:20;:18;:20::i;:::-;29172:27;;29092:115;:::o;9238:215::-;9326:4;9343:80;9352:12;:10;:12::i;:::-;9366:7;9412:10;9375:11;:25;9387:12;:10;:12::i;:::-;9375:25;;;;;;;;;;;;;;;;;;-1:-1:-1;9375:25:0;;;:34;;;;;;;;;;:47;;;;:::i;:::-;9343:8;:80::i;31964:257::-;30760:12;:10;:12::i;:::-;30749:23;;:7;:5;:7::i;:::-;:23;;;30741:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;31921:11:::1;32060:7;32044:13;:11;:13::i;:::-;:23;;;;:::i;:::-;:42;;32036:94;;;;;;;;;;;;:::i;:::-;32143:19;32149:3;32154:7;32143:5;:19::i;:::-;32173:40;32196:1;32200:3;32205:7;32173:14;:40::i;:::-;31964:257:::0;;:::o;34898:149::-;35018:21;;;;34986:7;35018:21;;;:10;:21;;;;;;;34898:149;;;;:::o;35191:104::-;35255:32;35265:10;35277:9;35255;:32::i;:::-;35191:104;:::o;32281:102::-;31921:11;32281:102;:::o;33270:49::-;;;;;;;;;;;;;;;:::o;6880:127::-;6981:18;;6954:7;6981:18;;;;;;;;;;;;6880:127::o;31180:148::-;30760:12;:10;:12::i;:::-;30749:23;;:7;:5;:7::i;:::-;:23;;;30741:68;;;;;;;;;;;;:::i;:::-;31271:6:::1;::::0;31250:40:::1;::::0;31287:1:::1;::::0;31250:40:::1;31271:6;::::0;31250:40:::1;::::0;31287:1;;31250:40:::1;31301:6;:19:::0;;;::::1;::::0;;31180:148::o;37730:1252::-;37838:7;37885:12;37871:11;:26;37863:77;;;;;;;;;;;;:::i;:::-;37975:23;;;37953:19;37975:23;;;:14;:23;;;;;;;;38013:17;38009:58;;38054:1;38047:8;;;;;38009:58;38127:20;;;;;;;:11;:20;;;;;38179:11;;38148:16;38163:1;38148:12;:16;:::i;:::-;38127:38;;;;;;;;;;;;;;;-1:-1:-1;38127:38:0;:48;;:63;38123:147;;38214:20;;;;;;;:11;:20;;;;;;38235:16;38250:1;38235:12;:16;:::i;:::-;38214:38;;;;;;;;;;;;;;;:44;;;38207:51;;;;;38123:147;38331:20;;;;;;;:11;:20;;;;;;;;:23;;;;;;;;:33;:23;:33;:47;-1:-1:-1;38327:88:0;;;38402:1;38395:8;;;;;38327:88;38427:12;;38469:16;38484:1;38469:12;:16;:::i;:::-;38454:31;;38496:428;38511:5;38503:13;;:5;:13;;;38496:428;;;38533:13;38575:1;38558:13;38566:5;38558;:13;:::i;:::-;38557:19;;;;:::i;:::-;38549:27;;:5;:27;:::i;:::-;38641:20;;;38618;38641;;;:11;:20;;;;;;;;:28;;;;;;;;;;;;;38618:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;38533:43;;-1:-1:-1;38688:27:0;;38684:229;;;38743:8;;;;-1:-1:-1;38736:15:0;;-1:-1:-1;;;;38736:15:0;38684:229;38777:12;;:26;;;-1:-1:-1;38773:140:0;;;38832:6;38824:14;;38773:140;;;38887:10;38896:1;38887:6;:10;:::i;:::-;38879:18;;38773:140;38496:428;;;;;-1:-1:-1;38941:20:0;;;;;;;:11;:20;;;;;;;;:27;;;;;;;;;;:33;;;;-1:-1:-1;;37730:1252:0;;;;:::o;28834:128::-;28930:14;;;28903:7;28930:14;;;:7;:14;;;;;:24;;:22;:24::i;30529:87::-;30602:6;;;;30529:87;:::o;5826:95::-;5873:13;5906:7;5899:14;;;;;:::i;9956:377::-;10049:4;10066:24;10093:11;:25;10105:12;:10;:12::i;:::-;10093:25;;;;;;;;;;;;;;;;;;-1:-1:-1;10093:25:0;;;:34;;;;;;;;;;;-1:-1:-1;10146:35:0;;;;10138:85;;;;;;;;;;;;:::i;:::-;10234:67;10243:12;:10;:12::i;:::-;10257:7;10266:34;10285:15;10266:16;:34;:::i;10234:67::-;-1:-1:-1;10321:4:0;;9956:377;-1:-1:-1;;;9956:377:0:o;34541:273::-;34633:4;34655:11;34669:33;34684:9;34695:6;34669:14;:33::i;:::-;34655:47;;34733;34748:12;:10;:12::i;:::-;34762:9;34773:6;34733:14;:47::i;:::-;34800:6;34541:273;-1:-1:-1;;;34541:273:0:o;37044:255::-;37183:23;;;37136:7;37183:23;;;:14;:23;;;;;;;;37224:16;:67;;37290:1;37224:67;;;37243:20;;;;;;;:11;:20;;;;;;37264:16;37279:1;37264:12;:16;:::i;:::-;37243:38;;;;;;;;;;;;;;;:44;;;37217:74;37044:255;-1:-1:-1;;;37044:255:0:o;35729:1114::-;35848:23;33434:80;35977:6;:4;:6::i;:::-;35961:24;;;;;;36004:12;:10;:12::i;:::-;36043:4;35898:165;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;35874:200;;;;;;35848:226;;36087:18;33654:71;36199:9;36227:5;36251:6;36132:140;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;36108:175;;;;;;36087:196;;36296:14;36401:15;36435:10;36337:123;;;;;;;;;:::i;:::-;;;;;;;;;;;;;36313:158;;;;;;36296:175;;36484:17;36504:26;36514:6;36522:1;36525;36528;36504:26;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;36504:26:0;;;;;;-1:-1:-1;;36549:23:0;;;36541:73;;;;;;;;;;;;:::i;:::-;36642:20;36652:9;36642;:20::i;:::-;36633:5;:29;36625:75;;;;;;;;;;;;:::i;:::-;36738:6;36719:15;:25;;36711:75;;;;;;;;;;;;:::i;:::-;36804:31;36814:9;36825;36804;:31::i;:::-;36797:38;;;;35729:1114;;;;;;;:::o;27997:771::-;28226:8;28207:15;:27;;28199:69;;;;;;;;;;;;:::i;:::-;28281:18;28355:16;28390:5;28414:7;28440:5;28464:16;28474:5;28464:9;:16::i;:::-;28499:8;28326:196;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;28302:231;;;;;;28281:252;;28546:12;28561:28;28578:10;28561:16;:28::i;:::-;28546:43;;28602:14;28619:28;28633:4;28639:1;28642;28645;28619:13;:28::i;:::-;28602:45;;28676:5;28666:15;;:6;:15;;;28658:58;;;;;;;;;;;;:::i;:::-;28729:31;28738:5;28745:7;28754:5;28729:8;:31::i;7458:151::-;7574:18;;;;7547:7;7574:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;7458:151::o;33608:117::-;33654:71;33608:117;:::o;33131:70::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31483:244::-;30760:12;:10;:12::i;:::-;30749:23;;:7;:5;:7::i;:::-;:23;;;30741:68;;;;;;;;;;;;:::i;:::-;31572:22:::1;::::0;::::1;31564:73;;;;;;;;;;;;:::i;:::-;31674:6;::::0;31653:38:::1;::::0;::::1;::::0;;::::1;::::0;31674:6:::1;::::0;31653:38:::1;::::0;31674:6:::1;::::0;31653:38:::1;31702:6;:17:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;31483:244::o;599:98::-;679:10;599:98;:::o;13312:346::-;13414:19;;;13406:68;;;;;;;;;;;;:::i;:::-;13493:21;;;13485:68;;;;;;;;;;;;:::i;:::-;13566:18;;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;;:36;;;13618:32;;;;;13596:6;;13618:32;:::i;:::-;;;;;;;;13312:346;;;:::o;8407:422::-;8513:4;8530:36;8540:6;8548:9;8559:6;8530:9;:36::i;:::-;8606:19;;;8579:24;8606:19;;;:11;:19;;;;;8579:24;8626:12;:10;:12::i;:::-;8606:33;;;;;;;;;;;;;;;;8579:60;;8678:6;8658:16;:26;;8650:79;;;;;;;;;;;;:::i;:::-;8740:57;8749:6;8757:12;:10;:12::i;:::-;8771:25;8790:6;8771:16;:25;:::i;8740:57::-;-1:-1:-1;8817:4:0;;8407:422;-1:-1:-1;;;;8407:422:0:o;39435:941::-;39541:6;39531:16;;:6;:16;;;;:30;;;;;39560:1;39551:6;:10;39531:30;39527:842;;;39582:20;;;;39578:382;;39690:22;;;39671:16;39690:22;;;:14;:22;;;;;;;;;39751:13;:60;;39810:1;39751:60;;;39767:19;;;;;;;:11;:19;;;;;;39787:13;39799:1;39787:9;:13;:::i;:::-;39767:34;;;;;;;;;;;;;;;:40;;;39751:60;39731:80;-1:-1:-1;39830:17:0;39850:18;39862:6;39731:80;39850:18;:::i;:::-;39830:38;;39887:57;39904:6;39912:9;39923;39934;39887:16;:57::i;:::-;39578:382;;;;39980:20;;;;39976:382;;40088:22;;;40069:16;40088:22;;;:14;:22;;;;;;;;;40149:13;:60;;40208:1;40149:60;;;40165:19;;;;;;;:11;:19;;;;;;40185:13;40197:1;40185:9;:13;:::i;:::-;40165:34;;;;;;;;;;;;;;;:40;;;40149:60;40129:80;-1:-1:-1;40228:17:0;40248:18;40260:6;40129:80;40248:18;:::i;:::-;40228:38;;40285:57;40302:6;40310:9;40321;40332;40285:16;:57::i;39976:382::-;39435:941;;;:::o;21788:281::-;21841:7;21882:16;21865:13;:33;21861:201;;;-1:-1:-1;21922:24:0;21915:31;;21861:201;21986:64;22008:10;22020:12;22034:15;21986:21;:64::i;:::-;21979:71;;;;11709:338;11793:21;;;11785:65;;;;;;;;;;;;:::i;:::-;11863:49;11892:1;11896:7;11905:6;11863:20;:49::i;:::-;11941:6;11925:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;11958:18:0;;;:9;:18;;;;;;;;;;:28;;11980:6;;11958:9;:28;;11980:6;;11958:28;:::i;:::-;;;;-1:-1:-1;;12002:37:0;;;;;;12019:1;;12002:37;;;;12032:6;;12002:37;:::i;:::-;;;;;;;;11709:338;;:::o;38990:437::-;39107:21;;;;39081:23;39107:21;;;:10;:21;;;;;;;;;;39166:20;39118:9;39166;:20::i;:::-;39241:21;;;;;;;;:10;:21;;;;;;:33;;;;;;;;;;;;;39292:54;;39139:47;;-1:-1:-1;39241:33:0;39292:54;;;;;;39241:21;39292:54;39359:60;39374:15;39391:9;39402:16;39359:14;:60::i;:::-;38990:437;;;;:::o;23961:114::-;24053:14;;23961:114::o;7220:175::-;7306:4;7323:42;7333:12;:10;:12::i;:::-;7347:9;7358:6;7323:9;:42::i;41264:153::-;41374:9;41264:153;:::o;29305:207::-;29426:14;;;29365:15;29426:14;;;:7;:14;;;;;29461:15;29426:14;29461:13;:15::i;:::-;29451:25;;29487:17;:5;:15;:17::i;:::-;29305:207;;;;:::o;23056:167::-;23133:7;23160:55;23182:20;:18;:20::i;:::-;23204:10;23160:21;:55::i;16289:1432::-;16374:7;17299:66;17285:80;;;17277:127;;;;;;;;;;;;:::i;:::-;17423:1;:7;;17428:2;17423:7;:18;;;;17434:1;:7;;17439:2;17434:7;17423:18;17415:65;;;;;;;;;;;;:::i;:::-;17578:14;17595:24;17605:4;17611:1;17614;17617;17595:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;17595:24:0;;;;;;-1:-1:-1;;17638:20:0;;;17630:57;;;;;;;;;;;;:::i;:::-;17707:6;16289:1432;-1:-1:-1;;;;;16289:1432:0:o;10823:604::-;10929:20;;;10921:70;;;;;;;;;;;;:::i;:::-;11010:23;;;11002:71;;;;;;;;;;;;:::i;:::-;11086:47;11107:6;11115:9;11126:6;11086:20;:47::i;:::-;11170:17;;;11146:21;11170:17;;;;;;;;;;;11206:23;;;;11198:74;;;;;;;;;;;;:::i;:::-;11303:22;11319:6;11303:13;:22;:::i;:::-;11283:17;;;;:9;:17;;;;;;;;;;;:42;;;;11336:20;;;;;;;;:30;;11360:6;;11283:9;11336:30;;11360:6;;11336:30;:::i;:::-;;;;;;;;11401:9;11384:35;;11393:6;11384:35;;;11412:6;11384:35;;;;;;:::i;:::-;;;;;;;;10823:604;;;;:::o;40384:703::-;40563:18;40584:75;40591:12;40584:75;;;;;;;;;;;;;;;;;:6;:75::i;:::-;40563:96;;40691:1;40676:12;:16;;;:85;;;;-1:-1:-1;40696:22:0;;;;;;;:11;:22;;;;;:65;;;;40719:16;40734:1;40719:12;:16;:::i;:::-;40696:40;;;;;;;;;;;;;;;-1:-1:-1;40696:40:0;:50;;:65;40676:85;40672:339;;;40778:22;;;;;;;:11;:22;;;;;40827:8;;40801:16;40816:1;40801:12;:16;:::i;:::-;40778:40;;;;;;;;;;;;;-1:-1:-1;40778:40:0;:46;;:57;40672:339;;;40907:33;;;;;;;;;;;;;;;;;;;;;40868:22;;;-1:-1:-1;40868:22:0;;;:11;:22;;;;;:36;;;;;;;;;;;:72;;;;;;;;;;;;;-1:-1:-1;40868:72:0;;;;40983:16;;40868:36;;40983:16;:::i;:::-;40955:25;;;;;;;:14;:25;;;;;:44;;;;;;;;;;;;;;;40672:339;41049:9;41028:51;;;41060:8;41070;41028:51;;;;;;;:::i;:::-;;;;;;;;40384:703;;;;;:::o;22077:337::-;22179:7;22259:8;22286:4;22309:7;22335:13;22375:4;22230:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22206:200;;;;;;22199:207;;22077:337;;;;;:::o;24083:127::-;24172:19;;24190:1;24172:19;;;24083:127::o;18640:196::-;18733:7;18799:15;18816:10;18770:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;18760:68;;;;;;18753:75;;18640:196;;;;:::o;41095:161::-;41170:6;41208:12;41201:5;41197:9;;41189:32;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;41246:1:0;;41095:161;-1:-1:-1;;41095:161:0:o;14:198:1:-;84:20;;144:42;133:54;;123:65;;113:2;;202:1;199;192:12;217:158;285:20;;345:4;334:16;;324:27;;314:2;;365:1;362;355:12;380:198;;492:2;480:9;471:7;467:23;463:32;460:2;;;513:6;505;498:22;460:2;541:31;562:9;541:31;:::i;583:274::-;;;712:2;700:9;691:7;687:23;683:32;680:2;;;733:6;725;718:22;680:2;761:31;782:9;761:31;:::i;:::-;751:41;;811:40;847:2;836:9;832:18;811:40;:::i;:::-;801:50;;670:187;;;;;:::o;862:342::-;;;;1008:2;996:9;987:7;983:23;979:32;976:2;;;1029:6;1021;1014:22;976:2;1057:31;1078:9;1057:31;:::i;:::-;1047:41;;1107:40;1143:2;1132:9;1128:18;1107:40;:::i;:::-;1097:50;;1194:2;1183:9;1179:18;1166:32;1156:42;;966:238;;;;;:::o;1209:622::-;;;;;;;;1421:3;1409:9;1400:7;1396:23;1392:33;1389:2;;;1443:6;1435;1428:22;1389:2;1471:31;1492:9;1471:31;:::i;:::-;1461:41;;1521:40;1557:2;1546:9;1542:18;1521:40;:::i;:::-;1511:50;;1608:2;1597:9;1593:18;1580:32;1570:42;;1659:2;1648:9;1644:18;1631:32;1621:42;;1682:39;1716:3;1705:9;1701:19;1682:39;:::i;:::-;1672:49;;1768:3;1757:9;1753:19;1740:33;1730:43;;1820:3;1809:9;1805:19;1792:33;1782:43;;1379:452;;;;;;;;;;:::o;1836:266::-;;;1965:2;1953:9;1944:7;1940:23;1936:32;1933:2;;;1986:6;1978;1971:22;1933:2;2014:31;2035:9;2014:31;:::i;:::-;2004:41;2092:2;2077:18;;;;2064:32;;-1:-1:-1;;;1923:179:1:o;2107:545::-;;;;;;;2302:3;2290:9;2281:7;2277:23;2273:33;2270:2;;;2324:6;2316;2309:22;2270:2;2352:31;2373:9;2352:31;:::i;:::-;2342:41;;2430:2;2419:9;2415:18;2402:32;2392:42;;2481:2;2470:9;2466:18;2453:32;2443:42;;2504:38;2538:2;2527:9;2523:18;2504:38;:::i;:::-;2494:48;;2589:3;2578:9;2574:19;2561:33;2551:43;;2641:3;2630:9;2626:19;2613:33;2603:43;;2260:392;;;;;;;;:::o;2657:372::-;;;2785:2;2773:9;2764:7;2760:23;2756:32;2753:2;;;2806:6;2798;2791:22;2753:2;2834:31;2855:9;2834:31;:::i;:::-;2824:41;;2915:2;2904:9;2900:18;2887:32;2959:10;2952:5;2948:22;2941:5;2938:33;2928:2;;2990:6;2982;2975:22;2928:2;3018:5;3008:15;;;2743:286;;;;;:::o;3034:444::-;3304:66;3292:79;;3396:1;3387:11;;3380:27;;;;3432:2;3423:12;;3416:28;3469:2;3460:12;;3282:196::o;3483:226::-;3659:42;3647:55;;;;3629:74;;3617:2;3602:18;;3584:125::o;3714:187::-;3879:14;;3872:22;3854:41;;3842:2;3827:18;;3809:92::o;3906:177::-;4052:25;;;4040:2;4025:18;;4007:76::o;4088:614::-;4375:25;;;4419:42;4497:15;;;4492:2;4477:18;;4470:43;4549:15;;;;4544:2;4529:18;;4522:43;4596:2;4581:18;;4574:34;4639:3;4624:19;;4617:35;;;;4683:3;4668:19;;4661:35;4362:3;4347:19;;4329:373::o;4707:440::-;4938:25;;;5011:42;4999:55;;;;4994:2;4979:18;;4972:83;5086:2;5071:18;;5064:34;5129:2;5114:18;;5107:34;4925:3;4910:19;;4892:255::o;5152:512::-;5411:25;;;5467:2;5452:18;;5445:34;;;;5510:2;5495:18;;5488:34;;;;5553:2;5538:18;;5531:34;5614:42;5602:55;5596:3;5581:19;;5574:84;5398:3;5383:19;;5365:299::o;5669:440::-;5900:25;;;5956:2;5941:18;;5934:34;;;;5999:2;5984:18;;5977:34;6059:42;6047:55;6042:2;6027:18;;6020:83;5887:3;5872:19;;5854:255::o;6114:398::-;6341:25;;;6414:4;6402:17;;;;6397:2;6382:18;;6375:45;6451:2;6436:18;;6429:34;6494:2;6479:18;;6472:34;6328:3;6313:19;;6295:217::o;6517:662::-;;6658:2;6687;6676:9;6669:21;6719:6;6713:13;6762:6;6757:2;6746:9;6742:18;6735:34;6787:4;6800:140;6814:6;6811:1;6808:13;6800:140;;;6909:14;;;6905:23;;6899:30;6875:17;;;6894:2;6871:26;6864:66;6829:10;;6800:140;;;6958:6;6955:1;6952:13;6949:2;;;7028:4;7023:2;7014:6;7003:9;6999:22;6995:31;6988:45;6949:2;-1:-1:-1;7095:2:1;7083:15;7100:66;7079:88;7064:104;;;;7170:2;7060:113;;6638:541;-1:-1:-1;;;6638:541:1:o;7184:348::-;7386:2;7368:21;;;7425:2;7405:18;;;7398:30;7464:26;7459:2;7444:18;;7437:54;7523:2;7508:18;;7358:174::o;7537:399::-;7739:2;7721:21;;;7778:2;7758:18;;;7751:30;7817:34;7812:2;7797:18;;7790:62;7888:5;7883:2;7868:18;;7861:33;7926:3;7911:19;;7711:225::o;7941:402::-;8143:2;8125:21;;;8182:2;8162:18;;;8155:30;8221:34;8216:2;8201:18;;8194:62;8292:8;8287:2;8272:18;;8265:36;8333:3;8318:19;;8115:228::o;8348:398::-;8550:2;8532:21;;;8589:2;8569:18;;;8562:30;8628:34;8623:2;8608:18;;8601:62;8699:4;8694:2;8679:18;;8672:32;8736:3;8721:19;;8522:224::o;8751:353::-;8953:2;8935:21;;;8992:2;8972:18;;;8965:30;9031:31;9026:2;9011:18;;9004:59;9095:2;9080:18;;8925:179::o;9109:402::-;9311:2;9293:21;;;9350:2;9330:18;;;9323:30;9389:34;9384:2;9369:18;;9362:62;9460:8;9455:2;9440:18;;9433:36;9501:3;9486:19;;9283:228::o;9516:398::-;9718:2;9700:21;;;9757:2;9737:18;;;9730:30;9796:34;9791:2;9776:18;;9769:62;9867:4;9862:2;9847:18;;9840:32;9904:3;9889:19;;9690:224::o;9919:402::-;10121:2;10103:21;;;10160:2;10140:18;;;10133:30;10199:34;10194:2;10179:18;;10172:62;10270:8;10265:2;10250:18;;10243:36;10311:3;10296:19;;10093:228::o;10326:401::-;10528:2;10510:21;;;10567:2;10547:18;;;10540:30;10606:34;10601:2;10586:18;;10579:62;10677:7;10672:2;10657:18;;10650:35;10717:3;10702:19;;10500:227::o;10732:398::-;10934:2;10916:21;;;10973:2;10953:18;;;10946:30;11012:34;11007:2;10992:18;;10985:62;11083:4;11078:2;11063:18;;11056:32;11120:3;11105:19;;10906:224::o;11135:403::-;11337:2;11319:21;;;11376:2;11356:18;;;11349:30;11415:34;11410:2;11395:18;;11388:62;11486:9;11481:2;11466:18;;11459:37;11528:3;11513:19;;11309:229::o;11543:354::-;11745:2;11727:21;;;11784:2;11764:18;;;11757:30;11823:32;11818:2;11803:18;;11796:60;11888:2;11873:18;;11717:180::o;11902:404::-;12104:2;12086:21;;;12143:2;12123:18;;;12116:30;12182:34;12177:2;12162:18;;12155:62;12253:10;12248:2;12233:18;;12226:38;12296:3;12281:19;;12076:230::o;12311:356::-;12513:2;12495:21;;;12532:18;;;12525:30;12591:34;12586:2;12571:18;;12564:62;12658:2;12643:18;;12485:182::o;12672:401::-;12874:2;12856:21;;;12913:2;12893:18;;;12886:30;12952:34;12947:2;12932:18;;12925:62;13023:7;13018:2;13003:18;;12996:35;13063:3;13048:19;;12846:227::o;13078:397::-;13280:2;13262:21;;;13319:2;13299:18;;;13292:30;13358:34;13353:2;13338:18;;13331:62;13429:3;13424:2;13409:18;;13402:31;13465:3;13450:19;;13252:223::o;13480:400::-;13682:2;13664:21;;;13721:2;13701:18;;;13694:30;13760:34;13755:2;13740:18;;13733:62;13831:6;13826:2;13811:18;;13804:34;13870:3;13855:19;;13654:226::o;13885:401::-;14087:2;14069:21;;;14126:2;14106:18;;;14099:30;14165:34;14160:2;14145:18;;14138:62;14236:7;14231:2;14216:18;;14209:35;14276:3;14261:19;;14059:227::o;14291:401::-;14493:2;14475:21;;;14532:2;14512:18;;;14505:30;14571:34;14566:2;14551:18;;14544:62;14642:7;14637:2;14622:18;;14615:35;14682:3;14667:19;;14465:227::o;14697:355::-;14899:2;14881:21;;;14938:2;14918:18;;;14911:30;14977:33;14972:2;14957:18;;14950:61;15043:2;15028:18;;14871:181::o;15239:248::-;15413:25;;;15469:2;15454:18;;15447:34;15401:2;15386:18;;15368:119::o;15492:192::-;15666:10;15654:23;;;;15636:42;;15624:2;15609:18;;15591:93::o;15689:263::-;15891:10;15879:23;;;;15861:42;;15934:2;15919:18;;15912:34;15849:2;15834:18;;15816:136::o;15957:184::-;16129:4;16117:17;;;;16099:36;;16087:2;16072:18;;16054:87::o;16146:128::-;;16217:1;16213:6;16210:1;16207:13;16204:2;;;16223:18;;:::i;:::-;-1:-1:-1;16259:9:1;;16194:80::o;16279:228::-;;16346:10;16383:2;16380:1;16376:10;16413:2;16410:1;16406:10;16444:3;16440:2;16436:12;16431:3;16428:21;16425:2;;;16452:18;;:::i;:::-;16488:13;;16326:181;-1:-1:-1;;;;16326:181:1:o;16512:345::-;;16577:10;16614:2;16611:1;16607:10;16636:3;16626:2;;16673:77;16670:1;16663:88;16774:4;16771:1;16764:15;16802:4;16799:1;16792:15;16626:2;16835:10;;16831:20;;;;;16557:300;-1:-1:-1;;16557:300:1:o;16862:125::-;;16930:1;16927;16924:8;16921:2;;;16935:18;;:::i;:::-;-1:-1:-1;16972:9:1;;16911:76::o;16992:221::-;;17060:10;17120;;;;17090;;17142:12;;;17139:2;;;17157:18;;:::i;:::-;17194:13;;17040:173;-1:-1:-1;;;17040:173:1:o;17218:437::-;17303:1;17293:12;;17350:1;17340:12;;;17361:2;;17415:4;17407:6;17403:17;17393:27;;17361:2;17468;17460:6;17457:14;17437:18;17434:38;17431:2;;;17505:77;17502:1;17495:88;17606:4;17603:1;17596:15;17634:4;17631:1;17624:15;17660:184;17712:77;17709:1;17702:88;17809:4;17806:1;17799:15;17833:4;17830:1;17823:15

Swarm Source

ipfs://bf8270bc64857a15475a63ea95e0795d71707aa052e94063a31e3d1966c13959
Loading