Token Skyblocks

Gaming 
 

Overview ERC-20

Price
$0.00 @ 0.002189 MATIC (-2.21%)
Fully Diluted Market Cap
Total Supply:
29,320,812.18918 ISKY

Holders:
1,745 addresses

Transfers:
-

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

OVERVIEW

In Infinity Skies, players will Build, Socialize, Trade, and undertake numerous adventures. Players will compete to build the most prestigious castle in the community while collecting rare NFT decorations, skins, and building components. The goal is to become the King or Queen of Infinity Skies.

Market

Volume (24H):$6,351.49
Market Capitalization:$41,852.00
Circulating Supply:15,516,297.00 ISKY
Market Data Source: Coinmarketcap


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

Contract Source Code Verified (Exact Match)

Contract Name:
Skyblocks

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-03-31
*/

// SPDX-License-Identifier: UNLICENSED

// Sources flattened with hardhat v2.7.0 https://hardhat.org

// File @openzeppelin/contracts/token/ERC20/[email protected]

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/utils/[email protected]

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

pragma solidity ^0.8.0;

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

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


// File contracts/utils/ERC20.sol



pragma solidity 0.8.9;


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

contract ERC20 is Context, IERC20 {
    mapping(address => uint256) internal _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The defaut value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All 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 returns (string memory) {
        return _name;
    }

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

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5,05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * 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 returns (uint8) {
        return 18;
    }

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

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

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

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

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

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

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

        return true;
    }

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

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

        return true;
    }

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

        _beforeTokenTransfer(sender, recipient, amount);

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

        emit Transfer(sender, recipient, amount);
    }

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/access/[email protected]

// OpenZeppelin Contracts v4.4.0 (access/IAccessControl.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/access/[email protected]


// OpenZeppelin Contracts v4.4.0 (access/IAccessControlEnumerable.sol)

pragma solidity ^0.8.0;

/**
 * @dev External interface of AccessControlEnumerable declared to support ERC165 detection.
 */
interface IAccessControlEnumerable is IAccessControl {
    /**
     * @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) external view returns (address);

    /**
     * @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) external view returns (uint256);
}


// File @openzeppelin/contracts/utils/[email protected]

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

pragma solidity ^0.8.0;

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

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

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

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

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


// File @openzeppelin/contracts/utils/introspection/[email protected]

// OpenZeppelin Contracts v4.4.0 (utils/introspection/IERC165.sol)

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 @openzeppelin/contracts/utils/introspection/[email protected]

// OpenZeppelin Contracts v4.4.0 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

/**
 * @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 @openzeppelin/contracts/access/[email protected]

// OpenZeppelin Contracts v4.4.0 (access/AccessControl.sol)

pragma solidity ^0.8.0;




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

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

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

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

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

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

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

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

        _revokeRole(role, account);
    }

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

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

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

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


// File @openzeppelin/contracts/utils/structs/[email protected]

// OpenZeppelin Contracts v4.4.0 (utils/structs/EnumerableSet.sol)

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

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function _values(Set storage set) private view returns (bytes32[] memory) {
        return set._values;
    }

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

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
        return _values(set._inner);
    }

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

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(AddressSet storage set) internal view returns (address[] memory) {
        bytes32[] memory store = _values(set._inner);
        address[] memory result;

        assembly {
            result := store
        }

        return result;
    }

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

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(UintSet storage set) internal view returns (uint256[] memory) {
        bytes32[] memory store = _values(set._inner);
        uint256[] memory result;

        assembly {
            result := store
        }

        return result;
    }
}


// File @openzeppelin/contracts/access/[email protected]

// OpenZeppelin Contracts v4.4.0 (access/AccessControlEnumerable.sol)

pragma solidity ^0.8.0;



/**
 * @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) internal virtual override {
        super._grantRole(role, account);
        _roleMembers[role].add(account);
    }

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


// File @openzeppelin/contracts/utils/math/[email protected]

// OpenZeppelin Contracts v4.4.0 (utils/math/Math.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a >= b ? a : b;
    }

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

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

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a / b + (a % b == 0 ? 0 : 1);
    }
}


// File @openzeppelin/contracts/utils/[email protected]

// OpenZeppelin Contracts v4.4.0 (utils/Arrays.sol)

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to array types.
 */
library Arrays {
    /**
     * @dev Searches a sorted `array` and returns the first index that contains
     * a value greater or equal to `element`. If no such index exists (i.e. all
     * values in the array are strictly less than `element`), the array length is
     * returned. Time complexity O(log n).
     *
     * `array` is expected to be sorted in ascending order, and to contain no
     * repeated elements.
     */
    function findUpperBound(uint256[] storage array, uint256 element) internal view returns (uint256) {
        if (array.length == 0) {
            return 0;
        }

        uint256 low = 0;
        uint256 high = array.length;

        while (low < high) {
            uint256 mid = Math.average(low, high);

            // Note that mid will always be strictly less than high (i.e. it will be a valid array index)
            // because Math.average rounds down (it does integer division with truncation).
            if (array[mid] > element) {
                high = mid;
            } else {
                low = mid + 1;
            }
        }

        // At this point `low` is the exclusive upper bound. We will return the inclusive upper bound.
        if (low > 0 && array[low - 1] == element) {
            return low - 1;
        } else {
            return low;
        }
    }
}


// File @openzeppelin/contracts/utils/[email protected]

// OpenZeppelin Contracts v4.4.0 (utils/Counters.sol)

pragma solidity ^0.8.0;

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

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

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

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

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


// File contracts/TokenSystems/Skyblocks.sol


pragma solidity 0.8.9;



/**
 *
 * @dev {Skyblocks} ERC20 compliant token
 *
 *
 * @notice TokenVesting will control ALL minting of after deployment. Whitelisting
 * and tax role are relegated for multi sig ecosystem governance. All ecosystem contracts
 * and applicable addresses will be untaxed permanently. Tax follows 3% -> Play To Earn,
 * 1.5% -> Claim Pool, and 0.5% -> Development Treasury.
 *
 * Claim Pool operates intrinsically with this contract's snapshotting. Snapshotting is
 * triggered solely by the Claim Pool contract itself, therefore creating a permanent
 * on-chain history that can be used by claim pool logic.
 *
 */

contract Skyblocks is Context, AccessControlEnumerable, ERC20 {
    struct Snapshots {
        uint256[] ids;
        uint256[] values;
    }

    bytes32 public immutable MINTER_ROLE;
    bytes32 public immutable WHITELIST_ROLE;
    bytes32 public immutable SNAPSHOT_ROLE;
    bytes32 public immutable TAX_ROLE_1;
    bytes32 public immutable TAX_ROLE_2;
    bytes32 public immutable TAX_ROLE_3;

    bytes32 public immutable MINTER_ROLE_ADMIN;
    bytes32 public immutable WHITELIST_ROLE_ADMIN;
    bytes32 public immutable TAX_ROLE_ADMIN;

    mapping(address => bool) public protocolWhitelist;
    address public playToEarn;
    address public claimPool;
    address public developmentTreasury;

    uint256 public developmentTax;
    uint256 public claimPoolTax;
    uint256 public playToEarnTax;
    uint256 public immutable taxDenominator;

    uint256 public immutable cap;

    using Arrays for uint256[];
    using Counters for Counters.Counter;

    mapping(address => Snapshots) private _accountBalanceSnapshots;
    Snapshots private _totalSupplySnapshots;
    Snapshots private _amountSentToClaimPoolSnapshots;
    uint256 public _amountSentToClaimPool;

    Counters.Counter private _currentSnapshotId;

    event Snapshot(uint256 indexed id, uint256 time);
    event PlayToEarnTaxUpdated(uint256 tax);
    event ClaimPoolTaxUpdated(uint256 tax);
    event DevelopmentTaxUpdated(uint256 tax);

    /**
     *
     * @dev deploys with initial minting(s), whitelisting of first wave protocol
     * contracts, and role hiarachy initialization
     *
     * @param name string name Skyblocks
     * @param symbol string symbol ISKY
     * @param _initialBeneficiaries list of the initial address to receive skyblocks
     * @param _amounts array of the intial amounts to mint
     * @param _claimPool address of the claim pool contract
     * @param _developmentTreasury address of the development treasury pool
     * @param _playToEarn address of the play to earn pool
     * @param _tokenStaking Address of the token staking contract
     * @param governance Address of the multi sig governance contract
     *
     */
    constructor(
        string memory name,
        string memory symbol,
        address[] memory _initialBeneficiaries,
        uint256[] memory _amounts,
        address _claimPool,
        address _developmentTreasury,
        address _playToEarn,
        address _tokenStaking,
        address governance
    ) ERC20(name, symbol) {
        require(_playToEarn != address(0), "Skyblocks: zero address");
        playToEarn = _playToEarn;
        require(_developmentTreasury != address(0), "Skyblocks: zero address");
        developmentTreasury = _developmentTreasury;
        require(_claimPool != address(0), "Skyblocks: zero address");
        claimPool = _claimPool;
        require(_tokenStaking != address(0), "Skyblocks: address 0");
        require(governance != address(0), "Skyblocks: address 0");

        MINTER_ROLE = keccak256("MINTER_ROLE");
        WHITELIST_ROLE = keccak256("WHITELIST_ROLE");
        SNAPSHOT_ROLE = keccak256("SNAPSHOT_ROLE");
        TAX_ROLE_1 = keccak256("TAX_ROLE_1");
        TAX_ROLE_2 = keccak256("TAX_ROLE_2");
        TAX_ROLE_3 = keccak256("TAX_ROLE_3");

        MINTER_ROLE_ADMIN = keccak256("MINTER_ROLE_ADMIN");
        WHITELIST_ROLE_ADMIN = keccak256("WHITELIST_ROLE_ADMIN");
        TAX_ROLE_ADMIN = keccak256("TAX_ROLE_ADMIN");

        taxDenominator = 1000;
        developmentTax = 5; // 0.5
        claimPoolTax = 15; // 1.5
        playToEarnTax = 30; // 3.0

        // setup role admins
        _setRoleAdmin(TAX_ROLE_1, TAX_ROLE_ADMIN);
        _setRoleAdmin(TAX_ROLE_2, TAX_ROLE_ADMIN);
        _setRoleAdmin(TAX_ROLE_3, TAX_ROLE_ADMIN);
        _setRoleAdmin(WHITELIST_ROLE, WHITELIST_ROLE_ADMIN);
        _setRoleAdmin(MINTER_ROLE, MINTER_ROLE_ADMIN);

        // grant admins
        _setupRole(MINTER_ROLE_ADMIN, governance);
        _setupRole(TAX_ROLE_ADMIN, governance);
        _setupRole(WHITELIST_ROLE_ADMIN, governance);

        // grant roles
        _setupRole(SNAPSHOT_ROLE, _claimPool);
        _setupRole(WHITELIST_ROLE, governance);

        // mint initial amounts and give minter role to the vesting contract
        for (uint256 i; i < _initialBeneficiaries.length; ++i) {
            require(_initialBeneficiaries[i] != address(0));
            require(_amounts[i] > 0);

            _mint(_initialBeneficiaries[i], _amounts[i]);
        }

        // setup whitelists
        protocolWhitelist[_claimPool] = true;
        protocolWhitelist[_tokenStaking] = true;

        _amountSentToClaimPool;
        cap = 100_000_000 * 1e18;

        // initialize snapshotting
        _snapshot();
    }

    /**
     *
     * @dev enables the long term minting of additional skyblocks via the release
     * schedule of vesting
     *
     * @param _skyblocksVesting the address of the Vesting Contract
     *
     * @notice minter admin is permanently renounced upon this call
     *
     */
    function setupVesting(address _skyblocksVesting)
        external
        onlyRole(MINTER_ROLE_ADMIN)
    {
        require(_skyblocksVesting != address(0), "Skyblocks: zero address");
        _setupRole(MINTER_ROLE, _skyblocksVesting);
        renounceRole(MINTER_ROLE_ADMIN, _msgSender());
    }

    /**
     *
     * @dev Mints Skyblocks to an account
     *
     * @param account address to receive Skyblocks
     * @param amount address to receive amount
     *
     */
    function mint(address account, uint256 amount)
        external
        onlyRole(MINTER_ROLE)
    {
        require(totalSupply() + amount <= cap, "Skyblocks: cap");
        _mint(account, amount);
    }

    /**
     *
     * @dev Moves tokens `amount` from `sender` to `recipient'.
     * Two outcome paths can occur based on ecosystem interaction.
     * All contracts within InfinitySkies ecosystem are
     * whitelisted from taxation. Additionally, this function tracks
     * all applicable historical balances for snapshoting
     *
     * @param sender 'from'
     * @param recipient 'to'
     * @param amount tokens in native decimals
     *
     */
    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual override(ERC20) {
        require(sender != address(0), "Skyblocks: zero address");
        require(recipient != address(0), "Skyblocks: zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        if (protocolWhitelist[sender] || protocolWhitelist[recipient]) {
            // normal transfer
            uint256 senderBalance = _balances[sender];
            require(senderBalance >= amount, "Skyblocks: exceeds balance");

            _balances[sender] = senderBalance - amount;
            _balances[recipient] += amount;

            emit Transfer(sender, recipient, amount);
        } else {
            // tax transfer
            require(amount > 1e5, "SkyBlocks: minimum amount");
            uint256 toDevelopmentTreasury = (amount * developmentTax) /
                (taxDenominator);
            uint256 toClaimPool = (amount * (claimPoolTax)) / (taxDenominator);
            uint256 toPlayToEarn = (amount * (playToEarnTax)) /
                (taxDenominator);
            uint256 rest = amount -
                (toDevelopmentTreasury + (toClaimPool) + (toPlayToEarn));

            uint256 senderBalance = _balances[sender];
            require(senderBalance >= amount, "Skyblocks: exceeds balance");
            _balances[sender] = senderBalance - amount;
            _balances[developmentTreasury] += toDevelopmentTreasury;

            _balances[claimPool] += toClaimPool;
            _amountSentToClaimPool += toClaimPool;

            _balances[playToEarn] += toPlayToEarn;
            _balances[recipient] += rest;

            emit Transfer(sender, developmentTreasury, toDevelopmentTreasury);
            emit Transfer(sender, claimPool, toClaimPool);
            emit Transfer(sender, playToEarn, toPlayToEarn);
            emit Transfer(sender, recipient, rest);
        }
    }

    /**
     *
     * @dev Sets the development tax; reserved only for TAX_ROLE_1
     *
     * @param _tax tax to set between 0 and 5%
     *
     */
    function setDevelopmentTax(uint256 _tax) external onlyRole(TAX_ROLE_1) {
        require(_tax >= 0 && _tax <= 50, "Skyblocks: tax range 0 to 5%");
        developmentTax = _tax;

        emit DevelopmentTaxUpdated(_tax);
    }

    /**
     *
     * @dev Sets the claimpool tax; reserved only for TAX_ROLE_2
     *
     * @param _tax tax to set between 0 and 5%
     *
     */
    function setClaimPoolTax(uint256 _tax) external onlyRole(TAX_ROLE_2) {
        require(_tax >= 0 && _tax <= 50, "Skyblocks: tax range 0 to 5%");
        claimPoolTax = _tax;

        emit ClaimPoolTaxUpdated(_tax);
    }

    /**
     *
     * @dev Sets the playToEarn tax; reserved only for TAX_ROLE_3
     *
     * @param _tax tax to set between 0 and 5%
     *
     */
    function setPlayToEarnTax(uint256 _tax) external onlyRole(TAX_ROLE_3) {
        require(_tax >= 0 && _tax <= 50, "Skyblocks: tax range 0 to 5%");
        playToEarnTax = _tax;

        emit PlayToEarnTaxUpdated(_tax);
    }

    /**
     *
     * @dev Snapshots all current balances, totalSupply, and Claim Pool Accumulation
     *
     * @notice The only Snapshot user will be the claim pool contract. Snapshots will
     * be publicly accessible
     *
     */
    function snapshot() external onlyRole(SNAPSHOT_ROLE) returns (uint256) {
        return _snapshot();
    }

    /**
     *
     * @dev adds a protocol contract to whitelist in order
     * to avoid taxation within the ecosystem
     *
     * @param toAdd address of the Infinity Skies ecosystem contract to whitelist from taxation
     *
     * @notice Should only be used to add ecosystem contracts/dapps
     *
     */
    function addWhitelist(address toAdd) external onlyRole(WHITELIST_ROLE) {
        require(address(0) != toAdd, "Skyblocks: zero address");
        require(!protocolWhitelist[toAdd], "Skyblocks: already added");
        protocolWhitelist[toAdd] = true;
    }

    /**
     *
     * @dev removes a protocol contract to whitelist
     *
     * @param toRemove address of the Infinity Skies ecosystem contract to UNwhitelist from taxation
     *
     * @notice Should only be used to remove ecosystem contracts/dapps
     *
     */
    function removeWhitelist(address toRemove)
        external
        onlyRole(WHITELIST_ROLE)
    {
        require(address(0) != toRemove, "Skyblocks: zero address");
        require(protocolWhitelist[toRemove], "Skyblocks: not whitelisted");
        protocolWhitelist[toRemove] = false;
    }

    /**
     * @dev Creates a new snapshot and returns its snapshot id.
     *
     * Emits a {Snapshot} event that contains the same id.
     *
     */
    function _snapshot() internal virtual returns (uint256) {
        _currentSnapshotId.increment();

        uint256 currentId = _getCurrentSnapshotId();
        emit Snapshot(currentId, block.timestamp);
        return currentId;
    }

    /**
     *
     * @dev Exposed: Get the current snapshotId
     *
     */
    function getCurrentSnapshotId() external view returns (uint256) {
        return _getCurrentSnapshotId();
    }

    /**
     *
     * @dev Get the current snapshotId
     *
     */
    function _getCurrentSnapshotId() internal view virtual returns (uint256) {
        return _currentSnapshotId.current();
    }

    /**
     *
     * @dev Retrieves the balance of `account` at the time `snapshotId` was created.
     *
     * @param account address
     * @param snapshotId Id to query
     *
     */
    function balanceOfAt(address account, uint256 snapshotId)
        external
        view
        virtual
        returns (uint256)
    {
        (bool snapshotted, uint256 value) = _valueAt(
            snapshotId,
            _accountBalanceSnapshots[account]
        );

        return snapshotted ? value : balanceOf(account);
    }

    /**
     *
     * @dev Retrieves the total supply at the time `snapshotId` was created.
     *
     * @param snapshotId Id to query
     *
     */
    function totalSupplyAt(uint256 snapshotId)
        external
        view
        virtual
        returns (uint256)
    {
        (bool snapshotted, uint256 value) = _valueAt(
            snapshotId,
            _totalSupplySnapshots
        );

        return snapshotted ? value : totalSupply();
    }

    /**
     *
     * @dev Retrieves the total amount sent to the Claim Pool
     * at the time `snapshotId` was created.
     *
     * @param snapshotId Id to query
     *
     */
    function amountSentToClaimPoolAt(uint256 snapshotId)
        external
        view
        virtual
        returns (uint256)
    {
        (bool snapshotted, uint256 value) = _valueAt(
            snapshotId,
            _amountSentToClaimPoolSnapshots
        );

        return snapshotted ? value : _amountSentToClaimPool;
    }

    /**
     *
     * @dev Update balance, total supply, claimpool amounts,
     * and applicable additional balance snapshots before the
     * values are modified. This is implemented in the _beforeTokenTransfer
     * hook, which is executed for _mint, _burn, and _transfer operations.
     *
     * @param from address sender
     * @param to address recipient
     * @param amount uint256 native decimal amount
     *
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual override(ERC20) {
        super._beforeTokenTransfer(from, to, amount);

        if (from == address(0)) {
            // mint
            _updateAccountSnapshot(to);
            _updateTotalSupplySnapshot();
        } else if (to == address(0)) {
            // burn
            _updateAccountSnapshot(from);
            _updateTotalSupplySnapshot();
        } else {
            // transfer
            _updateClaimPoolSnapShot();
            _updateAccountSnapshot(from);
            _updateAccountSnapshot(to);
            _updateAccountSnapshot(developmentTreasury);
            _updateAccountSnapshot(claimPool);
            _updateAccountSnapshot(playToEarn);
        }
    }

    /**
     *
     * @dev returns the snapshot value for a given type of snapshot
     *
     */
    function _valueAt(uint256 snapshotId, Snapshots storage snapshots)
        private
        view
        returns (bool, uint256)
    {
        require(snapshotId > 0, "ERC20Snapshot: id is 0");
        require(
            snapshotId <= _getCurrentSnapshotId(),
            "ERC20Snapshot: nonexistent id"
        );

        uint256 index = snapshots.ids.findUpperBound(snapshotId);

        if (index == snapshots.ids.length) {
            return (false, 0);
        } else {
            return (true, snapshots.values[index]);
        }
    }

    /**
     *
     * @dev updates the balances snapshots
     *
     */
    function _updateAccountSnapshot(address account) private {
        _updateSnapshot(_accountBalanceSnapshots[account], balanceOf(account));
    }

    /**
     *
     * @dev updates the total supply snapshots
     *
     */
    function _updateTotalSupplySnapshot() private {
        _updateSnapshot(_totalSupplySnapshots, totalSupply());
    }

    /**
     *
     * @dev updates the claim pool accumulation snapshots
     *
     */
    function _updateClaimPoolSnapShot() private {
        _updateSnapshot(
            _amountSentToClaimPoolSnapshots,
            _amountSentToClaimPool
        );
    }

    /**
     *
     * @dev generalized updating up the snapshots object
     *
     */
    function _updateSnapshot(Snapshots storage snapshots, uint256 currentValue)
        private
    {
        uint256 currentId = _getCurrentSnapshotId();
        if (_lastSnapshotId(snapshots.ids) < currentId) {
            snapshots.ids.push(currentId);
            snapshots.values.push(currentValue);
        }
    }

    /**
     *
     * @dev returns the last applicable snapshot Id
     *
     */
    function _lastSnapshotId(uint256[] storage ids)
        private
        view
        returns (uint256)
    {
        if (ids.length == 0) {
            return 0;
        } else {
            return ids[ids.length - 1];
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"address[]","name":"_initialBeneficiaries","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"},{"internalType":"address","name":"_claimPool","type":"address"},{"internalType":"address","name":"_developmentTreasury","type":"address"},{"internalType":"address","name":"_playToEarn","type":"address"},{"internalType":"address","name":"_tokenStaking","type":"address"},{"internalType":"address","name":"governance","type":"address"}],"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":"uint256","name":"tax","type":"uint256"}],"name":"ClaimPoolTaxUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tax","type":"uint256"}],"name":"DevelopmentTaxUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tax","type":"uint256"}],"name":"PlayToEarnTaxUpdated","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":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"Snapshot","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"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":"MINTER_ROLE_ADMIN","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SNAPSHOT_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TAX_ROLE_1","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TAX_ROLE_2","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TAX_ROLE_3","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TAX_ROLE_ADMIN","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WHITELIST_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WHITELIST_ROLE_ADMIN","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_amountSentToClaimPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"toAdd","type":"address"}],"name":"addWhitelist","outputs":[],"stateMutability":"nonpayable","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":"uint256","name":"snapshotId","type":"uint256"}],"name":"amountSentToClaimPoolAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"snapshotId","type":"uint256"}],"name":"balanceOfAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimPoolTax","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":[],"name":"developmentTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"developmentTreasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentSnapshotId","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":"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":"playToEarn","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"playToEarnTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"protocolWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"toRemove","type":"address"}],"name":"removeWhitelist","outputs":[],"stateMutability":"nonpayable","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":"uint256","name":"_tax","type":"uint256"}],"name":"setClaimPoolTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tax","type":"uint256"}],"name":"setDevelopmentTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tax","type":"uint256"}],"name":"setPlayToEarnTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_skyblocksVesting","type":"address"}],"name":"setupVesting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"snapshot","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"taxDenominator","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":"uint256","name":"snapshotId","type":"uint256"}],"name":"totalSupplyAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

