ETH Price: $3,136.16 (-0.85%)

Token

Dimitra Token (DMTR)
 

Overview

Max Total Supply

582,911,531 DMTR

Holders

9,262 ( -0.032%)

Market

Price

$0.09 @ 0.000030 ETH (-9.34%)

Onchain Market Cap

$54,411,273.43

Circulating Supply Market Cap

$45,412,135.85

Other Info

Token Contract (WITH 18 Decimals)

Balance
0 DMTR

Value
$0.00
0xa283c21f13c2b261881297973e34322c37a30e96
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

The DMTR token provides a catalyst that drives the ever-expanding Connected Farmer ecosystem. Dimitra launched a digital token to accelerate achieving our mission, enriching the lives of small to medium-size farmers everywhere, and to grow economies around the world.

Market

Volume (24H):$1,074,974.78
Market Capitalization:$45,412,135.85
Circulating Supply:486,503,182.00 DMTR
Market Data Source: Coinmarketcap

# Exchange Pair Price  24H Volume % Volume
1
KuCoin
DMTR-USDT$0.0924
0.0000294 Eth
$526,018.00
5,695,860.900 DMTR
49.0283%
2
MEXC
DMTR-USDT$0.0928
0.0000296 Eth
$195,902.00
2,110,768.860 DMTR
18.1689%
3
Uniswap V2 (Ethereum)
0X51CB253744189F11241BECB29BEDD3F1B5384FDB-0XC02AAA39B223FE8D0A0E5C4F27EAD9083C756CC2$0.096
0.0000305 Eth
$99,061.00
994,327.850 0X51CB253744189F11241BECB29BEDD3F1B5384FDB
8.5589%
4
Bitget
DMTR-USDT$0.0936
0.0000298 Eth
$66,283.00
671,264.130 DMTR
5.7780%
5
XT.COM
DMTR-USDT$0.0928
0.0000296 Eth
$49,159.00
502,025.500 DMTR
4.3213%
6
Gate.io
DMTR-USDT$0.0928
0.0000296 Eth
$32,696.00
334,126.500 DMTR
2.8761%
7
LBank
DMTR-USDT$0.0962
0.0000307 Eth
$30,120.00
313,173.770 DMTR
2.6957%
8
LATOKEN
DMTR-USDT$0.0932
0.0000297 Eth
$26,295.00
282,275.142 DMTR
2.4297%
9
Coinstore
DMTR-USDT$0.0951
0.0000303 Eth
$25,109.00
252,673.000 DMTR
2.1749%
10
Uniswap V3 (Ethereum)
0X51CB253744189F11241BECB29BEDD3F1B5384FDB-0XC02AAA39B223FE8D0A0E5C4F27EAD9083C756CC2$0.0967
0.0000308 Eth
$17,038.48
174,292.387 0X51CB253744189F11241BECB29BEDD3F1B5384FDB
1.5003%
11
Cryptology
DMTR-USDT$0.0926
0.0000295 Eth
$8,934.11
96,456.257 DMTR
0.8303%
12
BingX
DMTR-USDT$0.0943
0.0000300 Eth
$7,402.74
75,275.969 DMTR
0.6480%
13
CoinEx
DMTR-USDT$0.0935
0.0000298 Eth
$7,305.50
74,419.623 DMTR
0.6406%
14
BitMart
DMTR-USDT$0.0961
0.0000306 Eth
$3,303.68
34,362.420 DMTR
0.2958%
15
CoinDCX
DMTR-INR$0.0954
0.0000304 Eth
$3,071.44
0.000 DMTR
0.0000%
16
DigiFinex
DMTR-USDT$0.0964
0.0000307 Eth
$597.77
6,201.297 DMTR
0.0534%

Contract Source Code Verified (Exact Match)

Contract Name:
DimitraToken

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity Multiple files format)

File 4 of 15: DimitraToken.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.6;

import "./ERC20PresetMinterPauser.sol";

contract DimitraToken is ERC20PresetMinterPauser {
    uint public immutable cap;
    bytes32 private constant ISSUER_ROLE = keccak256("ISSUER_ROLE");
  
    mapping (address => mapping(uint => uint)) private lockBoxMap; // Mapping of user => releaseTime => amount
    mapping (address => uint[]) private userReleaseTimes; // user => releaseTime array
    uint [] private updatedReleaseTimes;

    uint public totalLockBoxBalance;

    event LogIssueLockedTokens(address sender, address recipient, uint amount, uint releaseTime);

    constructor() ERC20PresetMinterPauser("Dimitra Token", "DMTR") {
        cap = 1000000000 * (10 ** uint(decimals())); // Cap limit set to 1 billion tokens
        _setupRole(ISSUER_ROLE,_msgSender());
    }

    function mint(address account, uint256 amount) public virtual override {
        require(ERC20.totalSupply() + amount <= cap, "DimitraToken: Cap exceeded");
        ERC20PresetMinterPauser.mint(account, amount);
    }

    function issueLockedTokens(address recipient, uint lockAmount, uint releaseTime) public { // NOTE: releaseTime is date calculated in front end (at 12:00:00 AM)
        address sender = _msgSender();

        require(hasRole(ISSUER_ROLE, sender), "DimitraToken: Must have issuer role to issue locked tokens");
        require(releaseTime > block.timestamp, "DimitraToken: Release time must be greater than current block time");

        lockBoxMap[recipient][releaseTime] += lockAmount;

        bool releaseTimeExists = false;
        for (uint i=0; i<userReleaseTimes[recipient].length; i++) { // for a given recipient, release times should be unique
            if (userReleaseTimes[recipient][i] == releaseTime) {
                releaseTimeExists = true;
            }
        }
        if (!releaseTimeExists) {
            userReleaseTimes[recipient].push(releaseTime);
        }
        totalLockBoxBalance += lockAmount;

        _transfer(sender, recipient, lockAmount);

        emit LogIssueLockedTokens(msg.sender, recipient, lockAmount, releaseTime);
    }

    function _transfer (address sender, address recipient, uint256 amount) internal override {
        unlockTokens(sender,amount);
        return super._transfer(sender, recipient, amount);
    }

    function unlockTokens(address sender, uint amount) internal {
        uint256 len = userReleaseTimes[sender].length;
        uint256 j;
        uint lockedAmount;
        for (uint i = 0; i < len; i++) { // Release all expired locks
            uint256 releaseTime = userReleaseTimes[sender][j];
            if(block.timestamp <= releaseTime) {
                lockedAmount += lockBoxMap[sender][releaseTime];
                j++;
            } else {
                totalLockBoxBalance -= lockBoxMap[sender][releaseTime];
                delete lockBoxMap[sender][releaseTime];
                userReleaseTimes[sender][j] = userReleaseTimes[sender][userReleaseTimes[sender].length - 1];
                userReleaseTimes[sender].pop();
            }
        }
        require(balanceOf(sender) - lockedAmount >= amount, "DimitraToken: Insufficient balance");
    }

    function getLockedBalance(address user) public view returns (uint userLockBoxBalance) {
        uint[] memory releaseTimes = userReleaseTimes[user];

        for (uint i = 0; i < releaseTimes.length; i++) {
            if (block.timestamp <= releaseTimes[i]) {
                userLockBoxBalance += lockBoxMap[user][releaseTimes[i]];
            }
        }
    }

    function getReleasedBalance(address user) public view returns (uint) {
        return balanceOf(user) - getLockedBalance(user);
    }
}

File 1 of 15: AccessControl.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./Context.sol";
import "./Strings.sol";
import "./ERC165.sol";

/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    function hasRole(bytes32 role, address account) external view returns (bool);

    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    function grantRole(bytes32 role, address account) external;

    function revokeRole(bytes32 role, address account) external;

    function renounceRole(bytes32 role, address account) external;
}

/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

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

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

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

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

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

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

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

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

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

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

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

        _revokeRole(role, account);
    }

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

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

    function _grantRole(bytes32 role, address account) private {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    function _revokeRole(bytes32 role, address account) private {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}

File 2 of 15: AccessControlEnumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./AccessControl.sol";
import "./EnumerableSet.sol";

/**
 * @dev External interface of AccessControlEnumerable declared to support ERC165 detection.
 */
interface IAccessControlEnumerable {
    function getRoleMember(bytes32 role, uint256 index) external view returns (address);

    function getRoleMemberCount(bytes32 role) external view returns (uint256);
}

/**
 * @dev Extension of {AccessControl} that allows enumerating the members of each role.
 */
abstract contract AccessControlEnumerable is IAccessControlEnumerable, AccessControl {
    using EnumerableSet for EnumerableSet.AddressSet;

    mapping(bytes32 => EnumerableSet.AddressSet) private _roleMembers;

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

    /**
     * @dev Returns one of the accounts that have `role`. `index` must be a
     * value between 0 and {getRoleMemberCount}, non-inclusive.
     *
     * Role bearers are not sorted in any particular way, and their ordering may
     * change at any point.
     *
     * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure
     * you perform all queries on the same block. See the following
     * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]
     * for more information.
     */
    function getRoleMember(bytes32 role, uint256 index) public view override returns (address) {
        return _roleMembers[role].at(index);
    }

    /**
     * @dev Returns the number of accounts that have `role`. Can be used
     * together with {getRoleMember} to enumerate all bearers of a role.
     */
    function getRoleMemberCount(bytes32 role) public view override returns (uint256) {
        return _roleMembers[role].length();
    }

    /**
     * @dev Overload {grantRole} to track enumerable memberships
     */
    function grantRole(bytes32 role, address account) public virtual override {
        super.grantRole(role, account);
        _roleMembers[role].add(account);
    }

    /**
     * @dev Overload {revokeRole} to track enumerable memberships
     */
    function revokeRole(bytes32 role, address account) public virtual override {
        super.revokeRole(role, account);
        _roleMembers[role].remove(account);
    }

    /**
     * @dev Overload {renounceRole} to track enumerable memberships
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        super.renounceRole(role, account);
        _roleMembers[role].remove(account);
    }

    /**
     * @dev Overload {_setupRole} to track enumerable memberships
     */
    function _setupRole(bytes32 role, address account) internal virtual override {
        super._setupRole(role, account);
        _roleMembers[role].add(account);
    }
}

File 3 of 15: Context.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

File 5 of 15: EnumerableSet.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;
        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping(bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) {
            // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            if (lastIndex != toDeleteIndex) {
                bytes32 lastvalue = set._values[lastIndex];

                // Move the last value to the index where the value to delete is
                set._values[toDeleteIndex] = lastvalue;
                // Update the index for the moved value
                set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex
            }

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        return set._values[index];
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }
}

File 6 of 15: ERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

File 7 of 15: ERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC20.sol";
import "./IERC20Metadata.sol";
import "./Context.sol";

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

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

        return true;
    }

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

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

        return true;
    }

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

        _beforeTokenTransfer(sender, recipient, amount);

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

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

File 8 of 15: ERC20Burnable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC20.sol";
import "./Context.sol";

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

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

File 9 of 15: ERC20Pausable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC20.sol";
import "./Pausable.sol";

/**
 * @dev ERC20 token with pausable token transfers, minting and burning.
 *
 * Useful for scenarios such as preventing trades until the end of an evaluation
 * period, or having an emergency switch for freezing all token transfers in the
 * event of a large bug.
 */
