Token Potion

 

Overview ERC-20

Price
$0.00 @ 0.000000 FTM
Fully Diluted Market Cap
Total Supply:
17,000 POTION

Holders:
230 addresses

Transfers:
-

Contract:
0x3edA36088b931098e8E472748840b3dF78268c720x3edA36088b931098e8E472748840b3dF78268c72

Decimals:
18

Social Profiles:
Not Available, Update ?

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

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

Contract Source Code Verified (Exact Match)

Contract Name:
PotionToken

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-02-04
*/

// SPDX-License-Identifier: MIT
//                                s       .                              
//                               :8      @88>                            
//  .d``                u.      .88      %8P          u.      u.    u.   
//  @8Ne.   .u    ...ue888b    :888ooo    .     ...ue888b   [email protected] [email protected] 
//  %8888:[email protected]   888R Y888r -*8888888  [email protected]   888R Y888r ^"8888""8888" 
//   `888I  888.  888R I888>   8888    ''888E`  888R I888>   8888  888R  
//    888I  888I  888R I888>   8888      888E   888R I888>   8888  888R  
//    888I  888I  888R I888>   8888      888E   888R I888>   8888  888R  
//  uW888L  888' u8888cJ888   .8888Lu=   888E  u8888cJ888    8888  888R  
// '*88888Nu88P   "*888*P"    ^%888*     888&   "*888*P"    "*88*" 8888" 
// ~ '88888F`       'Y"         'Y"      R888"    'Y"         ""   'Y"   
//    888 ^                               ""                             
//    *8E                                                                
//    '8>                                                                
//     "                                                                 

pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/contracts/utils/Strings.sol


// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

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

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

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

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

// File: @openzeppelin/contracts/utils/cryptography/ECDSA.sol


// OpenZeppelin Contracts v4.4.1 (utils/cryptography/ECDSA.sol)

pragma solidity ^0.8.0;