6101e06040523480156200001257600080fd5b5060405162005fad38038062005fad8339818101604052810190620000389190620014f7565b888881600590805190602001906200005292919062001059565b5080600690805190602001906200006b92919062001059565b505050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415620000e1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000d890620016b3565b60405180910390fd5b82600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141562000195576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200018c90620016b3565b60405180910390fd5b83600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141562000249576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200024090620016b3565b60405180910390fd5b84600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620002fd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002f49062001725565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141562000370576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003679062001725565b60405180910390fd5b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6608081815250507fdc72ed553f2544c34465af23b847953efeb813428162d767f9ba5f4013be676060a081815250507f5fdbd35e8da83ee755d5e62a539e5ed7f47126abede0b8b10f9ea43dc6eed07f60c081815250507fd19c9a135042d8a53b9e61e107842ea53fd68027525deae6282612cfcce652be60e081815250507f49514dda7ee21596253b494f3ea1c5e997b7588b34eb1f01a437153bb97f45c561010081815250507f9a8c8f915b10863c961780eb6c2efad1286e296cf5c315eb5a47f49fa5b43b1b61012081815250507f11c2020b6b4f4e00c2410234e0c72636b4739cf7cda4d8e24ef6b881350e670461014081815250507f3dbd7c6bedf2412ff4c88c73c5cbd78a9c5f5066ba3f3b3b9a0c01e1a620d32061016081815250507f177588173caf214224a1e3e13572ac12b605b6c2cb220768a93636b9f9cd72b161018081815250506103e86101a081815250506005600b81905550600f600c81905550601e600d819055506200051760e05161018051620007b160201b60201c565b6200052f6101005161018051620007b160201b60201c565b620005476101205161018051620007b160201b60201c565b6200055e60a05161016051620007b160201b60201c565b6200057560805161014051620007b160201b60201c565b6200058a61014051826200081460201b60201c565b6200059f61018051826200081460201b60201c565b620005b461016051826200081460201b60201c565b620005c860c051866200081460201b60201c565b620005dc60a051826200081460201b60201c565b60005b8751811015620006cc57600073ffffffffffffffffffffffffffffffffffffffff1688828151811062000617576200061662001747565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614156200064157600080fd5b600087828151811062000659576200065862001747565b5b6020026020010151116200066c57600080fd5b620006b888828151811062000686576200068562001747565b5b6020026020010151888381518110620006a457620006a362001747565b5b60200260200101516200082a60201b60201c565b80620006c490620017a5565b9050620005df565b506001600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506a52b7d2dcc80cd2e40000006101c08181525050620007a16200099060201b60201c565b5050505050505050505062001990565b6000620007c483620009fe60201b60201c565b905081600080858152602001908152602001600020600101819055508181847fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff60405160405180910390a4505050565b62000826828262000a1d60201b60201c565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200089d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008949062001843565b60405180910390fd5b620008b16000838362000a6560201b60201c565b8060046000828254620008c5919062001865565b9250508190555080600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546200091d919062001865565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620009849190620018d3565b60405180910390a35050565b6000620009a9601462000c0960201b62001b811760201c565b6000620009bb62000c1f60201b60201c565b9050807f492fbd8cfdd942203e99f6bc74253a1e1f5791b0644612279e778349f353b19842604051620009ef9190620018d3565b60405180910390a28091505090565b6000806000838152602001908152602001600020600101549050919050565b62000a34828262000c3d60201b62001b971760201c565b62000a60816001600085815260200190815260200160002062000d2e60201b62001c771790919060201c565b505050565b62000a7d83838362000d6660201b62001ca71760201c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141562000ada5762000ac48262000d6b60201b60201c565b62000ad462000dce60201b60201c565b62000c04565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000b375762000b218362000d6b60201b60201c565b62000b3162000dce60201b60201c565b62000c03565b62000b4762000df260201b60201c565b62000b588362000d6b60201b60201c565b62000b698262000d6b60201b60201c565b62000b9c600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1662000d6b60201b60201c565b62000bcf600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1662000d6b60201b60201c565b62000c02600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1662000d6b60201b60201c565b5b5b505050565b6001816000016000828254019250508190555050565b600062000c38601462000e0960201b62001cac1760201c565b905090565b62000c4f828262000e1760201b60201c565b62000d2a57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555062000ccf62000e8160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600062000d5e836000018373ffffffffffffffffffffffffffffffffffffffff1660001b62000e8960201b60201c565b905092915050565b505050565b62000dcb600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002062000dbf8362000f0360201b60201c565b62000f4c60201b60201c565b50565b62000df0600f62000de462000fd860201b60201c565b62000f4c60201b60201c565b565b62000e07601160135462000f4c60201b60201c565b565b600081600001549050919050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600033905090565b600062000e9d838362000fe260201b60201c565b62000ef857826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905062000efd565b600090505b92915050565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600062000f5e62000c1f60201b60201c565b90508062000f75846000016200100560201b60201c565b101562000fd35782600001819080600181540180825580915050600190039060005260206000200160009091909190915055826001018290806001815401808255809150506001900390600052602060002001600090919091909150555b505050565b6000600454905090565b600080836001016000848152602001908152602001600020541415905092915050565b600080828054905014156200101e576000905062001054565b8160018380549050620010329190620018f0565b8154811062001046576200104562001747565b5b906000526020600020015490505b919050565b82805462001067906200195a565b90600052602060002090601f0160209004810192826200108b5760008555620010d7565b82601f10620010a657805160ff1916838001178555620010d7565b82800160010185558215620010d7579182015b82811115620010d6578251825591602001919060010190620010b9565b5b509050620010e69190620010ea565b5090565b5b8082111562001105576000816000905550600101620010eb565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620011728262001127565b810181811067ffffffffffffffff8211171562001194576200119362001138565b5b80604052505050565b6000620011a962001109565b9050620011b7828262001167565b919050565b600067ffffffffffffffff821115620011da57620011d962001138565b5b620011e58262001127565b9050602081019050919050565b60005b8381101562001212578082015181840152602081019050620011f5565b8381111562001222576000848401525b50505050565b60006200123f6200123984620011bc565b6200119d565b9050828152602081018484840111156200125e576200125d62001122565b5b6200126b848285620011f2565b509392505050565b600082601f8301126200128b576200128a6200111d565b5b81516200129d84826020860162001228565b91505092915050565b600067ffffffffffffffff821115620012c457620012c362001138565b5b602082029050602081019050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200130782620012da565b9050919050565b6200131981620012fa565b81146200132557600080fd5b50565b60008151905062001339816200130e565b92915050565b6000620013566200135084620012a6565b6200119d565b905080838252602082019050602084028301858111156200137c576200137b620012d5565b5b835b81811015620013a9578062001394888262001328565b8452602084019350506020810190506200137e565b5050509392505050565b600082601f830112620013cb57620013ca6200111d565b5b8151620013dd8482602086016200133f565b91505092915050565b600067ffffffffffffffff82111562001404576200140362001138565b5b602082029050602081019050919050565b6000819050919050565b6200142a8162001415565b81146200143657600080fd5b50565b6000815190506200144a816200141f565b92915050565b6000620014676200146184620013e6565b6200119d565b905080838252602082019050602084028301858111156200148d576200148c620012d5565b5b835b81811015620014ba5780620014a5888262001439565b8452602084019350506020810190506200148f565b5050509392505050565b600082601f830112620014dc57620014db6200111d565b5b8151620014ee84826020860162001450565b91505092915050565b60008060008060008060008060006101208a8c0312156200151d576200151c62001113565b5b60008a015167ffffffffffffffff8111156200153e576200153d62001118565b5b6200154c8c828d0162001273565b99505060208a015167ffffffffffffffff81111562001570576200156f62001118565b5b6200157e8c828d0162001273565b98505060408a015167ffffffffffffffff811115620015a257620015a162001118565b5b620015b08c828d01620013b3565b97505060608a015167ffffffffffffffff811115620015d457620015d362001118565b5b620015e28c828d01620014c4565b9650506080620015f58c828d0162001328565b95505060a0620016088c828d0162001328565b94505060c06200161b8c828d0162001328565b93505060e06200162e8c828d0162001328565b925050610100620016428c828d0162001328565b9150509295985092959850929598565b600082825260208201905092915050565b7f536b79626c6f636b733a207a65726f2061646472657373000000000000000000600082015250565b60006200169b60178362001652565b9150620016a88262001663565b602082019050919050565b60006020820190508181036000830152620016ce816200168c565b9050919050565b7f536b79626c6f636b733a20616464726573732030000000000000000000000000600082015250565b60006200170d60148362001652565b91506200171a82620016d5565b602082019050919050565b600060208201905081810360008301526200174081620016fe565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620017b28262001415565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415620017e857620017e762001776565b5b600182019050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006200182b601f8362001652565b91506200183882620017f3565b602082019050919050565b600060208201905081810360008301526200185e816200181c565b9050919050565b6000620018728262001415565b91506200187f8362001415565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115620018b757620018b662001776565b5b828201905092915050565b620018cd8162001415565b82525050565b6000602082019050620018ea6000830184620018c2565b92915050565b6000620018fd8262001415565b91506200190a8362001415565b92508282101562001920576200191f62001776565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200197357607f821691505b602082108114156200198a57620019896200192b565b5b50919050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c05161453462001a7960003960008181610cfe0152610e830152600081816118b601528181612278015281816122b501526122f2015260006112e40152600061186e015260008181610b780152818161130801526113d7015260008181610b54015261142d015260008181610f860152611892015260008181611409015261158b01526000818161109101526116e40152600081816110fe0152818161128e01526119f8015260008181610e51015281816113ad015261192401526145346000f3fe608060405234801561001057600080fd5b50600436106102f15760003560e01c80637a6d66dc1161019d578063981b24d0116100e9578063b361b2b5116100a2578063d53913931161007c578063d539139314610976578063d547741f14610994578063dd62ed3e146109b0578063f80f5dd5146109e0576102f1565b8063b361b2b51461090a578063b6bfd24b14610928578063ca15c87314610946576102f1565b8063981b24d014610820578063a217fddf14610850578063a457c2d71461086e578063a9059cbb1461089e578063a970cbf6146108ce578063a99b6248146108ec576102f1565b80638c1d11721161015657806391d148541161013057806391d14854146107985780639574aaf6146107c857806395d89b41146107e45780639711715a14610802576102f1565b80638c1d11721461072e5780638cf808af1461074c5780639010d07c14610768576102f1565b80637a6d66dc1461066a5780637a997ab7146106885780637ac1145a146106a65780637df4ebbd146106c45780638931392b146106f45780638be2bd2f14610712576102f1565b8063313ce5671161025c5780635439ad8611610215578063612cb2b5116101ef578063612cb2b5146105d05780637028e2cd1461060057806370a082311461061e57806378c8cda71461064e576102f1565b80635439ad86146105785780635475eba41461059657806355bf98fe146105b2576102f1565b8063313ce567146104a4578063355274ea146104c257806336568abe146104e057806339509351146104fc57806340c10f191461052c5780634ee2cd7e14610548576102f1565b806311d15e7a116102ae57806311d15e7a146103ce57806318160ddd146103ec57806323b872dd1461040a578063248a9ca31461043a5780632a7024731461046a5780632f2ff15d14610488576102f1565b806301ffc9a7146102f65780630204bb5f1461032657806306fdde0314610344578063095ea7b3146103625780630d9fdb37146103925780630eae4f02146103b0575b600080fd5b610310600480360381019061030b9190613570565b6109fc565b60405161031d91906135b8565b60405180910390f35b61032e610a76565b60405161033b9190613614565b60405180910390f35b61034c610a9c565b60405161035991906136c8565b60405180910390f35b61037c6004803603810190610377919061374c565b610b2e565b60405161038991906135b8565b60405180910390f35b61039a610b4c565b6040516103a7919061379b565b60405180910390f35b6103b8610b52565b6040516103c591906137cf565b60405180910390f35b6103d6610b76565b6040516103e391906137cf565b60405180910390f35b6103f4610b9a565b604051610401919061379b565b60405180910390f35b610424600480360381019061041f91906137ea565b610ba4565b60405161043191906135b8565b60405180910390f35b610454600480360381019061044f9190613869565b610ca5565b60405161046191906137cf565b60405180910390f35b610472610cc4565b60405161047f919061379b565b60405180910390f35b6104a2600480360381019061049d9190613896565b610cca565b005b6104ac610cf3565b6040516104b991906138f2565b60405180910390f35b6104ca610cfc565b6040516104d7919061379b565b60405180910390f35b6104fa60048036038101906104f59190613896565b610d20565b005b6105166004803603810190610511919061374c565b610da3565b60405161052391906135b8565b60405180910390f35b6105466004803603810190610541919061374c565b610e4f565b005b610562600480360381019061055d919061374c565b610f05565b60405161056f919061379b565b60405180910390f35b610580610f75565b60405161058d919061379b565b60405180910390f35b6105b060048036038101906105ab919061390d565b610f84565b005b6105ba611049565b6040516105c79190613614565b60405180910390f35b6105ea60048036038101906105e5919061393a565b61106f565b6040516105f791906135b8565b60405180910390f35b61060861108f565b60405161061591906137cf565b60405180910390f35b6106386004803603810190610633919061393a565b6110b3565b604051610645919061379b565b60405180910390f35b6106686004803603810190610663919061393a565b6110fc565b005b610672611286565b60405161067f919061379b565b60405180910390f35b61069061128c565b60405161069d91906137cf565b60405180910390f35b6106ae6112b0565b6040516106bb919061379b565b60405180910390f35b6106de60048036038101906106d9919061390d565b6112b6565b6040516106eb919061379b565b60405180910390f35b6106fc6112e2565b60405161070991906137cf565b60405180910390f35b61072c6004803603810190610727919061393a565b611306565b005b610736611407565b60405161074391906137cf565b60405180910390f35b6107666004803603810190610761919061390d565b61142b565b005b610782600480360381019061077d9190613967565b6114f0565b60405161078f9190613614565b60405180910390f35b6107b260048036038101906107ad9190613896565b61151f565b6040516107bf91906135b8565b60405180910390f35b6107e260048036038101906107dd919061390d565b611589565b005b6107ec61164e565b6040516107f991906136c8565b60405180910390f35b61080a6116e0565b604051610817919061379b565b60405180910390f35b61083a6004803603810190610835919061390d565b611722565b604051610847919061379b565b60405180910390f35b610858611753565b60405161086591906137cf565b60405180910390f35b6108886004803603810190610883919061374c565b61175a565b60405161089591906135b8565b60405180910390f35b6108b860048036038101906108b3919061374c565b61184e565b6040516108c591906135b8565b60405180910390f35b6108d661186c565b6040516108e391906137cf565b60405180910390f35b6108f4611890565b60405161090191906137cf565b60405180910390f35b6109126118b4565b60405161091f919061379b565b60405180910390f35b6109306118d8565b60405161093d9190613614565b60405180910390f35b610960600480360381019061095b9190613869565b6118fe565b60405161096d919061379b565b60405180910390f35b61097e611922565b60405161098b91906137cf565b60405180910390f35b6109ae60048036038101906109a99190613896565b611946565b005b6109ca60048036038101906109c591906139a7565b61196f565b6040516109d7919061379b565b60405180910390f35b6109fa60048036038101906109f5919061393a565b6119f6565b005b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a6f5750610a6e82611cba565b5b9050919050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060058054610aab90613a16565b80601f0160208091040260200160405190810160405280929190818152602001828054610ad790613a16565b8015610b245780601f10610af957610100808354040283529160200191610b24565b820191906000526020600020905b815481529060010190602001808311610b0757829003601f168201915b5050505050905090565b6000610b42610b3b611d34565b8484611d3c565b6001905092915050565b600d5481565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600454905090565b6000610bb1848484611f07565b6000600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610bfc611d34565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610c7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7390613aba565b60405180910390fd5b610c9985610c88611d34565b8584610c949190613b09565b611d3c565b60019150509392505050565b6000806000838152602001908152602001600020600101549050919050565b60135481565b610cd382610ca5565b610ce481610cdf611d34565b612803565b610cee83836128a0565b505050565b60006012905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b610d28611d34565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8c90613baf565b60405180910390fd5b610d9f82826128d4565b5050565b6000610e45610db0611d34565b848460036000610dbe611d34565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610e409190613bcf565b611d3c565b6001905092915050565b7f0000000000000000000000000000000000000000000000000000000000000000610e8181610e7c611d34565b612803565b7f000000000000000000000000000000000000000000000000000000000000000082610eab610b9a565b610eb59190613bcf565b1115610ef6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eed90613c71565b60405180910390fd5b610f008383612908565b505050565b6000806000610f5284600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612a5d565b9150915081610f6957610f64856110b3565b610f6b565b805b9250505092915050565b6000610f7f612b53565b905090565b7f0000000000000000000000000000000000000000000000000000000000000000610fb681610fb1611d34565b612803565b60008210158015610fc8575060328211155b611007576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffe90613cdd565b60405180910390fd5b81600c819055507f8d7156f97c3f3874c6f1255f65e1a12a7c50235ff12cfbaddaf2e4ded86281938260405161103d919061379b565b60405180910390a15050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60076020528060005260406000206000915054906101000a900460ff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b7f000000000000000000000000000000000000000000000000000000000000000061112e81611129611d34565b612803565b8173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff16141561119e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119590613d49565b60405180910390fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661122a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122190613db5565b60405180910390fd5b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600b5481565b7f000000000000000000000000000000000000000000000000000000000000000081565b600c5481565b60008060006112c6846011612a5d565b91509150816112d7576013546112d9565b805b92505050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000061133881611333611d34565b612803565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139f90613d49565b60405180910390fd5b6113d27f000000000000000000000000000000000000000000000000000000000000000083612b64565b6114037f00000000000000000000000000000000000000000000000000000000000000006113fe611d34565b610d20565b5050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000061145d81611458611d34565b612803565b6000821015801561146f575060328211155b6114ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a590613cdd565b60405180910390fd5b81600d819055507f1380c885556fcd87b5f3b8485f1c7b22359b2210baf03e22e74e4d61fcd40be0826040516114e4919061379b565b60405180910390a15050565b60006115178260016000868152602001908152602001600020612b7290919063ffffffff16565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b7f00000000000000000000000000000000000000000000000000000000000000006115bb816115b6611d34565b612803565b600082101580156115cd575060328211155b61160c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160390613cdd565b60405180910390fd5b81600b819055507f76e64a69bfc8a971ed674b8ab3748bcd02fd4b4ffa22af4f5b1b997bd3b2ad6782604051611642919061379b565b60405180910390a15050565b60606006805461165d90613a16565b80601f016020809104026020016040519081016040528092919081815260200182805461168990613a16565b80156116d65780601f106116ab576101008083540402835291602001916116d6565b820191906000526020600020905b8154815290600101906020018083116116b957829003601f168201915b5050505050905090565b60007f00000000000000000000000000000000000000000000000000000000000000006117148161170f611d34565b612803565b61171c612b8c565b91505090565b600080600061173284600f612a5d565b915091508161174857611743610b9a565b61174a565b805b92505050919050565b6000801b81565b60008060036000611769611d34565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611826576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181d90613e47565b60405180910390fd5b611843611831611d34565b85858461183e9190613b09565b611d3c565b600191505092915050565b600061186261185b611d34565b8484611f07565b6001905092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061191b60016000848152602001908152602001600020612be3565b9050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b61194f82610ca5565b6119608161195b611d34565b612803565b61196a83836128d4565b505050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b7f0000000000000000000000000000000000000000000000000000000000000000611a2881611a23611d34565b612803565b8173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff161415611a98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8f90613d49565b60405180910390fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611b25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1c90613eb3565b60405180910390fd5b6001600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6001816000016000828254019250508190555050565b611ba1828261151f565b611c7357600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611c18611d34565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000611c9f836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612bf8565b905092915050565b505050565b600081600001549050919050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611d2d5750611d2c82612c68565b5b9050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611dac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da390613f45565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1390613fd7565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611efa919061379b565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611f77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6e90613d49565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611fe7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fde90613d49565b60405180910390fd5b611ff2838383612cd2565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806120935750600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1561222f576000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561211f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211690614043565b60405180910390fd5b818161212b9190613b09565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121bd9190613bcf565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612221919061379b565b60405180910390a3506127fe565b620186a08111612274576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226b906140af565b60405180910390fd5b60007f0000000000000000000000000000000000000000000000000000000000000000600b54836122a591906140cf565b6122af9190614158565b905060007f0000000000000000000000000000000000000000000000000000000000000000600c54846122e291906140cf565b6122ec9190614158565b905060007f0000000000000000000000000000000000000000000000000000000000000000600d548561231f91906140cf565b6123299190614158565b9050600081838561233a9190613bcf565b6123449190613bcf565b8561234f9190613b09565b90506000600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050858110156123d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cf90614043565b60405180910390fd5b85816123e49190613b09565b600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508460026000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124989190613bcf565b925050819055508360026000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125109190613bcf565b9250508190555083601360008282546125299190613bcf565b925050819055508260026000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125a19190613bcf565b9250508190555081600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125f79190613bcf565b92505081905550600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8760405161267d919061379b565b60405180910390a3600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051612704919061379b565b60405180910390a3600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161278b919061379b565b60405180910390a38673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516127f0919061379b565b60405180910390a350505050505b505050565b61280d828261151f565b61289c576128328173ffffffffffffffffffffffffffffffffffffffff166014612e15565b6128408360001c6020612e15565b60405160200161285192919061425d565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289391906136c8565b60405180910390fd5b5050565b6128aa8282611b97565b6128cf8160016000858152602001908152602001600020611c7790919063ffffffff16565b505050565b6128de8282613051565b612903816001600085815260200190815260200160002061313290919063ffffffff16565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612978576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296f906142e3565b60405180910390fd5b61298460008383612cd2565b80600460008282546129969190613bcf565b9250508190555080600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129ec9190613bcf565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612a51919061379b565b60405180910390a35050565b60008060008411612aa3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9a9061434f565b60405180910390fd5b612aab612b53565b841115612aed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae4906143bb565b60405180910390fd5b6000612b05858560000161316290919063ffffffff16565b90508360000180549050811415612b23576000809250925050612b4c565b6001846001018281548110612b3b57612b3a6143db565b5b906000526020600020015492509250505b9250929050565b6000612b5f6014611cac565b905090565b612b6e82826128a0565b5050565b6000612b81836000018361323c565b60001c905092915050565b6000612b986014611b81565b6000612ba2612b53565b9050807f492fbd8cfdd942203e99f6bc74253a1e1f5791b0644612279e778349f353b19842604051612bd4919061379b565b60405180910390a28091505090565b6000612bf182600001613267565b9050919050565b6000612c048383613278565b612c5d578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050612c62565b600090505b92915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612cdd838383611ca7565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612d2857612d1b8261329b565b612d236132ee565b612e10565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d7357612d668361329b565b612d6e6132ee565b612e0f565b612d7b613302565b612d848361329b565b612d8d8261329b565b612db8600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661329b565b612de3600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661329b565b612e0e600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661329b565b5b5b505050565b606060006002836002612e2891906140cf565b612e329190613bcf565b67ffffffffffffffff811115612e4b57612e4a61440a565b5b6040519080825280601f01601f191660200182016040528015612e7d5781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612eb557612eb46143db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612f1957612f186143db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002612f5991906140cf565b612f639190613bcf565b90505b6001811115613003577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612fa557612fa46143db565b5b1a60f81b828281518110612fbc57612fbb6143db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080612ffc90614439565b9050612f66565b5060008414613047576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161303e906144af565b60405180910390fd5b8091505092915050565b61305b828261151f565b1561312e57600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506130d3611d34565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b600061315a836000018373ffffffffffffffffffffffffffffffffffffffff1660001b613311565b905092915050565b600080838054905014156131795760009050613236565b600080848054905090505b808210156131dd5760006131988383613425565b9050848682815481106131ae576131ad6143db565b5b906000526020600020015411156131c7578091506131d7565b6001816131d49190613bcf565b92505b50613184565b600082118015613215575083856001846131f79190613b09565b81548110613208576132076143db565b5b9060005260206000200154145b15613230576001826132279190613b09565b92505050613236565b81925050505b92915050565b6000826000018281548110613254576132536143db565b5b9060005260206000200154905092915050565b600081600001805490509050919050565b600080836001016000848152602001908152602001600020541415905092915050565b6132eb600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206132e6836110b3565b61344b565b50565b613300600f6132fb610b9a565b61344b565b565b61330f601160135461344b565b565b600080836001016000848152602001908152602001600020549050600081146134195760006001826133439190613b09565b905060006001866000018054905061335b9190613b09565b90508181146133ca57600086600001828154811061337c5761337b6143db565b5b90600052602060002001549050808760000184815481106133a05761339f6143db565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b856000018054806133de576133dd6144cf565b5b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061341f565b60009150505b92915050565b600060028284186134369190614158565b8284166134439190613bcf565b905092915050565b6000613455612b53565b905080613464846000016134c6565b10156134c15782600001819080600181540180825580915050600190039060005260206000200160009091909190915055826001018290806001815401808255809150506001900390600052602060002001600090919091909150555b505050565b600080828054905014156134dd576000905061350e565b81600183805490506134ef9190613b09565b81548110613500576134ff6143db565b5b906000526020600020015490505b919050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61354d81613518565b811461355857600080fd5b50565b60008135905061356a81613544565b92915050565b60006020828403121561358657613585613513565b5b60006135948482850161355b565b91505092915050565b60008115159050919050565b6135b28161359d565b82525050565b60006020820190506135cd60008301846135a9565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006135fe826135d3565b9050919050565b61360e816135f3565b82525050565b60006020820190506136296000830184613605565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561366957808201518184015260208101905061364e565b83811115613678576000848401525b50505050565b6000601f19601f8301169050919050565b600061369a8261362f565b6136a4818561363a565b93506136b481856020860161364b565b6136bd8161367e565b840191505092915050565b600060208201905081810360008301526136e2818461368f565b905092915050565b6136f3816135f3565b81146136fe57600080fd5b50565b600081359050613710816136ea565b92915050565b6000819050919050565b61372981613716565b811461373457600080fd5b50565b60008135905061374681613720565b92915050565b6000806040838503121561376357613762613513565b5b600061377185828601613701565b925050602061378285828601613737565b9150509250929050565b61379581613716565b82525050565b60006020820190506137b0600083018461378c565b92915050565b6000819050919050565b6137c9816137b6565b82525050565b60006020820190506137e460008301846137c0565b92915050565b60008060006060848603121561380357613802613513565b5b600061381186828701613701565b935050602061382286828701613701565b925050604061383386828701613737565b9150509250925092565b613846816137b6565b811461385157600080fd5b50565b6000813590506138638161383d565b92915050565b60006020828403121561387f5761387e613513565b5b600061388d84828501613854565b91505092915050565b600080604083850312156138ad576138ac613513565b5b60006138bb85828601613854565b92505060206138cc85828601613701565b9150509250929050565b600060ff82169050919050565b6138ec816138d6565b82525050565b600060208201905061390760008301846138e3565b92915050565b60006020828403121561392357613922613513565b5b600061393184828501613737565b91505092915050565b6000602082840312156139505761394f613513565b5b600061395e84828501613701565b91505092915050565b6000806040838503121561397e5761397d613513565b5b600061398c85828601613854565b925050602061399d85828601613737565b9150509250929050565b600080604083850312156139be576139bd613513565b5b60006139cc85828601613701565b92505060206139dd85828601613701565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613a2e57607f821691505b60208210811415613a4257613a416139e7565b5b50919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b6000613aa460288361363a565b9150613aaf82613a48565b604082019050919050565b60006020820190508181036000830152613ad381613a97565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613b1482613716565b9150613b1f83613716565b925082821015613b3257613b31613ada565b5b828203905092915050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000613b99602f8361363a565b9150613ba482613b3d565b604082019050919050565b60006020820190508181036000830152613bc881613b8c565b9050919050565b6000613bda82613716565b9150613be583613716565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613c1a57613c19613ada565b5b828201905092915050565b7f536b79626c6f636b733a20636170000000000000000000000000000000000000600082015250565b6000613c5b600e8361363a565b9150613c6682613c25565b602082019050919050565b60006020820190508181036000830152613c8a81613c4e565b9050919050565b7f536b79626c6f636b733a207461782072616e6765203020746f20352500000000600082015250565b6000613cc7601c8361363a565b9150613cd282613c91565b602082019050919050565b60006020820190508181036000830152613cf681613cba565b9050919050565b7f536b79626c6f636b733a207a65726f2061646472657373000000000000000000600082015250565b6000613d3360178361363a565b9150613d3e82613cfd565b602082019050919050565b60006020820190508181036000830152613d6281613d26565b9050919050565b7f536b79626c6f636b733a206e6f742077686974656c6973746564000000000000600082015250565b6000613d9f601a8361363a565b9150613daa82613d69565b602082019050919050565b60006020820190508181036000830152613dce81613d92565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000613e3160258361363a565b9150613e3c82613dd5565b604082019050919050565b60006020820190508181036000830152613e6081613e24565b9050919050565b7f536b79626c6f636b733a20616c72656164792061646465640000000000000000600082015250565b6000613e9d60188361363a565b9150613ea882613e67565b602082019050919050565b60006020820190508181036000830152613ecc81613e90565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613f2f60248361363a565b9150613f3a82613ed3565b604082019050919050565b60006020820190508181036000830152613f5e81613f22565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000613fc160228361363a565b9150613fcc82613f65565b604082019050919050565b60006020820190508181036000830152613ff081613fb4565b9050919050565b7f536b79626c6f636b733a20657863656564732062616c616e6365000000000000600082015250565b600061402d601a8361363a565b915061403882613ff7565b602082019050919050565b6000602082019050818103600083015261405c81614020565b9050919050565b7f536b79426c6f636b733a206d696e696d756d20616d6f756e7400000000000000600082015250565b600061409960198361363a565b91506140a482614063565b602082019050919050565b600060208201905081810360008301526140c88161408c565b9050919050565b60006140da82613716565b91506140e583613716565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561411e5761411d613ada565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061416382613716565b915061416e83613716565b92508261417e5761417d614129565b5b828204905092915050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b60006141ca601783614189565b91506141d582614194565b601782019050919050565b60006141eb8261362f565b6141f58185614189565b935061420581856020860161364b565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000614247601183614189565b915061425282614211565b601182019050919050565b6000614268826141bd565b915061427482856141e0565b915061427f8261423a565b915061428b82846141e0565b91508190509392505050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006142cd601f8361363a565b91506142d882614297565b602082019050919050565b600060208201905081810360008301526142fc816142c0565b9050919050565b7f4552433230536e617073686f743a206964206973203000000000000000000000600082015250565b600061433960168361363a565b915061434482614303565b602082019050919050565b600060208201905081810360008301526143688161432c565b9050919050565b7f4552433230536e617073686f743a206e6f6e6578697374656e74206964000000600082015250565b60006143a5601d8361363a565b91506143b08261436f565b602082019050919050565b600060208201905081810360008301526143d481614398565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600061444482613716565b9150600082141561445857614457613ada565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b600061449960208361363a565b91506144a482614463565b602082019050919050565b600060208201905081810360008301526144c88161448c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220dde40956612f70f8525f32654082f649b9df969c6b70f5b0e91a60297c5fb75464736f6c634300080900330000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000ea0000000000000000000000000152a3d85fb7d4dbeb407e6bbdcd1cfe4845d2db7000000000000000000000000e54b918e19163c9eeb0af36f502bc8be2fc27477000000000000000000000000b0612f90e5b7aaa1887bc71ed21cbea72acb8046000000000000000000000000f7f42998bff417ea5aceb4d252bdcfabc78fb907000000000000000000000000c5d13027ae19f5a41fef1335a33ca4434c457fbb0000000000000000000000000000000000000000000000000000000000000009536b79626c6f636b730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000449534b59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000067000000000000000000000000bc46e99f434bab242ea1a0c57f54a2e05681e45e0000000000000000000000006768f0f8a212f5b5b8081131323772ea7ea2a33100000000000000000000000039446c6743d9188b846813819161e9d66020a0ed000000000000000000000000826bcea879e4496ed163bcc128926b5627e1f08d00000000000000000000000018a878afa68ff540ddf520bab2f1f9470f7184100000000000000000000000004f20cb7a1d567a54350a18dacb0cc803aebb4483000000000000000000000000aa4237995a8ddb6fc30c3c5bc4cb9c0c15ee7c4f000000000000000000000000f3c9ea1658997558e5eb76ae49bed1a9832e18010000000000000000000000001d945e9ea2da9cb9a36b3e53e78b5e22bea1e3d90000000000000000000000005e2b1f3acf6473fa61c513ac5a5719d398ff42af00000000000000000000000099d218ad1ec627e786c50c5ffe6732410b8c78fd00000000000000000000000001aa498bbf2642d93c8d65e149d534c97676173a000000000000000000000000ac2e1d3f07a6b7b3c16f8811e77b36b1b5c3c40b0000000000000000000000009f7b75c2205d10f6f1ffc73c33ddb805167d27d5000000000000000000000000d378d1142830a9816128d8815137a070e3ede8f8000000000000000000000000f14c9dbdb31b0a18af44fcf97ed12b0abfe1b92e000000000000000000000000a02086f132afc89d0e129f323811f19bd13f79650000000000000000000000004da94e682326bd14997d1e1c62350654d8e44c5d0000000000000000000000008888888888e9997e64793849389a8faf5e8e547c000000000000000000000000eec32f9ba98938acafb3dff6100a546a50f25f9d000000000000000000000000cb47a9d150580b692f9e183c089abec12f14367000000000000000000000000026c68c139930de8d2901ef4dce945e8282f4e22c00000000000000000000000036b696aa9ba2aa4441e03baabeaa828f8ba7dc2c0000000000000000000000004549d92dd1e05df5615c0bb50163fc3a2d5b6933000000000000000000000000637e21ac11f0e0cf95d926d6bd2737b059a2858a000000000000000000000000874f5b8cc54ead6738a7bc3af7c16790808ffda9000000000000000000000000646f7044865bd507e3512f1847a901adc78bc74100000000000000000000000018701332a0126472ea908f54de9836ca1c5e96790000000000000000000000000e0b7c7e5c49525365b36a39b112f27965790e9e000000000000000000000000cec07cf2cace4ea5ca2b65e58b307e9efd2a2845000000000000000000000000cbc83a731e2baf8c26507ef952dee6889770c6f3000000000000000000000000151091122624bddb51ee8003d9c734aadc4dc8b0000000000000000000000000113b622f8f14d94cd449f4ecd2110cd5786a89be000000000000000000000000f5bc8bb5fa79b608f55afbe002884f736daf11ee000000000000000000000000e1476c3dd4be8c160636e68094d235922b9cdf1400000000000000000000000017ec047622c000df03599026a3b39871ec9384db000000000000000000000000f56345338cb4cddaf915ebef3bfde63e70fe30530000000000000000000000002031213cd107911515bbbdd98ce3b5c6db3e40120000000000000000000000002145dc142134d37b62a113e7293af87d0a186526000000000000000000000000707b8f3075521ee750c25ac3ba9a0b9b85e370c4000000000000000000000000f241607c45655a6bd0fee44e219890098e3dadbc000000000000000000000000644260a7987aa3510965213e7d244650c40fe343000000000000000000000000f130a864c042c908a9cf8f02cdbc1aca5220077b0000000000000000000000001a9edea0b12497f83487ef9598c24277ef87d85a0000000000000000000000002aff03a664417b7f83ff6385c0f7007afbe3d7c2000000000000000000000000f7069f11dc6b2d0f6a0654081cf951589e2b36c6000000000000000000000000825ffa5c61ed5a2f6a2320fba9dccc81fec6d9dc00000000000000000000000019be513f1ae7910d81ba80bdd0ac5426c2840fef0000000000000000000000004a3b614b084231d41f0ed71c7b748cfb6bbb83650000000000000000000000009efd227fc50dfd05eb42cdd3f1ff6918c44a79c20000000000000000000000007a1e1880b63daa7693d05b5a9192e8483dbfef640000000000000000000000009c0e9a8e72ab71aad7c85b3e1f87e3a70c8f4d140000000000000000000000007495e84fa5343fe83cc7d39df2d1152c53d2f294000000000000000000000000530588ece1281d1dbe1691f18ed8472bb898f8150000000000000000000000004a9456e33d53a32117ff84dcd7bf5892d247c0e800000000000000000000000009c8f3873109abc62929faed85942f13a31cda5d000000000000000000000000d34213ac9d09ce2b797ad17298f6a454985d506a00000000000000000000000060b01e7870acfbb6512634102f1463f8454389e9000000000000000000000000ce0d229d6dd09c2c92947294884cb9596bf427350000000000000000000000001fc36c331df289e592d2a75c3fa75da724fd81f50000000000000000000000008f4b3f9150412a0dc69a6cae03ffe6a6f9abe49c000000000000000000000000d9a80647011b1aa90b7d594688dea493c7ff139a0000000000000000000000008b835417cbe898ef8da0c8f79371bbb8e7a1daff000000000000000000000000ee36210d03f71f31dc949d907fcb44a8f9f97012000000000000000000000000be623350a8f95fddff5e00e0b0f0fe544e39f1c70000000000000000000000008b8a9bb77206977742a5bb2fd136e9f580395910000000000000000000000000d252960b0bf6b2848fdead80136db5f507f8be020000000000000000000000000d078bd6f56de18c0a97e714f390d9e63b2bb4d6000000000000000000000000e2b7fede2758d465019ce2c468f9414f274f262e000000000000000000000000c69a36f448d8a4b8282033ef6a209c2ff3d330c700000000000000000000000093ef9a16f2fb2871fc4ed6cb11bb8354330fb2d5000000000000000000000000ba3d570535360bc9383b28691c872959d4a34061000000000000000000000000f432eda8680d98aaa8270ecb4cfffc9c3b4534f0000000000000000000000000fc7035d84a37e65e6e8315747b85ca87d68e47220000000000000000000000009fe553de68865f425d8071c81640855a7c9613eb000000000000000000000000ca9061ae96f2728259e328aeda513270532fc43d000000000000000000000000714ea962c0c85e3ec05085c82fe702b11ca954490000000000000000000000000b23f70874c68410c240d1627b455c755638249300000000000000000000000081bfa4bff74e4af25ff112389527197d9cd2babd00000000000000000000000062c34149183c3426671c21bba85dc2588e57517d00000000000000000000000075069e4b3893094d521c52360ca701bfc3a4fbd600000000000000000000000017d903dc9530e5017a0fc3bcbcfe5c7c592b1d4c000000000000000000000000252378dd762da1eb778e1a3b6683f5457184ac98000000000000000000000000ac6de9f16c7b9b44c4e5c9073c3a10fa45ab4d5a0000000000000000000000006e14d4e15e245d6ecfe3181b08c2ff30d2c1da19000000000000000000000000be1b18279b30d524ca2d1c78a9a16cfc672d4fda000000000000000000000000edc5f04e825402c49e43bd475d864a8b5780bada0000000000000000000000004910198f711b06953b91f5665be6eb6b2d39c5a9000000000000000000000000be519c96c3bb0b240f3a5259dbc2ec461172ed97000000000000000000000000f5b88ba7ebe3b4cf5fe614237cc33ddcf6b991dd000000000000000000000000f8e2dabb64d034d405b6d5482eef5e9856d6bb9d00000000000000000000000032adf37e3be9a0b3682542042624b449790e92b900000000000000000000000008403f83a5da27fcecdbb12bb4649cd7f7a8c61f000000000000000000000000bcd8c157c75738086e9682cff7ef671e3d0e1e3100000000000000000000000021bd011b65aaf15add5909e97d33a9ad441bc873000000000000000000000000cc9ad85d1ec41b54f4d3a18ba750847d94f3c3d7000000000000000000000000b0612f90e5b7aaa1887bc71ed21cbea72acb8046000000000000000000000000d8d88bded611411097ccb83f9f32dc8b0523737c000000000000000000000000b940455e0ccdc8c471f7524072a9ac9996a91cb9000000000000000000000000b4b6f5f044b2de24dece953afa59bb540366fc5d000000000000000000000000c20d2fcebbda545ecbb24d7c217469bd6d854888000000000000000000000000998a16c18c8f75cf613012908ea561ee53eae59b000000000000000000000000575a5e79b2cec8265515cb536250dd8afcd5ccd00000000000000000000000000000000000000000000000000000000000000067000000000000000000000000000000000000000000004f68ca6d8cd91c60000000000000000000000000000000000000000000000000215a1794693c77700000000000000000000000000000000000000000000000000fe1c215e8f838e00000000000000000000000000000000000000000000000000fe1c215e8f838e000000000000000000000000000000000000000000000000013da329b6336471800000000000000000000000000000000000000000000000023bbf4b14c2e7ff800000000000000000000000000000000000000000000000023bbf4b14c2e7ff800000000000000000000000000000000000000000000000028b2815824fc11be00000000000000000000000000000000000000000000000003fc815b00e0188400000000000000000000000000000000000000000000000005f4a8c8375d155400000000000000000000000000000000000000000000000003f870857a3e0e380000000000000000000000000000000000000000000000003f870857a3e0e3800000000000000000000000000000000000000000000000000a56cefd5e102f4400000000000000000000000000000000000000000000000001fc3842bd1f071c00000000000000000000000000000000000000000000000003fc815b00e0188400000000000000000000000000000000000000000000000019cedb639a935c6c00000000000000000000000000000000000000000000000009ed194db19b238c00000000000000000000000000000000000000000000000003f870857a3e0e380000000000000000000000000000000000000000000000001dc33b138e2f605800000000000000000000000000000000000000000000000009ed194db19b238c00000000000000000000000000000000000000000000000001fc3842bd1f071c0000000000000000000000000000000000000000000000000ee3a5f48a68b55200000000000000000000000000000000000000000000000009ed194db19b238c00000000000000000000000000000000000000000000000009ed194db19b238c00000000000000000000000000000000000000000000000001fc3842bd1f071c00000000000000000000000000000000000000000000000007f0e10af47c1c7000000000000000000000000000000000000000000000000001fc3842bd1f071c00000000000000000000000000000000000000000000000004f68ca6d8cd91c600000000000000000000000000000000000000000000000027b46536c66c8e3000000000000000000000000000000000000000000000000001fc3842bd1f071c0000000000000000000000000000000000000000000000000261dd1ce2f2088800000000000000000000000000000000000000000000000002fa54641bae8aaa00000000000000000000000000000000000000000000000001fc3842bd1f071c00000000000000000000000000000000000000000000000001fc3842bd1f071c00000000000000000000000000000000000000000000000003f870857a3e0e3800000000000000000000000000000000000000000000000013da329b6336471800000000000000000000000000000000000000000000000003f870857a3e0e3800000000000000000000000000000000000000000000000000cb49b44ba602d8000000000000000000000000000000000000000000000000023efeeb72c3dd4800000000000000000000000000000000000000000000000009ed194db19b238c00000000000000000000000000000000000000000000000000ae401136a4d0db00000000000000000000000000000000000000000000000002c781f708c509f400000000000000000000000000000000000000000000000000ae401136a4d0db000000000000000000000000000000000000000000000000012268b272de251e00000000000000000000000000000000000000000000000000742ab6246de09200000000000000000000000000000000000000000000000000742ab6246de0920000000000000000000000000000000000000000000000000065a4da25d3016c00000000000000000000000000000000000000000000000001fc3842bd1f071c00000000000000000000000000000000000000000000000000742ab6246de0920000000000000000000000000000000000000000000000000098774738bc822200000000000000000000000000000000000000000000000000cb49b44ba602d800000000000000000000000000000000000000000000000009ed194db19b238c00000000000000000000000000000000000000000000000001fc3842bd1f071c00000000000000000000000000000000000000000000000003f870857a3e0e3800000000000000000000000000000000000000000000000001fc3842bd1f071c00000000000000000000000000000000000000000000000000ae401136a4d0db00000000000000000000000000000000000000000000000009ed194db19b238c00000000000000000000000000000000000000000000000009ed194db19b238c00000000000000000000000000000000000000000000000003f870857a3e0e3800000000000000000000000000000000000000000000000009ed194db19b238c0000000000000000000000000000000000000000000000000032d26d12e980b60000000000000000000000000000000000000000000000000032d26d12e980b6000000000000000000000000000000000000000000000000001d09a3150131fd00000000000000000000000000000000000000000000000000b1e07dc231427d00000000000000000000000000000000000000000000000009ed194db19b238c0000000000000000000000000000000000000000000000001dc74be914d16aa40000000000000000000000000000000000000000000000001fc3842bd1f071c00000000000000000000000000000000000000000000000000065a4da25d3016c0000000000000000000000000000000000000000000000000163c0fb846284fa000000000000000000000000000000000000000000000000007f0e10af47c1c70000000000000000000000000000000000000000000000000098774738bc822200000000000000000000000000000000000000000000000000e4b2ead51ac3330000000000000000000000000000000000000000000000000098774738bc822200000000000000000000000000000000000000000000000000fe1c215e8f838e0000000000000000000000000000000000000000000000000098774738bc822200000000000000000000000000000000000000000000000000b1e07dc231427d0000000000000000000000000000000000000000000000000032d26d12e980b600000000000000000000000000000000000000000000000000b1e07dc231427d000000000000000000000000000000000000000000000000002107bc71ca4d820000000000000000000000000000000000000000000000000032d26d12e980b60000000000000000000000000000000000000000000000000028a857425466f800000000000000000000000000000000000000000000000000cb49b44ba602d80000000000000000000000000000000000000000000000000130ee8e7179044400000000000000000000000000000000000000000000000001969368974c05b000000000000000000000000000000000000000000000000000b1e07dc231427d0000000000000000000000000000000000000000000000000032d26d12e980b600000000000000000000000000000000000000000000000027b46536c66c8e3000000000000000000000000000000000000000000000000005f4a8c8375d155400000000000000000000000000000000000000000000000002fa54641bae8aaa0000000000000000000000000000000000000000000000000098774738bc822200000000000000000000000000000000000000000000000000cb49b44ba602d80000000000000000000000000000000000000000000000000032d26d12e980b600000000000000000000000000000000000000000000000001178557e80443e900000000000000000000000000000000000000000000000001fc3842bd1f071c000000000000000000000000000000000000000000000000015c7e0d851515670000000000000000000000000000000000000000000000000163c0fb846284fa000000000000000000000000000000000000000000000000152d02c7e14af680000000000000000000000000000000000000000000000001acc3de76d8001208000000000000000000000000000000000000000000000000943b1377290cbd800000000000000000000000000000000000000000000000002a5a058fc295ed0000000000000000000000000000000000000000000000000026805f9fa6f344a800000000000000000000000000000000000000000000000009a017e7e9bcd12a00000000000000000000000000000000000000000000000009a017e7e9bcd12a0000

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000ea0000000000000000000000000152a3d85fb7d4dbeb407e6bbdcd1cfe4845d2db7000000000000000000000000e54b918e19163c9eeb0af36f502bc8be2fc27477000000000000000000000000b0612f90e5b7aaa1887bc71ed21cbea72acb8046000000000000000000000000f7f42998bff417ea5aceb4d252bdcfabc78fb907000000000000000000000000c5d13027ae19f5a41fef1335a33ca4434c457fbb0000000000000000000000000000000000000000000000000000000000000009536b79626c6f636b730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000449534b59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000067000000000000000000000000bc46e99f434bab242ea1a0c57f54a2e05681e45e0000000000000000000000006768f0f8a212f5b5b8081131323772ea7ea2a33100000000000000000000000039446c6743d9188b846813819161e9d66020a0ed000000000000000000000000826bcea879e4496ed163bcc128926b5627e1f08d00000000000000000000000018a878afa68ff540ddf520bab2f1f9470f7184100000000000000000000000004f20cb7a1d567a54350a18dacb0cc803aebb4483000000000000000000000000aa4237995a8ddb6fc30c3c5bc4cb9c0c15ee7c4f000000000000000000000000f3c9ea1658997558e5eb76ae49bed1a9832e18010000000000000000000000001d945e9ea2da9cb9a36b3e53e78b5e22bea1e3d90000000000000000000000005e2b1f3acf6473fa61c513ac5a5719d398ff42af00000000000000000000000099d218ad1ec627e786c50c5ffe6732410b8c78fd00000000000000000000000001aa498bbf2642d93c8d65e149d534c97676173a000000000000000000000000ac2e1d3f07a6b7b3c16f8811e77b36b1b5c3c40b0000000000000000000000009f7b75c2205d10f6f1ffc73c33ddb805167d27d5000000000000000000000000d378d1142830a9816128d8815137a070e3ede8f8000000000000000000000000f14c9dbdb31b0a18af44fcf97ed12b0abfe1b92e000000000000000000000000a02086f132afc89d0e129f323811f19bd13f79650000000000000000000000004da94e682326bd14997d1e1c62350654d8e44c5d0000000000000000000000008888888888e9997e64793849389a8faf5e8e547c000000000000000000000000eec32f9ba98938acafb3dff6100a546a50f25f9d000000000000000000000000cb47a9d150580b692f9e183c089abec12f14367000000000000000000000000026c68c139930de8d2901ef4dce945e8282f4e22c00000000000000000000000036b696aa9ba2aa4441e03baabeaa828f8ba7dc2c0000000000000000000000004549d92dd1e05df5615c0bb50163fc3a2d5b6933000000000000000000000000637e21ac11f0e0cf95d926d6bd2737b059a2858a000000000000000000000000874f5b8cc54ead6738a7bc3af7c16790808ffda9000000000000000000000000646f7044865bd507e3512f1847a901adc78bc74100000000000000000000000018701332a0126472ea908f54de9836ca1c5e96790000000000000000000000000e0b7c7e5c49525365b36a39b112f27965790e9e000000000000000000000000cec07cf2cace4ea5ca2b65e58b307e9efd2a2845000000000000000000000000cbc83a731e2baf8c26507ef952dee6889770c6f3000000000000000000000000151091122624bddb51ee8003d9c734aadc4dc8b0000000000000000000000000113b622f8f14d94cd449f4ecd2110cd5786a89be000000000000000000000000f5bc8bb5fa79b608f55afbe002884f736daf11ee000000000000000000000000e1476c3dd4be8c160636e68094d235922b9cdf1400000000000000000000000017ec047622c000df03599026a3b39871ec9384db000000000000000000000000f56345338cb4cddaf915ebef3bfde63e70fe30530000000000000000000000002031213cd107911515bbbdd98ce3b5c6db3e40120000000000000000000000002145dc142134d37b62a113e7293af87d0a186526000000000000000000000000707b8f3075521ee750c25ac3ba9a0b9b85e370c4000000000000000000000000f241607c45655a6bd0fee44e219890098e3dadbc000000000000000000000000644260a7987aa3510965213e7d244650c40fe343000000000000000000000000f130a864c042c908a9cf8f02cdbc1aca5220077b0000000000000000000000001a9edea0b12497f83487ef9598c24277ef87d85a0000000000000000000000002aff03a664417b7f83ff6385c0f7007afbe3d7c2000000000000000000000000f7069f11dc6b2d0f6a0654081cf951589e2b36c6000000000000000000000000825ffa5c61ed5a2f6a2320fba9dccc81fec6d9dc00000000000000000000000019be513f1ae7910d81ba80bdd0ac5426c2840fef0000000000000000000000004a3b614b084231d41f0ed71c7b748cfb6bbb83650000000000000000000000009efd227fc50dfd05eb42cdd3f1ff6918c44a79c20000000000000000000000007a1e1880b63daa7693d05b5a9192e8483dbfef640000000000000000000000009c0e9a8e72ab71aad7c85b3e1f87e3a70c8f4d140000000000000000000000007495e84fa5343fe83cc7d39df2d1152c53d2f294000000000000000000000000530588ece1281d1dbe1691f18ed8472bb898f8150000000000000000000000004a9456e33d53a32117ff84dcd7bf5892d247c0e800000000000000000000000009c8f3873109abc62929faed85942f13a31cda5d000000000000000000000000d34213ac9d09ce2b797ad17298f6a454985d506a00000000000000000000000060b01e7870acfbb6512634102f1463f8454389e9000000000000000000000000ce0d229d6dd09c2c92947294884cb9596bf427350000000000000000000000001fc36c331df289e592d2a75c3fa75da724fd81f50000000000000000000000008f4b3f9150412a0dc69a6cae03ffe6a6f9abe49c000000000000000000000000d9a80647011b1aa90b7d594688dea493c7ff139a0000000000000000000000008b835417cbe898ef8da0c8f79371bbb8e7a1daff000000000000000000000000ee36210d03f71f31dc949d907fcb44a8f9f97012000000000000000000000000be623350a8f95fddff5e00e0b0f0fe544e39f1c70000000000000000000000008b8a9bb77206977742a5bb2fd136e9f580395910000000000000000000000000d252960b0bf6b2848fdead80136db5f507f8be020000000000000000000000000d078bd6f56de18c0a97e714f390d9e63b2bb4d6000000000000000000000000e2b7fede2758d465019ce2c468f9414f274f262e000000000000000000000000c69a36f448d8a4b8282033ef6a209c2ff3d330c700000000000000000000000093ef9a16f2fb2871fc4ed6cb11bb8354330fb2d5000000000000000000000000ba3d570535360bc9383b28691c872959d4a34061000000000000000000000000f432eda8680d98aaa8270ecb4cfffc9c3b4534f0000000000000000000000000fc7035d84a37e65e6e8315747b85ca87d68e47220000000000000000000000009fe553de68865f425d8071c81640855a7c9613eb000000000000000000000000ca9061ae96f2728259e328aeda513270532fc43d000000000000000000000000714ea962c0c85e3ec05085c82fe702b11ca954490000000000000000000000000b23f70874c68410c240d1627b455c755638249300000000000000000000000081bfa4bff74e4af25ff112389527197d9cd2babd00000000000000000000000062c34149183c3426671c21bba85dc2588e57517d00000000000000000000000075069e4b3893094d521c52360ca701bfc3a4fbd600000000000000000000000017d903dc9530e5017a0fc3bcbcfe5c7c592b1d4c000000000000000000000000252378dd762da1eb778e1a3b6683f5457184ac98000000000000000000000000ac6de9f16c7b9b44c4e5c9073c3a10fa45ab4d5a0000000000000000000000006e14d4e15e245d6ecfe3181b08c2ff30d2c1da19000000000000000000000000be1b18279b30d524ca2d1c78a9a16cfc672d4fda000000000000000000000000edc5f04e825402c49e43bd475d864a8b5780bada0000000000000000000000004910198f711b06953b91f5665be6eb6b2d39c5a9000000000000000000000000be519c96c3bb0b240f3a5259dbc2ec461172ed97000000000000000000000000f5b88ba7ebe3b4cf5fe614237cc33ddcf6b991dd000000000000000000000000f8e2dabb64d034d405b6d5482eef5e9856d6bb9d00000000000000000000000032adf37e3be9a0b3682542042624b449790e92b900000000000000000000000008403f83a5da27fcecdbb12bb4649cd7f7a8c61f000000000000000000000000bcd8c157c75738086e9682cff7ef671e3d0e1e3100000000000000000000000021bd011b65aaf15add5909e97d33a9ad441bc873000000000000000000000000cc9ad85d1ec41b54f4d3a18ba750847d94f3c3d7000000000000000000000000b0612f90e5b7aaa1887bc71ed21cbea72acb8046000000000000000000000000d8d88bded611411097ccb83f9f32dc8b0523737c000000000000000000000000b940455e0ccdc8c471f7524072a9ac9996a91cb9000000000000000000000000b4b6f5f044b2de24dece953afa59bb540366fc5d000000000000000000000000c20d2fcebbda545ecbb24d7c217469bd6d854888000000000000000000000000998a16c18c8f75cf613012908ea561ee53eae59b000000000000000000000000575a5e79b2cec8265515cb536250dd8afcd5ccd00000000000000000000000000000000000000000000000000000000000000067000000000000000000000000000000000000000000004f68ca6d8cd91c60000000000000000000000000000000000000000000000000215a1794693c77700000000000000000000000000000000000000000000000000fe1c215e8f838e00000000000000000000000000000000000000000000000000fe1c215e8f838e000000000000000000000000000000000000000000000000013da329b6336471800000000000000000000000000000000000000000000000023bbf4b14c2e7ff800000000000000000000000000000000000000000000000023bbf4b14c2e7ff800000000000000000000000000000000000000000000000028b2815824fc11be00000000000000000000000000000000000000000000000003fc815b00e0188400000000000000000000000000000000000000000000000005f4a8c8375d155400000000000000000000000000000000000000000000000003f870857a3e0e380000000000000000000000000000000000000000000000003f870857a3e0e3800000000000000000000000000000000000000000000000000a56cefd5e102f4400000000000000000000000000000000000000000000000001fc3842bd1f071c00000000000000000000000000000000000000000000000003fc815b00e0188400000000000000000000000000000000000000000000000019cedb639a935c6c00000000000000000000000000000000000000000000000009ed194db19b238c00000000000000000000000000000000000000000000000003f870857a3e0e380000000000000000000000000000000000000000000000001dc33b138e2f605800000000000000000000000000000000000000000000000009ed194db19b238c00000000000000000000000000000000000000000000000001fc3842bd1f071c0000000000000000000000000000000000000000000000000ee3a5f48a68b55200000000000000000000000000000000000000000000000009ed194db19b238c00000000000000000000000000000000000000000000000009ed194db19b238c00000000000000000000000000000000000000000000000001fc3842bd1f071c00000000000000000000000000000000000000000000000007f0e10af47c1c7000000000000000000000000000000000000000000000000001fc3842bd1f071c00000000000000000000000000000000000000000000000004f68ca6d8cd91c600000000000000000000000000000000000000000000000027b46536c66c8e3000000000000000000000000000000000000000000000000001fc3842bd1f071c0000000000000000000000000000000000000000000000000261dd1ce2f2088800000000000000000000000000000000000000000000000002fa54641bae8aaa00000000000000000000000000000000000000000000000001fc3842bd1f071c00000000000000000000000000000000000000000000000001fc3842bd1f071c00000000000000000000000000000000000000000000000003f870857a3e0e3800000000000000000000000000000000000000000000000013da329b6336471800000000000000000000000000000000000000000000000003f870857a3e0e3800000000000000000000000000000000000000000000000000cb49b44ba602d8000000000000000000000000000000000000000000000000023efeeb72c3dd4800000000000000000000000000000000000000000000000009ed194db19b238c00000000000000000000000000000000000000000000000000ae401136a4d0db00000000000000000000000000000000000000000000000002c781f708c509f400000000000000000000000000000000000000000000000000ae401136a4d0db000000000000000000000000000000000000000000000000012268b272de251e00000000000000000000000000000000000000000000000000742ab6246de09200000000000000000000000000000000000000000000000000742ab6246de0920000000000000000000000000000000000000000000000000065a4da25d3016c00000000000000000000000000000000000000000000000001fc3842bd1f071c00000000000000000000000000000000000000000000000000742ab6246de0920000000000000000000000000000000000000000000000000098774738bc822200000000000000000000000000000000000000000000000000cb49b44ba602d800000000000000000000000000000000000000000000000009ed194db19b238c00000000000000000000000000000000000000000000000001fc3842bd1f071c00000000000000000000000000000000000000000000000003f870857a3e0e3800000000000000000000000000000000000000000000000001fc3842bd1f071c00000000000000000000000000000000000000000000000000ae401136a4d0db00000000000000000000000000000000000000000000000009ed194db19b238c00000000000000000000000000000000000000000000000009ed194db19b238c00000000000000000000000000000000000000000000000003f870857a3e0e3800000000000000000000000000000000000000000000000009ed194db19b238c0000000000000000000000000000000000000000000000000032d26d12e980b60000000000000000000000000000000000000000000000000032d26d12e980b6000000000000000000000000000000000000000000000000001d09a3150131fd00000000000000000000000000000000000000000000000000b1e07dc231427d00000000000000000000000000000000000000000000000009ed194db19b238c0000000000000000000000000000000000000000000000001dc74be914d16aa40000000000000000000000000000000000000000000000001fc3842bd1f071c00000000000000000000000000000000000000000000000000065a4da25d3016c0000000000000000000000000000000000000000000000000163c0fb846284fa000000000000000000000000000000000000000000000000007f0e10af47c1c70000000000000000000000000000000000000000000000000098774738bc822200000000000000000000000000000000000000000000000000e4b2ead51ac3330000000000000000000000000000000000000000000000000098774738bc822200000000000000000000000000000000000000000000000000fe1c215e8f838e0000000000000000000000000000000000000000000000000098774738bc822200000000000000000000000000000000000000000000000000b1e07dc231427d0000000000000000000000000000000000000000000000000032d26d12e980b600000000000000000000000000000000000000000000000000b1e07dc231427d000000000000000000000000000000000000000000000000002107bc71ca4d820000000000000000000000000000000000000000000000000032d26d12e980b60000000000000000000000000000000000000000000000000028a857425466f800000000000000000000000000000000000000000000000000cb49b44ba602d80000000000000000000000000000000000000000000000000130ee8e7179044400000000000000000000000000000000000000000000000001969368974c05b000000000000000000000000000000000000000000000000000b1e07dc231427d0000000000000000000000000000000000000000000000000032d26d12e980b600000000000000000000000000000000000000000000000027b46536c66c8e3000000000000000000000000000000000000000000000000005f4a8c8375d155400000000000000000000000000000000000000000000000002fa54641bae8aaa0000000000000000000000000000000000000000000000000098774738bc822200000000000000000000000000000000000000000000000000cb49b44ba602d80000000000000000000000000000000000000000000000000032d26d12e980b600000000000000000000000000000000000000000000000001178557e80443e900000000000000000000000000000000000000000000000001fc3842bd1f071c000000000000000000000000000000000000000000000000015c7e0d851515670000000000000000000000000000000000000000000000000163c0fb846284fa000000000000000000000000000000000000000000000000152d02c7e14af680000000000000000000000000000000000000000000000001acc3de76d8001208000000000000000000000000000000000000000000000000943b1377290cbd800000000000000000000000000000000000000000000000002a5a058fc295ed0000000000000000000000000000000000000000000000000026805f9fa6f344a800000000000000000000000000000000000000000000000009a017e7e9bcd12a00000000000000000000000000000000000000000000000009a017e7e9bcd12a0000