abstract contract ERC20Pausable is ERC20, Pausable {
    /**
     * @dev See {ERC20-_beforeTokenTransfer}.
     *
     * Requirements:
     *
     * - the contract must not be paused.
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, amount);

        require(!paused(), "ERC20Pausable: token transfer while paused");
    }
}

File 10 of 15: ERC20PresetMinterPauser.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC20.sol";
import "./ERC20Burnable.sol";
import "./ERC20Pausable.sol";
import "./AccessControlEnumerable.sol";
import "./Context.sol";

/**
 * @dev {ERC20} token, including:
 *
 *  - ability for holders to burn (destroy) their tokens
 *  - a minter role that allows for token minting (creation)
 *  - a pauser role that allows to stop all token transfers
 *
 * This contract uses {AccessControl} to lock permissioned functions using the
 * different roles - head to its documentation for details.
 *
 * The account that deploys the contract will be granted the minter and pauser
 * roles, as well as the default admin role, which will let it grant both minter
 * and pauser roles to other accounts.
 */
contract ERC20PresetMinterPauser is Context, AccessControlEnumerable, ERC20Burnable, ERC20Pausable {
    bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");
    bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE");

    /**
     * @dev Grants `DEFAULT_ADMIN_ROLE`, `MINTER_ROLE` and `PAUSER_ROLE` to the
     * account that deploys the contract.
     *
     * See {ERC20-constructor}.
     */
    constructor(string memory name, string memory symbol) ERC20(name, symbol) {
        _setupRole(DEFAULT_ADMIN_ROLE, _msgSender());

        _setupRole(MINTER_ROLE, _msgSender());
        _setupRole(PAUSER_ROLE, _msgSender());
    }

    /**
     * @dev Creates `amount` new tokens for `to`.
     *
     * See {ERC20-_mint}.
     *
     * Requirements:
     *
     * - the caller must have the `MINTER_ROLE`.
     */
    function mint(address to, uint256 amount) public virtual {
        require(hasRole(MINTER_ROLE, _msgSender()), "ERC20PresetMinterPauser: must have minter role to mint");
        _mint(to, amount);
    }

    /**
     * @dev Pauses all token transfers.
     *
     * See {ERC20Pausable} and {Pausable-_pause}.
     *
     * Requirements:
     *
     * - the caller must have the `PAUSER_ROLE`.
     */
    function pause() public virtual {
        require(hasRole(PAUSER_ROLE, _msgSender()), "ERC20PresetMinterPauser: must have pauser role to pause");
        _pause();
    }

    /**
     * @dev Unpauses all token transfers.
     *
     * See {ERC20Pausable} and {Pausable-_unpause}.
     *
     * Requirements:
     *
     * - the caller must have the `PAUSER_ROLE`.
     */
    function unpause() public virtual {
        require(hasRole(PAUSER_ROLE, _msgSender()), "ERC20PresetMinterPauser: must have pauser role to unpause");
        _unpause();
    }

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

File 11 of 15: IERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

File 12 of 15: IERC20.sol
// SPDX-License-Identifier: MIT

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 13 of 15: IERC20Metadata.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC20.sol";

/**
 * @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 14 of 15: Pausable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./Context.sol";

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

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

    bool private _paused;

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

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

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

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

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

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

File 15 of 15: Strings.sol
// SPDX-License-Identifier: MIT

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

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":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"releaseTime","type":"uint256"}],"name":"LogIssueLockedTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cap","outputs":[{"internalType":"uint256","name":"","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":"user","type":"address"}],"name":"getLockedBalance","outputs":[{"internalType":"uint256","name":"userLockBoxBalance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getReleasedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"lockAmount","type":"uint256"},{"internalType":"uint256","name":"releaseTime","type":"uint256"}],"name":"issueLockedTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalLockBoxBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a06040523480156200001157600080fd5b506040518060400160405280600d81526020017f44696d6974726120546f6b656e000000000000000000000000000000000000008152506040518060400160405280600481526020017f444d545200000000000000000000000000000000000000000000000000000000815250818181600590805190602001906200009892919062000496565b508060069080519060200190620000b192919062000496565b5050506000600760006101000a81548160ff021916908315150217905550620000f36000801b620000e7620001f760201b60201c565b620001ff60201b60201c565b620001347f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a662000128620001f760201b60201c565b620001ff60201b60201c565b620001757f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a62000169620001f760201b60201c565b620001ff60201b60201c565b5050620001876200024760201b60201c565b60ff16600a620001989190620005a1565b633b9aca00620001a99190620006de565b60808181525050620001f17f114e74f6ea3bd819998f78687bfcb11b140da08e9b7d222fa9c1f1ba1f2aa122620001e5620001f760201b60201c565b620001ff60201b60201c565b620007ea565b600033905090565b6200021682826200025060201b620014321760201c565b6200024281600160008581526020019081526020016000206200026660201b620014401790919060201c565b505050565b60006012905090565b6200026282826200029e60201b60201c565b5050565b600062000296836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6200038f60201b60201c565b905092915050565b620002b082826200040960201b60201c565b6200038b57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555062000330620001f760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000620003a383836200047360201b60201c565b620003fe57826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905062000403565b600090505b92915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b828054620004a49062000749565b90600052602060002090601f016020900481019282620004c8576000855562000514565b82601f10620004e357805160ff191683800117855562000514565b8280016001018555821562000514579182015b8281111562000513578251825591602001919060010190620004f6565b5b50905062000523919062000527565b5090565b5b808211156200054257600081600090555060010162000528565b5090565b6000808291508390505b6001851115620005985780860481111562000570576200056f6200077f565b5b6001851615620005805780820291505b80810290506200059085620007dd565b945062000550565b94509492505050565b6000620005ae826200073f565b9150620005bb836200073f565b9250620005ea7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484620005f2565b905092915050565b600082620006045760019050620006d7565b81620006145760009050620006d7565b81600181146200062d576002811462000638576200066e565b6001915050620006d7565b60ff8411156200064d576200064c6200077f565b5b8360020a9150848211156200066757620006666200077f565b5b50620006d7565b5060208310610133831016604e8410600b8410161715620006a85782820a905083811115620006a257620006a16200077f565b5b620006d7565b620006b7848484600162000546565b92509050818404811115620006d157620006d06200077f565b5b81810290505b9392505050565b6000620006eb826200073f565b9150620006f8836200073f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156200073457620007336200077f565b5b828202905092915050565b6000819050919050565b600060028204905060018216806200076257607f821691505b60208210811415620007795762000778620007ae565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60008160011c9050919050565b60805161405a6200080d600039600081816109340152610ab2015261405a6000f3fe608060405234801561001057600080fd5b50600436106101fb5760003560e01c806370a082311161011a578063a9059cbb116100ad578063ca15c8731161007c578063ca15c873146105ec578063d53913931461061c578063d547741f1461063a578063dd62ed3e14610656578063e63ab1e914610686576101fb565b8063a9059cbb14610540578063b1f0b0e514610570578063bd3c43b7146105a0578063c4086893146105bc576101fb565b806391d14854116100e957806391d14854146104a457806395d89b41146104d4578063a217fddf146104f2578063a457c2d714610510576101fb565b806370a082311461041e57806379cc67901461044e5780638456cb591461046a5780639010d07c14610474576101fb565b8063313ce567116101925780633f4ba83a116101615780633f4ba83a146103be57806340c10f19146103c857806342966c68146103e45780635c975abb14610400576101fb565b8063313ce56714610336578063355274ea1461035457806336568abe14610372578063395093511461038e576101fb565b806323b872dd116101ce57806323b872dd1461029c578063248a9ca3146102cc5780632b59318e146102fc5780632f2ff15d1461031a576101fb565b806301ffc9a71461020057806306fdde0314610230578063095ea7b31461024e57806318160ddd1461027e575b600080fd5b61021a60048036038101906102159190612d04565b6106a4565b6040516102279190613218565b60405180910390f35b61023861071e565b604051610245919061324e565b60405180910390f35b61026860048036038101906102639190612bc4565b6107b0565b6040516102759190613218565b60405180910390f35b6102866107ce565b6040516102939190613550565b60405180910390f35b6102b660048036038101906102b19190612b71565b6107d8565b6040516102c39190613218565b60405180910390f35b6102e660048036038101906102e19190612c57565b6108d0565b6040516102f39190613233565b60405180910390f35b6103046108ef565b6040516103119190613550565b60405180910390f35b610334600480360381019061032f9190612c84565b6108f5565b005b61033e610929565b60405161034b919061356b565b60405180910390f35b61035c610932565b6040516103699190613550565b60405180910390f35b61038c60048036038101906103879190612c84565b610956565b005b6103a860048036038101906103a39190612bc4565b61098a565b6040516103b59190613218565b60405180910390f35b6103c6610a36565b005b6103e260048036038101906103dd9190612bc4565b610ab0565b005b6103fe60048036038101906103f99190612d31565b610b33565b005b610408610b47565b6040516104159190613218565b60405180910390f35b61043860048036038101906104339190612b04565b610b5e565b6040516104459190613550565b60405180910390f35b61046860048036038101906104639190612bc4565b610ba7565b005b610472610c22565b005b61048e60048036038101906104899190612cc4565b610c9c565b60405161049b91906131b8565b60405180910390f35b6104be60048036038101906104b99190612c84565b610ccb565b6040516104cb9190613218565b60405180910390f35b6104dc610d35565b6040516104e9919061324e565b60405180910390f35b6104fa610dc7565b6040516105079190613233565b60405180910390f35b61052a60048036038101906105259190612bc4565b610dce565b6040516105379190613218565b60405180910390f35b61055a60048036038101906105559190612bc4565b610eb9565b6040516105679190613218565b60405180910390f35b61058a60048036038101906105859190612b04565b610ed7565b6040516105979190613550565b60405180910390f35b6105ba60048036038101906105b59190612c04565b610efc565b005b6105d660048036038101906105d19190612b04565b6111b8565b6040516105e39190613550565b60405180910390f35b61060660048036038101906106019190612c57565b61130b565b6040516106139190613550565b60405180910390f35b61062461132f565b6040516106319190613233565b60405180910390f35b610654600480360381019061064f9190612c84565b611353565b005b610670600480360381019061066b9190612b31565b611387565b60405161067d9190613550565b60405180910390f35b61068e61140e565b60405161069b9190613233565b60405180910390f35b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610717575061071682611470565b5b9050919050565b60606005805461072d90613779565b80601f016020809104026020016040519081016040528092919081815260200182805461075990613779565b80156107a65780601f1061077b576101008083540402835291602001916107a6565b820191906000526020600020905b81548152906001019060200180831161078957829003601f168201915b5050505050905090565b60006107c46107bd6114ea565b84846114f2565b6001905092915050565b6000600454905090565b60006107e58484846116bd565b6000600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006108306114ea565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156108b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a790613390565b60405180910390fd5b6108c4856108bc6114ea565b8584036114f2565b60019150509392505050565b6000806000838152602001908152602001600020600101549050919050565b600b5481565b6108ff82826116d7565b610924816001600085815260200190815260200160002061144090919063ffffffff16565b505050565b60006012905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6109608282611700565b610985816001600085815260200190815260200160002061178390919063ffffffff16565b505050565b6000610a2c6109976114ea565b8484600360006109a56114ea565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610a2791906135ad565b6114f2565b6001905092915050565b610a677f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610a626114ea565b610ccb565b610aa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9d906132f0565b60405180910390fd5b610aae6117b3565b565b7f000000000000000000000000000000000000000000000000000000000000000081610ada6107ce565b610ae491906135ad565b1115610b25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1c90613370565b60405180910390fd5b610b2f8282611855565b5050565b610b44610b3e6114ea565b826118d3565b50565b6000600760009054906101000a900460ff16905090565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000610bba83610bb56114ea565b611387565b905081811015610bff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf6906133d0565b60405180910390fd5b610c1383610c0b6114ea565b8484036114f2565b610c1d83836118d3565b505050565b610c537f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610c4e6114ea565b610ccb565b610c92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8990613490565b60405180910390fd5b610c9a611aac565b565b6000610cc38260016000868152602001908152602001600020611b4f90919063ffffffff16565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060068054610d4490613779565b80601f0160208091040260200160405190810160405280929190818152602001828054610d7090613779565b8015610dbd5780601f10610d9257610100808354040283529160200191610dbd565b820191906000526020600020905b815481529060010190602001808311610da057829003601f168201915b5050505050905090565b6000801b81565b60008060036000610ddd6114ea565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610e9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e91906134d0565b60405180910390fd5b610eae610ea56114ea565b858584036114f2565b600191505092915050565b6000610ecd610ec66114ea565b84846116bd565b6001905092915050565b6000610ee2826111b8565b610eeb83610b5e565b610ef5919061365d565b9050919050565b6000610f066114ea565b9050610f327f114e74f6ea3bd819998f78687bfcb11b140da08e9b7d222fa9c1f1ba1f2aa12282610ccb565b610f71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6890613410565b60405180910390fd5b428211610fb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610faa90613450565b60405180910390fd5b82600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020600082825461101391906135ad565b925050819055506000805b600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490508110156110e35783600960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481106110ba576110b9613881565b5b906000526020600020015414156110d057600191505b80806110db906137ab565b91505061101e565b508061115057600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208390806001815401808255809150506001900390600052602060002001600090919091909150555b83600b600082825461116291906135ad565b925050819055506111748286866116bd565b7fbeb29b6b240b42b10fc7c816e25c602d2e11ebff0d7870388ae1705052e9a058338686866040516111a994939291906131d3565b60405180910390a15050505050565b600080600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561124457602002820191906000526020600020905b815481526020019060010190808311611230575b5050505050905060005b81518110156113045781818151811061126a57611269613881565b5b602002602001015142116112f157600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008383815181106112cc576112cb613881565b5b6020026020010151815260200190815260200160002054836112ee91906135ad565b92505b80806112fc906137ab565b91505061124e565b5050919050565b600061132860016000848152602001908152602001600020611b69565b9050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b61135d8282611b7e565b611382816001600085815260200190815260200160002061178390919063ffffffff16565b505050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b61143c8282611ba7565b5050565b6000611468836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611c87565b905092915050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806114e357506114e282611cf7565b5b9050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611562576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155990613470565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c990613310565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516116b09190613550565b60405180910390a3505050565b6116c78382611d61565b6116d283838361212c565b505050565b6116e0826108d0565b6116f1816116ec6114ea565b6123b0565b6116fb8383611ba7565b505050565b6117086114ea565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611775576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176c906134f0565b60405180910390fd5b61177f828261244d565b5050565b60006117ab836000018373ffffffffffffffffffffffffffffffffffffffff1660001b61252e565b905092915050565b6117bb610b47565b6117fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f1906132b0565b60405180910390fd5b6000600760006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61183e6114ea565b60405161184b91906131b8565b60405180910390a1565b6118867f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66118816114ea565b610ccb565b6118c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118bc906133b0565b60405180910390fd5b6118cf8282612642565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611943576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193a906133f0565b60405180910390fd5b61194f826000836127a3565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156119d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119cd906132d0565b60405180910390fd5b818103600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160046000828254611a2e919061365d565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611a939190613550565b60405180910390a3611aa7836000846127b3565b505050565b611ab4610b47565b15611af4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aeb90613350565b60405180910390fd5b6001600760006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611b386114ea565b604051611b4591906131b8565b60405180910390a1565b6000611b5e83600001836127b8565b60001c905092915050565b6000611b77826000016127e3565b9050919050565b611b87826108d0565b611b9881611b936114ea565b6123b0565b611ba2838361244d565b505050565b611bb18282610ccb565b611c8357600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611c286114ea565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000611c9383836127f4565b611cec578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050611cf1565b600090505b92915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050905060008060005b838110156120ce576000600960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208481548110611e0957611e08613881565b5b90600052602060002001549050804211611e8e57600860008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008281526020019081526020016000205483611e7991906135ad565b92508380611e86906137ab565b9450506120ba565b600860008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082815260200190815260200160002054600b6000828254611ef0919061365d565b92505081905550600860008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082815260200190815260200160002060009055600960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001600960008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050611fd9919061365d565b81548110611fea57611fe9613881565b5b9060005260206000200154600960008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020858154811061204657612045613881565b5b9060005260206000200181905550600960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806120a3576120a2613852565b5b600190038181906000526020600020016000905590555b5080806120c6906137ab565b915050611dae565b5083816120da87610b5e565b6120e4919061365d565b1015612125576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211c906134b0565b60405180910390fd5b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561219c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219390613430565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561220c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220390613290565b60405180910390fd5b6122178383836127a3565b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561229e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229590613330565b60405180910390fd5b818103600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461233391906135ad565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516123979190613550565b60405180910390a36123aa8484846127b3565b50505050565b6123ba8282610ccb565b612449576123df8173ffffffffffffffffffffffffffffffffffffffff166014612817565b6123ed8360001c6020612817565b6040516020016123fe92919061317e565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612440919061324e565b60405180910390fd5b5050565b6124578282610ccb565b1561252a57600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506124cf6114ea565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b60008083600101600084815260200190815260200160002054905060008114612636576000600182612560919061365d565b9050600060018660000180549050612578919061365d565b90508181146125e757600086600001828154811061259957612598613881565b5b90600052602060002001549050808760000184815481106125bd576125bc613881565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b856000018054806125fb576125fa613852565b5b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061263c565b60009150505b92915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126a990613510565b60405180910390fd5b6126be600083836127a3565b80600460008282546126d091906135ad565b9250508190555080600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461272691906135ad565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161278b9190613550565b60405180910390a361279f600083836127b3565b5050565b6127ae838383612a53565b505050565b505050565b60008260000182815481106127d0576127cf613881565b5b9060005260206000200154905092915050565b600081600001805490509050919050565b600080836001016000848152602001908152602001600020541415905092915050565b60606000600283600261282a9190613603565b61283491906135ad565b67ffffffffffffffff81111561284d5761284c6138b0565b5b6040519080825280601f01601f19166020018201604052801561287f5781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106128b7576128b6613881565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061291b5761291a613881565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000600184600261295b9190613603565b61296591906135ad565b90505b6001811115612a05577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106129a7576129a6613881565b5b1a60f81b8282815181106129be576129bd613881565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806129fe9061374f565b9050612968565b5060008414612a49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4090613270565b60405180910390fd5b8091505092915050565b612a5e838383612aab565b612a66610b47565b15612aa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9d90613530565b60405180910390fd5b505050565b505050565b600081359050612abf81613fc8565b92915050565b600081359050612ad481613fdf565b92915050565b600081359050612ae981613ff6565b92915050565b600081359050612afe8161400d565b92915050565b600060208284031215612b1a57612b196138df565b5b6000612b2884828501612ab0565b91505092915050565b60008060408385031215612b4857612b476138df565b5b6000612b5685828601612ab0565b9250506020612b6785828601612ab0565b9150509250929050565b600080600060608486031215612b8a57612b896138df565b5b6000612b9886828701612ab0565b9350506020612ba986828701612ab0565b9250506040612bba86828701612aef565b9150509250925092565b60008060408385031215612bdb57612bda6138df565b5b6000612be985828601612ab0565b9250506020612bfa85828601612aef565b9150509250929050565b600080600060608486031215612c1d57612c1c6138df565b5b6000612c2b86828701612ab0565b9350506020612c3c86828701612aef565b9250506040612c4d86828701612aef565b9150509250925092565b600060208284031215612c6d57612c6c6138df565b5b6000612c7b84828501612ac5565b91505092915050565b60008060408385031215612c9b57612c9a6138df565b5b6000612ca985828601612ac5565b9250506020612cba85828601612ab0565b9150509250929050565b60008060408385031215612cdb57612cda6138df565b5b6000612ce985828601612ac5565b9250506020612cfa85828601612aef565b9150509250929050565b600060208284031215612d1a57612d196138df565b5b6000612d2884828501612ada565b91505092915050565b600060208284031215612d4757612d466138df565b5b6000612d5584828501612aef565b91505092915050565b612d6781613691565b82525050565b612d76816136a3565b82525050565b612d85816136af565b82525050565b6000612d9682613586565b612da08185613591565b9350612db081856020860161371c565b612db9816138e4565b840191505092915050565b6000612dcf82613586565b612dd981856135a2565b9350612de981856020860161371c565b80840191505092915050565b6000612e02602083613591565b9150612e0d826138f5565b602082019050919050565b6000612e25602383613591565b9150612e308261391e565b604082019050919050565b6000612e48601483613591565b9150612e538261396d565b602082019050919050565b6000612e6b602283613591565b9150612e7682613996565b604082019050919050565b6000612e8e603983613591565b9150612e99826139e5565b604082019050919050565b6000612eb1602283613591565b9150612ebc82613a34565b604082019050919050565b6000612ed4602683613591565b9150612edf82613a83565b604082019050919050565b6000612ef7601083613591565b9150612f0282613ad2565b602082019050919050565b6000612f1a601a83613591565b9150612f2582613afb565b602082019050919050565b6000612f3d602883613591565b9150612f4882613b24565b604082019050919050565b6000612f60603683613591565b9150612f6b82613b73565b604082019050919050565b6000612f83602483613591565b9150612f8e82613bc2565b604082019050919050565b6000612fa6602183613591565b9150612fb182613c11565b604082019050919050565b6000612fc9603a83613591565b9150612fd482613c60565b604082019050919050565b6000612fec602583613591565b9150612ff782613caf565b604082019050919050565b600061300f604283613591565b915061301a82613cfe565b606082019050919050565b6000613032602483613591565b915061303d82613d73565b604082019050919050565b6000613055603783613591565b915061306082613dc2565b604082019050919050565b60006130786017836135a2565b915061308382613e11565b601782019050919050565b600061309b602283613591565b91506130a682613e3a565b604082019050919050565b60006130be602583613591565b91506130c982613e89565b604082019050919050565b60006130e16011836135a2565b91506130ec82613ed8565b601182019050919050565b6000613104602f83613591565b915061310f82613f01565b604082019050919050565b6000613127601f83613591565b915061313282613f50565b602082019050919050565b600061314a602a83613591565b915061315582613f79565b604082019050919050565b61316981613705565b82525050565b6131788161370f565b82525050565b60006131898261306b565b91506131958285612dc4565b91506131a0826130d4565b91506131ac8284612dc4565b91508190509392505050565b60006020820190506131cd6000830184612d5e565b92915050565b60006080820190506131e86000830187612d5e565b6131f56020830186612d5e565b6132026040830185613160565b61320f6060830184613160565b95945050505050565b600060208201905061322d6000830184612d6d565b92915050565b60006020820190506132486000830184612d7c565b92915050565b600060208201905081810360008301526132688184612d8b565b905092915050565b6000602082019050818103600083015261328981612df5565b9050919050565b600060208201905081810360008301526132a981612e18565b9050919050565b600060208201905081810360008301526132c981612e3b565b9050919050565b600060208201905081810360008301526132e981612e5e565b9050919050565b6000602082019050818103600083015261330981612e81565b9050919050565b6000602082019050818103600083015261332981612ea4565b9050919050565b6000602082019050818103600083015261334981612ec7565b9050919050565b6000602082019050818103600083015261336981612eea565b9050919050565b6000602082019050818103600083015261338981612f0d565b9050919050565b600060208201905081810360008301526133a981612f30565b9050919050565b600060208201905081810360008301526133c981612f53565b9050919050565b600060208201905081810360008301526133e981612f76565b9050919050565b6000602082019050818103600083015261340981612f99565b9050919050565b6000602082019050818103600083015261342981612fbc565b9050919050565b6000602082019050818103600083015261344981612fdf565b9050919050565b6000602082019050818103600083015261346981613002565b9050919050565b6000602082019050818103600083015261348981613025565b9050919050565b600060208201905081810360008301526134a981613048565b9050919050565b600060208201905081810360008301526134c98161308e565b9050919050565b600060208201905081810360008301526134e9816130b1565b9050919050565b60006020820190508181036000830152613509816130f7565b9050919050565b600060208201905081810360008301526135298161311a565b9050919050565b600060208201905081810360008301526135498161313d565b9050919050565b60006020820190506135656000830184613160565b92915050565b6000602082019050613580600083018461316f565b92915050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b60006135b882613705565b91506135c383613705565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156135f8576135f76137f4565b5b828201905092915050565b600061360e82613705565b915061361983613705565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613652576136516137f4565b5b828202905092915050565b600061366882613705565b915061367383613705565b925082821015613686576136856137f4565b5b828203905092915050565b600061369c826136e5565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b8381101561373a57808201518184015260208101905061371f565b83811115613749576000848401525b50505050565b600061375a82613705565b9150600082141561376e5761376d6137f4565b5b600182039050919050565b6000600282049050600182168061379157607f821691505b602082108114156137a5576137a4613823565b5b50919050565b60006137b682613705565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156137e9576137e86137f4565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332305072657365744d696e7465725061757365723a206d75737420686160008201527f76652070617573657220726f6c6520746f20756e706175736500000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f44696d69747261546f6b656e3a20436170206578636565646564000000000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b7f45524332305072657365744d696e7465725061757365723a206d75737420686160008201527f7665206d696e74657220726f6c6520746f206d696e7400000000000000000000602082015250565b7f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f7760008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f44696d69747261546f6b656e3a204d757374206861766520697373756572207260008201527f6f6c6520746f206973737565206c6f636b656420746f6b656e73000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f44696d69747261546f6b656e3a2052656c656173652074696d65206d7573742060008201527f62652067726561746572207468616e2063757272656e7420626c6f636b20746960208201527f6d65000000000000000000000000000000000000000000000000000000000000604082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f45524332305072657365744d696e7465725061757365723a206d75737420686160008201527f76652070617573657220726f6c6520746f207061757365000000000000000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f44696d69747261546f6b656e3a20496e73756666696369656e742062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b7f45524332305061757361626c653a20746f6b656e207472616e7366657220776860008201527f696c652070617573656400000000000000000000000000000000000000000000602082015250565b613fd181613691565b8114613fdc57600080fd5b50565b613fe8816136af565b8114613ff357600080fd5b50565b613fff816136b9565b811461400a57600080fd5b50565b61401681613705565b811461402157600080fd5b5056fea2646970667358221220fb4289c0b7e9481a3bd6ef00c2f6ed34902c59c7ca0feeaf606f32e046b2bc7964736f6c63430008060033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101fb5760003560e01c806370a082311161011a578063a9059cbb116100ad578063ca15c8731161007c578063ca15c873146105ec578063d53913931461061c578063d547741f1461063a578063dd62ed3e14610656578063e63ab1e914610686576101fb565b8063a9059cbb14610540578063b1f0b0e514610570578063bd3c43b7146105a0578063c4086893146105bc576101fb565b806391d14854116100e957806391d14854146104a457806395d89b41146104d4578063a217fddf146104f2578063a457c2d714610510576101fb565b806370a082311461041e57806379cc67901461044e5780638456cb591461046a5780639010d07c14610474576101fb565b8063313ce567116101925780633f4ba83a116101615780633f4ba83a146103be57806340c10f19146103c857806342966c68146103e45780635c975abb14610400576101fb565b8063313ce56714610336578063355274ea1461035457806336568abe14610372578063395093511461038e576101fb565b806323b872dd116101ce57806323b872dd1461029c578063248a9ca3146102cc5780632b59318e146102fc5780632f2ff15d1461031a576101fb565b806301ffc9a71461020057806306fdde0314610230578063095ea7b31461024e57806318160ddd1461027e575b600080fd5b61021a60048036038101906102159190612d04565b6106a4565b6040516102279190613218565b60405180910390f35b61023861071e565b604051610245919061324e565b60405180910390f35b61026860048036038101906102639190612bc4565b6107b0565b6040516102759190613218565b60405180910390f35b6102866107ce565b6040516102939190613550565b60405180910390f35b6102b660048036038101906102b19190612b71565b6107d8565b6040516102c39190613218565b60405180910390f35b6102e660048036038101906102e19190612c57565b6108d0565b6040516102f39190613233565b60405180910390f35b6103046108ef565b6040516103119190613550565b60405180910390f35b610334600480360381019061032f9190612c84565b6108f5565b005b61033e610929565b60405161034b919061356b565b60405180910390f35b61035c610932565b6040516103699190613550565b60405180910390f35b61038c60048036038101906103879190612c84565b610956565b005b6103a860048036038101906103a39190612bc4565b61098a565b6040516103b59190613218565b60405180910390f35b6103c6610a36565b005b6103e260048036038101906103dd9190612bc4565b610ab0565b005b6103fe60048036038101906103f99190612d31565b610b33565b005b610408610b47565b6040516104159190613218565b60405180910390f35b61043860048036038101906104339190612b04565b610b5e565b6040516104459190613550565b60405180910390f35b61046860048036038101906104639190612bc4565b610ba7565b005b610472610c22565b005b61048e60048036038101906104899190612cc4565b610c9c565b60405161049b91906131b8565b60405180910390f35b6104be60048036038101906104b99190612c84565b610ccb565b6040516104cb9190613218565b60405180910390f35b6104dc610d35565b6040516104e9919061324e565b60405180910390f35b6104fa610dc7565b6040516105079190613233565b60405180910390f35b61052a60048036038101906105259190612bc4565b610dce565b6040516105379190613218565b60405180910390f35b61055a60048036038101906105559190612bc4565b610eb9565b6040516105679190613218565b60405180910390f35b61058a60048036038101906105859190612b04565b610ed7565b6040516105979190613550565b60405180910390f35b6105ba60048036038101906105b59190612c04565b610efc565b005b6105d660048036038101906105d19190612b04565b6111b8565b6040516105e39190613550565b60405180910390f35b61060660048036038101906106019190612c57565b61130b565b6040516106139190613550565b60405180910390f35b61062461132f565b6040516106319190613233565b60405180910390f35b610654600480360381019061064f9190612c84565b611353565b005b610670600480360381019061066b9190612b31565b611387565b60405161067d9190613550565b60405180910390f35b61068e61140e565b60405161069b9190613233565b60405180910390f35b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610717575061071682611470565b5b9050919050565b60606005805461072d90613779565b80601f016020809104026020016040519081016040528092919081815260200182805461075990613779565b80156107a65780601f1061077b576101008083540402835291602001916107a6565b820191906000526020600020905b81548152906001019060200180831161078957829003601f168201915b5050505050905090565b60006107c46107bd6114ea565b84846114f2565b6001905092915050565b6000600454905090565b60006107e58484846116bd565b6000600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006108306114ea565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156108b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a790613390565b60405180910390fd5b6108c4856108bc6114ea565b8584036114f2565b60019150509392505050565b6000806000838152602001908152602001600020600101549050919050565b600b5481565b6108ff82826116d7565b610924816001600085815260200190815260200160002061144090919063ffffffff16565b505050565b60006012905090565b7f0000000000000000000000000000000000000000033b2e3c9fd0803ce800000081565b6109608282611700565b610985816001600085815260200190815260200160002061178390919063ffffffff16565b505050565b6000610a2c6109976114ea565b8484600360006109a56114ea565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610a2791906135ad565b6114f2565b6001905092915050565b610a677f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610a626114ea565b610ccb565b610aa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9d906132f0565b60405180910390fd5b610aae6117b3565b565b7f0000000000000000000000000000000000000000033b2e3c9fd0803ce800000081610ada6107ce565b610ae491906135ad565b1115610b25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1c90613370565b60405180910390fd5b610b2f8282611855565b5050565b610b44610b3e6114ea565b826118d3565b50565b6000600760009054906101000a900460ff16905090565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000610bba83610bb56114ea565b611387565b905081811015610bff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf6906133d0565b60405180910390fd5b610c1383610c0b6114ea565b8484036114f2565b610c1d83836118d3565b505050565b610c537f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610c4e6114ea565b610ccb565b610c92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8990613490565b60405180910390fd5b610c9a611aac565b565b6000610cc38260016000868152602001908152602001600020611b4f90919063ffffffff16565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060068054610d4490613779565b80601f0160208091040260200160405190810160405280929190818152602001828054610d7090613779565b8015610dbd5780601f10610d9257610100808354040283529160200191610dbd565b820191906000526020600020905b815481529060010190602001808311610da057829003601f168201915b5050505050905090565b6000801b81565b60008060036000610ddd6114ea565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610e9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e91906134d0565b60405180910390fd5b610eae610ea56114ea565b858584036114f2565b600191505092915050565b6000610ecd610ec66114ea565b84846116bd565b6001905092915050565b6000610ee2826111b8565b610eeb83610b5e565b610ef5919061365d565b9050919050565b6000610f066114ea565b9050610f327f114e74f6ea3bd819998f78687bfcb11b140da08e9b7d222fa9c1f1ba1f2aa12282610ccb565b610f71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6890613410565b60405180910390fd5b428211610fb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610faa90613450565b60405180910390fd5b82600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020600082825461101391906135ad565b925050819055506000805b600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490508110156110e35783600960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481106110ba576110b9613881565b5b906000526020600020015414156110d057600191505b80806110db906137ab565b91505061101e565b508061115057600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208390806001815401808255809150506001900390600052602060002001600090919091909150555b83600b600082825461116291906135ad565b925050819055506111748286866116bd565b7fbeb29b6b240b42b10fc7c816e25c602d2e11ebff0d7870388ae1705052e9a058338686866040516111a994939291906131d3565b60405180910390a15050505050565b600080600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561124457602002820191906000526020600020905b815481526020019060010190808311611230575b5050505050905060005b81518110156113045781818151811061126a57611269613881565b5b602002602001015142116112f157600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008383815181106112cc576112cb613881565b5b6020026020010151815260200190815260200160002054836112ee91906135ad565b92505b80806112fc906137ab565b91505061124e565b5050919050565b600061132860016000848152602001908152602001600020611b69565b9050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b61135d8282611b7e565b611382816001600085815260200190815260200160002061178390919063ffffffff16565b505050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b61143c8282611ba7565b5050565b6000611468836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611c87565b905092915050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806114e357506114e282611cf7565b5b9050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611562576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155990613470565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c990613310565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516116b09190613550565b60405180910390a3505050565b6116c78382611d61565b6116d283838361212c565b505050565b6116e0826108d0565b6116f1816116ec6114ea565b6123b0565b6116fb8383611ba7565b505050565b6117086114ea565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611775576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176c906134f0565b60405180910390fd5b61177f828261244d565b5050565b60006117ab836000018373ffffffffffffffffffffffffffffffffffffffff1660001b61252e565b905092915050565b6117bb610b47565b6117fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f1906132b0565b60405180910390fd5b6000600760006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61183e6114ea565b60405161184b91906131b8565b60405180910390a1565b6118867f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66118816114ea565b610ccb565b6118c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118bc906133b0565b60405180910390fd5b6118cf8282612642565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611943576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193a906133f0565b60405180910390fd5b61194f826000836127a3565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156119d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119cd906132d0565b60405180910390fd5b818103600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160046000828254611a2e919061365d565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611a939190613550565b60405180910390a3611aa7836000846127b3565b505050565b611ab4610b47565b15611af4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aeb90613350565b60405180910390fd5b6001600760006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611b386114ea565b604051611b4591906131b8565b60405180910390a1565b6000611b5e83600001836127b8565b60001c905092915050565b6000611b77826000016127e3565b9050919050565b611b87826108d0565b611b9881611b936114ea565b6123b0565b611ba2838361244d565b505050565b611bb18282610ccb565b611c8357600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611c286114ea565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000611c9383836127f4565b611cec578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050611cf1565b600090505b92915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050905060008060005b838110156120ce576000600960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208481548110611e0957611e08613881565b5b90600052602060002001549050804211611e8e57600860008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008281526020019081526020016000205483611e7991906135ad565b92508380611e86906137ab565b9450506120ba565b600860008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082815260200190815260200160002054600b6000828254611ef0919061365d565b92505081905550600860008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082815260200190815260200160002060009055600960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001600960008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050611fd9919061365d565b81548110611fea57611fe9613881565b5b9060005260206000200154600960008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020858154811061204657612045613881565b5b9060005260206000200181905550600960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806120a3576120a2613852565b5b600190038181906000526020600020016000905590555b5080806120c6906137ab565b915050611dae565b5083816120da87610b5e565b6120e4919061365d565b1015612125576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211c906134b0565b60405180910390fd5b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561219c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219390613430565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561220c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220390613290565b60405180910390fd5b6122178383836127a3565b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561229e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229590613330565b60405180910390fd5b818103600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461233391906135ad565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516123979190613550565b60405180910390a36123aa8484846127b3565b50505050565b6123ba8282610ccb565b612449576123df8173ffffffffffffffffffffffffffffffffffffffff166014612817565b6123ed8360001c6020612817565b6040516020016123fe92919061317e565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612440919061324e565b60405180910390fd5b5050565b6124578282610ccb565b1561252a57600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506124cf6114ea565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b60008083600101600084815260200190815260200160002054905060008114612636576000600182612560919061365d565b9050600060018660000180549050612578919061365d565b90508181146125e757600086600001828154811061259957612598613881565b5b90600052602060002001549050808760000184815481106125bd576125bc613881565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b856000018054806125fb576125fa613852565b5b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061263c565b60009150505b92915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126a990613510565b60405180910390fd5b6126be600083836127a3565b80600460008282546126d091906135ad565b9250508190555080600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461272691906135ad565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161278b9190613550565b60405180910390a361279f600083836127b3565b5050565b6127ae838383612a53565b505050565b505050565b60008260000182815481106127d0576127cf613881565b5b9060005260206000200154905092915050565b600081600001805490509050919050565b600080836001016000848152602001908152602001600020541415905092915050565b60606000600283600261282a9190613603565b61283491906135ad565b67ffffffffffffffff81111561284d5761284c6138b0565b5b6040519080825280601f01601f19166020018201604052801561287f5781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106128b7576128b6613881565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061291b5761291a613881565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000600184600261295b9190613603565b61296591906135ad565b90505b6001811115612a05577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106129a7576129a6613881565b5b1a60f81b8282815181106129be576129bd613881565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806129fe9061374f565b9050612968565b5060008414612a49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4090613270565b60405180910390fd5b8091505092915050565b612a5e838383612aab565b612a66610b47565b15612aa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9d90613530565b60405180910390fd5b505050565b505050565b600081359050612abf81613fc8565b92915050565b600081359050612ad481613fdf565b92915050565b600081359050612ae981613ff6565b92915050565b600081359050612afe8161400d565b92915050565b600060208284031215612b1a57612b196138df565b5b6000612b2884828501612ab0565b91505092915050565b60008060408385031215612b4857612b476138df565b5b6000612b5685828601612ab0565b9250506020612b6785828601612ab0565b9150509250929050565b600080600060608486031215612b8a57612b896138df565b5b6000612b9886828701612ab0565b9350506020612ba986828701612ab0565b9250506040612bba86828701612aef565b9150509250925092565b60008060408385031215612bdb57612bda6138df565b5b6000612be985828601612ab0565b9250506020612bfa85828601612aef565b9150509250929050565b600080600060608486031215612c1d57612c1c6138df565b5b6000612c2b86828701612ab0565b9350506020612c3c86828701612aef565b9250506040612c4d86828701612aef565b9150509250925092565b600060208284031215612c6d57612c6c6138df565b5b6000612c7b84828501612ac5565b91505092915050565b60008060408385031215612c9b57612c9a6138df565b5b6000612ca985828601612ac5565b9250506020612cba85828601612ab0565b9150509250929050565b60008060408385031215612cdb57612cda6138df565b5b6000612ce985828601612ac5565b9250506020612cfa85828601612aef565b9150509250929050565b600060208284031215612d1a57612d196138df565b5b6000612d2884828501612ada565b91505092915050565b600060208284031215612d4757612d466138df565b5b6000612d5584828501612aef565b91505092915050565b612d6781613691565b82525050565b612d76816136a3565b82525050565b612d85816136af565b82525050565b6000612d9682613586565b612da08185613591565b9350612db081856020860161371c565b612db9816138e4565b840191505092915050565b6000612dcf82613586565b612dd981856135a2565b9350612de981856020860161371c565b80840191505092915050565b6000612e02602083613591565b9150612e0d826138f5565b602082019050919050565b6000612e25602383613591565b9150612e308261391e565b604082019050919050565b6000612e48601483613591565b9150612e538261396d565b602082019050919050565b6000612e6b602283613591565b9150612e7682613996565b604082019050919050565b6000612e8e603983613591565b9150612e99826139e5565b604082019050919050565b6000612eb1602283613591565b9150612ebc82613a34565b604082019050919050565b6000612ed4602683613591565b9150612edf82613a83565b604082019050919050565b6000612ef7601083613591565b9150612f0282613ad2565b602082019050919050565b6000612f1a601a83613591565b9150612f2582613afb565b602082019050919050565b6000612f3d602883613591565b9150612f4882613b24565b604082019050919050565b6000612f60603683613591565b9150612f6b82613b73565b604082019050919050565b6000612f83602483613591565b9150612f8e82613bc2565b604082019050919050565b6000612fa6602183613591565b9150612fb182613c11565b604082019050919050565b6000612fc9603a83613591565b9150612fd482613c60565b604082019050919050565b6000612fec602583613591565b9150612ff782613caf565b604082019050919050565b600061300f604283613591565b915061301a82613cfe565b606082019050919050565b6000613032602483613591565b915061303d82613d73565b604082019050919050565b6000613055603783613591565b915061306082613dc2565b604082019050919050565b60006130786017836135a2565b915061308382613e11565b601782019050919050565b600061309b602283613591565b91506130a682613e3a565b604082019050919050565b60006130be602583613591565b91506130c982613e89565b604082019050919050565b60006130e16011836135a2565b91506130ec82613ed8565b601182019050919050565b6000613104602f83613591565b915061310f82613f01565b604082019050919050565b6000613127601f83613591565b915061313282613f50565b602082019050919050565b600061314a602a83613591565b915061315582613f79565b604082019050919050565b61316981613705565b82525050565b6131788161370f565b82525050565b60006131898261306b565b91506131958285612dc4565b91506131a0826130d4565b91506131ac8284612dc4565b91508190509392505050565b60006020820190506131cd6000830184612d5e565b92915050565b60006080820190506131e86000830187612d5e565b6131f56020830186612d5e565b6132026040830185613160565b61320f6060830184613160565b95945050505050565b600060208201905061322d6000830184612d6d565b92915050565b60006020820190506132486000830184612d7c565b92915050565b600060208201905081810360008301526132688184612d8b565b905092915050565b6000602082019050818103600083015261328981612df5565b9050919050565b600060208201905081810360008301526132a981612e18565b9050919050565b600060208201905081810360008301526132c981612e3b565b9050919050565b600060208201905081810360008301526132e981612e5e565b9050919050565b6000602082019050818103600083015261330981612e81565b9050919050565b6000602082019050818103600083015261332981612ea4565b9050919050565b6000602082019050818103600083015261334981612ec7565b9050919050565b6000602082019050818103600083015261336981612eea565b9050919050565b6000602082019050818103600083015261338981612f0d565b9050919050565b600060208201905081810360008301526133a981612f30565b9050919050565b600060208201905081810360008301526133c981612f53565b9050919050565b600060208201905081810360008301526133e981612f76565b9050919050565b6000602082019050818103600083015261340981612f99565b9050919050565b6000602082019050818103600083015261342981612fbc565b9050919050565b6000602082019050818103600083015261344981612fdf565b9050919050565b6000602082019050818103600083015261346981613002565b9050919050565b6000602082019050818103600083015261348981613025565b9050919050565b600060208201905081810360008301526134a981613048565b9050919050565b600060208201905081810360008301526134c98161308e565b9050919050565b600060208201905081810360008301526134e9816130b1565b9050919050565b60006020820190508181036000830152613509816130f7565b9050919050565b600060208201905081810360008301526135298161311a565b9050919050565b600060208201905081810360008301526135498161313d565b9050919050565b60006020820190506135656000830184613160565b92915050565b6000602082019050613580600083018461316f565b92915050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b60006135b882613705565b91506135c383613705565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156135f8576135f76137f4565b5b828201905092915050565b600061360e82613705565b915061361983613705565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613652576136516137f4565b5b828202905092915050565b600061366882613705565b915061367383613705565b925082821015613686576136856137f4565b5b828203905092915050565b600061369c826136e5565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b8381101561373a57808201518184015260208101905061371f565b83811115613749576000848401525b50505050565b600061375a82613705565b9150600082141561376e5761376d6137f4565b5b600182039050919050565b6000600282049050600182168061379157607f821691505b602082108114156137a5576137a4613823565b5b50919050565b60006137b682613705565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156137e9576137e86137f4565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332305072657365744d696e7465725061757365723a206d75737420686160008201527f76652070617573657220726f6c6520746f20756e706175736500000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f44696d69747261546f6b656e3a20436170206578636565646564000000000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b7f45524332305072657365744d696e7465725061757365723a206d75737420686160008201527f7665206d696e74657220726f6c6520746f206d696e7400000000000000000000602082015250565b7f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f7760008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f44696d69747261546f6b656e3a204d757374206861766520697373756572207260008201527f6f6c6520746f206973737565206c6f636b656420746f6b656e73000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f44696d69747261546f6b656e3a2052656c656173652074696d65206d7573742060008201527f62652067726561746572207468616e2063757272656e7420626c6f636b20746960208201527f6d65000000000000000000000000000000000000000000000000000000000000604082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f45524332305072657365744d696e7465725061757365723a206d75737420686160008201527f76652070617573657220726f6c6520746f207061757365000000000000000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f44696d69747261546f6b656e3a20496e73756666696369656e742062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b7f45524332305061757361626c653a20746f6b656e207472616e7366657220776860008201527f696c652070617573656400000000000000000000000000000000000000000000602082015250565b613fd181613691565b8114613fdc57600080fd5b50565b613fe8816136af565b8114613ff357600080fd5b50565b613fff816136b9565b811461400a57600080fd5b50565b61401681613705565b811461402157600080fd5b5056fea2646970667358221220fb4289c0b7e9481a3bd6ef00c2f6ed34902c59c7ca0feeaf606f32e046b2bc7964736f6c63430008060033

Deployed Bytecode Sourcemap

97:3618:3:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;802:212:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2053:98:5;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4150:166;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3141:106;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4783:478;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5412:121:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;495:31:3;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2129:162:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2990:91:5;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;152:25:3;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2636:171:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5656:212:5;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2391:175:8;;;:::i;:::-;;844:217:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;473:89:6;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1034:84:13;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3305:125:5;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;868:361:6;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2015:169:8;;;:::i;:::-;;1599:143:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4329:137:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2264:102:5;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2361:49:0;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6355:405:5;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3633:172;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3580:133:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1067:1069;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3211:363;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1910:132:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;877:62:8;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2379:167:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3863:149:5;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;945:62:8;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;802:212:1;887:4;925:42;910:57;;;:11;:57;;;;:97;;;;971:36;995:11;971:23;:36::i;:::-;910:97;903:104;;802:212;;;:::o;2053:98:5:-;2107:13;2139:5;2132:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2053:98;:::o;4150:166::-;4233:4;4249:39;4258:12;:10;:12::i;:::-;4272:7;4281:6;4249:8;:39::i;:::-;4305:4;4298:11;;4150:166;;;;:::o;3141:106::-;3202:7;3228:12;;3221:19;;3141:106;:::o;4783:478::-;4919:4;4935:36;4945:6;4953:9;4964:6;4935:9;:36::i;:::-;4982:24;5009:11;:19;5021:6;5009:19;;;;;;;;;;;;;;;:33;5029:12;:10;:12::i;:::-;5009:33;;;;;;;;;;;;;;;;4982:60;;5080:6;5060:16;:26;;5052:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;5165:57;5174:6;5182:12;:10;:12::i;:::-;5215:6;5196:16;:25;5165:8;:57::i;:::-;5250:4;5243:11;;;4783:478;;;;;:::o;5412:121:0:-;5478:7;5504:6;:12;5511:4;5504:12;;;;;;;;;;;:22;;;5497:29;;5412:121;;;:::o;495:31:3:-;;;;:::o;2129:162:1:-;2213:30;2229:4;2235:7;2213:15;:30::i;:::-;2253:31;2276:7;2253:12;:18;2266:4;2253:18;;;;;;;;;;;:22;;:31;;;;:::i;:::-;;2129:162;;:::o;2990:91:5:-;3048:5;3072:2;3065:9;;2990:91;:::o;152:25:3:-;;;:::o;2636:171:1:-;2723:33;2742:4;2748:7;2723:18;:33::i;:::-;2766:34;2792:7;2766:12;:18;2779:4;2766:18;;;;;;;;;;;:25;;:34;;;;:::i;:::-;;2636:171;;:::o;5656:212:5:-;5744:4;5760:80;5769:12;:10;:12::i;:::-;5783:7;5829:10;5792:11;:25;5804:12;:10;:12::i;:::-;5792:25;;;;;;;;;;;;;;;:34;5818:7;5792:34;;;;;;;;;;;;;;;;:47;;;;:::i;:::-;5760:8;:80::i;:::-;5857:4;5850:11;;5656:212;;;;:::o;2391:175:8:-;2443:34;983:24;2464:12;:10;:12::i;:::-;2443:7;:34::i;:::-;2435:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;2549:10;:8;:10::i;:::-;2391:175::o;844:217:3:-;965:3;955:6;933:19;:17;:19::i;:::-;:28;;;;:::i;:::-;:35;;925:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;1009:45;1038:7;1047:6;1009:28;:45::i;:::-;844:217;;:::o;473:89:6:-;528:27;534:12;:10;:12::i;:::-;548:6;528:5;:27::i;:::-;473:89;:::o;1034:84:13:-;1081:4;1104:7;;;;;;;;;;;1097:14;;1034:84;:::o;3305:125:5:-;3379:7;3405:9;:18;3415:7;3405:18;;;;;;;;;;;;;;;;3398:25;;3305:125;;;:::o;868:361:6:-;944:24;971:32;981:7;990:12;:10;:12::i;:::-;971:9;:32::i;:::-;944:59;;1041:6;1021:16;:26;;1013:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;1122:58;1131:7;1140:12;:10;:12::i;:::-;1173:6;1154:16;:25;1122:8;:58::i;:::-;1200:22;1206:7;1215:6;1200:5;:22::i;:::-;934:295;868:361;;:::o;2015:169:8:-;2065:34;983:24;2086:12;:10;:12::i;:::-;2065:7;:34::i;:::-;2057:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;2169:8;:6;:8::i;:::-;2015:169::o;1599:143:1:-;1681:7;1707:28;1729:5;1707:12;:18;1720:4;1707:18;;;;;;;;;;;:21;;:28;;;;:::i;:::-;1700:35;;1599:143;;;;:::o;4329:137:0:-;4407:4;4430:6;:12;4437:4;4430:12;;;;;;;;;;;:20;;:29;4451:7;4430:29;;;;;;;;;;;;;;;;;;;;;;;;;4423:36;;4329:137;;;;:::o;2264:102:5:-;2320:13;2352:7;2345:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2264:102;:::o;2361:49:0:-;2406:4;2361:49;;;:::o;6355:405:5:-;6448:4;6464:24;6491:11;:25;6503:12;:10;:12::i;:::-;6491:25;;;;;;;;;;;;;;;:34;6517:7;6491:34;;;;;;;;;;;;;;;;6464:61;;6563:15;6543:16;:35;;6535:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;6654:67;6663:12;:10;:12::i;:::-;6677:7;6705:15;6686:16;:34;6654:8;:67::i;:::-;6749:4;6742:11;;;6355:405;;;;:::o;3633:172::-;3719:4;3735:42;3745:12;:10;:12::i;:::-;3759:9;3770:6;3735:9;:42::i;:::-;3794:4;3787:11;;3633:172;;;;:::o;3580:133:3:-;3643:4;3684:22;3701:4;3684:16;:22::i;:::-;3666:15;3676:4;3666:9;:15::i;:::-;:40;;;;:::i;:::-;3659:47;;3580:133;;;:::o;1067:1069::-;1235:14;1252:12;:10;:12::i;:::-;1235:29;;1283:28;222:24;1304:6;1283:7;:28::i;:::-;1275:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;1406:15;1392:11;:29;1384:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;1541:10;1503;:21;1514:9;1503:21;;;;;;;;;;;;;;;:34;1525:11;1503:34;;;;;;;;;;;;:48;;;;;;;:::i;:::-;;;;;;;;1562:22;1607:6;1602:247;1619:16;:27;1636:9;1619:27;;;;;;;;;;;;;;;:34;;;;1617:1;:36;1602:247;;;1769:11;1735:16;:27;1752:9;1735:27;;;;;;;;;;;;;;;1763:1;1735:30;;;;;;;;:::i;:::-;;;;;;;;;;:45;1731:108;;;1820:4;1800:24;;1731:108;1655:3;;;;;:::i;:::-;;;;1602:247;;;;1863:17;1858:94;;1896:16;:27;1913:9;1896:27;;;;;;;;;;;;;;;1929:11;1896:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1858:94;1984:10;1961:19;;:33;;;;;;;:::i;:::-;;;;;;;;2005:40;2015:6;2023:9;2034:10;2005:9;:40::i;:::-;2061:68;2082:10;2094:9;2105:10;2117:11;2061:68;;;;;;;;;:::i;:::-;;;;;;;;1155:981;;1067:1069;;;:::o;3211:363::-;3272:23;3307:26;3336:16;:22;3353:4;3336:22;;;;;;;;;;;;;;;3307:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3374:6;3369:199;3390:12;:19;3386:1;:23;3369:199;;;3453:12;3466:1;3453:15;;;;;;;;:::i;:::-;;;;;;;;3434;:34;3430:128;;3510:10;:16;3521:4;3510:16;;;;;;;;;;;;;;;:33;3527:12;3540:1;3527:15;;;;;;;;:::i;:::-;;;;;;;;3510:33;;;;;;;;;;;;3488:55;;;;;:::i;:::-;;;3430:128;3411:3;;;;;:::i;:::-;;;;3369:199;;;;3297:277;3211:363;;;:::o;1910:132:1:-;1982:7;2008:27;:12;:18;2021:4;2008:18;;;;;;;;;;;:25;:27::i;:::-;2001:34;;1910:132;;;:::o;877:62:8:-;915:24;877:62;:::o;2379:167:1:-;2464:31;2481:4;2487:7;2464:16;:31::i;:::-;2505:34;2531:7;2505:12;:18;2518:4;2505:18;;;;;;;;;;;:25;;:34;;;;:::i;:::-;;2379:167;;:::o;3863:149:5:-;3952:7;3978:11;:18;3990:5;3978:18;;;;;;;;;;;;;;;:27;3997:7;3978:27;;;;;;;;;;;;;;;;3971:34;;3863:149;;;;:::o;945:62:8:-;983:24;945:62;:::o;7579:110:0:-;7657:25;7668:4;7674:7;7657:10;:25::i;:::-;7579:110;;:::o;6232:150:9:-;6302:4;6325:50;6330:3;:10;;6366:5;6350:23;;6342:32;;6325:4;:50::i;:::-;6318:57;;6232:150;;;;:::o;4040:202:0:-;4125:4;4163:32;4148:47;;;:11;:47;;;;:87;;;;4199:36;4223:11;4199:23;:36::i;:::-;4148:87;4141:94;;4040:202;;;:::o;586:96:2:-;639:7;665:10;658:17;;586:96;:::o;9931:370:5:-;10079:1;10062:19;;:5;:19;;;;10054:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10159:1;10140:21;;:7;:21;;;;10132:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10241:6;10211:11;:18;10223:5;10211:18;;;;;;;;;;;;;;;:27;10230:7;10211:27;;;;;;;;;;;;;;;:36;;;;10278:7;10262:32;;10271:5;10262:32;;;10287:6;10262:32;;;;;;:::i;:::-;;;;;;;;9931:370;;;:::o;2142:192:3:-;2241:27;2254:6;2261;2241:12;:27::i;:::-;2285:42;2301:6;2309:9;2320:6;2285:15;:42::i;:::-;2142:192;;;:::o;5783:145:0:-;5866:18;5879:4;5866:12;:18::i;:::-;3925:30;3936:4;3942:12;:10;:12::i;:::-;3925:10;:30::i;:::-;5896:25:::1;5907:4;5913:7;5896:10;:25::i;:::-;5783:145:::0;;;:::o;6800:214::-;6906:12;:10;:12::i;:::-;6895:23;;:7;:23;;;6887:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;6981:26;6993:4;6999:7;6981:11;:26::i;:::-;6800:214;;:::o;6550:156:9:-;6623:4;6646:53;6654:3;:10;;6690:5;6674:23;;6666:32;;6646:7;:53::i;:::-;6639:60;;6550:156;;;;:::o;2046:117:13:-;1613:8;:6;:8::i;:::-;1605:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;2114:5:::1;2104:7;;:15;;;;;;;;;;;;;;;;;;2134:22;2143:12;:10;:12::i;:::-;2134:22;;;;;;:::i;:::-;;;;;;;;2046:117::o:0;1610:202:8:-;1685:34;915:24;1706:12;:10;:12::i;:::-;1685:7;:34::i;:::-;1677:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;1788:17;1794:2;1798:6;1788:5;:17::i;:::-;1610:202;;:::o;8932:576:5:-;9034:1;9015:21;;:7;:21;;;;9007:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;9085:49;9106:7;9123:1;9127:6;9085:20;:49::i;:::-;9145:22;9170:9;:18;9180:7;9170:18;;;;;;;;;;;;;;;;9145:43;;9224:6;9206:14;:24;;9198:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;9341:6;9324:14;:23;9303:9;:18;9313:7;9303:18;;;;;;;;;;;;;;;:44;;;;9383:6;9367:12;;:22;;;;;;;:::i;:::-;;;;;;;;9431:1;9405:37;;9414:7;9405:37;;;9435:6;9405:37;;;;;;:::i;:::-;;;;;;;;9453:48;9473:7;9490:1;9494:6;9453:19;:48::i;:::-;8997:511;8932:576;;:::o;1799:115:13:-;1348:8;:6;:8::i;:::-;1347:9;1339:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;1868:4:::1;1858:7;;:14;;;;;;;;;;;;;;;;;;1887:20;1894:12;:10;:12::i;:::-;1887:20;;;;;;:::i;:::-;;;;;;;;1799:115::o:0;7490:156:9:-;7564:7;7614:22;7618:3;:10;;7630:5;7614:3;:22::i;:::-;7606:31;;7583:56;;7490:156;;;;:::o;7033:115::-;7096:7;7122:19;7130:3;:10;;7122:7;:19::i;:::-;7115:26;;7033:115;;;:::o;6162:147:0:-;6246:18;6259:4;6246:12;:18::i;:::-;3925:30;3936:4;3942:12;:10;:12::i;:::-;3925:10;:30::i;:::-;6276:26:::1;6288:4;6294:7;6276:11;:26::i;:::-;6162:147:::0;;;:::o;8012:224::-;8086:22;8094:4;8100:7;8086;:22::i;:::-;8081:149;;8156:4;8124:6;:12;8131:4;8124:12;;;;;;;;;;;:20;;:29;8145:7;8124:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;8206:12;:10;:12::i;:::-;8179:40;;8197:7;8179:40;;8191:4;8179:40;;;;;;;;;;8081:149;8012:224;;:::o;1630:404:9:-;1693:4;1714:21;1724:3;1729:5;1714:9;:21::i;:::-;1709:319;;1751:3;:11;;1768:5;1751:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1931:3;:11;;:18;;;;1909:3;:12;;:19;1922:5;1909:19;;;;;;;;;;;:40;;;;1970:4;1963:11;;;;1709:319;2012:5;2005:12;;1630:404;;;;;:::o;763:155:4:-;848:4;886:25;871:40;;;:11;:40;;;;864:47;;763:155;;;:::o;2340:865:3:-;2410:11;2424:16;:24;2441:6;2424:24;;;;;;;;;;;;;;;:31;;;;2410:45;;2465:9;2484:17;2516:6;2511:589;2532:3;2528:1;:7;2511:589;;;2585:19;2607:16;:24;2624:6;2607:24;;;;;;;;;;;;;;;2632:1;2607:27;;;;;;;;:::i;:::-;;;;;;;;;;2585:49;;2670:11;2651:15;:30;2648:442;;2717:10;:18;2728:6;2717:18;;;;;;;;;;;;;;;:31;2736:11;2717:31;;;;;;;;;;;;2701:47;;;;;:::i;:::-;;;2766:3;;;;;:::i;:::-;;;;2648:442;;;2831:10;:18;2842:6;2831:18;;;;;;;;;;;;;;;:31;2850:11;2831:31;;;;;;;;;;;;2808:19;;:54;;;;;;;:::i;:::-;;;;;;;;2887:10;:18;2898:6;2887:18;;;;;;;;;;;;;;;:31;2906:11;2887:31;;;;;;;;;;;2880:38;;;2966:16;:24;2983:6;2966:24;;;;;;;;;;;;;;;3025:1;2991:16;:24;3008:6;2991:24;;;;;;;;;;;;;;;:31;;;;:35;;;;:::i;:::-;2966:61;;;;;;;;:::i;:::-;;;;;;;;;;2936:16;:24;2953:6;2936:24;;;;;;;;;;;;;;;2961:1;2936:27;;;;;;;;:::i;:::-;;;;;;;;;:91;;;;3045:16;:24;3062:6;3045:24;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2648:442;2542:558;2537:3;;;;;:::i;:::-;;;;2511:589;;;;3153:6;3137:12;3117:17;3127:6;3117:9;:17::i;:::-;:32;;;;:::i;:::-;:42;;3109:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;2400:805;;;2340:865;;:::o;7234:713:5:-;7387:1;7369:20;;:6;:20;;;;7361:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;7470:1;7449:23;;:9;:23;;;;7441:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;7523:47;7544:6;7552:9;7563:6;7523:20;:47::i;:::-;7581:21;7605:9;:17;7615:6;7605:17;;;;;;;;;;;;;;;;7581:41;;7657:6;7640:13;:23;;7632:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;7776:6;7760:13;:22;7740:9;:17;7750:6;7740:17;;;;;;;;;;;;;;;:42;;;;7826:6;7802:9;:20;7812:9;7802:20;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;7865:9;7848:35;;7857:6;7848:35;;;7876:6;7848:35;;;;;;:::i;:::-;;;;;;;;7894:46;7914:6;7922:9;7933:6;7894:19;:46::i;:::-;7351:596;7234:713;;;:::o;4747:484:0:-;4827:22;4835:4;4841:7;4827;:22::i;:::-;4822:403;;5010:41;5038:7;5010:41;;5048:2;5010:19;:41::i;:::-;5122:38;5150:4;5142:13;;5157:2;5122:19;:38::i;:::-;4917:265;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4865:349;;;;;;;;;;;:::i;:::-;;;;;;;;4822:403;4747:484;;:::o;8242:225::-;8316:22;8324:4;8330:7;8316;:22::i;:::-;8312:149;;;8386:5;8354:6;:12;8361:4;8354:12;;;;;;;;;;;:20;;:29;8375:7;8354:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;8437:12;:10;:12::i;:::-;8410:40;;8428:7;8410:40;;8422:4;8410:40;;;;;;;;;;8312:149;8242:225;;:::o;2202:1388:9:-;2268:4;2384:18;2405:3;:12;;:19;2418:5;2405:19;;;;;;;;;;;;2384:40;;2453:1;2439:10;:15;2435:1149;;2808:21;2845:1;2832:10;:14;;;;:::i;:::-;2808:38;;2860:17;2901:1;2880:3;:11;;:18;;;;:22;;;;:::i;:::-;2860:42;;2934:13;2921:9;:26;2917:398;;2967:17;2987:3;:11;;2999:9;2987:22;;;;;;;;:::i;:::-;;;;;;;;;;2967:42;;3138:9;3109:3;:11;;3121:13;3109:26;;;;;;;;:::i;:::-;;;;;;;;;:38;;;;3247:10;3221:3;:12;;:23;3234:9;3221:23;;;;;;;;;;;:36;;;;2949:366;2917:398;3393:3;:11;;:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3485:3;:12;;:19;3498:5;3485:19;;;;;;;;;;;3478:26;;;3526:4;3519:11;;;;;;;2435:1149;3568:5;3561:12;;;2202:1388;;;;;:::o;8223:389:5:-;8325:1;8306:21;;:7;:21;;;;8298:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;8374:49;8403:1;8407:7;8416:6;8374:20;:49::i;:::-;8450:6;8434:12;;:22;;;;;;;:::i;:::-;;;;;;;;8488:6;8466:9;:18;8476:7;8466:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;8530:7;8509:37;;8526:1;8509:37;;;8539:6;8509:37;;;;;;:::i;:::-;;;;;;;;8557:48;8585:1;8589:7;8598:6;8557:19;:48::i;:::-;8223:389;;:::o;2572:211:8:-;2732:44;2759:4;2765:2;2769:6;2732:26;:44::i;:::-;2572:211;;;:::o;11594:120:5:-;;;;:::o;4328:118:9:-;4395:7;4421:3;:11;;4433:5;4421:18;;;;;;;;:::i;:::-;;;;;;;;;;4414:25;;4328:118;;;;:::o;3879:107::-;3935:7;3961:3;:11;;:18;;;;3954:25;;3879:107;;;:::o;3671:127::-;3744:4;3790:1;3767:3;:12;;:19;3780:5;3767:19;;;;;;;;;;;;:24;;3760:31;;3671:127;;;;:::o;1535:441:14:-;1610:13;1635:19;1680:1;1671:6;1667:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;1657:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1635:47;;1692:15;:6;1699:1;1692:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;1717;:6;1724:1;1717:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;1747:9;1772:1;1763:6;1759:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;1747:26;;1742:132;1779:1;1775;:5;1742:132;;;1813:12;1834:3;1826:5;:11;1813:25;;;;;;;:::i;:::-;;;;;1801:6;1808:1;1801:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;1862:1;1852:11;;;;;1782:3;;;;:::i;:::-;;;1742:132;;;;1900:1;1891:5;:10;1883:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;1962:6;1948:21;;;1535:441;;;;:::o;572:264:7:-;710:44;737:4;743:2;747:6;710:26;:44::i;:::-;774:8;:6;:8::i;:::-;773:9;765:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;572:264;;;:::o;10885:121:5:-;;;;:::o;7:139:15:-;53:5;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;59:87;;;;:::o;152:139::-;198:5;236:6;223:20;214:29;;252:33;279:5;252:33;:::i;:::-;204:87;;;;:::o;297:137::-;342:5;380:6;367:20;358:29;;396:32;422:5;396:32;:::i;:::-;348:86;;;;:::o;440:139::-;486:5;524:6;511:20;502:29;;540:33;567:5;540:33;:::i;:::-;492:87;;;;:::o;585:329::-;644:6;693:2;681:9;672:7;668:23;664:32;661:2;;;699:79;;:::i;:::-;661:2;819:1;844:53;889:7;880:6;869:9;865:22;844:53;:::i;:::-;834:63;;790:117;651:263;;;;:::o;920:474::-;988:6;996;1045:2;1033:9;1024:7;1020:23;1016:32;1013:2;;;1051:79;;:::i;:::-;1013:2;1171:1;1196:53;1241:7;1232:6;1221:9;1217:22;1196:53;:::i;:::-;1186:63;;1142:117;1298:2;1324:53;1369:7;1360:6;1349:9;1345:22;1324:53;:::i;:::-;1314:63;;1269:118;1003:391;;;;;:::o;1400:619::-;1477:6;1485;1493;1542:2;1530:9;1521:7;1517:23;1513:32;1510:2;;;1548:79;;:::i;:::-;1510:2;1668:1;1693:53;1738:7;1729:6;1718:9;1714:22;1693:53;:::i;:::-;1683:63;;1639:117;1795:2;1821:53;1866:7;1857:6;1846:9;1842:22;1821:53;:::i;:::-;1811:63;;1766:118;1923:2;1949:53;1994:7;1985:6;1974:9;1970:22;1949:53;:::i;:::-;1939:63;;1894:118;1500:519;;;;;:::o;2025:474::-;2093:6;2101;2150:2;2138:9;2129:7;2125:23;2121:32;2118:2;;;2156:79;;:::i;:::-;2118:2;2276:1;2301:53;2346:7;2337:6;2326:9;2322:22;2301:53;:::i;:::-;2291:63;;2247:117;2403:2;2429:53;2474:7;2465:6;2454:9;2450:22;2429:53;:::i;:::-;2419:63;;2374:118;2108:391;;;;;:::o;2505:619::-;2582:6;2590;2598;2647:2;2635:9;2626:7;2622:23;2618:32;2615:2;;;2653:79;;:::i;:::-;2615:2;2773:1;2798:53;2843:7;2834:6;2823:9;2819:22;2798:53;:::i;:::-;2788:63;;2744:117;2900:2;2926:53;2971:7;2962:6;2951:9;2947:22;2926:53;:::i;:::-;2916:63;;2871:118;3028:2;3054:53;3099:7;3090:6;3079:9;3075:22;3054:53;:::i;:::-;3044:63;;2999:118;2605:519;;;;;:::o;3130:329::-;3189:6;3238:2;3226:9;3217:7;3213:23;3209:32;3206:2;;;3244:79;;:::i;:::-;3206:2;3364:1;3389:53;3434:7;3425:6;3414:9;3410:22;3389:53;:::i;:::-;3379:63;;3335:117;3196:263;;;;:::o;3465:474::-;3533:6;3541;3590:2;3578:9;3569:7;3565:23;3561:32;3558:2;;;3596:79;;:::i;:::-;3558:2;3716:1;3741:53;3786:7;3777:6;3766:9;3762:22;3741:53;:::i;:::-;3731:63;;3687:117;3843:2;3869:53;3914:7;3905:6;3894:9;3890:22;3869:53;:::i;:::-;3859:63;;3814:118;3548:391;;;;;:::o;3945:474::-;4013:6;4021;4070:2;4058:9;4049:7;4045:23;4041:32;4038:2;;;4076:79;;:::i;:::-;4038:2;4196:1;4221:53;4266:7;4257:6;4246:9;4242:22;4221:53;:::i;:::-;4211:63;;4167:117;4323:2;4349:53;4394:7;4385:6;4374:9;4370:22;4349:53;:::i;:::-;4339:63;;4294:118;4028:391;;;;;:::o;4425:327::-;4483:6;4532:2;4520:9;4511:7;4507:23;4503:32;4500:2;;;4538:79;;:::i;:::-;4500:2;4658:1;4683:52;4727:7;4718:6;4707:9;4703:22;4683:52;:::i;:::-;4673:62;;4629:116;4490:262;;;;:::o;4758:329::-;4817:6;4866:2;4854:9;4845:7;4841:23;4837:32;4834:2;;;4872:79;;:::i;:::-;4834:2;4992:1;5017:53;5062:7;5053:6;5042:9;5038:22;5017:53;:::i;:::-;5007:63;;4963:117;4824:263;;;;:::o;5093:118::-;5180:24;5198:5;5180:24;:::i;:::-;5175:3;5168:37;5158:53;;:::o;5217:109::-;5298:21;5313:5;5298:21;:::i;:::-;5293:3;5286:34;5276:50;;:::o;5332:118::-;5419:24;5437:5;5419:24;:::i;:::-;5414:3;5407:37;5397:53;;:::o;5456:364::-;5544:3;5572:39;5605:5;5572:39;:::i;:::-;5627:71;5691:6;5686:3;5627:71;:::i;:::-;5620:78;;5707:52;5752:6;5747:3;5740:4;5733:5;5729:16;5707:52;:::i;:::-;5784:29;5806:6;5784:29;:::i;:::-;5779:3;5775:39;5768:46;;5548:272;;;;;:::o;5826:377::-;5932:3;5960:39;5993:5;5960:39;:::i;:::-;6015:89;6097:6;6092:3;6015:89;:::i;:::-;6008:96;;6113:52;6158:6;6153:3;6146:4;6139:5;6135:16;6113:52;:::i;:::-;6190:6;6185:3;6181:16;6174:23;;5936:267;;;;;:::o;6209:366::-;6351:3;6372:67;6436:2;6431:3;6372:67;:::i;:::-;6365:74;;6448:93;6537:3;6448:93;:::i;:::-;6566:2;6561:3;6557:12;6550:19;;6355:220;;;:::o;6581:366::-;6723:3;6744:67;6808:2;6803:3;6744:67;:::i;:::-;6737:74;;6820:93;6909:3;6820:93;:::i;:::-;6938:2;6933:3;6929:12;6922:19;;6727:220;;;:::o;6953:366::-;7095:3;7116:67;7180:2;7175:3;7116:67;:::i;:::-;7109:74;;7192:93;7281:3;7192:93;:::i;:::-;7310:2;7305:3;7301:12;7294:19;;7099:220;;;:::o;7325:366::-;7467:3;7488:67;7552:2;7547:3;7488:67;:::i;:::-;7481:74;;7564:93;7653:3;7564:93;:::i;:::-;7682:2;7677:3;7673:12;7666:19;;7471:220;;;:::o;7697:366::-;7839:3;7860:67;7924:2;7919:3;7860:67;:::i;:::-;7853:74;;7936:93;8025:3;7936:93;:::i;:::-;8054:2;8049:3;8045:12;8038:19;;7843:220;;;:::o;8069:366::-;8211:3;8232:67;8296:2;8291:3;8232:67;:::i;:::-;8225:74;;8308:93;8397:3;8308:93;:::i;:::-;8426:2;8421:3;8417:12;8410:19;;8215:220;;;:::o;8441:366::-;8583:3;8604:67;8668:2;8663:3;8604:67;:::i;:::-;8597:74;;8680:93;8769:3;8680:93;:::i;:::-;8798:2;8793:3;8789:12;8782:19;;8587:220;;;:::o;8813:366::-;8955:3;8976:67;9040:2;9035:3;8976:67;:::i;:::-;8969:74;;9052:93;9141:3;9052:93;:::i;:::-;9170:2;9165:3;9161:12;9154:19;;8959:220;;;:::o;9185:366::-;9327:3;9348:67;9412:2;9407:3;9348:67;:::i;:::-;9341:74;;9424:93;9513:3;9424:93;:::i;:::-;9542:2;9537:3;9533:12;9526:19;;9331:220;;;:::o;9557:366::-;9699:3;9720:67;9784:2;9779:3;9720:67;:::i;:::-;9713:74;;9796:93;9885:3;9796:93;:::i;:::-;9914:2;9909:3;9905:12;9898:19;;9703:220;;;:::o;9929:366::-;10071:3;10092:67;10156:2;10151:3;10092:67;:::i;:::-;10085:74;;10168:93;10257:3;10168:93;:::i;:::-;10286:2;10281:3;10277:12;10270:19;;10075:220;;;:::o;10301:366::-;10443:3;10464:67;10528:2;10523:3;10464:67;:::i;:::-;10457:74;;10540:93;10629:3;10540:93;:::i;:::-;10658:2;10653:3;10649:12;10642:19;;10447:220;;;:::o;10673:366::-;10815:3;10836:67;10900:2;10895:3;10836:67;:::i;:::-;10829:74;;10912:93;11001:3;10912:93;:::i;:::-;11030:2;11025:3;11021:12;11014:19;;10819:220;;;:::o;11045:366::-;11187:3;11208:67;11272:2;11267:3;11208:67;:::i;:::-;11201:74;;11284:93;11373:3;11284:93;:::i;:::-;11402:2;11397:3;11393:12;11386:19;;11191:220;;;:::o;11417:366::-;11559:3;11580:67;11644:2;11639:3;11580:67;:::i;:::-;11573:74;;11656:93;11745:3;11656:93;:::i;:::-;11774:2;11769:3;11765:12;11758:19;;11563:220;;;:::o;11789:366::-;11931:3;11952:67;12016:2;12011:3;11952:67;:::i;:::-;11945:74;;12028:93;12117:3;12028:93;:::i;:::-;12146:2;12141:3;12137:12;12130:19;;11935:220;;;:::o;12161:366::-;12303:3;12324:67;12388:2;12383:3;12324:67;:::i;:::-;12317:74;;12400:93;12489:3;12400:93;:::i;:::-;12518:2;12513:3;12509:12;12502:19;;12307:220;;;:::o;12533:366::-;12675:3;12696:67;12760:2;12755:3;12696:67;:::i;:::-;12689:74;;12772:93;12861:3;12772:93;:::i;:::-;12890:2;12885:3;12881:12;12874:19;;12679:220;;;:::o;12905:402::-;13065:3;13086:85;13168:2;13163:3;13086:85;:::i;:::-;13079:92;;13180:93;13269:3;13180:93;:::i;:::-;13298:2;13293:3;13289:12;13282:19;;13069:238;;;:::o;13313:366::-;13455:3;13476:67;13540:2;13535:3;13476:67;:::i;:::-;13469:74;;13552:93;13641:3;13552:93;:::i;:::-;13670:2;13665:3;13661:12;13654:19;;13459:220;;;:::o;13685:366::-;13827:3;13848:67;13912:2;13907:3;13848:67;:::i;:::-;13841:74;;13924:93;14013:3;13924:93;:::i;:::-;14042:2;14037:3;14033:12;14026:19;;13831:220;;;:::o;14057:402::-;14217:3;14238:85;14320:2;14315:3;14238:85;:::i;:::-;14231:92;;14332:93;14421:3;14332:93;:::i;:::-;14450:2;14445:3;14441:12;14434:19;;14221:238;;;:::o;14465:366::-;14607:3;14628:67;14692:2;14687:3;14628:67;:::i;:::-;14621:74;;14704:93;14793:3;14704:93;:::i;:::-;14822:2;14817:3;14813:12;14806:19;;14611:220;;;:::o;14837:366::-;14979:3;15000:67;15064:2;15059:3;15000:67;:::i;:::-;14993:74;;15076:93;15165:3;15076:93;:::i;:::-;15194:2;15189:3;15185:12;15178:19;;14983:220;;;:::o;15209:366::-;15351:3;15372:67;15436:2;15431:3;15372:67;:::i;:::-;15365:74;;15448:93;15537:3;15448:93;:::i;:::-;15566:2;15561:3;15557:12;15550:19;;15355:220;;;:::o;15581:118::-;15668:24;15686:5;15668:24;:::i;:::-;15663:3;15656:37;15646:53;;:::o;15705:112::-;15788:22;15804:5;15788:22;:::i;:::-;15783:3;15776:35;15766:51;;:::o;15823:967::-;16205:3;16227:148;16371:3;16227:148;:::i;:::-;16220:155;;16392:95;16483:3;16474:6;16392:95;:::i;:::-;16385:102;;16504:148;16648:3;16504:148;:::i;:::-;16497:155;;16669:95;16760:3;16751:6;16669:95;:::i;:::-;16662:102;;16781:3;16774:10;;16209:581;;;;;:::o;16796:222::-;16889:4;16927:2;16916:9;16912:18;16904:26;;16940:71;17008:1;16997:9;16993:17;16984:6;16940:71;:::i;:::-;16894:124;;;;:::o;17024:553::-;17201:4;17239:3;17228:9;17224:19;17216:27;;17253:71;17321:1;17310:9;17306:17;17297:6;17253:71;:::i;:::-;17334:72;17402:2;17391:9;17387:18;17378:6;17334:72;:::i;:::-;17416;17484:2;17473:9;17469:18;17460:6;17416:72;:::i;:::-;17498;17566:2;17555:9;17551:18;17542:6;17498:72;:::i;:::-;17206:371;;;;;;;:::o;17583:210::-;17670:4;17708:2;17697:9;17693:18;17685:26;;17721:65;17783:1;17772:9;17768:17;17759:6;17721:65;:::i;:::-;17675:118;;;;:::o;17799:222::-;17892:4;17930:2;17919:9;17915:18;17907:26;;17943:71;18011:1;18000:9;17996:17;17987:6;17943:71;:::i;:::-;17897:124;;;;:::o;18027:313::-;18140:4;18178:2;18167:9;18163:18;18155:26;;18227:9;18221:4;18217:20;18213:1;18202:9;18198:17;18191:47;18255:78;18328:4;18319:6;18255:78;:::i;:::-;18247:86;;18145:195;;;;:::o;18346:419::-;18512:4;18550:2;18539:9;18535:18;18527:26;;18599:9;18593:4;18589:20;18585:1;18574:9;18570:17;18563:47;18627:131;18753:4;18627:131;:::i;:::-;18619:139;;18517:248;;;:::o;18771:419::-;18937:4;18975:2;18964:9;18960:18;18952:26;;19024:9;19018:4;19014:20;19010:1;18999:9;18995:17;18988:47;19052:131;19178:4;19052:131;:::i;:::-;19044:139;;18942:248;;;:::o;19196:419::-;19362:4;19400:2;19389:9;19385:18;19377:26;;19449:9;19443:4;19439:20;19435:1;19424:9;19420:17;19413:47;19477:131;19603:4;19477:131;:::i;:::-;19469:139;;19367:248;;;:::o;19621:419::-;19787:4;19825:2;19814:9;19810:18;19802:26;;19874:9;19868:4;19864:20;19860:1;19849:9;19845:17;19838:47;19902:131;20028:4;19902:131;:::i;:::-;19894:139;;19792:248;;;:::o;20046:419::-;20212:4;20250:2;20239:9;20235:18;20227:26;;20299:9;20293:4;20289:20;20285:1;20274:9;20270:17;20263:47;20327:131;20453:4;20327:131;:::i;:::-;20319:139;;20217:248;;;:::o;20471:419::-;20637:4;20675:2;20664:9;20660:18;20652:26;;20724:9;20718:4;20714:20;20710:1;20699:9;20695:17;20688:47;20752:131;20878:4;20752:131;:::i;:::-;20744:139;;20642:248;;;:::o;20896:419::-;21062:4;21100:2;21089:9;21085:18;21077:26;;21149:9;21143:4;21139:20;21135:1;21124:9;21120:17;21113:47;21177:131;21303:4;21177:131;:::i;:::-;21169:139;;21067:248;;;:::o;21321:419::-;21487:4;21525:2;21514:9;21510:18;21502:26;;21574:9;21568:4;21564:20;21560:1;21549:9;21545:17;21538:47;21602:131;21728:4;21602:131;:::i;:::-;21594:139;;21492:248;;;:::o;21746:419::-;21912:4;21950:2;21939:9;21935:18;21927:26;;21999:9;21993:4;21989:20;21985:1;21974:9;21970:17;21963:47;22027:131;22153:4;22027:131;:::i;:::-;22019:139;;21917:248;;;:::o;22171:419::-;22337:4;22375:2;22364:9;22360:18;22352:26;;22424:9;22418:4;22414:20;22410:1;22399:9;22395:17;22388:47;22452:131;22578:4;22452:131;:::i;:::-;22444:139;;22342:248;;;:::o;22596:419::-;22762:4;22800:2;22789:9;22785:18;22777:26;;22849:9;22843:4;22839:20;22835:1;22824:9;22820:17;22813:47;22877:131;23003:4;22877:131;:::i;:::-;22869:139;;22767:248;;;:::o;23021:419::-;23187:4;23225:2;23214:9;23210:18;23202:26;;23274:9;23268:4;23264:20;23260:1;23249:9;23245:17;23238:47;23302:131;23428:4;23302:131;:::i;:::-;23294:139;;23192:248;;;:::o;23446:419::-;23612:4;23650:2;23639:9;23635:18;23627:26;;23699:9;23693:4;23689:20;23685:1;23674:9;23670:17;23663:47;23727:131;23853:4;23727:131;:::i;:::-;23719:139;;23617:248;;;:::o;23871:419::-;24037:4;24075:2;24064:9;24060:18;24052:26;;24124:9;24118:4;24114:20;24110:1;24099:9;24095:17;24088:47;24152:131;24278:4;24152:131;:::i;:::-;24144:139;;24042:248;;;:::o;24296:419::-;24462:4;24500:2;24489:9;24485:18;24477:26;;24549:9;24543:4;24539:20;24535:1;24524:9;24520:17;24513:47;24577:131;24703:4;24577:131;:::i;:::-;24569:139;;24467:248;;;:::o;24721:419::-;24887:4;24925:2;24914:9;24910:18;24902:26;;24974:9;24968:4;24964:20;24960:1;24949:9;24945:17;24938:47;25002:131;25128:4;25002:131;:::i;:::-;24994:139;;24892:248;;;:::o;25146:419::-;25312:4;25350:2;25339:9;25335:18;25327:26;;25399:9;25393:4;25389:20;25385:1;25374:9;25370:17;25363:47;25427:131;25553:4;25427:131;:::i;:::-;25419:139;;25317:248;;;:::o;25571:419::-;25737:4;25775:2;25764:9;25760:18;25752:26;;25824:9;25818:4;25814:20;25810:1;25799:9;25795:17;25788:47;25852:131;25978:4;25852:131;:::i;:::-;25844:139;;25742:248;;;:::o;25996:419::-;26162:4;26200:2;26189:9;26185:18;26177:26;;26249:9;26243:4;26239:20;26235:1;26224:9;26220:17;26213:47;26277:131;26403:4;26277:131;:::i;:::-;26269:139;;26167:248;;;:::o;26421:419::-;26587:4;26625:2;26614:9;26610:18;26602:26;;26674:9;26668:4;26664:20;26660:1;26649:9;26645:17;26638:47;26702:131;26828:4;26702:131;:::i;:::-;26694:139;;26592:248;;;:::o;26846:419::-;27012:4;27050:2;27039:9;27035:18;27027:26;;27099:9;27093:4;27089:20;27085:1;27074:9;27070:17;27063:47;27127:131;27253:4;27127:131;:::i;:::-;27119:139;;27017:248;;;:::o;27271:419::-;27437:4;27475:2;27464:9;27460:18;27452:26;;27524:9;27518:4;27514:20;27510:1;27499:9;27495:17;27488:47;27552:131;27678:4;27552:131;:::i;:::-;27544:139;;27442:248;;;:::o;27696:419::-;27862:4;27900:2;27889:9;27885:18;27877:26;;27949:9;27943:4;27939:20;27935:1;27924:9;27920:17;27913:47;27977:131;28103:4;27977:131;:::i;:::-;27969:139;;27867:248;;;:::o;28121:222::-;28214:4;28252:2;28241:9;28237:18;28229:26;;28265:71;28333:1;28322:9;28318:17;28309:6;28265:71;:::i;:::-;28219:124;;;;:::o;28349:214::-;28438:4;28476:2;28465:9;28461:18;28453:26;;28489:67;28553:1;28542:9;28538:17;28529:6;28489:67;:::i;:::-;28443:120;;;;:::o;28650:99::-;28702:6;28736:5;28730:12;28720:22;;28709:40;;;:::o;28755:169::-;28839:11;28873:6;28868:3;28861:19;28913:4;28908:3;28904:14;28889:29;;28851:73;;;;:::o;28930:148::-;29032:11;29069:3;29054:18;;29044:34;;;;:::o;29084:305::-;29124:3;29143:20;29161:1;29143:20;:::i;:::-;29138:25;;29177:20;29195:1;29177:20;:::i;:::-;29172:25;;29331:1;29263:66;29259:74;29256:1;29253:81;29250:2;;;29337:18;;:::i;:::-;29250:2;29381:1;29378;29374:9;29367:16;;29128:261;;;;:::o;29395:348::-;29435:7;29458:20;29476:1;29458:20;:::i;:::-;29453:25;;29492:20;29510:1;29492:20;:::i;:::-;29487:25;;29680:1;29612:66;29608:74;29605:1;29602:81;29597:1;29590:9;29583:17;29579:105;29576:2;;;29687:18;;:::i;:::-;29576:2;29735:1;29732;29728:9;29717:20;;29443:300;;;;:::o;29749:191::-;29789:4;29809:20;29827:1;29809:20;:::i;:::-;29804:25;;29843:20;29861:1;29843:20;:::i;:::-;29838:25;;29882:1;29879;29876:8;29873:2;;;29887:18;;:::i;:::-;29873:2;29932:1;29929;29925:9;29917:17;;29794:146;;;;:::o;29946:96::-;29983:7;30012:24;30030:5;30012:24;:::i;:::-;30001:35;;29991:51;;;:::o;30048:90::-;30082:7;30125:5;30118:13;30111:21;30100:32;;30090:48;;;:::o;30144:77::-;30181:7;30210:5;30199:16;;30189:32;;;:::o;30227:149::-;30263:7;30303:66;30296:5;30292:78;30281:89;;30271:105;;;:::o;30382:126::-;30419:7;30459:42;30452:5;30448:54;30437:65;;30427:81;;;:::o;30514:77::-;30551:7;30580:5;30569:16;;30559:32;;;:::o;30597:86::-;30632:7;30672:4;30665:5;30661:16;30650:27;;30640:43;;;:::o;30689:307::-;30757:1;30767:113;30781:6;30778:1;30775:13;30767:113;;;30866:1;30861:3;30857:11;30851:18;30847:1;30842:3;30838:11;30831:39;30803:2;30800:1;30796:10;30791:15;;30767:113;;;30898:6;30895:1;30892:13;30889:2;;;30978:1;30969:6;30964:3;30960:16;30953:27;30889:2;30738:258;;;;:::o;31002:171::-;31041:3;31064:24;31082:5;31064:24;:::i;:::-;31055:33;;31110:4;31103:5;31100:15;31097:2;;;31118:18;;:::i;:::-;31097:2;31165:1;31158:5;31154:13;31147:20;;31045:128;;;:::o;31179:320::-;31223:6;31260:1;31254:4;31250:12;31240:22;;31307:1;31301:4;31297:12;31328:18;31318:2;;31384:4;31376:6;31372:17;31362:27;;31318:2;31446;31438:6;31435:14;31415:18;31412:38;31409:2;;;31465:18;;:::i;:::-;31409:2;31230:269;;;;:::o;31505:233::-;31544:3;31567:24;31585:5;31567:24;:::i;:::-;31558:33;;31613:66;31606:5;31603:77;31600:2;;;31683:18;;:::i;:::-;31600:2;31730:1;31723:5;31719:13;31712:20;;31548:190;;;:::o;31744:180::-;31792:77;31789:1;31782:88;31889:4;31886:1;31879:15;31913:4;31910:1;31903:15;31930:180;31978:77;31975:1;31968:88;32075:4;32072:1;32065:15;32099:4;32096:1;32089:15;32116:180;32164:77;32161:1;32154:88;32261:4;32258:1;32251:15;32285:4;32282:1;32275:15;32302:180;32350:77;32347:1;32340:88;32447:4;32444:1;32437:15;32471:4;32468:1;32461:15;32488:180;32536:77;32533:1;32526:88;32633:4;32630:1;32623:15;32657:4;32654:1;32647:15;32797:117;32906:1;32903;32896:12;32920:102;32961:6;33012:2;33008:7;33003:2;32996:5;32992:14;32988:28;32978:38;;32968:54;;;:::o;33028:182::-;33168:34;33164:1;33156:6;33152:14;33145:58;33134:76;:::o;33216:222::-;33356:34;33352:1;33344:6;33340:14;33333:58;33425:5;33420:2;33412:6;33408:15;33401:30;33322:116;:::o;33444:170::-;33584:22;33580:1;33572:6;33568:14;33561:46;33550:64;:::o;33620:221::-;33760:34;33756:1;33748:6;33744:14;33737:58;33829:4;33824:2;33816:6;33812:15;33805:29;33726:115;:::o;33847:244::-;33987:34;33983:1;33975:6;33971:14;33964:58;34056:27;34051:2;34043:6;34039:15;34032:52;33953:138;:::o;34097:221::-;34237:34;34233:1;34225:6;34221:14;34214:58;34306:4;34301:2;34293:6;34289:15;34282:29;34203:115;:::o;34324:225::-;34464:34;34460:1;34452:6;34448:14;34441:58;34533:8;34528:2;34520:6;34516:15;34509:33;34430:119;:::o;34555:166::-;34695:18;34691:1;34683:6;34679:14;34672:42;34661:60;:::o;34727:176::-;34867:28;34863:1;34855:6;34851:14;34844:52;34833:70;:::o;34909:227::-;35049:34;35045:1;35037:6;35033:14;35026:58;35118:10;35113:2;35105:6;35101:15;35094:35;35015:121;:::o;35142:241::-;35282:34;35278:1;35270:6;35266:14;35259:58;35351:24;35346:2;35338:6;35334:15;35327:49;35248:135;:::o;35389:223::-;35529:34;35525:1;35517:6;35513:14;35506:58;35598:6;35593:2;35585:6;35581:15;35574:31;35495:117;:::o;35618:220::-;35758:34;35754:1;35746:6;35742:14;35735:58;35827:3;35822:2;35814:6;35810:15;35803:28;35724:114;:::o;35844:245::-;35984:34;35980:1;35972:6;35968:14;35961:58;36053:28;36048:2;36040:6;36036:15;36029:53;35950:139;:::o;36095:224::-;36235:34;36231:1;36223:6;36219:14;36212:58;36304:7;36299:2;36291:6;36287:15;36280:32;36201:118;:::o;36325:290::-;36465:34;36461:1;36453:6;36449:14;36442:58;36534:34;36529:2;36521:6;36517:15;36510:59;36603:4;36598:2;36590:6;36586:15;36579:29;36431:184;:::o;36621:223::-;36761:34;36757:1;36749:6;36745:14;36738:58;36830:6;36825:2;36817:6;36813:15;36806:31;36727:117;:::o;36850:242::-;36990:34;36986:1;36978:6;36974:14;36967:58;37059:25;37054:2;37046:6;37042:15;37035:50;36956:136;:::o;37098:173::-;37238:25;37234:1;37226:6;37222:14;37215:49;37204:67;:::o;37277:221::-;37417:34;37413:1;37405:6;37401:14;37394:58;37486:4;37481:2;37473:6;37469:15;37462:29;37383:115;:::o;37504:224::-;37644:34;37640:1;37632:6;37628:14;37621:58;37713:7;37708:2;37700:6;37696:15;37689:32;37610:118;:::o;37734:167::-;37874:19;37870:1;37862:6;37858:14;37851:43;37840:61;:::o;37907:234::-;38047:34;38043:1;38035:6;38031:14;38024:58;38116:17;38111:2;38103:6;38099:15;38092:42;38013:128;:::o;38147:181::-;38287:33;38283:1;38275:6;38271:14;38264:57;38253:75;:::o;38334:229::-;38474:34;38470:1;38462:6;38458:14;38451:58;38543:12;38538:2;38530:6;38526:15;38519:37;38440:123;:::o;38569:122::-;38642:24;38660:5;38642:24;:::i;:::-;38635:5;38632:35;38622:2;;38681:1;38678;38671:12;38622:2;38612:79;:::o;38697:122::-;38770:24;38788:5;38770:24;:::i;:::-;38763:5;38760:35;38750:2;;38809:1;38806;38799:12;38750:2;38740:79;:::o;38825:120::-;38897:23;38914:5;38897:23;:::i;:::-;38890:5;38887:34;38877:2;;38935:1;38932;38925:12;38877:2;38867:78;:::o;38951:122::-;39024:24;39042:5;39024:24;:::i;:::-;39017:5;39014:35;39004:2;;39063:1;39060;39053:12;39004:2;38994:79;:::o

Swarm Source

ipfs://fb4289c0b7e9481a3bd6ef00c2f6ed34902c59c7ca0feeaf606f32e046b2bc79
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.