/**
 * @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 {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. 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.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @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) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s;
        uint8 v;
        assembly {
            s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)
            v := add(shr(255, vs), 27)
        }
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // 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 (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): 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.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @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) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @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 Message, created from `s`. 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(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

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

// File: @openzeppelin/contracts/utils/cryptography/draft-EIP712.sol


// OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol)

pragma solidity ^0.8.0;


/**
 * @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;
    address private immutable _CACHED_THIS;

    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);
        _CACHED_THIS = address(this);
        _TYPE_HASH = typeHash;
    }

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

    function _buildDomainSeparator(
        bytes32 typeHash,
        bytes32 nameHash,
        bytes32 versionHash
    ) private view returns (bytes32) {
        return keccak256(abi.encode(typeHash, nameHash, versionHash, 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);
    }
}

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

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) {
        return msg.data;
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/contracts/token/ERC20/ERC20.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;




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

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - amount);
        }

        return true;
    }

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

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

        return true;
    }

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

        _beforeTokenTransfer(sender, recipient, amount);

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

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: contracts/OpenZeppelin/ERC20Permit.sol



pragma solidity ^0.8.0;






// 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();
    }
}
// File: contracts/PotionToken.sol


pragma solidity ^0.8.0;



contract PotionToken is ERC20Permit, Ownable {

    constructor() ERC20("Potion", "POTION") ERC20Permit("Potion")
    {

    }

    uint256 constant private _maxTotalSupply = 17000000e18; // 17,000,000 max potions

    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), "POTION::delegateBySig: invalid signature");
        require(nonce == _useNonce(signatory), "POTION::delegateBySig: invalid nonce");
        require(block.timestamp <= expiry, "POTION::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, "POTION::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 POTIONs (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, "POTION::_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"}]

6101606040527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9610140908152503480156200003a57600080fd5b506040518060400160405280600681526020017f506f74696f6e0000000000000000000000000000000000000000000000000000815250806040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152506040518060400160405280600681526020017f506f74696f6e00000000000000000000000000000000000000000000000000008152506040518060400160405280600681526020017f504f54494f4e000000000000000000000000000000000000000000000000000081525081600390805190602001906200012c9291906200032e565b508060049080519060200190620001459291906200032e565b50505060008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a08181525050620001b18184846200022460201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508061012081815250505050505050506200021e620002126200026060201b60201c565b6200026860201b60201c565b6200051b565b600083838346306040516020016200024195949392919062000411565b6040516020818303038152906040528051906020012090509392505050565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200033c90620004b6565b90600052602060002090601f016020900481019282620003605760008555620003ac565b82601f106200037b57805160ff1916838001178555620003ac565b82800160010185558215620003ac579182015b82811115620003ab5782518255916020019190600101906200038e565b5b509050620003bb9190620003bf565b5090565b5b80821115620003da576000816000905550600101620003c0565b5090565b620003e9816200046e565b82525050565b620003fa8162000482565b82525050565b6200040b81620004ac565b82525050565b600060a082019050620004286000830188620003ef565b620004376020830187620003ef565b620004466040830186620003ef565b62000455606083018562000400565b620004646080830184620003de565b9695505050505050565b60006200047b826200048c565b9050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006002820490506001821680620004cf57607f821691505b60208210811415620004e657620004e5620004ec565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60805160a05160c05160601c60e051610100516101205161014051613fdb62000579600039600061138101526000611c7a01526000611cbc01526000611c9b01526000611bd001526000611c2601526000611c4f0152613fdb6000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c8063715018a6116100f9578063b4b5ea5711610097578063dd62ed3e11610071578063dd62ed3e14610543578063e7a324dc14610573578063f1127ed814610591578063f2fde38b146105c2576101c4565b8063b4b5ea57146104db578063c3cda5201461050b578063d505accf14610527576101c4565b80638da5cb5b116100d35780638da5cb5b1461043f57806395d89b411461045d578063a457c2d71461047b578063a9059cbb146104ab576101c4565b8063715018a6146103d5578063782d6fe1146103df5780637ecebe001461040f576101c4565b806339509351116101665780635c19a95c116101405780635c19a95c1461033b5780635db30bb1146103575780636fcfff451461037557806370a08231146103a5576101c4565b806339509351146102bf57806340c10f19146102ef578063587cde1e1461030b576101c4565b806320606b70116101a257806320606b701461023557806323b872dd14610253578063313ce567146102835780633644e515146102a1576101c4565b806306fdde03146101c9578063095ea7b3146101e757806318160ddd14610217575b600080fd5b6101d16105de565b6040516101de91906132d7565b60405180910390f35b61020160048036038101906101fc9190612c13565b610670565b60405161020e919061311e565b60405180910390f35b61021f61068e565b60405161022c9190613599565b60405180910390f35b61023d610698565b60405161024a9190613139565b60405180910390f35b61026d60048036038101906102689190612b1e565b6106bc565b60405161027a919061311e565b60405180910390f35b61028b6106e2565b6040516102989190613621565b60405180910390f35b6102a96106eb565b6040516102b69190613139565b60405180910390f35b6102d960048036038101906102d49190612c13565b6106fa565b6040516102e6919061311e565b60405180910390f35b61030960048036038101906103049190612c13565b6107a6565b005b61032560048036038101906103209190612ab1565b61089c565b6040516103329190613103565b60405180910390f35b61035560048036038101906103509190612ab1565b610905565b005b61035f610912565b60405161036c9190613599565b60405180910390f35b61038f600480360381019061038a9190612ab1565b610925565b60405161039c91906135dd565b60405180910390f35b6103bf60048036038101906103ba9190612ab1565b610948565b6040516103cc9190613599565b60405180910390f35b6103dd610990565b005b6103f960048036038101906103f49190612c13565b610a18565b6040516104069190613599565b60405180910390f35b61042960048036038101906104249190612ab1565b610def565b6040516104369190613599565b60405180910390f35b610447610e3f565b6040516104549190613103565b60405180910390f35b610465610e69565b60405161047291906132d7565b60405180910390f35b61049560048036038101906104909190612c13565b610efb565b6040516104a2919061311e565b60405180910390f35b6104c560048036038101906104c09190612c13565b610fe6565b6040516104d2919061311e565b60405180910390f35b6104f560048036038101906104f09190612ab1565b611011565b6040516105029190613599565b60405180910390f35b61052560048036038101906105209190612c53565b6110f0565b005b610541600480360381019061053c9190612b71565b61133a565b005b61055d60048036038101906105589190612ade565b61147c565b60405161056a9190613599565b60405180910390f35b61057b611503565b6040516105889190613139565b60405180910390f35b6105ab60048036038101906105a69190612ce0565b611527565b6040516105b99291906135f8565b60405180910390f35b6105dc60048036038101906105d79190612ab1565b611568565b005b6060600380546105ed9061382e565b80601f01602080910402602001604051908101604052809291908181526020018280546106199061382e565b80156106665780601f1061063b57610100808354040283529160200191610666565b820191906000526020600020905b81548152906001019060200180831161064957829003601f168201915b5050505050905090565b600061068461067d611660565b8484611668565b6001905092915050565b6000600254905090565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6000806106ca858585611833565b90506106d785858561192b565b809150509392505050565b60006012905090565b60006106f5611bcc565b905090565b600061079c610707611660565b848460016000610715611660565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546107979190613663565b611668565b6001905092915050565b6107ae611660565b73ffffffffffffffffffffffffffffffffffffffff166107cc610e3f565b73ffffffffffffffffffffffffffffffffffffffff1614610822576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610819906134b9565b60405180910390fd5b6a0e0fe3d8bb9bc7b10000008161083761068e565b6108419190613663565b1115610882576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087990613459565b60405180910390fd5b61088c8282611ce6565b6108986000838361192b565b5050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b61090f3382611e46565b50565b60006a0e0fe3d8bb9bc7b1000000905090565b60096020528060005260406000206000915054906101000a900463ffffffff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610998611660565b73ffffffffffffffffffffffffffffffffffffffff166109b6610e3f565b73ffffffffffffffffffffffffffffffffffffffff1614610a0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a03906134b9565b60405180910390fd5b610a166000611fb7565b565b6000438210610a5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5390613519565b60405180910390fd5b6000600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff16905060008163ffffffff161415610ac9576000915050610de9565b82600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600184610b189190613758565b63ffffffff1663ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff1611610bc557600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600183610b9f9190613758565b63ffffffff1663ffffffff16815260200190815260200160002060010154915050610de9565b82600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008063ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff161115610c46576000915050610de9565b600080600183610c569190613758565b90505b8163ffffffff168163ffffffff161115610d8357600060028383610c7d9190613758565b610c8791906136f3565b82610c929190613758565b90506000600860008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008363ffffffff1663ffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff168152602001600182015481525050905086816000015163ffffffff161415610d5257806020015195505050505050610de9565b86816000015163ffffffff161015610d6c57819350610d7c565b600182610d799190613758565b92505b5050610c59565b600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008363ffffffff1663ffffffff1681526020019081526020016000206001015493505050505b92915050565b6000610e38600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061207d565b9050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610e789061382e565b80601f0160208091040260200160405190810160405280929190818152602001828054610ea49061382e565b8015610ef15780601f10610ec657610100808354040283529160200191610ef1565b820191906000526020600020905b815481529060010190602001808311610ed457829003601f168201915b5050505050905090565b60008060016000610f0a611660565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610fc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbe90613539565b60405180910390fd5b610fdb610fd2611660565b85858403611668565b600191505092915050565b600080610ff3848461208b565b9050611007611000611660565b858561192b565b8091505092915050565b600080600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff16905060008163ffffffff161161107b5760006110e8565b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001836110c99190613758565b63ffffffff1663ffffffff168152602001908152602001600020600101545b915050919050565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86661111b6105de565b8051906020012061112a6120a9565b3060405160200161113e949392919061324d565b60405160208183030381529060405280519060200120905060007fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf88888860405160200161118f94939291906131b5565b604051602081830303815290604052805190602001209050600082826040516020016111bc9291906130cc565b6040516020818303038152906040528051906020012090506000600182888888604051600081526020016040526040516111f99493929190613292565b6020604051602081039080840390855afa15801561121b573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611297576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128e90613359565b60405180910390fd5b6112a0816120b6565b89146112e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d890613559565b60405180910390fd5b87421115611324576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131b90613339565b60405180910390fd5b61132e818b611e46565b50505050505050505050565b8342111561137d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611374906133d9565b60405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000008888886113ac8c6120b6565b896040516020016113c296959493929190613154565b60405160208183030381529060405280519060200120905060006113e582612114565b905060006113f58287878761212e565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611465576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145c90613479565b60405180910390fd5b6114708a8a8a611668565b50505050505050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b6008602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a900463ffffffff16908060010154905082565b611570611660565b73ffffffffffffffffffffffffffffffffffffffff1661158e610e3f565b73ffffffffffffffffffffffffffffffffffffffff16146115e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115db906134b9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611654576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164b90613399565b60405180910390fd5b61165d81611fb7565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156116d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cf906134f9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611748576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173f906133b9565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516118269190613599565b60405180910390a3505050565b6000611840848484612159565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600061188b611660565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508281101561190b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190290613499565b60405180910390fd5b61191f85611917611660565b858403611668565b60019150509392505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156119675750600081115b15611bc757600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611a99576000600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff1611611a0a576000611a77565b600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600184611a589190613758565b63ffffffff1663ffffffff168152602001908152602001600020600101545b905060008382611a879190613724565b9050611a95868484846123da565b5050505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611bc6576000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff1611611b37576000611ba4565b600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600184611b859190613758565b63ffffffff1663ffffffff168152602001908152602001600020600101545b905060008382611bb49190613663565b9050611bc2858484846123da565b5050505b5b505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015611c4857507f000000000000000000000000000000000000000000000000000000000000000046145b15611c75577f00000000000000000000000000000000000000000000000000000000000000009050611ce3565b611ce07f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612683565b90505b90565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4d90613579565b60405180910390fd5b611d62600083836126bd565b8060026000828254611d749190613663565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611dc99190613663565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611e2e9190613599565b60405180910390a3611e42600083836126c2565b5050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000611eb584610948565b905082600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a4611fb182848361192b565b50505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081600001549050919050565b600061209f612098611660565b8484612159565b6001905092915050565b6000804690508091505090565b600080600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506121038161207d565b915061210e816126c7565b50919050565b6000612127612121611bcc565b836126dd565b9050919050565b600080600061213f87878787612710565b9150915061214c8161281d565b8192505050949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156121c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c0906134d9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612239576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223090613319565b60405180910390fd5b6122448383836126bd565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156122ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c1906133f9565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461235d9190613663565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516123c19190613599565b60405180910390a36123d48484846126c2565b50505050565b60006123fe43604051806060016040528060368152602001613f70603691396129f2565b905060008463ffffffff1611801561249c57508063ffffffff16600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001876124669190613758565b63ffffffff1663ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff16145b156125165781600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001876124f09190613758565b63ffffffff1663ffffffff1681526020019081526020016000206001018190555061262c565b60405180604001604052808263ffffffff16815260200183815250600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008663ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff160217905550602082015181600101559050506001846125ce91906136b9565b600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055505b8473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72484846040516126749291906135b4565b60405180910390a25050505050565b6000838383463060405160200161269e9594939291906131fa565b6040516020818303038152906040528051906020012090509392505050565b505050565b505050565b6001816000016000828254019250508190555050565b600082826040516020016126f29291906130cc565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561274b576000600391509150612814565b601b8560ff16141580156127635750601c8560ff1614155b15612775576000600491509150612814565b60006001878787876040516000815260200160405260405161279a9493929190613292565b6020604051602081039080840390855afa1580156127bc573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561280b57600060019250925050612814565b80600092509250505b94509492505050565b60006004811115612831576128306138c8565b5b816004811115612844576128436138c8565b5b141561284f576129ef565b60016004811115612863576128626138c8565b5b816004811115612876576128756138c8565b5b14156128b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ae906132f9565b60405180910390fd5b600260048111156128cb576128ca6138c8565b5b8160048111156128de576128dd6138c8565b5b141561291f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291690613379565b60405180910390fd5b60036004811115612933576129326138c8565b5b816004811115612946576129456138c8565b5b1415612987576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161297e90613419565b60405180910390fd5b60048081111561299a576129996138c8565b5b8160048111156129ad576129ac6138c8565b5b14156129ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129e590613439565b60405180910390fd5b5b50565b600064010000000083108290612a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a3591906132d7565b60405180910390fd5b5082905092915050565b600081359050612a5781613efc565b92915050565b600081359050612a6c81613f13565b92915050565b600081359050612a8181613f2a565b92915050565b600081359050612a9681613f41565b92915050565b600081359050612aab81613f58565b92915050565b600060208284031215612ac757612ac6613926565b5b6000612ad584828501612a48565b91505092915050565b60008060408385031215612af557612af4613926565b5b6000612b0385828601612a48565b9250506020612b1485828601612a48565b9150509250929050565b600080600060608486031215612b3757612b36613926565b5b6000612b4586828701612a48565b9350506020612b5686828701612a48565b9250506040612b6786828701612a72565b9150509250925092565b600080600080600080600060e0888a031215612b9057612b8f613926565b5b6000612b9e8a828b01612a48565b9750506020612baf8a828b01612a48565b9650506040612bc08a828b01612a72565b9550506060612bd18a828b01612a72565b9450506080612be28a828b01612a9c565b93505060a0612bf38a828b01612a5d565b92505060c0612c048a828b01612a5d565b91505092959891949750929550565b60008060408385031215612c2a57612c29613926565b5b6000612c3885828601612a48565b9250506020612c4985828601612a72565b9150509250929050565b60008060008060008060c08789031215612c7057612c6f613926565b5b6000612c7e89828a01612a48565b9650506020612c8f89828a01612a72565b9550506040612ca089828a01612a72565b9450506060612cb189828a01612a9c565b9350506080612cc289828a01612a5d565b92505060a0612cd389828a01612a5d565b9150509295509295509295565b60008060408385031215612cf757612cf6613926565b5b6000612d0585828601612a48565b9250506020612d1685828601612a87565b9150509250929050565b612d298161378c565b82525050565b612d388161379e565b82525050565b612d47816137aa565b82525050565b612d5e612d59826137aa565b613860565b82525050565b6000612d6f8261363c565b612d798185613647565b9350612d898185602086016137fb565b612d928161392b565b840191505092915050565b6000612daa601883613647565b9150612db58261393c565b602082019050919050565b6000612dcd602383613647565b9150612dd882613965565b604082019050919050565b6000612df0602883613647565b9150612dfb826139b4565b604082019050919050565b6000612e13602883613647565b9150612e1e82613a03565b604082019050919050565b6000612e36601f83613647565b9150612e4182613a52565b602082019050919050565b6000612e59602683613647565b9150612e6482613a7b565b604082019050919050565b6000612e7c602283613647565b9150612e8782613aca565b604082019050919050565b6000612e9f600283613658565b9150612eaa82613b19565b600282019050919050565b6000612ec2601d83613647565b9150612ecd82613b42565b602082019050919050565b6000612ee5602683613647565b9150612ef082613b6b565b604082019050919050565b6000612f08602283613647565b9150612f1382613bba565b604082019050919050565b6000612f2b602283613647565b9150612f3682613c09565b604082019050919050565b6000612f4e602783613647565b9150612f5982613c58565b604082019050919050565b6000612f71601e83613647565b9150612f7c82613ca7565b602082019050919050565b6000612f94602883613647565b9150612f9f82613cd0565b604082019050919050565b6000612fb7602083613647565b9150612fc282613d1f565b602082019050919050565b6000612fda602583613647565b9150612fe582613d48565b604082019050919050565b6000612ffd602483613647565b915061300882613d97565b604082019050919050565b6000613020602983613647565b915061302b82613de6565b604082019050919050565b6000613043602583613647565b915061304e82613e35565b604082019050919050565b6000613066602483613647565b915061307182613e84565b604082019050919050565b6000613089601f83613647565b915061309482613ed3565b602082019050919050565b6130a8816137d4565b82525050565b6130b7816137de565b82525050565b6130c6816137ee565b82525050565b60006130d782612e92565b91506130e38285612d4d565b6020820191506130f38284612d4d565b6020820191508190509392505050565b60006020820190506131186000830184612d20565b92915050565b60006020820190506131336000830184612d2f565b92915050565b600060208201905061314e6000830184612d3e565b92915050565b600060c0820190506131696000830189612d3e565b6131766020830188612d20565b6131836040830187612d20565b613190606083018661309f565b61319d608083018561309f565b6131aa60a083018461309f565b979650505050505050565b60006080820190506131ca6000830187612d3e565b6131d76020830186612d20565b6131e4604083018561309f565b6131f1606083018461309f565b95945050505050565b600060a08201905061320f6000830188612d3e565b61321c6020830187612d3e565b6132296040830186612d3e565b613236606083018561309f565b6132436080830184612d20565b9695505050505050565b60006080820190506132626000830187612d3e565b61326f6020830186612d3e565b61327c604083018561309f565b6132896060830184612d20565b95945050505050565b60006080820190506132a76000830187612d3e565b6132b460208301866130bd565b6132c16040830185612d3e565b6132ce6060830184612d3e565b95945050505050565b600060208201905081810360008301526132f18184612d64565b905092915050565b6000602082019050818103600083015261331281612d9d565b9050919050565b6000602082019050818103600083015261333281612dc0565b9050919050565b6000602082019050818103600083015261335281612de3565b9050919050565b6000602082019050818103600083015261337281612e06565b9050919050565b6000602082019050818103600083015261339281612e29565b9050919050565b600060208201905081810360008301526133b281612e4c565b9050919050565b600060208201905081810360008301526133d281612e6f565b9050919050565b600060208201905081810360008301526133f281612eb5565b9050919050565b6000602082019050818103600083015261341281612ed8565b9050919050565b6000602082019050818103600083015261343281612efb565b9050919050565b6000602082019050818103600083015261345281612f1e565b9050919050565b6000602082019050818103600083015261347281612f41565b9050919050565b6000602082019050818103600083015261349281612f64565b9050919050565b600060208201905081810360008301526134b281612f87565b9050919050565b600060208201905081810360008301526134d281612faa565b9050919050565b600060208201905081810360008301526134f281612fcd565b9050919050565b6000602082019050818103600083015261351281612ff0565b9050919050565b6000602082019050818103600083015261353281613013565b9050919050565b6000602082019050818103600083015261355281613036565b9050919050565b6000602082019050818103600083015261357281613059565b9050919050565b600060208201905081810360008301526135928161307c565b9050919050565b60006020820190506135ae600083018461309f565b92915050565b60006040820190506135c9600083018561309f565b6135d6602083018461309f565b9392505050565b60006020820190506135f260008301846130ae565b92915050565b600060408201905061360d60008301856130ae565b61361a602083018461309f565b9392505050565b600060208201905061363660008301846130bd565b92915050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600061366e826137d4565b9150613679836137d4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156136ae576136ad61386a565b5b828201905092915050565b60006136c4826137de565b91506136cf836137de565b92508263ffffffff038211156136e8576136e761386a565b5b828201905092915050565b60006136fe826137de565b9150613709836137de565b92508261371957613718613899565b5b828204905092915050565b600061372f826137d4565b915061373a836137d4565b92508282101561374d5761374c61386a565b5b828203905092915050565b6000613763826137de565b915061376e836137de565b9250828210156137815761378061386a565b5b828203905092915050565b6000613797826137b4565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600060ff82169050919050565b60005b838110156138195780820151818401526020810190506137fe565b83811115613828576000848401525b50505050565b6000600282049050600182168061384657607f821691505b6020821081141561385a576138596138f7565b5b50919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b6000601f19601f8301169050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f504f54494f4e3a3a64656c656761746542795369673a207369676e617475726560008201527f2065787069726564000000000000000000000000000000000000000000000000602082015250565b7f504f54494f4e3a3a64656c656761746542795369673a20696e76616c6964207360008201527f69676e6174757265000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f45524332305065726d69743a206578706972656420646561646c696e65000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206d696e74696e67206d6f7265207468656e204d6178546f746160008201527f6c537570706c7900000000000000000000000000000000000000000000000000602082015250565b7f45524332305065726d69743a20696e76616c6964207369676e61747572650000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f504f54494f4e3a3a6765745072696f72566f7465733a206e6f7420796574206460008201527f657465726d696e65640000000000000000000000000000000000000000000000602082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f504f54494f4e3a3a64656c656761746542795369673a20696e76616c6964206e60008201527f6f6e636500000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b613f058161378c565b8114613f1057600080fd5b50565b613f1c816137aa565b8114613f2757600080fd5b50565b613f33816137d4565b8114613f3e57600080fd5b50565b613f4a816137de565b8114613f5557600080fd5b50565b613f61816137ee565b8114613f6c57600080fd5b5056fe504f54494f4e3a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473a2646970667358221220e10e2378f3dab45218411741d469d0ce6c2d6e87112443f605fefe44018941d664736f6c63430008070033

Deployed ByteCode Sourcemap

43196:9708:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28017:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30184:169;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29137:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44852:122;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45694:299;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28979:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42700:115;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31736:215;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43424:257;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46358:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46651:104;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43741:102;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44730:49;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29308:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21438:103;;;:::i;:::-;;49199:1255;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42442:128;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20787:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28236:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32454:413;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46001:273;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48513:255;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47189:1123;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41605:771;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29886:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45068:117;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44591:70;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;21696:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28017:100;28071:13;28104:5;28097:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28017:100;:::o;30184:169::-;30267:4;30284:39;30293:12;:10;:12::i;:::-;30307:7;30316:6;30284:8;:39::i;:::-;30341:4;30334:11;;30184:169;;;;:::o;29137:108::-;29198:7;29225:12;;29218:19;;29137:108;:::o;44852:122::-;44894:80;44852:122;:::o;45694:299::-;45806:4;45828:11;45842:45;45861:6;45869:9;45880:6;45842:18;:45::i;:::-;45828:59;;45918:41;45933:6;45941:9;45952:6;45918:14;:41::i;:::-;45979:6;45972:13;;;45694:299;;;;;:::o;28979:93::-;29037:5;29062:2;29055:9;;28979:93;:::o;42700:115::-;42760:7;42787:20;:18;:20::i;:::-;42780:27;;42700:115;:::o;31736:215::-;31824:4;31841:80;31850:12;:10;:12::i;:::-;31864:7;31910:10;31873:11;:25;31885:12;:10;:12::i;:::-;31873:25;;;;;;;;;;;;;;;:34;31899:7;31873:34;;;;;;;;;;;;;;;;:47;;;;:::i;:::-;31841:8;:80::i;:::-;31939:4;31932:11;;31736:215;;;;:::o;43424:257::-;21018:12;:10;:12::i;:::-;21007:23;;:7;:5;:7::i;:::-;:23;;;20999:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43378:11:::1;43520:7;43504:13;:11;:13::i;:::-;:23;;;;:::i;:::-;:42;;43496:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;43603:19;43609:3;43614:7;43603:5;:19::i;:::-;43633:40;43656:1;43660:3;43665:7;43633:14;:40::i;:::-;43424:257:::0;;:::o;46358:149::-;46446:7;46478:10;:21;46489:9;46478:21;;;;;;;;;;;;;;;;;;;;;;;;;46471:28;;46358:149;;;:::o;46651:104::-;46715:32;46725:10;46737:9;46715;:32::i;:::-;46651:104;:::o;43741:102::-;43793:7;43378:11;43813:22;;43741:102;:::o;44730:49::-;;;;;;;;;;;;;;;;;;;;;;:::o;29308:127::-;29382:7;29409:9;:18;29419:7;29409:18;;;;;;;;;;;;;;;;29402:25;;29308:127;;;:::o;21438:103::-;21018:12;:10;:12::i;:::-;21007:23;;:7;:5;:7::i;:::-;:23;;;20999:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;21503:30:::1;21530:1;21503:18;:30::i;:::-;21438:103::o:0;49199:1255::-;49307:7;49354:12;49340:11;:26;49332:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;49425:19;49447:14;:23;49462:7;49447:23;;;;;;;;;;;;;;;;;;;;;;;;;49425:45;;49501:1;49485:12;:17;;;49481:58;;;49526:1;49519:8;;;;;49481:58;49651:11;49599;:20;49611:7;49599:20;;;;;;;;;;;;;;;:38;49635:1;49620:12;:16;;;;:::i;:::-;49599:38;;;;;;;;;;;;;;;:48;;;;;;;;;;;;:63;;;49595:147;;49686:11;:20;49698:7;49686:20;;;;;;;;;;;;;;;:38;49722:1;49707:12;:16;;;;:::i;:::-;49686:38;;;;;;;;;;;;;;;:44;;;49679:51;;;;;49595:147;49839:11;49803;:20;49815:7;49803:20;;;;;;;;;;;;;;;:23;49824:1;49803:23;;;;;;;;;;;;;:33;;;;;;;;;;;;:47;;;49799:88;;;49874:1;49867:8;;;;;49799:88;49899:12;49926;49956:1;49941:12;:16;;;;:::i;:::-;49926:31;;49968:428;49983:5;49975:13;;:5;:13;;;49968:428;;;50005:13;50047:1;50038:5;50030;:13;;;;:::i;:::-;50029:19;;;;:::i;:::-;50021:5;:27;;;;:::i;:::-;50005:43;;50090:20;50113:11;:20;50125:7;50113:20;;;;;;;;;;;;;;;:28;50134:6;50113:28;;;;;;;;;;;;;;;50090:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50176:11;50160:2;:12;;;:27;;;50156:229;;;50215:2;:8;;;50208:15;;;;;;;;;50156:229;50264:11;50249:2;:12;;;:26;;;50245:140;;;50304:6;50296:14;;50245:140;;;50368:1;50359:6;:10;;;;:::i;:::-;50351:18;;50245:140;49990:406;;49968:428;;;50413:11;:20;50425:7;50413:20;;;;;;;;;;;;;;;:27;50434:5;50413:27;;;;;;;;;;;;;;;:33;;;50406:40;;;;;49199:1255;;;;;:::o;42442:128::-;42511:7;42538:24;:7;:14;42546:5;42538:14;;;;;;;;;;;;;;;:22;:24::i;:::-;42531:31;;42442:128;;;:::o;20787:87::-;20833:7;20860:6;;;;;;;;;;;20853:13;;20787:87;:::o;28236:104::-;28292:13;28325:7;28318:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28236:104;:::o;32454:413::-;32547:4;32564:24;32591:11;:25;32603:12;:10;:12::i;:::-;32591:25;;;;;;;;;;;;;;;:34;32617:7;32591:34;;;;;;;;;;;;;;;;32564:61;;32664:15;32644:16;:35;;32636:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;32757:67;32766:12;:10;:12::i;:::-;32780:7;32808:15;32789:16;:34;32757:8;:67::i;:::-;32855:4;32848:11;;;32454:413;;;;:::o;46001:273::-;46093:4;46115:11;46129:33;46144:9;46155:6;46129:14;:33::i;:::-;46115:47;;46193;46208:12;:10;:12::i;:::-;46222:9;46233:6;46193:14;:47::i;:::-;46260:6;46253:13;;;46001:273;;;;:::o;48513:255::-;48605:7;48630:19;48652:14;:23;48667:7;48652:23;;;;;;;;;;;;;;;;;;;;;;;;;48630:45;;48708:1;48693:12;:16;;;:67;;48759:1;48693:67;;;48712:11;:20;48724:7;48712:20;;;;;;;;;;;;;;;:38;48748:1;48733:12;:16;;;;:::i;:::-;48712:38;;;;;;;;;;;;;;;:44;;;48693:67;48686:74;;;48513:255;;;:::o;47189:1123::-;47308:23;44894:80;47437:6;:4;:6::i;:::-;47421:24;;;;;;47464:12;:10;:12::i;:::-;47503:4;47358:165;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47334:200;;;;;;47308:226;;47547:18;45114:71;47659:9;47687:5;47711:6;47592:140;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47568:175;;;;;;47547:196;;47756:14;47861:15;47895:10;47797:123;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47773:158;;;;;;47756:175;;47944:17;47964:26;47974:6;47982:1;47985;47988;47964:26;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47944:46;;48030:1;48009:23;;:9;:23;;;;48001:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;48105:20;48115:9;48105;:20::i;:::-;48096:5;:29;48088:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;48204:6;48185:15;:25;;48177:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;48273:31;48283:9;48294;48273;:31::i;:::-;48266:38;;;;47189:1123;;;;;;:::o;41605:771::-;41834:8;41815:15;:27;;41807:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;41889:18;41963:16;41998:5;42022:7;42048:5;42072:16;42082:5;42072:9;:16::i;:::-;42107:8;41934:196;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;41910:231;;;;;;41889:252;;42154:12;42169:28;42186:10;42169:16;:28::i;:::-;42154:43;;42210:14;42227:28;42241:4;42247:1;42250;42253;42227:13;:28::i;:::-;42210:45;;42284:5;42274:15;;:6;:15;;;42266:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;42337:31;42346:5;42353:7;42362:5;42337:8;:31::i;:::-;41741:635;;;41605:771;;;;;;;:::o;29886:151::-;29975:7;30002:11;:18;30014:5;30002:18;;;;;;;;;;;;;;;:27;30021:7;30002:27;;;;;;;;;;;;;;;;29995:34;;29886:151;;;;:::o;45068:117::-;45114:71;45068:117;:::o;44591:70::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;21696:201::-;21018:12;:10;:12::i;:::-;21007:23;;:7;:5;:7::i;:::-;:23;;;20999:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;21805:1:::1;21785:22;;:8;:22;;;;21777:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21861:28;21880:8;21861:18;:28::i;:::-;21696:201:::0;:::o;19511:98::-;19564:7;19591:10;19584:17;;19511:98;:::o;36138:380::-;36291:1;36274:19;;:5;:19;;;;36266:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36372:1;36353:21;;:7;:21;;;;36345:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36456:6;36426:11;:18;36438:5;36426:18;;;;;;;;;;;;;;;:27;36445:7;36426:27;;;;;;;;;;;;;;;:36;;;;36494:7;36478:32;;36487:5;36478:32;;;36503:6;36478:32;;;;;;:::i;:::-;;;;;;;;36138:380;;;:::o;30835:492::-;30975:4;30992:36;31002:6;31010:9;31021:6;30992:9;:36::i;:::-;31041:24;31068:11;:19;31080:6;31068:19;;;;;;;;;;;;;;;:33;31088:12;:10;:12::i;:::-;31068:33;;;;;;;;;;;;;;;;31041:60;;31140:6;31120:16;:26;;31112:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;31227:57;31236:6;31244:12;:10;:12::i;:::-;31277:6;31258:16;:25;31227:8;:57::i;:::-;31315:4;31308:11;;;30835:492;;;;;:::o;50910:941::-;51016:6;51006:16;;:6;:16;;;;:30;;;;;51035:1;51026:6;:10;51006:30;51002:842;;;51075:1;51057:20;;:6;:20;;;51053:382;;51146:16;51165:14;:22;51180:6;51165:22;;;;;;;;;;;;;;;;;;;;;;;;;51146:41;;51206:17;51238:1;51226:9;:13;;;:60;;51285:1;51226:60;;;51242:11;:19;51254:6;51242:19;;;;;;;;;;;;;;;:34;51274:1;51262:9;:13;;;;:::i;:::-;51242:34;;;;;;;;;;;;;;;:40;;;51226:60;51206:80;;51305:17;51337:6;51325:9;:18;;;;:::i;:::-;51305:38;;51362:57;51379:6;51387:9;51398;51409;51362:16;:57::i;:::-;51079:356;;;51053:382;51473:1;51455:20;;:6;:20;;;51451:382;;51544:16;51563:14;:22;51578:6;51563:22;;;;;;;;;;;;;;;;;;;;;;;;;51544:41;;51604:17;51636:1;51624:9;:13;;;:60;;51683:1;51624:60;;;51640:11;:19;51652:6;51640:19;;;;;;;;;;;;;;;:34;51672:1;51660:9;:13;;;;:::i;:::-;51640:34;;;;;;;;;;;;;;;:40;;;51624:60;51604:80;;51703:17;51735:6;51723:9;:18;;;;:::i;:::-;51703:38;;51760:57;51777:6;51785:9;51796;51807;51760:16;:57::i;:::-;51477:356;;;51451:382;51002:842;50910:941;;;:::o;17431:314::-;17484:7;17525:12;17508:29;;17516:4;17508:29;;;:66;;;;;17558:16;17541:13;:33;17508:66;17504:234;;;17598:24;17591:31;;;;17504:234;17662:64;17684:10;17696:12;17710:15;17662:21;:64::i;:::-;17655:71;;17431:314;;:::o;34377:399::-;34480:1;34461:21;;:7;:21;;;;34453:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;34531:49;34560:1;34564:7;34573:6;34531:20;:49::i;:::-;34609:6;34593:12;;:22;;;;;;;:::i;:::-;;;;;;;;34648:6;34626:9;:18;34636:7;34626:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;34691:7;34670:37;;34687:1;34670:37;;;34700:6;34670:37;;;;;;:::i;:::-;;;;;;;;34720:48;34748:1;34752:7;34761:6;34720:19;:48::i;:::-;34377:399;;:::o;50462:440::-;50553:23;50579:10;:21;50590:9;50579:21;;;;;;;;;;;;;;;;;;;;;;;;;50553:47;;50611:24;50638:20;50648:9;50638;:20::i;:::-;50611:47;;50740:9;50716:10;:21;50727:9;50716:21;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;50811:9;50767:54;;50794:15;50767:54;;50783:9;50767:54;;;;;;;;;;;;50834:60;50849:15;50866:9;50877:16;50834:14;:60::i;:::-;50542:360;;50462:440;;:::o;22057:191::-;22131:16;22150:6;;;;;;;;;;;22131:25;;22176:8;22167:6;;:17;;;;;;;;;;;;;;;;;;22231:8;22200:40;;22221:8;22200:40;;;;;;;;;;;;22120:128;22057:191;:::o;1918:114::-;1983:7;2010;:14;;;2003:21;;1918:114;;;:::o;29648:175::-;29734:4;29751:42;29761:12;:10;:12::i;:::-;29775:9;29786:6;29751:9;:42::i;:::-;29811:4;29804:11;;29648:175;;;;:::o;52742:153::-;52787:4;52804:15;52852:9;52841:20;;52880:7;52873:14;;;52742:153;:::o;42913:207::-;42973:15;43001:30;43034:7;:14;43042:5;43034:14;;;;;;;;;;;;;;;43001:47;;43069:15;:5;:13;:15::i;:::-;43059:25;;43095:17;:5;:15;:17::i;:::-;42990:130;42913:207;;;:::o;18658:167::-;18735:7;18762:55;18784:20;:18;:20::i;:::-;18806:10;18762:21;:55::i;:::-;18755:62;;18658:167;;;:::o;12307:279::-;12435:7;12456:17;12475:18;12497:25;12508:4;12514:1;12517;12520;12497:10;:25::i;:::-;12455:67;;;;12533:18;12545:5;12533:11;:18::i;:::-;12569:9;12562:16;;;;12307:279;;;;;;:::o;33357:733::-;33515:1;33497:20;;:6;:20;;;;33489:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;33599:1;33578:23;;:9;:23;;;;33570:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;33654:47;33675:6;33683:9;33694:6;33654:20;:47::i;:::-;33714:21;33738:9;:17;33748:6;33738:17;;;;;;;;;;;;;;;;33714:41;;33791:6;33774:13;:23;;33766:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;33912:6;33896:13;:22;33876:9;:17;33886:6;33876:17;;;;;;;;;;;;;;;:42;;;;33964:6;33940:9;:20;33950:9;33940:20;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;34005:9;33988:35;;33997:6;33988:35;;;34016:6;33988:35;;;;;;:::i;:::-;;;;;;;;34036:46;34056:6;34064:9;34075:6;34036:19;:46::i;:::-;33478:612;33357:733;;;:::o;51859:706::-;52038:18;52059:78;52066:12;52059:78;;;;;;;;;;;;;;;;;:6;:78::i;:::-;52038:99;;52169:1;52154:12;:16;;;:85;;;;;52228:11;52174:65;;:11;:22;52186:9;52174:22;;;;;;;;;;;;;;;:40;52212:1;52197:12;:16;;;;:::i;:::-;52174:40;;;;;;;;;;;;;;;:50;;;;;;;;;;;;:65;;;52154:85;52150:339;;;52305:8;52256:11;:22;52268:9;52256:22;;;;;;;;;;;;;;;:40;52294:1;52279:12;:16;;;;:::i;:::-;52256:40;;;;;;;;;;;;;;;:46;;:57;;;;52150:339;;;52385:33;;;;;;;;52396:11;52385:33;;;;;;52409:8;52385:33;;;52346:11;:22;52358:9;52346:22;;;;;;;;;;;;;;;:36;52369:12;52346:36;;;;;;;;;;;;;;;:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52476:1;52461:12;:16;;;;:::i;:::-;52433:14;:25;52448:9;52433:25;;;;;;;;;;;;;;;;:44;;;;;;;;;;;;;;;;;;52150:339;52527:9;52506:51;;;52538:8;52548;52506:51;;;;;;;:::i;:::-;;;;;;;;52027:538;51859:706;;;;:::o;17753:263::-;17897:7;17945:8;17955;17965:11;17978:13;18001:4;17934:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;17924:84;;;;;;17917:91;;17753:263;;;;;:::o;37118:125::-;;;;:::o;37847:124::-;;;;:::o;2040:127::-;2147:1;2129:7;:14;;;:19;;;;;;;;;;;2040:127;:::o;13998:196::-;14091:7;14157:15;14174:10;14128:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;14118:68;;;;;;14111:75;;13998:196;;;;:::o;10536:1632::-;10667:7;10676:12;11601:66;11596:1;11588:10;;:79;11584:163;;;11700:1;11704:30;11684:51;;;;;;11584:163;11766:2;11761:1;:7;;;;:18;;;;;11777:2;11772:1;:7;;;;11761:18;11757:102;;;11812:1;11816:30;11796:51;;;;;;11757:102;11956:14;11973:24;11983:4;11989:1;11992;11995;11973:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11956:41;;12030:1;12012:20;;:6;:20;;;12008:103;;;12065:1;12069:29;12049:50;;;;;;;12008:103;12131:6;12139:20;12123:37;;;;;10536:1632;;;;;;;;:::o;5198:643::-;5276:20;5267:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;5263:571;;;5313:7;;5263:571;5374:29;5365:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;5361:473;;;5420:34;;;;;;;;;;:::i;:::-;;;;;;;;5361:473;5485:35;5476:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;5472:362;;;5537:41;;;;;;;;;;:::i;:::-;;;;;;;;5472:362;5609:30;5600:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;5596:238;;;5656:44;;;;;;;;;;:::i;:::-;;;;;;;;5596:238;5731:30;5722:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;5718:116;;;5778:44;;;;;;;;;;:::i;:::-;;;;;;;;5718:116;5198:643;;:::o;52573:161::-;52648:6;52679:5;52675:1;:9;52686:12;52667:32;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;52724:1;52710:16;;52573:161;;;;:::o;7:139:1:-;53:5;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;7:139;;;;:::o;152:::-;198:5;236:6;223:20;214:29;;252:33;279:5;252:33;:::i;:::-;152:139;;;;:::o;297:::-;343:5;381:6;368:20;359:29;;397:33;424:5;397:33;:::i;:::-;297:139;;;;:::o;442:137::-;487:5;525:6;512:20;503:29;;541:32;567:5;541:32;:::i;:::-;442:137;;;;:::o;585:135::-;629:5;667:6;654:20;645:29;;683:31;708:5;683:31;:::i;:::-;585:135;;;;:::o;726:329::-;785:6;834:2;822:9;813:7;809:23;805:32;802:119;;;840:79;;:::i;:::-;802:119;960:1;985:53;1030:7;1021:6;1010:9;1006:22;985:53;:::i;:::-;975:63;;931:117;726:329;;;;:::o;1061:474::-;1129:6;1137;1186:2;1174:9;1165:7;1161:23;1157:32;1154:119;;;1192:79;;:::i;:::-;1154:119;1312:1;1337:53;1382:7;1373:6;1362:9;1358:22;1337:53;:::i;:::-;1327:63;;1283:117;1439:2;1465:53;1510:7;1501:6;1490:9;1486:22;1465:53;:::i;:::-;1455:63;;1410:118;1061:474;;;;;:::o;1541:619::-;1618:6;1626;1634;1683:2;1671:9;1662:7;1658:23;1654:32;1651:119;;;1689:79;;:::i;:::-;1651:119;1809:1;1834:53;1879:7;1870:6;1859:9;1855:22;1834:53;:::i;:::-;1824:63;;1780:117;1936:2;1962:53;2007:7;1998:6;1987:9;1983:22;1962:53;:::i;:::-;1952:63;;1907:118;2064:2;2090:53;2135:7;2126:6;2115:9;2111:22;2090:53;:::i;:::-;2080:63;;2035:118;1541:619;;;;;:::o;2166:1199::-;2277:6;2285;2293;2301;2309;2317;2325;2374:3;2362:9;2353:7;2349:23;2345:33;2342:120;;;2381:79;;:::i;:::-;2342:120;2501:1;2526:53;2571:7;2562:6;2551:9;2547:22;2526:53;:::i;:::-;2516:63;;2472:117;2628:2;2654:53;2699:7;2690:6;2679:9;2675:22;2654:53;:::i;:::-;2644:63;;2599:118;2756:2;2782:53;2827:7;2818:6;2807:9;2803:22;2782:53;:::i;:::-;2772:63;;2727:118;2884:2;2910:53;2955:7;2946:6;2935:9;2931:22;2910:53;:::i;:::-;2900:63;;2855:118;3012:3;3039:51;3082:7;3073:6;3062:9;3058:22;3039:51;:::i;:::-;3029:61;;2983:117;3139:3;3166:53;3211:7;3202:6;3191:9;3187:22;3166:53;:::i;:::-;3156:63;;3110:119;3268:3;3295:53;3340:7;3331:6;3320:9;3316:22;3295:53;:::i;:::-;3285:63;;3239:119;2166:1199;;;;;;;;;;:::o;3371:474::-;3439:6;3447;3496:2;3484:9;3475:7;3471:23;3467:32;3464:119;;;3502:79;;:::i;:::-;3464:119;3622:1;3647:53;3692:7;3683:6;3672:9;3668:22;3647:53;:::i;:::-;3637:63;;3593:117;3749:2;3775:53;3820:7;3811:6;3800:9;3796:22;3775:53;:::i;:::-;3765:63;;3720:118;3371:474;;;;;:::o;3851:1053::-;3953:6;3961;3969;3977;3985;3993;4042:3;4030:9;4021:7;4017:23;4013:33;4010:120;;;4049:79;;:::i;:::-;4010:120;4169:1;4194:53;4239:7;4230:6;4219:9;4215:22;4194:53;:::i;:::-;4184:63;;4140:117;4296:2;4322:53;4367:7;4358:6;4347:9;4343:22;4322:53;:::i;:::-;4312:63;;4267:118;4424:2;4450:53;4495:7;4486:6;4475:9;4471:22;4450:53;:::i;:::-;4440:63;;4395:118;4552:2;4578:51;4621:7;4612:6;4601:9;4597:22;4578:51;:::i;:::-;4568:61;;4523:116;4678:3;4705:53;4750:7;4741:6;4730:9;4726:22;4705:53;:::i;:::-;4695:63;;4649:119;4807:3;4834:53;4879:7;4870:6;4859:9;4855:22;4834:53;:::i;:::-;4824:63;;4778:119;3851:1053;;;;;;;;:::o;4910:472::-;4977:6;4985;5034:2;5022:9;5013:7;5009:23;5005:32;5002:119;;;5040:79;;:::i;:::-;5002:119;5160:1;5185:53;5230:7;5221:6;5210:9;5206:22;5185:53;:::i;:::-;5175:63;;5131:117;5287:2;5313:52;5357:7;5348:6;5337:9;5333:22;5313:52;:::i;:::-;5303:62;;5258:117;4910:472;;;;;:::o;5388:118::-;5475:24;5493:5;5475:24;:::i;:::-;5470:3;5463:37;5388:118;;:::o;5512:109::-;5593:21;5608:5;5593:21;:::i;:::-;5588:3;5581:34;5512:109;;:::o;5627:118::-;5714:24;5732:5;5714:24;:::i;:::-;5709:3;5702:37;5627:118;;:::o;5751:157::-;5856:45;5876:24;5894:5;5876:24;:::i;:::-;5856:45;:::i;:::-;5851:3;5844:58;5751:157;;:::o;5914:364::-;6002:3;6030:39;6063:5;6030:39;:::i;:::-;6085:71;6149:6;6144:3;6085:71;:::i;:::-;6078:78;;6165:52;6210:6;6205:3;6198:4;6191:5;6187:16;6165:52;:::i;:::-;6242:29;6264:6;6242:29;:::i;:::-;6237:3;6233:39;6226:46;;6006:272;5914:364;;;;:::o;6284:366::-;6426:3;6447:67;6511:2;6506:3;6447:67;:::i;:::-;6440:74;;6523:93;6612:3;6523:93;:::i;:::-;6641:2;6636:3;6632:12;6625:19;;6284:366;;;:::o;6656:::-;6798:3;6819:67;6883:2;6878:3;6819:67;:::i;:::-;6812:74;;6895:93;6984:3;6895:93;:::i;:::-;7013:2;7008:3;7004:12;6997:19;;6656:366;;;:::o;7028:::-;7170:3;7191:67;7255:2;7250:3;7191:67;:::i;:::-;7184:74;;7267:93;7356:3;7267:93;:::i;:::-;7385:2;7380:3;7376:12;7369:19;;7028:366;;;:::o;7400:::-;7542:3;7563:67;7627:2;7622:3;7563:67;:::i;:::-;7556:74;;7639:93;7728:3;7639:93;:::i;:::-;7757:2;7752:3;7748:12;7741:19;;7400:366;;;:::o;7772:::-;7914:3;7935:67;7999:2;7994:3;7935:67;:::i;:::-;7928:74;;8011:93;8100:3;8011:93;:::i;:::-;8129:2;8124:3;8120:12;8113:19;;7772:366;;;:::o;8144:::-;8286:3;8307:67;8371:2;8366:3;8307:67;:::i;:::-;8300:74;;8383:93;8472:3;8383:93;:::i;:::-;8501:2;8496:3;8492:12;8485:19;;8144:366;;;:::o;8516:::-;8658:3;8679:67;8743:2;8738:3;8679:67;:::i;:::-;8672:74;;8755:93;8844:3;8755:93;:::i;:::-;8873:2;8868:3;8864:12;8857:19;;8516:366;;;:::o;8888:400::-;9048:3;9069:84;9151:1;9146:3;9069:84;:::i;:::-;9062:91;;9162:93;9251:3;9162:93;:::i;:::-;9280:1;9275:3;9271:11;9264:18;;8888:400;;;:::o;9294:366::-;9436:3;9457:67;9521:2;9516:3;9457:67;:::i;:::-;9450:74;;9533:93;9622:3;9533:93;:::i;:::-;9651:2;9646:3;9642:12;9635:19;;9294:366;;;:::o;9666:::-;9808:3;9829:67;9893:2;9888:3;9829:67;:::i;:::-;9822:74;;9905:93;9994:3;9905:93;:::i;:::-;10023:2;10018:3;10014:12;10007:19;;9666:366;;;:::o;10038:::-;10180:3;10201:67;10265:2;10260:3;10201:67;:::i;:::-;10194:74;;10277:93;10366:3;10277:93;:::i;:::-;10395:2;10390:3;10386:12;10379:19;;10038:366;;;:::o;10410:::-;10552:3;10573:67;10637:2;10632:3;10573:67;:::i;:::-;10566:74;;10649:93;10738:3;10649:93;:::i;:::-;10767:2;10762:3;10758:12;10751:19;;10410:366;;;:::o;10782:::-;10924:3;10945:67;11009:2;11004:3;10945:67;:::i;:::-;10938:74;;11021:93;11110:3;11021:93;:::i;:::-;11139:2;11134:3;11130:12;11123:19;;10782:366;;;:::o;11154:::-;11296:3;11317:67;11381:2;11376:3;11317:67;:::i;:::-;11310:74;;11393:93;11482:3;11393:93;:::i;:::-;11511:2;11506:3;11502:12;11495:19;;11154:366;;;:::o;11526:::-;11668:3;11689:67;11753:2;11748:3;11689:67;:::i;:::-;11682:74;;11765:93;11854:3;11765:93;:::i;:::-;11883:2;11878:3;11874:12;11867:19;;11526:366;;;:::o;11898:::-;12040:3;12061:67;12125:2;12120:3;12061:67;:::i;:::-;12054:74;;12137:93;12226:3;12137:93;:::i;:::-;12255:2;12250:3;12246:12;12239:19;;11898:366;;;:::o;12270:::-;12412:3;12433:67;12497:2;12492:3;12433:67;:::i;:::-;12426:74;;12509:93;12598:3;12509:93;:::i;:::-;12627:2;12622:3;12618:12;12611:19;;12270:366;;;:::o;12642:::-;12784:3;12805:67;12869:2;12864:3;12805:67;:::i;:::-;12798:74;;12881:93;12970:3;12881:93;:::i;:::-;12999:2;12994:3;12990:12;12983:19;;12642:366;;;:::o;13014:::-;13156:3;13177:67;13241:2;13236:3;13177:67;:::i;:::-;13170:74;;13253:93;13342:3;13253:93;:::i;:::-;13371:2;13366:3;13362:12;13355:19;;13014:366;;;:::o;13386:::-;13528:3;13549:67;13613:2;13608:3;13549:67;:::i;:::-;13542:74;;13625:93;13714:3;13625:93;:::i;:::-;13743:2;13738:3;13734:12;13727:19;;13386:366;;;:::o;13758:::-;13900:3;13921:67;13985:2;13980:3;13921:67;:::i;:::-;13914:74;;13997:93;14086:3;13997:93;:::i;:::-;14115:2;14110:3;14106:12;14099:19;;13758:366;;;:::o;14130:::-;14272:3;14293:67;14357:2;14352:3;14293:67;:::i;:::-;14286:74;;14369:93;14458:3;14369:93;:::i;:::-;14487:2;14482:3;14478:12;14471:19;;14130:366;;;:::o;14502:118::-;14589:24;14607:5;14589:24;:::i;:::-;14584:3;14577:37;14502:118;;:::o;14626:115::-;14711:23;14728:5;14711:23;:::i;:::-;14706:3;14699:36;14626:115;;:::o;14747:112::-;14830:22;14846:5;14830:22;:::i;:::-;14825:3;14818:35;14747:112;;:::o;14865:663::-;15106:3;15128:148;15272:3;15128:148;:::i;:::-;15121:155;;15286:75;15357:3;15348:6;15286:75;:::i;:::-;15386:2;15381:3;15377:12;15370:19;;15399:75;15470:3;15461:6;15399:75;:::i;:::-;15499:2;15494:3;15490:12;15483:19;;15519:3;15512:10;;14865:663;;;;;:::o;15534:222::-;15627:4;15665:2;15654:9;15650:18;15642:26;;15678:71;15746:1;15735:9;15731:17;15722:6;15678:71;:::i;:::-;15534:222;;;;:::o;15762:210::-;15849:4;15887:2;15876:9;15872:18;15864:26;;15900:65;15962:1;15951:9;15947:17;15938:6;15900:65;:::i;:::-;15762:210;;;;:::o;15978:222::-;16071:4;16109:2;16098:9;16094:18;16086:26;;16122:71;16190:1;16179:9;16175:17;16166:6;16122:71;:::i;:::-;15978:222;;;;:::o;16206:775::-;16439:4;16477:3;16466:9;16462:19;16454:27;;16491:71;16559:1;16548:9;16544:17;16535:6;16491:71;:::i;:::-;16572:72;16640:2;16629:9;16625:18;16616:6;16572:72;:::i;:::-;16654;16722:2;16711:9;16707:18;16698:6;16654:72;:::i;:::-;16736;16804:2;16793:9;16789:18;16780:6;16736:72;:::i;:::-;16818:73;16886:3;16875:9;16871:19;16862:6;16818:73;:::i;:::-;16901;16969:3;16958:9;16954:19;16945:6;16901:73;:::i;:::-;16206:775;;;;;;;;;:::o;16987:553::-;17164:4;17202:3;17191:9;17187:19;17179:27;;17216:71;17284:1;17273:9;17269:17;17260:6;17216:71;:::i;:::-;17297:72;17365:2;17354:9;17350:18;17341:6;17297:72;:::i;:::-;17379;17447:2;17436:9;17432:18;17423:6;17379:72;:::i;:::-;17461;17529:2;17518:9;17514:18;17505:6;17461:72;:::i;:::-;16987:553;;;;;;;:::o;17546:664::-;17751:4;17789:3;17778:9;17774:19;17766:27;;17803:71;17871:1;17860:9;17856:17;17847:6;17803:71;:::i;:::-;17884:72;17952:2;17941:9;17937:18;17928:6;17884:72;:::i;:::-;17966;18034:2;18023:9;18019:18;18010:6;17966:72;:::i;:::-;18048;18116:2;18105:9;18101:18;18092:6;18048:72;:::i;:::-;18130:73;18198:3;18187:9;18183:19;18174:6;18130:73;:::i;:::-;17546:664;;;;;;;;:::o;18216:553::-;18393:4;18431:3;18420:9;18416:19;18408:27;;18445:71;18513:1;18502:9;18498:17;18489:6;18445:71;:::i;:::-;18526:72;18594:2;18583:9;18579:18;18570:6;18526:72;:::i;:::-;18608;18676:2;18665:9;18661:18;18652:6;18608:72;:::i;:::-;18690;18758:2;18747:9;18743:18;18734:6;18690:72;:::i;:::-;18216:553;;;;;;;:::o;18775:545::-;18948:4;18986:3;18975:9;18971:19;18963:27;;19000:71;19068:1;19057:9;19053:17;19044:6;19000:71;:::i;:::-;19081:68;19145:2;19134:9;19130:18;19121:6;19081:68;:::i;:::-;19159:72;19227:2;19216:9;19212:18;19203:6;19159:72;:::i;:::-;19241;19309:2;19298:9;19294:18;19285:6;19241:72;:::i;:::-;18775:545;;;;;;;:::o;19326:313::-;19439:4;19477:2;19466:9;19462:18;19454:26;;19526:9;19520:4;19516:20;19512:1;19501:9;19497:17;19490:47;19554:78;19627:4;19618:6;19554:78;:::i;:::-;19546:86;;19326:313;;;;:::o;19645:419::-;19811:4;19849:2;19838:9;19834:18;19826:26;;19898:9;19892:4;19888:20;19884:1;19873:9;19869:17;19862:47;19926:131;20052:4;19926:131;:::i;:::-;19918:139;;19645:419;;;:::o;20070:::-;20236:4;20274:2;20263:9;20259:18;20251:26;;20323:9;20317:4;20313:20;20309:1;20298:9;20294:17;20287:47;20351:131;20477:4;20351:131;:::i;:::-;20343:139;;20070:419;;;:::o;20495:::-;20661:4;20699:2;20688:9;20684:18;20676:26;;20748:9;20742:4;20738:20;20734:1;20723:9;20719:17;20712:47;20776:131;20902:4;20776:131;:::i;:::-;20768:139;;20495:419;;;:::o;20920:::-;21086:4;21124:2;21113:9;21109:18;21101:26;;21173:9;21167:4;21163:20;21159:1;21148:9;21144:17;21137:47;21201:131;21327:4;21201:131;:::i;:::-;21193:139;;20920:419;;;:::o;21345:::-;21511:4;21549:2;21538:9;21534:18;21526:26;;21598:9;21592:4;21588:20;21584:1;21573:9;21569:17;21562:47;21626:131;21752:4;21626:131;:::i;:::-;21618:139;;21345:419;;;:::o;21770:::-;21936:4;21974:2;21963:9;21959:18;21951:26;;22023:9;22017:4;22013:20;22009:1;21998:9;21994:17;21987:47;22051:131;22177:4;22051:131;:::i;:::-;22043:139;;21770:419;;;:::o;22195:::-;22361:4;22399:2;22388:9;22384:18;22376:26;;22448:9;22442:4;22438:20;22434:1;22423:9;22419:17;22412:47;22476:131;22602:4;22476:131;:::i;:::-;22468:139;;22195:419;;;:::o;22620:::-;22786:4;22824:2;22813:9;22809:18;22801:26;;22873:9;22867:4;22863:20;22859:1;22848:9;22844:17;22837:47;22901:131;23027:4;22901:131;:::i;:::-;22893:139;;22620:419;;;:::o;23045:::-;23211:4;23249:2;23238:9;23234:18;23226:26;;23298:9;23292:4;23288:20;23284:1;23273:9;23269:17;23262:47;23326:131;23452:4;23326:131;:::i;:::-;23318:139;;23045:419;;;:::o;23470:::-;23636:4;23674:2;23663:9;23659:18;23651:26;;23723:9;23717:4;23713:20;23709:1;23698:9;23694:17;23687:47;23751:131;23877:4;23751:131;:::i;:::-;23743:139;;23470:419;;;:::o;23895:::-;24061:4;24099:2;24088:9;24084:18;24076:26;;24148:9;24142:4;24138:20;24134:1;24123:9;24119:17;24112:47;24176:131;24302:4;24176:131;:::i;:::-;24168:139;;23895:419;;;:::o;24320:::-;24486:4;24524:2;24513:9;24509:18;24501:26;;24573:9;24567:4;24563:20;24559:1;24548:9;24544:17;24537:47;24601:131;24727:4;24601:131;:::i;:::-;24593:139;;24320:419;;;:::o;24745:::-;24911:4;24949:2;24938:9;24934:18;24926:26;;24998:9;24992:4;24988:20;24984:1;24973:9;24969:17;24962:47;25026:131;25152:4;25026:131;:::i;:::-;25018:139;;24745:419;;;:::o;25170:::-;25336:4;25374:2;25363:9;25359:18;25351:26;;25423:9;25417:4;25413:20;25409:1;25398:9;25394:17;25387:47;25451:131;25577:4;25451:131;:::i;:::-;25443:139;;25170:419;;;:::o;25595:::-;25761:4;25799:2;25788:9;25784:18;25776:26;;25848:9;25842:4;25838:20;25834:1;25823:9;25819:17;25812:47;25876:131;26002:4;25876:131;:::i;:::-;25868:139;;25595:419;;;:::o;26020:::-;26186:4;26224:2;26213:9;26209:18;26201:26;;26273:9;26267:4;26263:20;26259:1;26248:9;26244:17;26237:47;26301:131;26427:4;26301:131;:::i;:::-;26293:139;;26020:419;;;:::o;26445:::-;26611:4;26649:2;26638:9;26634:18;26626:26;;26698:9;26692:4;26688:20;26684:1;26673:9;26669:17;26662:47;26726:131;26852:4;26726:131;:::i;:::-;26718:139;;26445:419;;;:::o;26870:::-;27036:4;27074:2;27063:9;27059:18;27051:26;;27123:9;27117:4;27113:20;27109:1;27098:9;27094:17;27087:47;27151:131;27277:4;27151:131;:::i;:::-;27143:139;;26870:419;;;:::o;27295:::-;27461:4;27499:2;27488:9;27484:18;27476:26;;27548:9;27542:4;27538:20;27534:1;27523:9;27519:17;27512:47;27576:131;27702:4;27576:131;:::i;:::-;27568:139;;27295:419;;;:::o;27720:::-;27886:4;27924:2;27913:9;27909:18;27901:26;;27973:9;27967:4;27963:20;27959:1;27948:9;27944:17;27937:47;28001:131;28127:4;28001:131;:::i;:::-;27993:139;;27720:419;;;:::o;28145:::-;28311:4;28349:2;28338:9;28334:18;28326:26;;28398:9;28392:4;28388:20;28384:1;28373:9;28369:17;28362:47;28426:131;28552:4;28426:131;:::i;:::-;28418:139;;28145:419;;;:::o;28570:222::-;28663:4;28701:2;28690:9;28686:18;28678:26;;28714:71;28782:1;28771:9;28767:17;28758:6;28714:71;:::i;:::-;28570:222;;;;:::o;28798:332::-;28919:4;28957:2;28946:9;28942:18;28934:26;;28970:71;29038:1;29027:9;29023:17;29014:6;28970:71;:::i;:::-;29051:72;29119:2;29108:9;29104:18;29095:6;29051:72;:::i;:::-;28798:332;;;;;:::o;29136:218::-;29227:4;29265:2;29254:9;29250:18;29242:26;;29278:69;29344:1;29333:9;29329:17;29320:6;29278:69;:::i;:::-;29136:218;;;;:::o;29360:328::-;29479:4;29517:2;29506:9;29502:18;29494:26;;29530:69;29596:1;29585:9;29581:17;29572:6;29530:69;:::i;:::-;29609:72;29677:2;29666:9;29662:18;29653:6;29609:72;:::i;:::-;29360:328;;;;;:::o;29694:214::-;29783:4;29821:2;29810:9;29806:18;29798:26;;29834:67;29898:1;29887:9;29883:17;29874:6;29834:67;:::i;:::-;29694:214;;;;:::o;29995:99::-;30047:6;30081:5;30075:12;30065:22;;29995:99;;;:::o;30100:169::-;30184:11;30218:6;30213:3;30206:19;30258:4;30253:3;30249:14;30234:29;;30100:169;;;;:::o;30275:148::-;30377:11;30414:3;30399:18;;30275:148;;;;:::o;30429:305::-;30469:3;30488:20;30506:1;30488:20;:::i;:::-;30483:25;;30522:20;30540:1;30522:20;:::i;:::-;30517:25;;30676:1;30608:66;30604:74;30601:1;30598:81;30595:107;;;30682:18;;:::i;:::-;30595:107;30726:1;30723;30719:9;30712:16;;30429:305;;;;:::o;30740:246::-;30779:3;30798:19;30815:1;30798:19;:::i;:::-;30793:24;;30831:19;30848:1;30831:19;:::i;:::-;30826:24;;30928:1;30916:10;30912:18;30909:1;30906:25;30903:51;;;30934:18;;:::i;:::-;30903:51;30978:1;30975;30971:9;30964:16;;30740:246;;;;:::o;30992:182::-;31031:1;31048:19;31065:1;31048:19;:::i;:::-;31043:24;;31081:19;31098:1;31081:19;:::i;:::-;31076:24;;31119:1;31109:35;;31124:18;;:::i;:::-;31109:35;31166:1;31163;31159:9;31154:14;;30992:182;;;;:::o;31180:191::-;31220:4;31240:20;31258:1;31240:20;:::i;:::-;31235:25;;31274:20;31292:1;31274:20;:::i;:::-;31269:25;;31313:1;31310;31307:8;31304:34;;;31318:18;;:::i;:::-;31304:34;31363:1;31360;31356:9;31348:17;;31180:191;;;;:::o;31377:188::-;31416:4;31436:19;31453:1;31436:19;:::i;:::-;31431:24;;31469:19;31486:1;31469:19;:::i;:::-;31464:24;;31507:1;31504;31501:8;31498:34;;;31512:18;;:::i;:::-;31498:34;31557:1;31554;31550:9;31542:17;;31377:188;;;;:::o;31571:96::-;31608:7;31637:24;31655:5;31637:24;:::i;:::-;31626:35;;31571:96;;;:::o;31673:90::-;31707:7;31750:5;31743:13;31736:21;31725:32;;31673:90;;;:::o;31769:77::-;31806:7;31835:5;31824:16;;31769:77;;;:::o;31852:126::-;31889:7;31929:42;31922:5;31918:54;31907:65;;31852:126;;;:::o;31984:77::-;32021:7;32050:5;32039:16;;31984:77;;;:::o;32067:93::-;32103:7;32143:10;32136:5;32132:22;32121:33;;32067:93;;;:::o;32166:86::-;32201:7;32241:4;32234:5;32230:16;32219:27;;32166:86;;;:::o;32258:307::-;32326:1;32336:113;32350:6;32347:1;32344:13;32336:113;;;32435:1;32430:3;32426:11;32420:18;32416:1;32411:3;32407:11;32400:39;32372:2;32369:1;32365:10;32360:15;;32336:113;;;32467:6;32464:1;32461:13;32458:101;;;32547:1;32538:6;32533:3;32529:16;32522:27;32458:101;32307:258;32258:307;;;:::o;32571:320::-;32615:6;32652:1;32646:4;32642:12;32632:22;;32699:1;32693:4;32689:12;32720:18;32710:81;;32776:4;32768:6;32764:17;32754:27;;32710:81;32838:2;32830:6;32827:14;32807:18;32804:38;32801:84;;;32857:18;;:::i;:::-;32801:84;32622:269;32571:320;;;:::o;32897:79::-;32936:7;32965:5;32954:16;;32897:79;;;:::o;32982:180::-;33030:77;33027:1;33020:88;33127:4;33124:1;33117:15;33151:4;33148:1;33141:15;33168:180;33216:77;33213:1;33206:88;33313:4;33310:1;33303:15;33337:4;33334:1;33327:15;33354:180;33402:77;33399:1;33392:88;33499:4;33496:1;33489:15;33523:4;33520:1;33513:15;33540:180;33588:77;33585:1;33578:88;33685:4;33682:1;33675:15;33709:4;33706:1;33699:15;33849:117;33958:1;33955;33948:12;33972:102;34013:6;34064:2;34060:7;34055:2;34048:5;34044:14;34040:28;34030:38;;33972:102;;;:::o;34080:174::-;34220:26;34216:1;34208:6;34204:14;34197:50;34080:174;:::o;34260:222::-;34400:34;34396:1;34388:6;34384:14;34377:58;34469:5;34464:2;34456:6;34452:15;34445:30;34260:222;:::o;34488:227::-;34628:34;34624:1;34616:6;34612:14;34605:58;34697:10;34692:2;34684:6;34680:15;34673:35;34488:227;:::o;34721:::-;34861:34;34857:1;34849:6;34845:14;34838:58;34930:10;34925:2;34917:6;34913:15;34906:35;34721:227;:::o;34954:181::-;35094:33;35090:1;35082:6;35078:14;35071:57;34954:181;:::o;35141:225::-;35281:34;35277:1;35269:6;35265:14;35258:58;35350:8;35345:2;35337:6;35333:15;35326:33;35141:225;:::o;35372:221::-;35512:34;35508:1;35500:6;35496:14;35489:58;35581:4;35576:2;35568:6;35564:15;35557:29;35372:221;:::o;35599:214::-;35739:66;35735:1;35727:6;35723:14;35716:90;35599:214;:::o;35819:179::-;35959:31;35955:1;35947:6;35943:14;35936:55;35819:179;:::o;36004:225::-;36144:34;36140:1;36132:6;36128:14;36121:58;36213:8;36208:2;36200:6;36196:15;36189:33;36004:225;:::o;36235:221::-;36375:34;36371:1;36363:6;36359:14;36352:58;36444:4;36439:2;36431:6;36427:15;36420:29;36235:221;:::o;36462:::-;36602:34;36598:1;36590:6;36586:14;36579:58;36671:4;36666:2;36658:6;36654:15;36647:29;36462:221;:::o;36689:226::-;36829:34;36825:1;36817:6;36813:14;36806:58;36898:9;36893:2;36885:6;36881:15;36874:34;36689:226;:::o;36921:180::-;37061:32;37057:1;37049:6;37045:14;37038:56;36921:180;:::o;37107:227::-;37247:34;37243:1;37235:6;37231:14;37224:58;37316:10;37311:2;37303:6;37299:15;37292:35;37107:227;:::o;37340:182::-;37480:34;37476:1;37468:6;37464:14;37457:58;37340:182;:::o;37528:224::-;37668:34;37664:1;37656:6;37652:14;37645:58;37737:7;37732:2;37724:6;37720:15;37713:32;37528:224;:::o;37758:223::-;37898:34;37894:1;37886:6;37882:14;37875:58;37967:6;37962:2;37954:6;37950:15;37943:31;37758:223;:::o;37987:228::-;38127:34;38123:1;38115:6;38111:14;38104:58;38196:11;38191:2;38183:6;38179:15;38172:36;37987:228;:::o;38221:224::-;38361:34;38357:1;38349:6;38345:14;38338:58;38430:7;38425:2;38417:6;38413:15;38406:32;38221:224;:::o;38451:223::-;38591:34;38587:1;38579:6;38575:14;38568:58;38660:6;38655:2;38647:6;38643:15;38636:31;38451:223;:::o;38680:181::-;38820:33;38816:1;38808:6;38804:14;38797:57;38680:181;:::o;38867:122::-;38940:24;38958:5;38940:24;:::i;:::-;38933:5;38930:35;38920:63;;38979:1;38976;38969:12;38920:63;38867:122;:::o;38995:::-;39068:24;39086:5;39068:24;:::i;:::-;39061:5;39058:35;39048:63;;39107:1;39104;39097:12;39048:63;38995:122;:::o;39123:::-;39196:24;39214:5;39196:24;:::i;:::-;39189:5;39186:35;39176:63;;39235:1;39232;39225:12;39176:63;39123:122;:::o;39251:120::-;39323:23;39340:5;39323:23;:::i;:::-;39316:5;39313:34;39303:62;;39361:1;39358;39351:12;39303:62;39251:120;:::o;39377:118::-;39448:22;39464:5;39448:22;:::i;:::-;39441:5;39438:33;39428:61;;39485:1;39482;39475:12;39428:61;39377:118;:::o

Swarm Source

ipfs://e10e2378f3dab45218411741d469d0ce6c2d6e87112443f605fefe44018941d6
Loading