-----Decoded View---------------
Arg [0] : name (string): Skyblocks
Arg [1] : symbol (string): ISKY
Arg [2] : _initialBeneficiaries (address[]): 0xbc46e99f434bab242ea1a0c57f54a2e05681e45e,0x6768f0f8a212f5b5b8081131323772ea7ea2a331,0x39446c6743d9188b846813819161e9d66020a0ed,0x826bcea879e4496ed163bcc128926b5627e1f08d,0x18a878afa68ff540ddf520bab2f1f9470f718410,0x4f20cb7a1d567a54350a18dacb0cc803aebb4483,0xaa4237995a8ddb6fc30c3c5bc4cb9c0c15ee7c4f,0xf3c9ea1658997558e5eb76ae49bed1a9832e1801,0x1d945e9ea2da9cb9a36b3e53e78b5e22bea1e3d9,0x5e2b1f3acf6473fa61c513ac5a5719d398ff42af,0x99d218ad1ec627e786c50c5ffe6732410b8c78fd,0x01aa498bbf2642d93c8d65e149d534c97676173a,0xac2e1d3f07a6b7b3c16f8811e77b36b1b5c3c40b,0x9f7b75c2205d10f6f1ffc73c33ddb805167d27d5,0xd378d1142830a9816128d8815137a070e3ede8f8,0xf14c9dbdb31b0a18af44fcf97ed12b0abfe1b92e,0xa02086f132afc89d0e129f323811f19bd13f7965,0x4da94e682326bd14997d1e1c62350654d8e44c5d,0x8888888888e9997e64793849389a8faf5e8e547c,0xeec32f9ba98938acafb3dff6100a546a50f25f9d,0xcb47a9d150580b692f9e183c089abec12f143670,0x26c68c139930de8d2901ef4dce945e8282f4e22c,0x36b696aa9ba2aa4441e03baabeaa828f8ba7dc2c,0x4549d92dd1e05df5615c0bb50163fc3a2d5b6933,0x637e21ac11f0e0cf95d926d6bd2737b059a2858a,0x874f5b8cc54ead6738a7bc3af7c16790808ffda9,0x646f7044865bd507e3512f1847a901adc78bc741,0x18701332a0126472ea908f54de9836ca1c5e9679,0x0e0b7c7e5c49525365b36a39b112f27965790e9e,0xcec07cf2cace4ea5ca2b65e58b307e9efd2a2845,0xcbc83a731e2baf8c26507ef952dee6889770c6f3,0x151091122624bddb51ee8003d9c734aadc4dc8b0,0x113b622f8f14d94cd449f4ecd2110cd5786a89be,0xf5bc8bb5fa79b608f55afbe002884f736daf11ee,0xe1476c3dd4be8c160636e68094d235922b9cdf14,0x17ec047622c000df03599026a3b39871ec9384db,0xf56345338cb4cddaf915ebef3bfde63e70fe3053,0x2031213cd107911515bbbdd98ce3b5c6db3e4012,0x2145dc142134d37b62a113e7293af87d0a186526,0x707b8f3075521ee750c25ac3ba9a0b9b85e370c4,0xf241607c45655a6bd0fee44e219890098e3dadbc,0x644260a7987aa3510965213e7d244650c40fe343,0xf130a864c042c908a9cf8f02cdbc1aca5220077b,0x1a9edea0b12497f83487ef9598c24277ef87d85a,0x2aff03a664417b7f83ff6385c0f7007afbe3d7c2,0xf7069f11dc6b2d0f6a0654081cf951589e2b36c6,0x825ffa5c61ed5a2f6a2320fba9dccc81fec6d9dc,0x19be513f1ae7910d81ba80bdd0ac5426c2840fef,0x4a3b614b084231d41f0ed71c7b748cfb6bbb8365,0x9efd227fc50dfd05eb42cdd3f1ff6918c44a79c2,0x7a1e1880b63daa7693d05b5a9192e8483dbfef64,0x9c0e9a8e72ab71aad7c85b3e1f87e3a70c8f4d14,0x7495e84fa5343fe83cc7d39df2d1152c53d2f294,0x530588ece1281d1dbe1691f18ed8472bb898f815,0x4a9456e33d53a32117ff84dcd7bf5892d247c0e8,0x09c8f3873109abc62929faed85942f13a31cda5d,0xd34213ac9d09ce2b797ad17298f6a454985d506a,0x60b01e7870acfbb6512634102f1463f8454389e9,0xce0d229d6dd09c2c92947294884cb9596bf42735,0x1fc36c331df289e592d2a75c3fa75da724fd81f5,0x8f4b3f9150412a0dc69a6cae03ffe6a6f9abe49c,0xd9a80647011b1aa90b7d594688dea493c7ff139a,0x8b835417cbe898ef8da0c8f79371bbb8e7a1daff,0xee36210d03f71f31dc949d907fcb44a8f9f97012,0xbe623350a8f95fddff5e00e0b0f0fe544e39f1c7,0x8b8a9bb77206977742a5bb2fd136e9f580395910,0xd252960b0bf6b2848fdead80136db5f507f8be02,0x0d078bd6f56de18c0a97e714f390d9e63b2bb4d6,0xe2b7fede2758d465019ce2c468f9414f274f262e,0xc69a36f448d8a4b8282033ef6a209c2ff3d330c7,0x93ef9a16f2fb2871fc4ed6cb11bb8354330fb2d5,0xba3d570535360bc9383b28691c872959d4a34061,0xf432eda8680d98aaa8270ecb4cfffc9c3b4534f0,0xfc7035d84a37e65e6e8315747b85ca87d68e4722,0x9fe553de68865f425d8071c81640855a7c9613eb,0xca9061ae96f2728259e328aeda513270532fc43d,0x714ea962c0c85e3ec05085c82fe702b11ca95449,0x0b23f70874c68410c240d1627b455c7556382493,0x81bfa4bff74e4af25ff112389527197d9cd2babd,0x62c34149183c3426671c21bba85dc2588e57517d,0x75069e4b3893094d521c52360ca701bfc3a4fbd6,0x17d903dc9530e5017a0fc3bcbcfe5c7c592b1d4c,0x252378dd762da1eb778e1a3b6683f5457184ac98,0xac6de9f16c7b9b44c4e5c9073c3a10fa45ab4d5a,0x6e14d4e15e245d6ecfe3181b08c2ff30d2c1da19,0xbe1b18279b30d524ca2d1c78a9a16cfc672d4fda,0xedc5f04e825402c49e43bd475d864a8b5780bada,0x4910198f711b06953b91f5665be6eb6b2d39c5a9,0xbe519c96c3bb0b240f3a5259dbc2ec461172ed97,0xf5b88ba7ebe3b4cf5fe614237cc33ddcf6b991dd,0xf8e2dabb64d034d405b6d5482eef5e9856d6bb9d,0x32adf37e3be9a0b3682542042624b449790e92b9,0x08403f83a5da27fcecdbb12bb4649cd7f7a8c61f,0xbcd8c157c75738086e9682cff7ef671e3d0e1e31,0x21bd011b65aaf15add5909e97d33a9ad441bc873,0xcc9ad85d1ec41b54f4d3a18ba750847d94f3c3d7,0xb0612f90e5b7aaa1887bc71ed21cbea72acb8046,0xd8d88bded611411097ccb83f9f32dc8b0523737c,0xb940455e0ccdc8c471f7524072a9ac9996a91cb9,0xb4b6f5f044b2de24dece953afa59bb540366fc5d,0xc20d2fcebbda545ecbb24d7c217469bd6d854888,0x998a16c18c8f75cf613012908ea561ee53eae59b,0x575a5e79b2cec8265515cb536250dd8afcd5ccd0
Arg [3] : _amounts (uint256[]): 375000000000000000000000,157500000000000000000000,75000000000000000000000,75000000000000000000000,93750000000000000000000,168750000000000000000000,168750000000000000000000,192187500000000000000000,18825000000000000000000,28125000000000000000000,18750000000000000000000,300000000000000000000000,48825000000000000000000,9375000000000000000000,18825000000000000000000,121875000000000000000000,46875000000000000000000,18750000000000000000000,140550000000000000000000,46875000000000000000000,9375000000000000000000,70312500000000000000000,46875000000000000000000,46875000000000000000000,9375000000000000000000,37500000000000000000000,9375000000000000000000,23437500000000000000000,187500000000000000000000,9375000000000000000000,11250000000000000000000,14062500000000000000000,9375000000000000000000,9375000000000000000000,18750000000000000000000,93750000000000000000000,18750000000000000000000,3750000000000000000000,10606800000000000000000,46875000000000000000000,3214350000000000000000,13125000000000000000000,3214350000000000000000,5357100000000000000000,2142900000000000000000,2142900000000000000000,1875000000000000000000,9375000000000000000000,2142900000000000000000,2812500000000000000000,3750000000000000000000,46875000000000000000000,9375000000000000000000,18750000000000000000000,9375000000000000000000,3214350000000000000000,46875000000000000000000,46875000000000000000000,18750000000000000000000,46875000000000000000000,937500000000000000000,937500000000000000000,535650000000000000000,3281250000000000000000,46875000000000000000000,140625000000000000000000,150000000000000000000000,1875000000000000000000,6562500000000000000000,2343750000000000000000,2812500000000000000000,4218750000000000000000,2812500000000000000000,4687500000000000000000,2812500000000000000000,3281250000000000000000,937500000000000000000,3281250000000000000000,609300000000000000000,937500000000000000000,750000000000000000000,3750000000000000000000,5625000000000000000000,7500000000000000000000,3281250000000000000000,937500000000000000000,187500000000000000000000,28125000000000000000000,14062500000000000000000,2812500000000000000000,3750000000000000000000,937500000000000000000,5156250000000000000000,9375000000000000000000,6428550000000000000000,6562500000000000000000,100000000000000000000000,2024786000000000000000000,700000000000000000000000,200000000000000000000000,181818000000000000000000,45454500000000000000000,45454500000000000000000
Arg [4] : _claimPool (address): 0x152a3d85fb7d4dbeb407e6bbdcd1cfe4845d2db7
Arg [5] : _developmentTreasury (address): 0xe54b918e19163c9eeb0af36f502bc8be2fc27477
Arg [6] : _playToEarn (address): 0xb0612f90e5b7aaa1887bc71ed21cbea72acb8046
Arg [7] : _tokenStaking (address): 0xf7f42998bff417ea5aceb4d252bdcfabc78fb907
Arg [8] : governance (address): 0xc5d13027ae19f5a41fef1335a33ca4434c457fbb

-----Encoded View---------------
221 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [2] : 00000000000000000000000000000000000000000000000000000000000001a0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000ea0
Arg [4] : 000000000000000000000000152a3d85fb7d4dbeb407e6bbdcd1cfe4845d2db7
Arg [5] : 000000000000000000000000e54b918e19163c9eeb0af36f502bc8be2fc27477
Arg [6] : 000000000000000000000000b0612f90e5b7aaa1887bc71ed21cbea72acb8046
Arg [7] : 000000000000000000000000f7f42998bff417ea5aceb4d252bdcfabc78fb907
Arg [8] : 000000000000000000000000c5d13027ae19f5a41fef1335a33ca4434c457fbb
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [10] : 536b79626c6f636b730000000000000000000000000000000000000000000000
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [12] : 49534b5900000000000000000000000000000000000000000000000000000000
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000067
Arg [14] : 000000000000000000000000bc46e99f434bab242ea1a0c57f54a2e05681e45e
Arg [15] : 0000000000000000000000006768f0f8a212f5b5b8081131323772ea7ea2a331
Arg [16] : 00000000000000000000000039446c6743d9188b846813819161e9d66020a0ed
Arg [17] : 000000000000000000000000826bcea879e4496ed163bcc128926b5627e1f08d
Arg [18] : 00000000000000000000000018a878afa68ff540ddf520bab2f1f9470f718410
Arg [19] : 0000000000000000000000004f20cb7a1d567a54350a18dacb0cc803aebb4483
Arg [20] : 000000000000000000000000aa4237995a8ddb6fc30c3c5bc4cb9c0c15ee7c4f
Arg [21] : 000000000000000000000000f3c9ea1658997558e5eb76ae49bed1a9832e1801
Arg [22] : 0000000000000000000000001d945e9ea2da9cb9a36b3e53e78b5e22bea1e3d9
Arg [23] : 0000000000000000000000005e2b1f3acf6473fa61c513ac5a5719d398ff42af
Arg [24] : 00000000000000000000000099d218ad1ec627e786c50c5ffe6732410b8c78fd
Arg [25] : 00000000000000000000000001aa498bbf2642d93c8d65e149d534c97676173a
Arg [26] : 000000000000000000000000ac2e1d3f07a6b7b3c16f8811e77b36b1b5c3c40b
Arg [27] : 0000000000000000000000009f7b75c2205d10f6f1ffc73c33ddb805167d27d5
Arg [28] : 000000000000000000000000d378d1142830a9816128d8815137a070e3ede8f8
Arg [29] : 000000000000000000000000f14c9dbdb31b0a18af44fcf97ed12b0abfe1b92e
Arg [30] : 000000000000000000000000a02086f132afc89d0e129f323811f19bd13f7965
Arg [31] : 0000000000000000000000004da94e682326bd14997d1e1c62350654d8e44c5d
Arg [32] : 0000000000000000000000008888888888e9997e64793849389a8faf5e8e547c
Arg [33] : 000000000000000000000000eec32f9ba98938acafb3dff6100a546a50f25f9d
Arg [34] : 000000000000000000000000cb47a9d150580b692f9e183c089abec12f143670
Arg [35] : 00000000000000000000000026c68c139930de8d2901ef4dce945e8282f4e22c
Arg [36] : 00000000000000000000000036b696aa9ba2aa4441e03baabeaa828f8ba7dc2c
Arg [37] : 0000000000000000000000004549d92dd1e05df5615c0bb50163fc3a2d5b6933
Arg [38] : 000000000000000000000000637e21ac11f0e0cf95d926d6bd2737b059a2858a
Arg [39] : 000000000000000000000000874f5b8cc54ead6738a7bc3af7c16790808ffda9
Arg [40] : 000000000000000000000000646f7044865bd507e3512f1847a901adc78bc741
Arg [41] : 00000000000000000000000018701332a0126472ea908f54de9836ca1c5e9679
Arg [42] : 0000000000000000000000000e0b7c7e5c49525365b36a39b112f27965790e9e
Arg [43] : 000000000000000000000000cec07cf2cace4ea5ca2b65e58b307e9efd2a2845
Arg [44] : 000000000000000000000000cbc83a731e2baf8c26507ef952dee6889770c6f3
Arg [45] : 000000000000000000000000151091122624bddb51ee8003d9c734aadc4dc8b0
Arg [46] : 000000000000000000000000113b622f8f14d94cd449f4ecd2110cd5786a89be
Arg [47] : 000000000000000000000000f5bc8bb5fa79b608f55afbe002884f736daf11ee
Arg [48] : 000000000000000000000000e1476c3dd4be8c160636e68094d235922b9cdf14
Arg [49] : 00000000000000000000000017ec047622c000df03599026a3b39871ec9384db
Arg [50] : 000000000000000000000000f56345338cb4cddaf915ebef3bfde63e70fe3053
Arg [51] : 0000000000000000000000002031213cd107911515bbbdd98ce3b5c6db3e4012
Arg [52] : 0000000000000000000000002145dc142134d37b62a113e7293af87d0a186526
Arg [53] : 000000000000000000000000707b8f3075521ee750c25ac3ba9a0b9b85e370c4
Arg [54] : 000000000000000000000000f241607c45655a6bd0fee44e219890098e3dadbc
Arg [55] : 000000000000000000000000644260a7987aa3510965213e7d244650c40fe343
Arg [56] : 000000000000000000000000f130a864c042c908a9cf8f02cdbc1aca5220077b
Arg [57] : 0000000000000000000000001a9edea0b12497f83487ef9598c24277ef87d85a
Arg [58] : 0000000000000000000000002aff03a664417b7f83ff6385c0f7007afbe3d7c2
Arg [59] : 000000000000000000000000f7069f11dc6b2d0f6a0654081cf951589e2b36c6
Arg [60] : 000000000000000000000000825ffa5c61ed5a2f6a2320fba9dccc81fec6d9dc
Arg [61] : 00000000000000000000000019be513f1ae7910d81ba80bdd0ac5426c2840fef
Arg [62] : 0000000000000000000000004a3b614b084231d41f0ed71c7b748cfb6bbb8365
Arg [63] : 0000000000000000000000009efd227fc50dfd05eb42cdd3f1ff6918c44a79c2
Arg [64] : 0000000000000000000000007a1e1880b63daa7693d05b5a9192e8483dbfef64
Arg [65] : 0000000000000000000000009c0e9a8e72ab71aad7c85b3e1f87e3a70c8f4d14
Arg [66] : 0000000000000000000000007495e84fa5343fe83cc7d39df2d1152c53d2f294
Arg [67] : 000000000000000000000000530588ece1281d1dbe1691f18ed8472bb898f815
Arg [68] : 0000000000000000000000004a9456e33d53a32117ff84dcd7bf5892d247c0e8
Arg [69] : 00000000000000000000000009c8f3873109abc62929faed85942f13a31cda5d
Arg [70] : 000000000000000000000000d34213ac9d09ce2b797ad17298f6a454985d506a
Arg [71] : 00000000000000000000000060b01e7870acfbb6512634102f1463f8454389e9
Arg [72] : 000000000000000000000000ce0d229d6dd09c2c92947294884cb9596bf42735
Arg [73] : 0000000000000000000000001fc36c331df289e592d2a75c3fa75da724fd81f5
Arg [74] : 0000000000000000000000008f4b3f9150412a0dc69a6cae03ffe6a6f9abe49c
Arg [75] : 000000000000000000000000d9a80647011b1aa90b7d594688dea493c7ff139a
Arg [76] : 0000000000000000000000008b835417cbe898ef8da0c8f79371bbb8e7a1daff
Arg [77] : 000000000000000000000000ee36210d03f71f31dc949d907fcb44a8f9f97012
Arg [78] : 000000000000000000000000be623350a8f95fddff5e00e0b0f0fe544e39f1c7
Arg [79] : 0000000000000000000000008b8a9bb77206977742a5bb2fd136e9f580395910
Arg [80] : 000000000000000000000000d252960b0bf6b2848fdead80136db5f507f8be02
Arg [81] : 0000000000000000000000000d078bd6f56de18c0a97e714f390d9e63b2bb4d6
Arg [82] : 000000000000000000000000e2b7fede2758d465019ce2c468f9414f274f262e
Arg [83] : 000000000000000000000000c69a36f448d8a4b8282033ef6a209c2ff3d330c7
Arg [84] : 00000000000000000000000093ef9a16f2fb2871fc4ed6cb11bb8354330fb2d5
Arg [85] : 000000000000000000000000ba3d570535360bc9383b28691c872959d4a34061
Arg [86] : 000000000000000000000000f432eda8680d98aaa8270ecb4cfffc9c3b4534f0
Arg [87] : 000000000000000000000000fc7035d84a37e65e6e8315747b85ca87d68e4722
Arg [88] : 0000000000000000000000009fe553de68865f425d8071c81640855a7c9613eb
Arg [89] : 000000000000000000000000ca9061ae96f2728259e328aeda513270532fc43d
Arg [90] : 000000000000000000000000714ea962c0c85e3ec05085c82fe702b11ca95449
Arg [91] : 0000000000000000000000000b23f70874c68410c240d1627b455c7556382493
Arg [92] : 00000000000000000000000081bfa4bff74e4af25ff112389527197d9cd2babd
Arg [93] : 00000000000000000000000062c34149183c3426671c21bba85dc2588e57517d
Arg [94] : 00000000000000000000000075069e4b3893094d521c52360ca701bfc3a4fbd6
Arg [95] : 00000000000000000000000017d903dc9530e5017a0fc3bcbcfe5c7c592b1d4c
Arg [96] : 000000000000000000000000252378dd762da1eb778e1a3b6683f5457184ac98
Arg [97] : 000000000000000000000000ac6de9f16c7b9b44c4e5c9073c3a10fa45ab4d5a
Arg [98] : 0000000000000000000000006e14d4e15e245d6ecfe3181b08c2ff30d2c1da19
Arg [99] : 000000000000000000000000be1b18279b30d524ca2d1c78a9a16cfc672d4fda
Arg [100] : 000000000000000000000000edc5f04e825402c49e43bd475d864a8b5780bada
Arg [101] : 0000000000000000000000004910198f711b06953b91f5665be6eb6b2d39c5a9
Arg [102] : 000000000000000000000000be519c96c3bb0b240f3a5259dbc2ec461172ed97
Arg [103] : 000000000000000000000000f5b88ba7ebe3b4cf5fe614237cc33ddcf6b991dd
Arg [104] : 000000000000000000000000f8e2dabb64d034d405b6d5482eef5e9856d6bb9d
Arg [105] : 00000000000000000000000032adf37e3be9a0b3682542042624b449790e92b9
Arg [106] : 00000000000000000000000008403f83a5da27fcecdbb12bb4649cd7f7a8c61f
Arg [107] : 000000000000000000000000bcd8c157c75738086e9682cff7ef671e3d0e1e31
Arg [108] : 00000000000000000000000021bd011b65aaf15add5909e97d33a9ad441bc873
Arg [109] : 000000000000000000000000cc9ad85d1ec41b54f4d3a18ba750847d94f3c3d7
Arg [110] : 000000000000000000000000b0612f90e5b7aaa1887bc71ed21cbea72acb8046
Arg [111] : 000000000000000000000000d8d88bded611411097ccb83f9f32dc8b0523737c
Arg [112] : 000000000000000000000000b940455e0ccdc8c471f7524072a9ac9996a91cb9
Arg [113] : 000000000000000000000000b4b6f5f044b2de24dece953afa59bb540366fc5d
Arg [114] : 000000000000000000000000c20d2fcebbda545ecbb24d7c217469bd6d854888
Arg [115] : 000000000000000000000000998a16c18c8f75cf613012908ea561ee53eae59b
Arg [116] : 000000000000000000000000575a5e79b2cec8265515cb536250dd8afcd5ccd0
Arg [117] : 0000000000000000000000000000000000000000000000000000000000000067
Arg [118] : 000000000000000000000000000000000000000000004f68ca6d8cd91c600000
Arg [119] : 00000000000000000000000000000000000000000000215a1794693c77700000
Arg [120] : 000000000000000000000000000000000000000000000fe1c215e8f838e00000
Arg [121] : 000000000000000000000000000000000000000000000fe1c215e8f838e00000
Arg [122] : 0000000000000000000000000000000000000000000013da329b633647180000
Arg [123] : 0000000000000000000000000000000000000000000023bbf4b14c2e7ff80000
Arg [124] : 0000000000000000000000000000000000000000000023bbf4b14c2e7ff80000
Arg [125] : 0000000000000000000000000000000000000000000028b2815824fc11be0000
Arg [126] : 0000000000000000000000000000000000000000000003fc815b00e018840000
Arg [127] : 0000000000000000000000000000000000000000000005f4a8c8375d15540000
Arg [128] : 0000000000000000000000000000000000000000000003f870857a3e0e380000
Arg [129] : 000000000000000000000000000000000000000000003f870857a3e0e3800000
Arg [130] : 000000000000000000000000000000000000000000000a56cefd5e102f440000
Arg [131] : 0000000000000000000000000000000000000000000001fc3842bd1f071c0000
Arg [132] : 0000000000000000000000000000000000000000000003fc815b00e018840000
Arg [133] : 0000000000000000000000000000000000000000000019cedb639a935c6c0000
Arg [134] : 0000000000000000000000000000000000000000000009ed194db19b238c0000
Arg [135] : 0000000000000000000000000000000000000000000003f870857a3e0e380000
Arg [136] : 000000000000000000000000000000000000000000001dc33b138e2f60580000
Arg [137] : 0000000000000000000000000000000000000000000009ed194db19b238c0000
Arg [138] : 0000000000000000000000000000000000000000000001fc3842bd1f071c0000
Arg [139] : 000000000000000000000000000000000000000000000ee3a5f48a68b5520000
Arg [140] : 0000000000000000000000000000000000000000000009ed194db19b238c0000
Arg [141] : 0000000000000000000000000000000000000000000009ed194db19b238c0000
Arg [142] : 0000000000000000000000000000000000000000000001fc3842bd1f071c0000
Arg [143] : 0000000000000000000000000000000000000000000007f0e10af47c1c700000
Arg [144] : 0000000000000000000000000000000000000000000001fc3842bd1f071c0000
Arg [145] : 0000000000000000000000000000000000000000000004f68ca6d8cd91c60000
Arg [146] : 0000000000000000000000000000000000000000000027b46536c66c8e300000
Arg [147] : 0000000000000000000000000000000000000000000001fc3842bd1f071c0000
Arg [148] : 000000000000000000000000000000000000000000000261dd1ce2f208880000
Arg [149] : 0000000000000000000000000000000000000000000002fa54641bae8aaa0000
Arg [150] : 0000000000000000000000000000000000000000000001fc3842bd1f071c0000
Arg [151] : 0000000000000000000000000000000000000000000001fc3842bd1f071c0000
Arg [152] : 0000000000000000000000000000000000000000000003f870857a3e0e380000
Arg [153] : 0000000000000000000000000000000000000000000013da329b633647180000
Arg [154] : 0000000000000000000000000000000000000000000003f870857a3e0e380000
Arg [155] : 0000000000000000000000000000000000000000000000cb49b44ba602d80000
Arg [156] : 00000000000000000000000000000000000000000000023efeeb72c3dd480000
Arg [157] : 0000000000000000000000000000000000000000000009ed194db19b238c0000
Arg [158] : 0000000000000000000000000000000000000000000000ae401136a4d0db0000
Arg [159] : 0000000000000000000000000000000000000000000002c781f708c509f40000
Arg [160] : 0000000000000000000000000000000000000000000000ae401136a4d0db0000
Arg [161] : 00000000000000000000000000000000000000000000012268b272de251e0000
Arg [162] : 0000000000000000000000000000000000000000000000742ab6246de0920000
Arg [163] : 0000000000000000000000000000000000000000000000742ab6246de0920000
Arg [164] : 000000000000000000000000000000000000000000000065a4da25d3016c0000
Arg [165] : 0000000000000000000000000000000000000000000001fc3842bd1f071c0000
Arg [166] : 0000000000000000000000000000000000000000000000742ab6246de0920000
Arg [167] : 000000000000000000000000000000000000000000000098774738bc82220000
Arg [168] : 0000000000000000000000000000000000000000000000cb49b44ba602d80000
Arg [169] : 0000000000000000000000000000000000000000000009ed194db19b238c0000
Arg [170] : 0000000000000000000000000000000000000000000001fc3842bd1f071c0000
Arg [171] : 0000000000000000000000000000000000000000000003f870857a3e0e380000
Arg [172] : 0000000000000000000000000000000000000000000001fc3842bd1f071c0000
Arg [173] : 0000000000000000000000000000000000000000000000ae401136a4d0db0000
Arg [174] : 0000000000000000000000000000000000000000000009ed194db19b238c0000
Arg [175] : 0000000000000000000000000000000000000000000009ed194db19b238c0000
Arg [176] : 0000000000000000000000000000000000000000000003f870857a3e0e380000
Arg [177] : 0000000000000000000000000000000000000000000009ed194db19b238c0000
Arg [178] : 000000000000000000000000000000000000000000000032d26d12e980b60000
Arg [179] : 000000000000000000000000000000000000000000000032d26d12e980b60000
Arg [180] : 00000000000000000000000000000000000000000000001d09a3150131fd0000
Arg [181] : 0000000000000000000000000000000000000000000000b1e07dc231427d0000
Arg [182] : 0000000000000000000000000000000000000000000009ed194db19b238c0000
Arg [183] : 000000000000000000000000000000000000000000001dc74be914d16aa40000
Arg [184] : 000000000000000000000000000000000000000000001fc3842bd1f071c00000
Arg [185] : 000000000000000000000000000000000000000000000065a4da25d3016c0000
Arg [186] : 000000000000000000000000000000000000000000000163c0fb846284fa0000
Arg [187] : 00000000000000000000000000000000000000000000007f0e10af47c1c70000
Arg [188] : 000000000000000000000000000000000000000000000098774738bc82220000
Arg [189] : 0000000000000000000000000000000000000000000000e4b2ead51ac3330000
Arg [190] : 000000000000000000000000000000000000000000000098774738bc82220000
Arg [191] : 0000000000000000000000000000000000000000000000fe1c215e8f838e0000
Arg [192] : 000000000000000000000000000000000000000000000098774738bc82220000
Arg [193] : 0000000000000000000000000000000000000000000000b1e07dc231427d0000
Arg [194] : 000000000000000000000000000000000000000000000032d26d12e980b60000
Arg [195] : 0000000000000000000000000000000000000000000000b1e07dc231427d0000
Arg [196] : 00000000000000000000000000000000000000000000002107bc71ca4d820000
Arg [197] : 000000000000000000000000000000000000000000000032d26d12e980b60000
Arg [198] : 000000000000000000000000000000000000000000000028a857425466f80000
Arg [199] : 0000000000000000000000000000000000000000000000cb49b44ba602d80000
Arg [200] : 000000000000000000000000000000000000000000000130ee8e717904440000
Arg [201] : 0000000000000000000000000000000000000000000001969368974c05b00000
Arg [202] : 0000000000000000000000000000000000000000000000b1e07dc231427d0000
Arg [203] : 000000000000000000000000000000000000000000000032d26d12e980b60000
Arg [204] : 0000000000000000000000000000000000000000000027b46536c66c8e300000
Arg [205] : 0000000000000000000000000000000000000000000005f4a8c8375d15540000
Arg [206] : 0000000000000000000000000000000000000000000002fa54641bae8aaa0000
Arg [207] : 000000000000000000000000000000000000000000000098774738bc82220000
Arg [208] : 0000000000000000000000000000000000000000000000cb49b44ba602d80000
Arg [209] : 000000000000000000000000000000000000000000000032d26d12e980b60000
Arg [210] : 0000000000000000000000000000000000000000000001178557e80443e90000
Arg [211] : 0000000000000000000000000000000000000000000001fc3842bd1f071c0000
Arg [212] : 00000000000000000000000000000000000000000000015c7e0d851515670000
Arg [213] : 000000000000000000000000000000000000000000000163c0fb846284fa0000
Arg [214] : 00000000000000000000000000000000000000000000152d02c7e14af6800000
Arg [215] : 00000000000000000000000000000000000000000001acc3de76d80012080000
Arg [216] : 00000000000000000000000000000000000000000000943b1377290cbd800000
Arg [217] : 000000000000000000000000000000000000000000002a5a058fc295ed000000
Arg [218] : 0000000000000000000000000000000000000000000026805f9fa6f344a80000
Arg [219] : 0000000000000000000000000000000000000000000009a017e7e9bcd12a0000
Arg [220] : 0000000000000000000000000000000000000000000009a017e7e9bcd12a0000


Deployed ByteCode Sourcemap

51171:16862:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44316:214;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51791:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5929:91;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8210:210;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51967:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51542:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51586:42;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7022:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8902:493;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27615:123;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52335:37;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28000:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6873:84;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52050:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29048:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9804:297;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56823:209;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63239:346;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62712:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60057:225;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51854:34;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51735:49;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51413:38;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7193:177;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61914:300;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51897:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51367:39;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51933:27;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64262:343;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51687:39;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56326:304;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51458:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60447:228;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45129:145;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26500:139;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59662:231;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6139:95;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60929:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63751:314;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25591:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10604:446;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7583:216;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51635:45;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51500:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52002:39;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51823:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45448:134;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51324:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28392:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7862:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61368:260;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44316:214;44401:4;44440:42;44425:57;;;:11;:57;;;;:97;;;;44486:36;44510:11;44486:23;:36::i;:::-;44425:97;44418:104;;44316:214;;;:::o;51791:25::-;;;;;;;;;;;;;:::o;5929:91::-;5974:13;6007:5;6000:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5929:91;:::o;8210:210::-;8329:4;8351:39;8360:12;:10;:12::i;:::-;8374:7;8383:6;8351:8;:39::i;:::-;8408:4;8401:11;;8210:210;;;;:::o;51967:28::-;;;;:::o;51542:35::-;;;:::o;51586:42::-;;;:::o;7022:108::-;7083:7;7110:12;;7103:19;;7022:108;:::o;8902:493::-;9042:4;9059:36;9069:6;9077:9;9088:6;9059:9;:36::i;:::-;9108:24;9135:11;:19;9147:6;9135:19;;;;;;;;;;;;;;;:33;9155:12;:10;:12::i;:::-;9135:33;;;;;;;;;;;;;;;;9108:60;;9221:6;9201:16;:26;;9179:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;9306:57;9315:6;9323:12;:10;:12::i;:::-;9356:6;9337:16;:25;;;;:::i;:::-;9306:8;:57::i;:::-;9383:4;9376:11;;;8902:493;;;;;:::o;27615:123::-;27681:7;27708:6;:12;27715:4;27708:12;;;;;;;;;;;:22;;;27701:29;;27615:123;;;:::o;52335:37::-;;;;:::o;28000:147::-;28083:18;28096:4;28083:12;:18::i;:::-;26082:30;26093:4;26099:12;:10;:12::i;:::-;26082:10;:30::i;:::-;28114:25:::1;28125:4;28131:7;28114:10;:25::i;:::-;28000:147:::0;;;:::o;6873:84::-;6922:5;6947:2;6940:9;;6873:84;:::o;52050:28::-;;;:::o;29048:218::-;29155:12;:10;:12::i;:::-;29144:23;;:7;:23;;;29136:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;29232:26;29244:4;29250:7;29232:11;:26::i;:::-;29048:218;;:::o;9804:297::-;9919:4;9941:130;9964:12;:10;:12::i;:::-;9991:7;10050:10;10013:11;:25;10025:12;:10;:12::i;:::-;10013:25;;;;;;;;;;;;;;;:34;10039:7;10013:34;;;;;;;;;;;;;;;;:47;;;;:::i;:::-;9941:8;:130::i;:::-;10089:4;10082:11;;9804:297;;;;:::o;56823:209::-;56906:11;26082:30;26093:4;26099:12;:10;:12::i;:::-;26082:10;:30::i;:::-;56969:3:::1;56959:6;56943:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:29;;56935:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;57002:22;57008:7;57017:6;57002:5;:22::i;:::-;56823:209:::0;;;:::o;63239:346::-;63364:7;63390:16;63408:13;63425:92;63448:10;63473:24;:33;63498:7;63473:33;;;;;;;;;;;;;;;63425:8;:92::i;:::-;63389:128;;;;63537:11;:40;;63559:18;63569:7;63559:9;:18::i;:::-;63537:40;;;63551:5;63537:40;63530:47;;;;63239:346;;;;:::o;62712:113::-;62767:7;62794:23;:21;:23::i;:::-;62787:30;;62712:113;:::o;60057:225::-;60114:10;26082:30;26093:4;26099:12;:10;:12::i;:::-;26082:10;:30::i;:::-;60153:1:::1;60145:4;:9;;:23;;;;;60166:2;60158:4;:10;;60145:23;60137:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;60227:4;60212:12;:19;;;;60249:25;60269:4;60249:25;;;;;;:::i;:::-;;;;;;;;60057:225:::0;;:::o;51854:34::-;;;;;;;;;;;;;:::o;51735:49::-;;;;;;;;;;;;;;;;;;;;;;:::o;51413:38::-;;;:::o;7193:177::-;7312:7;7344:9;:18;7354:7;7344:18;;;;;;;;;;;;;;;;7337:25;;7193:177;;;:::o;61914:300::-;61993:14;26082:30;26093:4;26099:12;:10;:12::i;:::-;26082:10;:30::i;:::-;62047:8:::1;62033:22;;62041:1;62033:22;;;;62025:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;62102:17;:27;62120:8;62102:27;;;;;;;;;;;;;;;;;;;;;;;;;62094:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;62201:5;62171:17;:27;62189:8;62171:27;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;61914:300:::0;;:::o;51897:29::-;;;;:::o;51367:39::-;;;:::o;51933:27::-;;;;:::o;64262:343::-;64382:7;64408:16;64426:13;64443:90;64466:10;64491:31;64443:8;:90::i;:::-;64407:126;;;;64553:11;:44;;64575:22;;64553:44;;;64567:5;64553:44;64546:51;;;;64262:343;;;:::o;51687:39::-;;;:::o;56326:304::-;56411:17;26082:30;26093:4;26099:12;:10;:12::i;:::-;26082:10;:30::i;:::-;56483:1:::1;56454:31;;:17;:31;;;;56446:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;56524:42;56535:11;56548:17;56524:10;:42::i;:::-;56577:45;56590:17;56609:12;:10;:12::i;:::-;56577;:45::i;:::-;56326:304:::0;;:::o;51458:35::-;;;:::o;60447:228::-;60505:10;26082:30;26093:4;26099:12;:10;:12::i;:::-;26082:10;:30::i;:::-;60544:1:::1;60536:4;:9;;:23;;;;;60557:2;60549:4;:10;;60536:23;60528:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;60619:4;60603:13;:20;;;;60641:26;60662:4;60641:26;;;;;;:::i;:::-;;;;;;;;60447:228:::0;;:::o;45129:145::-;45211:7;45238:28;45260:5;45238:12;:18;45251:4;45238:18;;;;;;;;;;;:21;;:28;;;;:::i;:::-;45231:35;;45129:145;;;;:::o;26500:139::-;26578:4;26602:6;:12;26609:4;26602:12;;;;;;;;;;;:20;;:29;26623:7;26602:29;;;;;;;;;;;;;;;;;;;;;;;;;26595:36;;26500:139;;;;:::o;59662:231::-;59721:10;26082:30;26093:4;26099:12;:10;:12::i;:::-;26082:10;:30::i;:::-;59760:1:::1;59752:4;:9;;:23;;;;;59773:2;59765:4;:10;;59752:23;59744:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;59836:4;59819:14;:21;;;;59858:27;59880:4;59858:27;;;;;;:::i;:::-;;;;;;;;59662:231:::0;;:::o;6139:95::-;6186:13;6219:7;6212:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6139:95;:::o;60929:108::-;60991:7;60967:13;26082:30;26093:4;26099:12;:10;:12::i;:::-;26082:10;:30::i;:::-;61018:11:::1;:9;:11::i;:::-;61011:18;;60929:108:::0;;:::o;63751:314::-;63861:7;63887:16;63905:13;63922:80;63945:10;63970:21;63922:8;:80::i;:::-;63886:116;;;;64022:11;:35;;64044:13;:11;:13::i;:::-;64022:35;;;64036:5;64022:35;64015:42;;;;63751:314;;;:::o;25591:49::-;25636:4;25591:49;;;:::o;10604:446::-;10724:4;10746:24;10773:11;:25;10785:12;:10;:12::i;:::-;10773:25;;;;;;;;;;;;;;;:34;10799:7;10773:34;;;;;;;;;;;;;;;;10746:61;;10860:15;10840:16;:35;;10818:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;10951:67;10960:12;:10;:12::i;:::-;10974:7;11002:15;10983:16;:34;;;;:::i;:::-;10951:8;:67::i;:::-;11038:4;11031:11;;;10604:446;;;;:::o;7583:216::-;7705:4;7727:42;7737:12;:10;:12::i;:::-;7751:9;7762:6;7727:9;:42::i;:::-;7787:4;7780:11;;7583:216;;;;:::o;51635:45::-;;;:::o;51500:35::-;;;:::o;52002:39::-;;;:::o;51823:24::-;;;;;;;;;;;;;:::o;45448:134::-;45520:7;45547:27;:12;:18;45560:4;45547:18;;;;;;;;;;;:25;:27::i;:::-;45540:34;;45448:134;;;:::o;51324:36::-;;;:::o;28392:149::-;28476:18;28489:4;28476:12;:18::i;:::-;26082:30;26093:4;26099:12;:10;:12::i;:::-;26082:10;:30::i;:::-;28507:26:::1;28519:4;28525:7;28507:11;:26::i;:::-;28392:149:::0;;;:::o;7862:201::-;7996:7;8028:11;:18;8040:5;8028:18;;;;;;;;;;;;;;;:27;8047:7;8028:27;;;;;;;;;;;;;;;;8021:34;;7862:201;;;;:::o;61368:260::-;61423:14;26082:30;26093:4;26099:12;:10;:12::i;:::-;26082:10;:30::i;:::-;61472:5:::1;61458:19;;61466:1;61458:19;;;;61450:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;61525:17;:24;61543:5;61525:24;;;;;;;;;;;;;;;;;;;;;;;;;61524:25;61516:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;61616:4;61589:17;:24;61607:5;61589:24;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;61368:260:::0;;:::o;49985:127::-;50092:1;50074:7;:14;;;:19;;;;;;;;;;;49985:127;:::o;30549:238::-;30633:22;30641:4;30647:7;30633;:22::i;:::-;30628:152;;30704:4;30672:6;:12;30679:4;30672:12;;;;;;;;;;;:20;;:29;30693:7;30672:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;30755:12;:10;:12::i;:::-;30728:40;;30746:7;30728:40;;30740:4;30728:40;;;;;;;;;;30628:152;30549:238;;:::o;39043:152::-;39113:4;39137:50;39142:3;:10;;39178:5;39162:23;;39154:32;;39137:4;:50::i;:::-;39130:57;;39043:152;;;;:::o;15083:125::-;;;;:::o;49863:114::-;49928:7;49955;:14;;;49948:21;;49863:114;;;:::o;26204:204::-;26289:4;26328:32;26313:47;;;:11;:47;;;;:87;;;;26364:36;26388:11;26364:23;:36::i;:::-;26313:87;26306:94;;26204:204;;;:::o;3691:98::-;3744:7;3771:10;3764:17;;3691:98;:::o;14100:380::-;14253:1;14236:19;;:5;:19;;;;14228:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14334:1;14315:21;;:7;:21;;;;14307:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14418:6;14388:11;:18;14400:5;14388:18;;;;;;;;;;;;;;;:27;14407:7;14388:27;;;;;;;;;;;;;;;:36;;;;14456:7;14440:32;;14449:5;14440:32;;;14465:6;14440:32;;;;;;:::i;:::-;;;;;;;;14100:380;;;:::o;57508:1988::-;57682:1;57664:20;;:6;:20;;;;57656:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;57752:1;57731:23;;:9;:23;;;;57723:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;57795:47;57816:6;57824:9;57835:6;57795:20;:47::i;:::-;57859:17;:25;57877:6;57859:25;;;;;;;;;;;;;;;;;;;;;;;;;:57;;;;57888:17;:28;57906:9;57888:28;;;;;;;;;;;;;;;;;;;;;;;;;57859:57;57855:1634;;;57965:21;57989:9;:17;57999:6;57989:17;;;;;;;;;;;;;;;;57965:41;;58046:6;58029:13;:23;;58021:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;58136:6;58120:13;:22;;;;:::i;:::-;58100:9;:17;58110:6;58100:17;;;;;;;;;;;;;;;:42;;;;58181:6;58157:9;:20;58167:9;58157:20;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;58226:9;58209:35;;58218:6;58209:35;;;58237:6;58209:35;;;;;;:::i;:::-;;;;;;;;57918:338;57855:1634;;;58323:3;58314:6;:12;58306:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;58371:29;58449:14;58413;;58404:6;:23;;;;:::i;:::-;58403:61;;;;:::i;:::-;58371:93;;58479:19;58530:14;58512:12;;58502:6;:23;;;;:::i;:::-;58501:44;;;;:::i;:::-;58479:66;;58560:20;58630:14;58594:13;;58584:6;:24;;;;:::i;:::-;58583:62;;;;:::i;:::-;58560:85;;58660:12;58743;58727:11;58702:21;:37;;;;:::i;:::-;:54;;;;:::i;:::-;58675:6;:82;;;;:::i;:::-;58660:97;;58774:21;58798:9;:17;58808:6;58798:17;;;;;;;;;;;;;;;;58774:41;;58855:6;58838:13;:23;;58830:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;58943:6;58927:13;:22;;;;:::i;:::-;58907:9;:17;58917:6;58907:17;;;;;;;;;;;;;;;:42;;;;58998:21;58964:9;:30;58974:19;;;;;;;;;;;58964:30;;;;;;;;;;;;;;;;:55;;;;;;;:::i;:::-;;;;;;;;59060:11;59036:9;:20;59046:9;;;;;;;;;;;59036:20;;;;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;;;;;59112:11;59086:22;;:37;;;;;;;:::i;:::-;;;;;;;;59165:12;59140:9;:21;59150:10;;;;;;;;;;;59140:21;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;59216:4;59192:9;:20;59202:9;59192:20;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;59259:19;;;;;;;;;;;59242:60;;59251:6;59242:60;;;59280:21;59242:60;;;;;;:::i;:::-;;;;;;;;59339:9;;;;;;;;;;;59322:40;;59331:6;59322:40;;;59350:11;59322:40;;;;;;:::i;:::-;;;;;;;;59399:10;;;;;;;;;;;59382:42;;59391:6;59382:42;;;59411:12;59382:42;;;;;;:::i;:::-;;;;;;;;59461:9;59444:33;;59453:6;59444:33;;;59472:4;59444:33;;;;;;:::i;:::-;;;;;;;;58262:1227;;;;;57855:1634;57508:1988;;;:::o;26929:497::-;27010:22;27018:4;27024:7;27010;:22::i;:::-;27005:414;;27198:41;27226:7;27198:41;;27236:2;27198:19;:41::i;:::-;27312:38;27340:4;27332:13;;27347:2;27312:19;:38::i;:::-;27103:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;27049:358;;;;;;;;;;;:::i;:::-;;;;;;;;27005:414;26929:497;;:::o;45675:169::-;45763:31;45780:4;45786:7;45763:16;:31::i;:::-;45805;45828:7;45805:12;:18;45818:4;45805:18;;;;;;;;;;;:22;;:31;;;;:::i;:::-;;45675:169;;:::o;45938:174::-;46027:32;46045:4;46051:7;46027:17;:32::i;:::-;46070:34;46096:7;46070:12;:18;46083:4;46070:18;;;;;;;;;;;:25;;:34;;;;:::i;:::-;;45938:174;;:::o;12497:338::-;12600:1;12581:21;;:7;:21;;;;12573:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;12651:49;12680:1;12684:7;12693:6;12651:20;:49::i;:::-;12729:6;12713:12;;:22;;;;;;;:::i;:::-;;;;;;;;12768:6;12746:9;:18;12756:7;12746:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;12811:7;12790:37;;12807:1;12790:37;;;12820:6;12790:37;;;;;;:::i;:::-;;;;;;;;12497:338;;:::o;65992:562::-;66108:4;66114:7;66160:1;66147:10;:14;66139:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;66235:23;:21;:23::i;:::-;66221:10;:37;;66199:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;66328:13;66344:40;66373:10;66344:9;:13;;:28;;:40;;;;:::i;:::-;66328:56;;66410:9;:13;;:20;;;;66401:5;:29;66397:150;;;66455:5;66462:1;66447:17;;;;;;;66397:150;66505:4;66511:9;:16;;66528:5;66511:23;;;;;;;;:::i;:::-;;;;;;;;;;66497:38;;;;;65992:562;;;;;;:::o;62907:127::-;62971:7;62998:28;:18;:26;:28::i;:::-;62991:35;;62907:127;:::o;29925:112::-;30004:25;30015:4;30021:7;30004:10;:25::i;:::-;29925:112;;:::o;40339:158::-;40413:7;40464:22;40468:3;:10;;40480:5;40464:3;:22::i;:::-;40456:31;;40433:56;;40339:158;;;;:::o;62381:240::-;62428:7;62448:30;:18;:28;:30::i;:::-;62491:17;62511:23;:21;:23::i;:::-;62491:43;;62559:9;62550:36;62570:15;62550:36;;;;;;:::i;:::-;;;;;;;;62604:9;62597:16;;;62381:240;:::o;39868:117::-;39931:7;39958:19;39966:3;:10;;39958:7;:19::i;:::-;39951:26;;39868:117;;;:::o;32958:414::-;33021:4;33043:21;33053:3;33058:5;33043:9;:21::i;:::-;33038:327;;33081:3;:11;;33098:5;33081:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33264:3;:11;;:18;;;;33242:3;:12;;:19;33255:5;33242:19;;;;;;;;;;;:40;;;;33304:4;33297:11;;;;33038:327;33348:5;33341:12;;32958:414;;;;;:::o;23460:157::-;23545:4;23584:25;23569:40;;;:11;:40;;;;23562:47;;23460:157;;;:::o;65056:825::-;65206:44;65233:4;65239:2;65243:6;65206:26;:44::i;:::-;65283:1;65267:18;;:4;:18;;;65263:611;;;65323:26;65346:2;65323:22;:26::i;:::-;65364:28;:26;:28::i;:::-;65263:611;;;65428:1;65414:16;;:2;:16;;;65410:464;;;65468:28;65491:4;65468:22;:28::i;:::-;65511;:26;:28::i;:::-;65410:464;;;65597:26;:24;:26::i;:::-;65638:28;65661:4;65638:22;:28::i;:::-;65681:26;65704:2;65681:22;:26::i;:::-;65722:43;65745:19;;;;;;;;;;;65722:22;:43::i;:::-;65780:33;65803:9;;;;;;;;;;;65780:22;:33::i;:::-;65828:34;65851:10;;;;;;;;;;;65828:22;:34::i;:::-;65410:464;65263:611;65056:825;;;:::o;21210:451::-;21285:13;21311:19;21356:1;21347:6;21343:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;21333:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21311:47;;21369:15;:6;21376:1;21369:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;21395;:6;21402:1;21395:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;21426:9;21451:1;21442:6;21438:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;21426:26;;21421:135;21458:1;21454;:5;21421:135;;;21493:12;21514:3;21506:5;:11;21493:25;;;;;;;:::i;:::-;;;;;21481:6;21488:1;21481:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;21543:1;21533:11;;;;;21461:3;;;;:::i;:::-;;;21421:135;;;;21583:1;21574:5;:10;21566:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;21646:6;21632:21;;;21210:451;;;;:::o;30919:239::-;31003:22;31011:4;31017:7;31003;:22::i;:::-;30999:152;;;31074:5;31042:6;:12;31049:4;31042:12;;;;;;;;;;;:20;;:29;31063:7;31042:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;31126:12;:10;:12::i;:::-;31099:40;;31117:7;31099:40;;31111:4;31099:40;;;;;;;;;;30999:152;30919:239;;:::o;39371:158::-;39444:4;39468:53;39476:3;:10;;39512:5;39496:23;;39488:32;;39468:7;:53::i;:::-;39461:60;;39371:158;;;;:::o;48060:918::-;48149:7;48189:1;48173:5;:12;;;;:17;48169:58;;;48214:1;48207:8;;;;48169:58;48239:11;48265:12;48280:5;:12;;;;48265:27;;48305:424;48318:4;48312:3;:10;48305:424;;;48339:11;48353:23;48366:3;48371:4;48353:12;:23::i;:::-;48339:37;;48610:7;48597:5;48603:3;48597:10;;;;;;;;:::i;:::-;;;;;;;;;;:20;48593:125;;;48645:3;48638:10;;48593:125;;;48701:1;48695:3;:7;;;;:::i;:::-;48689:13;;48593:125;48324:405;48305:424;;;48855:1;48849:3;:7;:36;;;;;48878:7;48860:5;48872:1;48866:3;:7;;;;:::i;:::-;48860:14;;;;;;;;:::i;:::-;;;;;;;;;;:25;48849:36;48845:126;;;48915:1;48909:3;:7;;;;:::i;:::-;48902:14;;;;;;48845:126;48956:3;48949:10;;;;48060:918;;;;;:::o;35732:120::-;35799:7;35826:3;:11;;35838:5;35826:18;;;;;;;;:::i;:::-;;;;;;;;;;35819:25;;35732:120;;;;:::o;35269:109::-;35325:7;35352:3;:11;;:18;;;;35345:25;;35269:109;;;:::o;35054:129::-;35127:4;35174:1;35151:3;:12;;:19;35164:5;35151:19;;;;;;;;;;;;:24;;35144:31;;35054:129;;;;:::o;66640:146::-;66708:70;66724:24;:33;66749:7;66724:33;;;;;;;;;;;;;;;66759:18;66769:7;66759:9;:18::i;:::-;66708:15;:70::i;:::-;66640:146;:::o;66876:118::-;66933:53;66949:21;66972:13;:11;:13::i;:::-;66933:15;:53::i;:::-;66876:118::o;67095:172::-;67150:109;67180:31;67226:22;;67150:15;:109::i;:::-;67095:172::o;33548:1420::-;33614:4;33732:18;33753:3;:12;;:19;33766:5;33753:19;;;;;;;;;;;;33732:40;;33803:1;33789:10;:15;33785:1176;;34164:21;34201:1;34188:10;:14;;;;:::i;:::-;34164:38;;34217:17;34258:1;34237:3;:11;;:18;;;;:22;;;;:::i;:::-;34217:42;;34293:13;34280:9;:26;34276:405;;34327:17;34347:3;:11;;34359:9;34347:22;;;;;;;;:::i;:::-;;;;;;;;;;34327:42;;34501:9;34472:3;:11;;34484:13;34472:26;;;;;;;;:::i;:::-;;;;;;;;;:38;;;;34612:10;34586:3;:12;;:23;34599:9;34586:23;;;;;;;;;;;:36;;;;34308:373;34276:405;34762:3;:11;;:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;34857:3;:12;;:19;34870:5;34857:19;;;;;;;;;;;34850:26;;;34900:4;34893:11;;;;;;;33785:1176;34944:5;34937:12;;;33548:1420;;;;;:::o;46840:156::-;46902:7;46987:1;46982;46978;:5;46977:11;;;;:::i;:::-;46972:1;46968;:5;46967:21;;;;:::i;:::-;46960:28;;46840:156;;;;:::o;67367:324::-;67476:17;67496:23;:21;:23::i;:::-;67476:43;;67567:9;67534:30;67550:9;:13;;67534:15;:30::i;:::-;:42;67530:154;;;67593:9;:13;;67612:9;67593:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67637:9;:16;;67659:12;67637:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67530:154;67465:226;67367:324;;:::o;67786:244::-;67883:7;67926:1;67912:3;:10;;;;:15;67908:115;;;67951:1;67944:8;;;;67908:115;67992:3;68009:1;67996:3;:10;;;;:14;;;;:::i;:::-;67992:19;;;;;;;;:::i;:::-;;;;;;;;;;67985:26;;67786:244;;;;:::o;88:117:1:-;197:1;194;187:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:126::-;1555:7;1595:42;1588:5;1584:54;1573:65;;1518:126;;;:::o;1650:96::-;1687:7;1716:24;1734:5;1716:24;:::i;:::-;1705:35;;1650:96;;;:::o;1752:118::-;1839:24;1857:5;1839:24;:::i;:::-;1834:3;1827:37;1752:118;;:::o;1876:222::-;1969:4;2007:2;1996:9;1992:18;1984:26;;2020:71;2088:1;2077:9;2073:17;2064:6;2020:71;:::i;:::-;1876:222;;;;:::o;2104:99::-;2156:6;2190:5;2184:12;2174:22;;2104:99;;;:::o;2209:169::-;2293:11;2327:6;2322:3;2315:19;2367:4;2362:3;2358:14;2343:29;;2209:169;;;;:::o;2384:307::-;2452:1;2462:113;2476:6;2473:1;2470:13;2462:113;;;2561:1;2556:3;2552:11;2546:18;2542:1;2537:3;2533:11;2526:39;2498:2;2495:1;2491:10;2486:15;;2462:113;;;2593:6;2590:1;2587:13;2584:101;;;2673:1;2664:6;2659:3;2655:16;2648:27;2584:101;2433:258;2384:307;;;:::o;2697:102::-;2738:6;2789:2;2785:7;2780:2;2773:5;2769:14;2765:28;2755:38;;2697:102;;;:::o;2805:364::-;2893:3;2921:39;2954:5;2921:39;:::i;:::-;2976:71;3040:6;3035:3;2976:71;:::i;:::-;2969:78;;3056:52;3101:6;3096:3;3089:4;3082:5;3078:16;3056:52;:::i;:::-;3133:29;3155:6;3133:29;:::i;:::-;3128:3;3124:39;3117:46;;2897:272;2805:364;;;;:::o;3175:313::-;3288:4;3326:2;3315:9;3311:18;3303:26;;3375:9;3369:4;3365:20;3361:1;3350:9;3346:17;3339:47;3403:78;3476:4;3467:6;3403:78;:::i;:::-;3395:86;;3175:313;;;;:::o;3494:122::-;3567:24;3585:5;3567:24;:::i;:::-;3560:5;3557:35;3547:63;;3606:1;3603;3596:12;3547:63;3494:122;:::o;3622:139::-;3668:5;3706:6;3693:20;3684:29;;3722:33;3749:5;3722:33;:::i;:::-;3622:139;;;;:::o;3767:77::-;3804:7;3833:5;3822:16;;3767:77;;;:::o;3850:122::-;3923:24;3941:5;3923:24;:::i;:::-;3916:5;3913:35;3903:63;;3962:1;3959;3952:12;3903:63;3850:122;:::o;3978:139::-;4024:5;4062:6;4049:20;4040:29;;4078:33;4105:5;4078:33;:::i;:::-;3978:139;;;;:::o;4123:474::-;4191:6;4199;4248:2;4236:9;4227:7;4223:23;4219:32;4216:119;;;4254:79;;:::i;:::-;4216:119;4374:1;4399:53;4444:7;4435:6;4424:9;4420:22;4399:53;:::i;:::-;4389:63;;4345:117;4501:2;4527:53;4572:7;4563:6;4552:9;4548:22;4527:53;:::i;:::-;4517:63;;4472:118;4123:474;;;;;:::o;4603:118::-;4690:24;4708:5;4690:24;:::i;:::-;4685:3;4678:37;4603:118;;:::o;4727:222::-;4820:4;4858:2;4847:9;4843:18;4835:26;;4871:71;4939:1;4928:9;4924:17;4915:6;4871:71;:::i;:::-;4727:222;;;;:::o;4955:77::-;4992:7;5021:5;5010:16;;4955:77;;;:::o;5038:118::-;5125:24;5143:5;5125:24;:::i;:::-;5120:3;5113:37;5038:118;;:::o;5162:222::-;5255:4;5293:2;5282:9;5278:18;5270:26;;5306:71;5374:1;5363:9;5359:17;5350:6;5306:71;:::i;:::-;5162:222;;;;:::o;5390:619::-;5467:6;5475;5483;5532:2;5520:9;5511:7;5507:23;5503:32;5500:119;;;5538:79;;:::i;:::-;5500:119;5658:1;5683:53;5728:7;5719:6;5708:9;5704:22;5683:53;:::i;:::-;5673:63;;5629:117;5785:2;5811:53;5856:7;5847:6;5836:9;5832:22;5811:53;:::i;:::-;5801:63;;5756:118;5913:2;5939:53;5984:7;5975:6;5964:9;5960:22;5939:53;:::i;:::-;5929:63;;5884:118;5390:619;;;;;:::o;6015:122::-;6088:24;6106:5;6088:24;:::i;:::-;6081:5;6078:35;6068:63;;6127:1;6124;6117:12;6068:63;6015:122;:::o;6143:139::-;6189:5;6227:6;6214:20;6205:29;;6243:33;6270:5;6243:33;:::i;:::-;6143:139;;;;:::o;6288:329::-;6347:6;6396:2;6384:9;6375:7;6371:23;6367:32;6364:119;;;6402:79;;:::i;:::-;6364:119;6522:1;6547:53;6592:7;6583:6;6572:9;6568:22;6547:53;:::i;:::-;6537:63;;6493:117;6288:329;;;;:::o;6623:474::-;6691:6;6699;6748:2;6736:9;6727:7;6723:23;6719:32;6716:119;;;6754:79;;:::i;:::-;6716:119;6874:1;6899:53;6944:7;6935:6;6924:9;6920:22;6899:53;:::i;:::-;6889:63;;6845:117;7001:2;7027:53;7072:7;7063:6;7052:9;7048:22;7027:53;:::i;:::-;7017:63;;6972:118;6623:474;;;;;:::o;7103:86::-;7138:7;7178:4;7171:5;7167:16;7156:27;;7103:86;;;:::o;7195:112::-;7278:22;7294:5;7278:22;:::i;:::-;7273:3;7266:35;7195:112;;:::o;7313:214::-;7402:4;7440:2;7429:9;7425:18;7417:26;;7453:67;7517:1;7506:9;7502:17;7493:6;7453:67;:::i;:::-;7313:214;;;;:::o;7533:329::-;7592:6;7641:2;7629:9;7620:7;7616:23;7612:32;7609:119;;;7647:79;;:::i;:::-;7609:119;7767:1;7792:53;7837:7;7828:6;7817:9;7813:22;7792:53;:::i;:::-;7782:63;;7738:117;7533:329;;;;:::o;7868:::-;7927:6;7976:2;7964:9;7955:7;7951:23;7947:32;7944:119;;;7982:79;;:::i;:::-;7944:119;8102:1;8127:53;8172:7;8163:6;8152:9;8148:22;8127:53;:::i;:::-;8117:63;;8073:117;7868:329;;;;:::o;8203:474::-;8271:6;8279;8328:2;8316:9;8307:7;8303:23;8299:32;8296:119;;;8334:79;;:::i;:::-;8296:119;8454:1;8479:53;8524:7;8515:6;8504:9;8500:22;8479:53;:::i;:::-;8469:63;;8425:117;8581:2;8607:53;8652:7;8643:6;8632:9;8628:22;8607:53;:::i;:::-;8597:63;;8552:118;8203:474;;;;;:::o;8683:::-;8751:6;8759;8808:2;8796:9;8787:7;8783:23;8779:32;8776:119;;;8814:79;;:::i;:::-;8776:119;8934:1;8959:53;9004:7;8995:6;8984:9;8980:22;8959:53;:::i;:::-;8949:63;;8905:117;9061:2;9087:53;9132:7;9123:6;9112:9;9108:22;9087:53;:::i;:::-;9077:63;;9032:118;8683:474;;;;;:::o;9163:180::-;9211:77;9208:1;9201:88;9308:4;9305:1;9298:15;9332:4;9329:1;9322:15;9349:320;9393:6;9430:1;9424:4;9420:12;9410:22;;9477:1;9471:4;9467:12;9498:18;9488:81;;9554:4;9546:6;9542:17;9532:27;;9488:81;9616:2;9608:6;9605:14;9585:18;9582:38;9579:84;;;9635:18;;:::i;:::-;9579:84;9400:269;9349:320;;;:::o;9675:227::-;9815:34;9811:1;9803:6;9799:14;9792:58;9884:10;9879:2;9871:6;9867:15;9860:35;9675:227;:::o;9908:366::-;10050:3;10071:67;10135:2;10130:3;10071:67;:::i;:::-;10064:74;;10147:93;10236:3;10147:93;:::i;:::-;10265:2;10260:3;10256:12;10249:19;;9908:366;;;:::o;10280:419::-;10446:4;10484:2;10473:9;10469:18;10461:26;;10533:9;10527:4;10523:20;10519:1;10508:9;10504:17;10497:47;10561:131;10687:4;10561:131;:::i;:::-;10553:139;;10280:419;;;:::o;10705:180::-;10753:77;10750:1;10743:88;10850:4;10847:1;10840:15;10874:4;10871:1;10864:15;10891:191;10931:4;10951:20;10969:1;10951:20;:::i;:::-;10946:25;;10985:20;11003:1;10985:20;:::i;:::-;10980:25;;11024:1;11021;11018:8;11015:34;;;11029:18;;:::i;:::-;11015:34;11074:1;11071;11067:9;11059:17;;10891:191;;;;:::o;11088:234::-;11228:34;11224:1;11216:6;11212:14;11205:58;11297:17;11292:2;11284:6;11280:15;11273:42;11088:234;:::o;11328:366::-;11470:3;11491:67;11555:2;11550:3;11491:67;:::i;:::-;11484:74;;11567:93;11656:3;11567:93;:::i;:::-;11685:2;11680:3;11676:12;11669:19;;11328:366;;;:::o;11700:419::-;11866:4;11904:2;11893:9;11889:18;11881:26;;11953:9;11947:4;11943:20;11939:1;11928:9;11924:17;11917:47;11981:131;12107:4;11981:131;:::i;:::-;11973:139;;11700:419;;;:::o;12125:305::-;12165:3;12184:20;12202:1;12184:20;:::i;:::-;12179:25;;12218:20;12236:1;12218:20;:::i;:::-;12213:25;;12372:1;12304:66;12300:74;12297:1;12294:81;12291:107;;;12378:18;;:::i;:::-;12291:107;12422:1;12419;12415:9;12408:16;;12125:305;;;;:::o;12436:164::-;12576:16;12572:1;12564:6;12560:14;12553:40;12436:164;:::o;12606:366::-;12748:3;12769:67;12833:2;12828:3;12769:67;:::i;:::-;12762:74;;12845:93;12934:3;12845:93;:::i;:::-;12963:2;12958:3;12954:12;12947:19;;12606:366;;;:::o;12978:419::-;13144:4;13182:2;13171:9;13167:18;13159:26;;13231:9;13225:4;13221:20;13217:1;13206:9;13202:17;13195:47;13259:131;13385:4;13259:131;:::i;:::-;13251:139;;12978:419;;;:::o;13403:178::-;13543:30;13539:1;13531:6;13527:14;13520:54;13403:178;:::o;13587:366::-;13729:3;13750:67;13814:2;13809:3;13750:67;:::i;:::-;13743:74;;13826:93;13915:3;13826:93;:::i;:::-;13944:2;13939:3;13935:12;13928:19;;13587:366;;;:::o;13959:419::-;14125:4;14163:2;14152:9;14148:18;14140:26;;14212:9;14206:4;14202:20;14198:1;14187:9;14183:17;14176:47;14240:131;14366:4;14240:131;:::i;:::-;14232:139;;13959:419;;;:::o;14384:173::-;14524:25;14520:1;14512:6;14508:14;14501:49;14384:173;:::o;14563:366::-;14705:3;14726:67;14790:2;14785:3;14726:67;:::i;:::-;14719:74;;14802:93;14891:3;14802:93;:::i;:::-;14920:2;14915:3;14911:12;14904:19;;14563:366;;;:::o;14935:419::-;15101:4;15139:2;15128:9;15124:18;15116:26;;15188:9;15182:4;15178:20;15174:1;15163:9;15159:17;15152:47;15216:131;15342:4;15216:131;:::i;:::-;15208:139;;14935:419;;;:::o;15360:176::-;15500:28;15496:1;15488:6;15484:14;15477:52;15360:176;:::o;15542:366::-;15684:3;15705:67;15769:2;15764:3;15705:67;:::i;:::-;15698:74;;15781:93;15870:3;15781:93;:::i;:::-;15899:2;15894:3;15890:12;15883:19;;15542:366;;;:::o;15914:419::-;16080:4;16118:2;16107:9;16103:18;16095:26;;16167:9;16161:4;16157:20;16153:1;16142:9;16138:17;16131:47;16195:131;16321:4;16195:131;:::i;:::-;16187:139;;15914:419;;;:::o;16339:224::-;16479:34;16475:1;16467:6;16463:14;16456:58;16548:7;16543:2;16535:6;16531:15;16524:32;16339:224;:::o;16569:366::-;16711:3;16732:67;16796:2;16791:3;16732:67;:::i;:::-;16725:74;;16808:93;16897:3;16808:93;:::i;:::-;16926:2;16921:3;16917:12;16910:19;;16569:366;;;:::o;16941:419::-;17107:4;17145:2;17134:9;17130:18;17122:26;;17194:9;17188:4;17184:20;17180:1;17169:9;17165:17;17158:47;17222:131;17348:4;17222:131;:::i;:::-;17214:139;;16941:419;;;:::o;17366:174::-;17506:26;17502:1;17494:6;17490:14;17483:50;17366:174;:::o;17546:366::-;17688:3;17709:67;17773:2;17768:3;17709:67;:::i;:::-;17702:74;;17785:93;17874:3;17785:93;:::i;:::-;17903:2;17898:3;17894:12;17887:19;;17546:366;;;:::o;17918:419::-;18084:4;18122:2;18111:9;18107:18;18099:26;;18171:9;18165:4;18161:20;18157:1;18146:9;18142:17;18135:47;18199:131;18325:4;18199:131;:::i;:::-;18191:139;;17918:419;;;:::o;18343:223::-;18483:34;18479:1;18471:6;18467:14;18460:58;18552:6;18547:2;18539:6;18535:15;18528:31;18343:223;:::o;18572:366::-;18714:3;18735:67;18799:2;18794:3;18735:67;:::i;:::-;18728:74;;18811:93;18900:3;18811:93;:::i;:::-;18929:2;18924:3;18920:12;18913:19;;18572:366;;;:::o;18944:419::-;19110:4;19148:2;19137:9;19133:18;19125:26;;19197:9;19191:4;19187:20;19183:1;19172:9;19168:17;19161:47;19225:131;19351:4;19225:131;:::i;:::-;19217:139;;18944:419;;;:::o;19369:221::-;19509:34;19505:1;19497:6;19493:14;19486:58;19578:4;19573:2;19565:6;19561:15;19554:29;19369:221;:::o;19596:366::-;19738:3;19759:67;19823:2;19818:3;19759:67;:::i;:::-;19752:74;;19835:93;19924:3;19835:93;:::i;:::-;19953:2;19948:3;19944:12;19937:19;;19596:366;;;:::o;19968:419::-;20134:4;20172:2;20161:9;20157:18;20149:26;;20221:9;20215:4;20211:20;20207:1;20196:9;20192:17;20185:47;20249:131;20375:4;20249:131;:::i;:::-;20241:139;;19968:419;;;:::o;20393:176::-;20533:28;20529:1;20521:6;20517:14;20510:52;20393:176;:::o;20575:366::-;20717:3;20738:67;20802:2;20797:3;20738:67;:::i;:::-;20731:74;;20814:93;20903:3;20814:93;:::i;:::-;20932:2;20927:3;20923:12;20916:19;;20575:366;;;:::o;20947:419::-;21113:4;21151:2;21140:9;21136:18;21128:26;;21200:9;21194:4;21190:20;21186:1;21175:9;21171:17;21164:47;21228:131;21354:4;21228:131;:::i;:::-;21220:139;;20947:419;;;:::o;21372:175::-;21512:27;21508:1;21500:6;21496:14;21489:51;21372:175;:::o;21553:366::-;21695:3;21716:67;21780:2;21775:3;21716:67;:::i;:::-;21709:74;;21792:93;21881:3;21792:93;:::i;:::-;21910:2;21905:3;21901:12;21894:19;;21553:366;;;:::o;21925:419::-;22091:4;22129:2;22118:9;22114:18;22106:26;;22178:9;22172:4;22168:20;22164:1;22153:9;22149:17;22142:47;22206:131;22332:4;22206:131;:::i;:::-;22198:139;;21925:419;;;:::o;22350:348::-;22390:7;22413:20;22431:1;22413:20;:::i;:::-;22408:25;;22447:20;22465:1;22447:20;:::i;:::-;22442:25;;22635:1;22567:66;22563:74;22560:1;22557:81;22552:1;22545:9;22538:17;22534:105;22531:131;;;22642:18;;:::i;:::-;22531:131;22690:1;22687;22683:9;22672:20;;22350:348;;;;:::o;22704:180::-;22752:77;22749:1;22742:88;22849:4;22846:1;22839:15;22873:4;22870:1;22863:15;22890:185;22930:1;22947:20;22965:1;22947:20;:::i;:::-;22942:25;;22981:20;22999:1;22981:20;:::i;:::-;22976:25;;23020:1;23010:35;;23025:18;;:::i;:::-;23010:35;23067:1;23064;23060:9;23055:14;;22890:185;;;;:::o;23081:148::-;23183:11;23220:3;23205:18;;23081:148;;;;:::o;23235:173::-;23375:25;23371:1;23363:6;23359:14;23352:49;23235:173;:::o;23414:402::-;23574:3;23595:85;23677:2;23672:3;23595:85;:::i;:::-;23588:92;;23689:93;23778:3;23689:93;:::i;:::-;23807:2;23802:3;23798:12;23791:19;;23414:402;;;:::o;23822:377::-;23928:3;23956:39;23989:5;23956:39;:::i;:::-;24011:89;24093:6;24088:3;24011:89;:::i;:::-;24004:96;;24109:52;24154:6;24149:3;24142:4;24135:5;24131:16;24109:52;:::i;:::-;24186:6;24181:3;24177:16;24170:23;;23932:267;23822:377;;;;:::o;24205:167::-;24345:19;24341:1;24333:6;24329:14;24322:43;24205:167;:::o;24378:402::-;24538:3;24559:85;24641:2;24636:3;24559:85;:::i;:::-;24552:92;;24653:93;24742:3;24653:93;:::i;:::-;24771:2;24766:3;24762:12;24755:19;;24378:402;;;:::o;24786:967::-;25168:3;25190:148;25334:3;25190:148;:::i;:::-;25183:155;;25355:95;25446:3;25437:6;25355:95;:::i;:::-;25348:102;;25467:148;25611:3;25467:148;:::i;:::-;25460:155;;25632:95;25723:3;25714:6;25632:95;:::i;:::-;25625:102;;25744:3;25737:10;;24786:967;;;;;:::o;25759:181::-;25899:33;25895:1;25887:6;25883:14;25876:57;25759:181;:::o;25946:366::-;26088:3;26109:67;26173:2;26168:3;26109:67;:::i;:::-;26102:74;;26185:93;26274:3;26185:93;:::i;:::-;26303:2;26298:3;26294:12;26287:19;;25946:366;;;:::o;26318:419::-;26484:4;26522:2;26511:9;26507:18;26499:26;;26571:9;26565:4;26561:20;26557:1;26546:9;26542:17;26535:47;26599:131;26725:4;26599:131;:::i;:::-;26591:139;;26318:419;;;:::o;26743:172::-;26883:24;26879:1;26871:6;26867:14;26860:48;26743:172;:::o;26921:366::-;27063:3;27084:67;27148:2;27143:3;27084:67;:::i;:::-;27077:74;;27160:93;27249:3;27160:93;:::i;:::-;27278:2;27273:3;27269:12;27262:19;;26921:366;;;:::o;27293:419::-;27459:4;27497:2;27486:9;27482:18;27474:26;;27546:9;27540:4;27536:20;27532:1;27521:9;27517:17;27510:47;27574:131;27700:4;27574:131;:::i;:::-;27566:139;;27293:419;;;:::o;27718:179::-;27858:31;27854:1;27846:6;27842:14;27835:55;27718:179;:::o;27903:366::-;28045:3;28066:67;28130:2;28125:3;28066:67;:::i;:::-;28059:74;;28142:93;28231:3;28142:93;:::i;:::-;28260:2;28255:3;28251:12;28244:19;;27903:366;;;:::o;28275:419::-;28441:4;28479:2;28468:9;28464:18;28456:26;;28528:9;28522:4;28518:20;28514:1;28503:9;28499:17;28492:47;28556:131;28682:4;28556:131;:::i;:::-;28548:139;;28275:419;;;:::o;28700:180::-;28748:77;28745:1;28738:88;28845:4;28842:1;28835:15;28869:4;28866:1;28859:15;28886:180;28934:77;28931:1;28924:88;29031:4;29028:1;29021:15;29055:4;29052:1;29045:15;29072:171;29111:3;29134:24;29152:5;29134:24;:::i;:::-;29125:33;;29180:4;29173:5;29170:15;29167:41;;;29188:18;;:::i;:::-;29167:41;29235:1;29228:5;29224:13;29217:20;;29072:171;;;:::o;29249:182::-;29389:34;29385:1;29377:6;29373:14;29366:58;29249:182;:::o;29437:366::-;29579:3;29600:67;29664:2;29659:3;29600:67;:::i;:::-;29593:74;;29676:93;29765:3;29676:93;:::i;:::-;29794:2;29789:3;29785:12;29778:19;;29437:366;;;:::o;29809:419::-;29975:4;30013:2;30002:9;29998:18;29990:26;;30062:9;30056:4;30052:20;30048:1;30037:9;30033:17;30026:47;30090:131;30216:4;30090:131;:::i;:::-;30082:139;;29809:419;;;:::o;30234:180::-;30282:77;30279:1;30272:88;30379:4;30376:1;30369:15;30403:4;30400:1;30393:15

Swarm Source

ipfs://dde40956612f70f8525f32654082f649b9df969c6b70f5b0e91a60297c5fb754
Loading