ETH Price: $3,267.18 (-0.24%)
Gas: 2 Gwei

Token

META ALL-STARS ()
 

Overview

Max Total Supply

2,210

Holders

221

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
0xcd4f095142e8e78c68166f98f65d35a36edb104c
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
MAS

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.1 (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/utils/Context.sol


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/security/Pausable.sol


// OpenZeppelin Contracts v4.4.1 (security/Pausable.sol)

pragma solidity ^0.8.0;


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

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

    bool private _paused;

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

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (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/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (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/AccessControl.sol


// OpenZeppelin Contracts (last updated v4.5.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 virtual 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 virtual {
        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 virtual 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/token/ERC1155/IERC1155Receiver.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.0;


/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
     * @dev Handles the receipt of a single ERC1155 token type. This function is
     * called at the end of a `safeTransferFrom` after the balance has been updated.
     *
     * NOTE: To accept the transfer, this must return
     * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
     * (i.e. 0xf23a6e61, or its own function selector).
     *
     * @param operator The address which initiated the transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param id The ID of the token being transferred
     * @param value The amount of tokens being transferred
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
     */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
     * @dev Handles the receipt of a multiple ERC1155 token types. This function
     * is called at the end of a `safeBatchTransferFrom` after the balances have
     * been updated.
     *
     * NOTE: To accept the transfer(s), this must return
     * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
     * (i.e. 0xbc197c81, or its own function selector).
     *
     * @param operator The address which initiated the batch transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param ids An array containing ids of each token being transferred (order and length must match values array)
     * @param values An array containing amounts of each token being transferred (order and length must match ids array)
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
     */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/token/ERC1155/IERC1155.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

// File: @openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}

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


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

pragma solidity ^0.8.0;







/**
 * @dev Implementation of the basic standard multi-token.
 * See https://eips.ethereum.org/EIPS/eip-1155
 * Originally based on code by Enjin: https://github.com/enjin/erc-1155
 *
 * _Available since v3.1._
 */
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
    using Address for address;

    // Mapping from token ID to account balances
    mapping(uint256 => mapping(address => uint256)) private _balances;

    // Mapping from account to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
    string private _uri;

    /**
     * @dev See {_setURI}.
     */
    constructor(string memory uri_) {
        _setURI(uri_);
    }

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

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the same URI for *all* token types. It relies
     * on the token type ID substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * Clients calling this function must replace the `\{id\}` substring with the
     * actual token type ID.
     */
    function uri(uint256) public view virtual override returns (string memory) {
        return _uri;
    }

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
        require(account != address(0), "ERC1155: balance query for the zero address");
        return _balances[id][account];
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
        public
        view
        virtual
        override
        returns (uint256[] memory)
    {
        require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf(accounts[i], ids[i]);
        }

        return batchBalances;
    }

    /**
     * @dev See {IERC1155-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC1155-isApprovedForAll}.
     */
    function isApprovedForAll(address account, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[account][operator];
    }

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );
        _safeTransferFrom(from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: transfer caller is not owner nor approved"
        );
        _safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data);

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }
        _balances[id][to] += amount;

        emit TransferSingle(operator, from, to, id, amount);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
            _balances[id][to] += amount;
        }

        emit TransferBatch(operator, from, to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
    }

    /**
     * @dev Sets a new URI for all token types, by relying on the token type ID
     * substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * By this mechanism, any occurrence of the `\{id\}` substring in either the
     * URI or any of the amounts in the JSON file at said URI will be replaced by
     * clients with the token type ID.
     *
     * For example, the `https://token-cdn-domain/\{id\}.json` URI would be
     * interpreted by clients as
     * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
     * for token type ID 0x4cce0.
     *
     * See {uri}.
     *
     * Because these URIs cannot be meaningfully represented by the {URI} event,
     * this function emits no events.
     */
    function _setURI(string memory newuri) internal virtual {
        _uri = newuri;
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, _asSingletonArray(id), _asSingletonArray(amount), data);

        _balances[id][to] += amount;
        emit TransferSingle(operator, address(0), to, id, amount);

        _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; i++) {
            _balances[ids[i]][to] += amounts[i];
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
    }

    /**
     * @dev Destroys `amount` tokens of token type `id` from `from`
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `from` must have at least `amount` tokens of token type `id`.
     */
    function _burn(
        address from,
        uint256 id,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), _asSingletonArray(id), _asSingletonArray(amount), "");

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }

        emit TransferSingle(operator, from, address(0), id, amount);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function _burnBatch(
        address from,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        for (uint256 i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
        }

        emit TransferBatch(operator, from, address(0), ids, amounts);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC1155: setting approval status for self");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
                if (response != IERC1155Receiver.onERC1155Received.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (
                bytes4 response
            ) {
                if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }
}

// File: @openzeppelin/contracts/token/ERC1155/extensions/ERC1155Burnable.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/ERC1155Burnable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Extension of {ERC1155} that allows token holders to destroy both their
 * own tokens and those that they have been approved to use.
 *
 * _Available since v3.1._
 */
abstract contract ERC1155Burnable is ERC1155 {
    function burn(
        address account,
        uint256 id,
        uint256 value
    ) public virtual {
        require(
            account == _msgSender() || isApprovedForAll(account, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );

        _burn(account, id, value);
    }

    function burnBatch(
        address account,
        uint256[] memory ids,
        uint256[] memory values
    ) public virtual {
        require(
            account == _msgSender() || isApprovedForAll(account, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );

        _burnBatch(account, ids, values);
    }
}

// File: @openzeppelin/contracts/token/ERC1155/extensions/ERC1155Supply.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/ERC1155Supply.sol)

pragma solidity ^0.8.0;


/**
 * @dev Extension of ERC1155 that adds tracking of total supply per id.
 *
 * Useful for scenarios where Fungible and Non-fungible tokens have to be
 * clearly identified. Note: While a totalSupply of 1 might mean the
 * corresponding is an NFT, there is no guarantees that no other token with the
 * same id are not going to be minted.
 */
abstract contract ERC1155Supply is ERC1155 {
    mapping(uint256 => uint256) private _totalSupply;

    /**
     * @dev Total amount of tokens in with a given id.
     */
    function totalSupply(uint256 id) public view virtual returns (uint256) {
        return _totalSupply[id];
    }

    /**
     * @dev Indicates whether any token exist with a given id, or not.
     */
    function exists(uint256 id) public view virtual returns (bool) {
        return ERC1155Supply.totalSupply(id) > 0;
    }

    /**
     * @dev See {ERC1155-_beforeTokenTransfer}.
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual override {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);

        if (from == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                _totalSupply[ids[i]] += amounts[i];
            }
        }

        if (to == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                _totalSupply[ids[i]] -= amounts[i];
            }
        }
    }
}

// File: ERC1155.sol


pragma solidity ^0.8.4;








contract MAS is ERC1155, ERC1155Supply, ERC1155Burnable, AccessControl, Pausable, Ownable {
    bytes32 public constant URI_SETTER_ROLE = keccak256("URI_SETTER_ROLE");
    bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE");
    bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");

    // Token name to secure the compatilibity with ERC721)
    string private _name = "META ALL-STARS";

    // Token URIs (tokenId => tokenURI)
    // URI should be full-length including prefix and suffix (https://example.com/xxxx.json)
    mapping(uint256 => string) private _tokenURIs;

    constructor() ERC1155("") {
        _grantRole(DEFAULT_ADMIN_ROLE, _msgSender());
        _grantRole(URI_SETTER_ROLE, _msgSender());
        _grantRole(PAUSER_ROLE, _msgSender());
        _grantRole(MINTER_ROLE, _msgSender());
    }

    function uri(uint256 tokenId) public view virtual override returns (string memory) {
        require(totalSupply(tokenId) != 0, "URI query for nonexistent token");

        return _tokenURIs[tokenId];
    }

    function setURI(uint256 tokenId, string memory _uri) public onlyRole(URI_SETTER_ROLE) {
        require(totalSupply(tokenId) != 0, "URI set of nonexistent token");

        _tokenURIs[tokenId] = _uri;
    }

    function setURIBatch(uint256[] memory tokenIds, string[] memory _uris) public onlyRole(URI_SETTER_ROLE) {
        require(tokenIds.length == _uris.length, "tokenIds and uris length mismatch");

        for (uint256 i = 0; i < tokenIds.length; i++) {
            require(totalSupply(tokenIds[i]) != 0, "URI set of nonexistent token");
            _tokenURIs[tokenIds[i]] = _uris[i];
        }
    }

    function name() public view virtual returns (string memory) {
        return _name;
    }

    function pause() public onlyRole(PAUSER_ROLE) {
        _pause();
    }

    function unpause() public onlyRole(PAUSER_ROLE) {
        _unpause();
    }

    function mint(address account, uint256 id, uint256 amount, bytes memory data)
        public
        onlyRole(MINTER_ROLE)
    {
        _mint(account, id, amount, data);
    }

    function mintBatch(address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data)
        public
        onlyRole(MINTER_ROLE)
    {
        _mintBatch(to, ids, amounts, data);
    }

    function _beforeTokenTransfer(address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data)
        internal
        whenNotPaused
        override(ERC1155, ERC1155Supply)
    {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);
    }

    // The following functions are overrides required by Solidity.

    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC1155, AccessControl)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"URI_SETTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"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":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"mintBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","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":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"_uri","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"string[]","name":"_uris","type":"string[]"}],"name":"setURIBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

60806040526040518060400160405280600e81526020017f4d45544120414c4c2d53544152530000000000000000000000000000000000008152506006908051906020019062000051929190620003f1565b503480156200005f57600080fd5b50604051806020016040528060008152506200008181620001aa60201b60201c565b506000600560006101000a81548160ff021916908315150217905550620000bd620000b1620001c660201b60201c565b620001ce60201b60201c565b620000e16000801b620000d5620001c660201b60201c565b6200029460201b60201c565b620001227f7804d923f43a17d325d77e781528e0793b2edd9890ab45fc64efd7b4b427744c62000116620001c660201b60201c565b6200029460201b60201c565b620001637f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a62000157620001c660201b60201c565b6200029460201b60201c565b620001a47f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a662000198620001c660201b60201c565b6200029460201b60201c565b62000506565b8060029080519060200190620001c2929190620003f1565b5050565b600033905090565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002a682826200038660201b60201c565b620003825760016004600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555062000327620001c660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006004600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b828054620003ff90620004a1565b90600052602060002090601f0160209004810192826200042357600085556200046f565b82601f106200043e57805160ff19168380011785556200046f565b828001600101855582156200046f579182015b828111156200046e57825182559160200191906001019062000451565b5b5090506200047e919062000482565b5090565b5b808211156200049d57600081600090555060010162000483565b5090565b60006002820490506001821680620004ba57607f821691505b60208210811415620004d157620004d0620004d7565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61526080620005166000396000f3fe608060405234801561001057600080fd5b50600436106101ef5760003560e01c8063731133e91161010f578063bd85b039116100a2578063e985e9c511610071578063e985e9c51461057c578063f242432a146105ac578063f2fde38b146105c8578063f5298aca146105e4576101ef565b8063bd85b039146104f4578063d539139314610524578063d547741f14610542578063e63ab1e91461055e576101ef565b80638da5cb5b116100de5780638da5cb5b1461046c57806391d148541461048a578063a217fddf146104ba578063a22cb465146104d8576101ef565b8063731133e91461040c5780637f345710146104285780638456cb5914610446578063862440e214610450576101ef565b80632f2ff15d116101875780634f558e79116101565780634f558e79146103985780635c975abb146103c85780636b20c454146103e6578063715018a614610402576101ef565b80632f2ff15d1461032657806336568abe146103425780633f4ba83a1461035e5780634e1273f414610368576101ef565b80630e89341c116101c35780630e89341c1461028e5780631f7fdffa146102be578063248a9ca3146102da5780632eb2c2d61461030a576101ef565b8062fdd58e146101f457806301b98ea01461022457806301ffc9a71461024057806306fdde0314610270575b600080fd5b61020e60048036038101906102099190613905565b610600565b60405161021b919061458f565b60405180910390f35b61023e60048036038101906102399190613a93565b6106c9565b005b61025a60048036038101906102559190613b78565b610826565b6040516102679190614277565b60405180910390f35b610278610838565b60405161028591906142ad565b60405180910390f35b6102a860048036038101906102a39190613bd2565b6108ca565b6040516102b591906142ad565b60405180910390f35b6102d860048036038101906102d3919061380a565b6109bb565b005b6102f460048036038101906102ef9190613b0b565b610a00565b6040516103019190614292565b60405180910390f35b610324600480360381019061031f9190613619565b610a20565b005b610340600480360381019061033b9190613b38565b610ac1565b005b61035c60048036038101906103579190613b38565b610aea565b005b610366610b6d565b005b610382600480360381019061037d9190613a1b565b610baa565b60405161038f919061421e565b60405180910390f35b6103b260048036038101906103ad9190613bd2565b610cc3565b6040516103bf9190614277565b60405180910390f35b6103d0610cd7565b6040516103dd9190614277565b60405180910390f35b61040060048036038101906103fb919061377f565b610cee565b005b61040a610d8b565b005b61042660048036038101906104219190613998565b610e13565b005b610430610e58565b60405161043d9190614292565b60405180910390f35b61044e610e7c565b005b61046a60048036038101906104659190613bff565b610eb9565b005b610474610f64565b6040516104819190614141565b60405180910390f35b6104a4600480360381019061049f9190613b38565b610f8e565b6040516104b19190614277565b60405180910390f35b6104c2610ff9565b6040516104cf9190614292565b60405180910390f35b6104f260048036038101906104ed91906138c5565b611000565b005b61050e60048036038101906105099190613bd2565b611016565b60405161051b919061458f565b60405180910390f35b61052c611033565b6040516105399190614292565b60405180910390f35b61055c60048036038101906105579190613b38565b611057565b005b610566611080565b6040516105739190614292565b60405180910390f35b610596600480360381019061059191906135d9565b6110a4565b6040516105a39190614277565b60405180910390f35b6105c660048036038101906105c191906136e8565b611138565b005b6105e260048036038101906105dd91906135ac565b6111d9565b005b6105fe60048036038101906105f99190613945565b6112d1565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610671576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106689061436f565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b7f7804d923f43a17d325d77e781528e0793b2edd9890ab45fc64efd7b4b427744c6106fb816106f661136e565b611376565b815183511461073f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610736906144cf565b60405180910390fd5b60005b835181101561082057600061077085838151811061076357610762614a32565b5b6020026020010151611016565b14156107b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a8906144af565b60405180910390fd5b8281815181106107c4576107c3614a32565b5b6020026020010151600760008684815181106107e3576107e2614a32565b5b60200260200101518152602001908152602001600020908051906020019061080c9291906131b3565b5080806108189061498b565b915050610742565b50505050565b600061083182611413565b9050919050565b60606006805461084790614928565b80601f016020809104026020016040519081016040528092919081815260200182805461087390614928565b80156108c05780601f10610895576101008083540402835291602001916108c0565b820191906000526020600020905b8154815290600101906020018083116108a357829003601f168201915b5050505050905090565b606060006108d783611016565b1415610918576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090f9061434f565b60405180910390fd5b60076000838152602001908152602001600020805461093690614928565b80601f016020809104026020016040519081016040528092919081815260200182805461096290614928565b80156109af5780601f10610984576101008083540402835291602001916109af565b820191906000526020600020905b81548152906001019060200180831161099257829003601f168201915b50505050509050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66109ed816109e861136e565b611376565b6109f98585858561148d565b5050505050565b600060046000838152602001908152602001600020600101549050919050565b610a2861136e565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610a6e5750610a6d85610a6861136e565b6110a4565b5b610aad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa49061442f565b60405180910390fd5b610aba85858585856116ab565b5050505050565b610aca82610a00565b610adb81610ad661136e565b611376565b610ae583836119bf565b505050565b610af261136e565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b569061456f565b60405180910390fd5b610b698282611aa0565b5050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610b9f81610b9a61136e565b611376565b610ba7611b82565b50565b60608151835114610bf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be79061450f565b60405180910390fd5b6000835167ffffffffffffffff811115610c0d57610c0c614a61565b5b604051908082528060200260200182016040528015610c3b5781602001602082028036833780820191505090505b50905060005b8451811015610cb857610c88858281518110610c6057610c5f614a32565b5b6020026020010151858381518110610c7b57610c7a614a32565b5b6020026020010151610600565b828281518110610c9b57610c9a614a32565b5b60200260200101818152505080610cb19061498b565b9050610c41565b508091505092915050565b600080610ccf83611016565b119050919050565b6000600560009054906101000a900460ff16905090565b610cf661136e565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480610d3c5750610d3b83610d3661136e565b6110a4565b5b610d7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d72906143cf565b60405180910390fd5b610d86838383611c24565b505050565b610d9361136e565b73ffffffffffffffffffffffffffffffffffffffff16610db1610f64565b73ffffffffffffffffffffffffffffffffffffffff1614610e07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfe9061448f565b60405180910390fd5b610e116000611ed5565b565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610e4581610e4061136e565b611376565b610e5185858585611f9b565b5050505050565b7f7804d923f43a17d325d77e781528e0793b2edd9890ab45fc64efd7b4b427744c81565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610eae81610ea961136e565b611376565b610eb6612131565b50565b7f7804d923f43a17d325d77e781528e0793b2edd9890ab45fc64efd7b4b427744c610eeb81610ee661136e565b611376565b6000610ef684611016565b1415610f37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2e906144af565b60405180910390fd5b81600760008581526020019081526020016000209080519060200190610f5e9291906131b3565b50505050565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006004600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000801b81565b61101261100b61136e565b83836121d4565b5050565b600060036000838152602001908152602001600020549050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b61106082610a00565b6110718161106c61136e565b611376565b61107b8383611aa0565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61114061136e565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061118657506111858561118061136e565b6110a4565b5b6111c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111bc906143cf565b60405180910390fd5b6111d28585858585612341565b5050505050565b6111e161136e565b73ffffffffffffffffffffffffffffffffffffffff166111ff610f64565b73ffffffffffffffffffffffffffffffffffffffff1614611255576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124c9061448f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112bc9061438f565b60405180910390fd5b6112ce81611ed5565b50565b6112d961136e565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148061131f575061131e8361131961136e565b6110a4565b5b61135e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611355906143cf565b60405180910390fd5b6113698383836125c3565b505050565b600033905090565b6113808282610f8e565b61140f576113a58173ffffffffffffffffffffffffffffffffffffffff1660146127e0565b6113b38360001c60206127e0565b6040516020016113c4929190614107565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140691906142ad565b60405180910390fd5b5050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611486575061148582612a1c565b5b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156114fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f49061454f565b60405180910390fd5b8151835114611541576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115389061452f565b60405180910390fd5b600061154b61136e565b905061155c81600087878787612afe565b60005b84518110156116155783818151811061157b5761157a614a32565b5b602002602001015160008087848151811061159957611598614a32565b5b6020026020010151815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115fb919061475a565b92505081905550808061160d9061498b565b91505061155f565b508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161168d929190614240565b60405180910390a46116a481600087878787612b5c565b5050505050565b81518351146116ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e69061452f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561175f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117569061440f565b60405180910390fd5b600061176961136e565b9050611779818787878787612afe565b60005b845181101561192a57600085828151811061179a57611799614a32565b5b6020026020010151905060008583815181106117b9576117b8614a32565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561185a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118519061446f565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461190f919061475a565b92505081905550505050806119239061498b565b905061177c565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516119a1929190614240565b60405180910390a46119b7818787878787612b5c565b505050505050565b6119c98282610f8e565b611a9c5760016004600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611a4161136e565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b611aaa8282610f8e565b15611b7e5760006004600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611b2361136e565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b611b8a610cd7565b611bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc09061432f565b60405180910390fd5b6000600560006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611c0d61136e565b604051611c1a9190614141565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611c94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8b9061444f565b60405180910390fd5b8051825114611cd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccf9061452f565b60405180910390fd5b6000611ce261136e565b9050611d0281856000868660405180602001604052806000815250612afe565b60005b8351811015611e4f576000848281518110611d2357611d22614a32565b5b602002602001015190506000848381518110611d4257611d41614a32565b5b60200260200101519050600080600084815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611de3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dda906143af565b60405180910390fd5b81810360008085815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050508080611e479061498b565b915050611d05565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051611ec7929190614240565b60405180910390a450505050565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561200b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120029061454f565b60405180910390fd5b600061201561136e565b90506120368160008761202788612d43565b61203088612d43565b87612afe565b8260008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612095919061475a565b925050819055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6287876040516121139291906145aa565b60405180910390a461212a81600087878787612dbd565b5050505050565b612139610cd7565b15612179576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612170906143ef565b60405180910390fd5b6001600560006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586121bd61136e565b6040516121ca9190614141565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612243576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223a906144ef565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516123349190614277565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156123b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a89061440f565b60405180910390fd5b60006123bb61136e565b90506123db8187876123cc88612d43565b6123d588612d43565b87612afe565b600080600086815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015612472576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124699061446f565b60405180910390fd5b83810360008087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508360008087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612527919061475a565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6288886040516125a49291906145aa565b60405180910390a46125ba828888888888612dbd565b50505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612633576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262a9061444f565b60405180910390fd5b600061263d61136e565b905061266d8185600061264f87612d43565b61265887612d43565b60405180602001604052806000815250612afe565b600080600085815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015612704576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126fb906143af565b60405180910390fd5b82810360008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6287876040516127d19291906145aa565b60405180910390a45050505050565b6060600060028360026127f391906147b0565b6127fd919061475a565b67ffffffffffffffff81111561281657612815614a61565b5b6040519080825280601f01601f1916602001820160405280156128485781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106128805761287f614a32565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106128e4576128e3614a32565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000600184600261292491906147b0565b61292e919061475a565b90505b60018111156129ce577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106129705761296f614a32565b5b1a60f81b82828151811061298757612986614a32565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806129c7906148fe565b9050612931565b5060008414612a12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a09906142ef565b60405180910390fd5b8091505092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612ae757507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612af75750612af682612fa4565b5b9050919050565b612b06610cd7565b15612b46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3d906143ef565b60405180910390fd5b612b5486868686868661300e565b505050505050565b612b7b8473ffffffffffffffffffffffffffffffffffffffff16613188565b15612d3b578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401612bc195949392919061415c565b602060405180830381600087803b158015612bdb57600080fd5b505af1925050508015612c0c57506040513d601f19601f82011682018060405250810190612c099190613ba5565b60015b612cb257612c18614a90565b806308c379a01415612c755750612c2d615121565b80612c385750612c77565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c6c91906142ad565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ca9906142cf565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612d39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d309061430f565b60405180910390fd5b505b505050505050565b60606000600167ffffffffffffffff811115612d6257612d61614a61565b5b604051908082528060200260200182016040528015612d905781602001602082028036833780820191505090505b5090508281600081518110612da857612da7614a32565b5b60200260200101818152505080915050919050565b612ddc8473ffffffffffffffffffffffffffffffffffffffff16613188565b15612f9c578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401612e229594939291906141c4565b602060405180830381600087803b158015612e3c57600080fd5b505af1925050508015612e6d57506040513d601f19601f82011682018060405250810190612e6a9190613ba5565b60015b612f1357612e79614a90565b806308c379a01415612ed65750612e8e615121565b80612e995750612ed8565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ecd91906142ad565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f0a906142cf565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612f9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f919061430f565b60405180910390fd5b505b505050505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61301c8686868686866131ab565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156130ce5760005b83518110156130cc578281815181106130705761306f614a32565b5b60200260200101516003600086848151811061308f5761308e614a32565b5b6020026020010151815260200190815260200160002060008282546130b4919061475a565b92505081905550806130c59061498b565b9050613054565b505b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156131805760005b835181101561317e5782818151811061312257613121614a32565b5b60200260200101516003600086848151811061314157613140614a32565b5b602002602001015181526020019081526020016000206000828254613166919061480a565b92505081905550806131779061498b565b9050613106565b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050505050565b8280546131bf90614928565b90600052602060002090601f0160209004810192826131e15760008555613228565b82601f106131fa57805160ff1916838001178555613228565b82800160010185558215613228579182015b8281111561322757825182559160200191906001019061320c565b5b5090506132359190613239565b5090565b5b8082111561325257600081600090555060010161323a565b5090565b6000613269613264846145f8565b6145d3565b9050808382526020820190508285602086028201111561328c5761328b614ab7565b5b60005b858110156132bc57816132a28882613448565b84526020840193506020830192505060018101905061328f565b5050509392505050565b60006132d96132d484614624565b6145d3565b905080838252602082019050828560208602820111156132fc576132fb614ab7565b5b60005b8581101561334a57813567ffffffffffffffff81111561332257613321614ab2565b5b80860161332f8982613569565b855260208501945060208401935050506001810190506132ff565b5050509392505050565b600061336761336284614650565b6145d3565b9050808382526020820190508285602086028201111561338a57613389614ab7565b5b60005b858110156133ba57816133a08882613597565b84526020840193506020830192505060018101905061338d565b5050509392505050565b60006133d76133d28461467c565b6145d3565b9050828152602081018484840111156133f3576133f2614abc565b5b6133fe8482856148bc565b509392505050565b6000613419613414846146ad565b6145d3565b90508281526020810184848401111561343557613434614abc565b5b6134408482856148bc565b509392505050565b600081359050613457816151b7565b92915050565b600082601f83011261347257613471614ab2565b5b8135613482848260208601613256565b91505092915050565b600082601f8301126134a05761349f614ab2565b5b81356134b08482602086016132c6565b91505092915050565b600082601f8301126134ce576134cd614ab2565b5b81356134de848260208601613354565b91505092915050565b6000813590506134f6816151ce565b92915050565b60008135905061350b816151e5565b92915050565b600081359050613520816151fc565b92915050565b600081519050613535816151fc565b92915050565b600082601f8301126135505761354f614ab2565b5b81356135608482602086016133c4565b91505092915050565b600082601f83011261357e5761357d614ab2565b5b813561358e848260208601613406565b91505092915050565b6000813590506135a681615213565b92915050565b6000602082840312156135c2576135c1614ac6565b5b60006135d084828501613448565b91505092915050565b600080604083850312156135f0576135ef614ac6565b5b60006135fe85828601613448565b925050602061360f85828601613448565b9150509250929050565b600080600080600060a0868803121561363557613634614ac6565b5b600061364388828901613448565b955050602061365488828901613448565b945050604086013567ffffffffffffffff81111561367557613674614ac1565b5b613681888289016134b9565b935050606086013567ffffffffffffffff8111156136a2576136a1614ac1565b5b6136ae888289016134b9565b925050608086013567ffffffffffffffff8111156136cf576136ce614ac1565b5b6136db8882890161353b565b9150509295509295909350565b600080600080600060a0868803121561370457613703614ac6565b5b600061371288828901613448565b955050602061372388828901613448565b945050604061373488828901613597565b935050606061374588828901613597565b925050608086013567ffffffffffffffff81111561376657613765614ac1565b5b6137728882890161353b565b9150509295509295909350565b60008060006060848603121561379857613797614ac6565b5b60006137a686828701613448565b935050602084013567ffffffffffffffff8111156137c7576137c6614ac1565b5b6137d3868287016134b9565b925050604084013567ffffffffffffffff8111156137f4576137f3614ac1565b5b613800868287016134b9565b9150509250925092565b6000806000806080858703121561382457613823614ac6565b5b600061383287828801613448565b945050602085013567ffffffffffffffff81111561385357613852614ac1565b5b61385f878288016134b9565b935050604085013567ffffffffffffffff8111156138805761387f614ac1565b5b61388c878288016134b9565b925050606085013567ffffffffffffffff8111156138ad576138ac614ac1565b5b6138b98782880161353b565b91505092959194509250565b600080604083850312156138dc576138db614ac6565b5b60006138ea85828601613448565b92505060206138fb858286016134e7565b9150509250929050565b6000806040838503121561391c5761391b614ac6565b5b600061392a85828601613448565b925050602061393b85828601613597565b9150509250929050565b60008060006060848603121561395e5761395d614ac6565b5b600061396c86828701613448565b935050602061397d86828701613597565b925050604061398e86828701613597565b9150509250925092565b600080600080608085870312156139b2576139b1614ac6565b5b60006139c087828801613448565b94505060206139d187828801613597565b93505060406139e287828801613597565b925050606085013567ffffffffffffffff811115613a0357613a02614ac1565b5b613a0f8782880161353b565b91505092959194509250565b60008060408385031215613a3257613a31614ac6565b5b600083013567ffffffffffffffff811115613a5057613a4f614ac1565b5b613a5c8582860161345d565b925050602083013567ffffffffffffffff811115613a7d57613a7c614ac1565b5b613a89858286016134b9565b9150509250929050565b60008060408385031215613aaa57613aa9614ac6565b5b600083013567ffffffffffffffff811115613ac857613ac7614ac1565b5b613ad4858286016134b9565b925050602083013567ffffffffffffffff811115613af557613af4614ac1565b5b613b018582860161348b565b9150509250929050565b600060208284031215613b2157613b20614ac6565b5b6000613b2f848285016134fc565b91505092915050565b60008060408385031215613b4f57613b4e614ac6565b5b6000613b5d858286016134fc565b9250506020613b6e85828601613448565b9150509250929050565b600060208284031215613b8e57613b8d614ac6565b5b6000613b9c84828501613511565b91505092915050565b600060208284031215613bbb57613bba614ac6565b5b6000613bc984828501613526565b91505092915050565b600060208284031215613be857613be7614ac6565b5b6000613bf684828501613597565b91505092915050565b60008060408385031215613c1657613c15614ac6565b5b6000613c2485828601613597565b925050602083013567ffffffffffffffff811115613c4557613c44614ac1565b5b613c5185828601613569565b9150509250929050565b6000613c6783836140e9565b60208301905092915050565b613c7c8161483e565b82525050565b6000613c8d826146ee565b613c97818561471c565b9350613ca2836146de565b8060005b83811015613cd3578151613cba8882613c5b565b9750613cc58361470f565b925050600181019050613ca6565b5085935050505092915050565b613ce981614850565b82525050565b613cf88161485c565b82525050565b6000613d09826146f9565b613d13818561472d565b9350613d238185602086016148cb565b613d2c81614acb565b840191505092915050565b6000613d4282614704565b613d4c818561473e565b9350613d5c8185602086016148cb565b613d6581614acb565b840191505092915050565b6000613d7b82614704565b613d85818561474f565b9350613d958185602086016148cb565b80840191505092915050565b6000613dae60348361473e565b9150613db982614ae9565b604082019050919050565b6000613dd160208361473e565b9150613ddc82614b38565b602082019050919050565b6000613df460288361473e565b9150613dff82614b61565b604082019050919050565b6000613e1760148361473e565b9150613e2282614bb0565b602082019050919050565b6000613e3a601f8361473e565b9150613e4582614bd9565b602082019050919050565b6000613e5d602b8361473e565b9150613e6882614c02565b604082019050919050565b6000613e8060268361473e565b9150613e8b82614c51565b604082019050919050565b6000613ea360248361473e565b9150613eae82614ca0565b604082019050919050565b6000613ec660298361473e565b9150613ed182614cef565b604082019050919050565b6000613ee960108361473e565b9150613ef482614d3e565b602082019050919050565b6000613f0c60258361473e565b9150613f1782614d67565b604082019050919050565b6000613f2f60328361473e565b9150613f3a82614db6565b604082019050919050565b6000613f5260238361473e565b9150613f5d82614e05565b604082019050919050565b6000613f75602a8361473e565b9150613f8082614e54565b604082019050919050565b6000613f9860208361473e565b9150613fa382614ea3565b602082019050919050565b6000613fbb601c8361473e565b9150613fc682614ecc565b602082019050919050565b6000613fde60218361473e565b9150613fe982614ef5565b604082019050919050565b600061400160178361474f565b915061400c82614f44565b601782019050919050565b600061402460298361473e565b915061402f82614f6d565b604082019050919050565b600061404760298361473e565b915061405282614fbc565b604082019050919050565b600061406a60288361473e565b91506140758261500b565b604082019050919050565b600061408d60218361473e565b91506140988261505a565b604082019050919050565b60006140b060118361474f565b91506140bb826150a9565b601182019050919050565b60006140d3602f8361473e565b91506140de826150d2565b604082019050919050565b6140f2816148b2565b82525050565b614101816148b2565b82525050565b600061411282613ff4565b915061411e8285613d70565b9150614129826140a3565b91506141358284613d70565b91508190509392505050565b60006020820190506141566000830184613c73565b92915050565b600060a0820190506141716000830188613c73565b61417e6020830187613c73565b81810360408301526141908186613c82565b905081810360608301526141a48185613c82565b905081810360808301526141b88184613cfe565b90509695505050505050565b600060a0820190506141d96000830188613c73565b6141e66020830187613c73565b6141f360408301866140f8565b61420060608301856140f8565b81810360808301526142128184613cfe565b90509695505050505050565b600060208201905081810360008301526142388184613c82565b905092915050565b6000604082019050818103600083015261425a8185613c82565b9050818103602083015261426e8184613c82565b90509392505050565b600060208201905061428c6000830184613ce0565b92915050565b60006020820190506142a76000830184613cef565b92915050565b600060208201905081810360008301526142c78184613d37565b905092915050565b600060208201905081810360008301526142e881613da1565b9050919050565b6000602082019050818103600083015261430881613dc4565b9050919050565b6000602082019050818103600083015261432881613de7565b9050919050565b6000602082019050818103600083015261434881613e0a565b9050919050565b6000602082019050818103600083015261436881613e2d565b9050919050565b6000602082019050818103600083015261438881613e50565b9050919050565b600060208201905081810360008301526143a881613e73565b9050919050565b600060208201905081810360008301526143c881613e96565b9050919050565b600060208201905081810360008301526143e881613eb9565b9050919050565b6000602082019050818103600083015261440881613edc565b9050919050565b6000602082019050818103600083015261442881613eff565b9050919050565b6000602082019050818103600083015261444881613f22565b9050919050565b6000602082019050818103600083015261446881613f45565b9050919050565b6000602082019050818103600083015261448881613f68565b9050919050565b600060208201905081810360008301526144a881613f8b565b9050919050565b600060208201905081810360008301526144c881613fae565b9050919050565b600060208201905081810360008301526144e881613fd1565b9050919050565b6000602082019050818103600083015261450881614017565b9050919050565b600060208201905081810360008301526145288161403a565b9050919050565b600060208201905081810360008301526145488161405d565b9050919050565b6000602082019050818103600083015261456881614080565b9050919050565b60006020820190508181036000830152614588816140c6565b9050919050565b60006020820190506145a460008301846140f8565b92915050565b60006040820190506145bf60008301856140f8565b6145cc60208301846140f8565b9392505050565b60006145dd6145ee565b90506145e9828261495a565b919050565b6000604051905090565b600067ffffffffffffffff82111561461357614612614a61565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561463f5761463e614a61565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561466b5761466a614a61565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561469757614696614a61565b5b6146a082614acb565b9050602081019050919050565b600067ffffffffffffffff8211156146c8576146c7614a61565b5b6146d182614acb565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614765826148b2565b9150614770836148b2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156147a5576147a46149d4565b5b828201905092915050565b60006147bb826148b2565b91506147c6836148b2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156147ff576147fe6149d4565b5b828202905092915050565b6000614815826148b2565b9150614820836148b2565b925082821015614833576148326149d4565b5b828203905092915050565b600061484982614892565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156148e95780820151818401526020810190506148ce565b838111156148f8576000848401525b50505050565b6000614909826148b2565b9150600082141561491d5761491c6149d4565b5b600182039050919050565b6000600282049050600182168061494057607f821691505b6020821081141561495457614953614a03565b5b50919050565b61496382614acb565b810181811067ffffffffffffffff8211171561498257614981614a61565b5b80604052505050565b6000614996826148b2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156149c9576149c86149d4565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d1115614aaf5760046000803e614aac600051614adc565b90505b90565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160e01c9050919050565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00600082015250565b7f455243313135353a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f55524920736574206f66206e6f6e6578697374656e7420746f6b656e00000000600082015250565b7f746f6b656e49647320616e642075726973206c656e677468206d69736d61746360008201527f6800000000000000000000000000000000000000000000000000000000000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b600060443d1015615131576151b4565b6151396145ee565b60043d036004823e80513d602482011167ffffffffffffffff821117156151615750506151b4565b808201805167ffffffffffffffff81111561517f57505050506151b4565b80602083010160043d03850181111561519c5750505050506151b4565b6151ab8260200185018661495a565b82955050505050505b90565b6151c08161483e565b81146151cb57600080fd5b50565b6151d781614850565b81146151e257600080fd5b50565b6151ee8161485c565b81146151f957600080fd5b50565b61520581614866565b811461521057600080fd5b50565b61521c816148b2565b811461522757600080fd5b5056fea2646970667358221220f260cc0e7a5f241d3d831f0379454de79d60250e934ac429fe3eb0833ab0338a64736f6c63430008070033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101ef5760003560e01c8063731133e91161010f578063bd85b039116100a2578063e985e9c511610071578063e985e9c51461057c578063f242432a146105ac578063f2fde38b146105c8578063f5298aca146105e4576101ef565b8063bd85b039146104f4578063d539139314610524578063d547741f14610542578063e63ab1e91461055e576101ef565b80638da5cb5b116100de5780638da5cb5b1461046c57806391d148541461048a578063a217fddf146104ba578063a22cb465146104d8576101ef565b8063731133e91461040c5780637f345710146104285780638456cb5914610446578063862440e214610450576101ef565b80632f2ff15d116101875780634f558e79116101565780634f558e79146103985780635c975abb146103c85780636b20c454146103e6578063715018a614610402576101ef565b80632f2ff15d1461032657806336568abe146103425780633f4ba83a1461035e5780634e1273f414610368576101ef565b80630e89341c116101c35780630e89341c1461028e5780631f7fdffa146102be578063248a9ca3146102da5780632eb2c2d61461030a576101ef565b8062fdd58e146101f457806301b98ea01461022457806301ffc9a71461024057806306fdde0314610270575b600080fd5b61020e60048036038101906102099190613905565b610600565b60405161021b919061458f565b60405180910390f35b61023e60048036038101906102399190613a93565b6106c9565b005b61025a60048036038101906102559190613b78565b610826565b6040516102679190614277565b60405180910390f35b610278610838565b60405161028591906142ad565b60405180910390f35b6102a860048036038101906102a39190613bd2565b6108ca565b6040516102b591906142ad565b60405180910390f35b6102d860048036038101906102d3919061380a565b6109bb565b005b6102f460048036038101906102ef9190613b0b565b610a00565b6040516103019190614292565b60405180910390f35b610324600480360381019061031f9190613619565b610a20565b005b610340600480360381019061033b9190613b38565b610ac1565b005b61035c60048036038101906103579190613b38565b610aea565b005b610366610b6d565b005b610382600480360381019061037d9190613a1b565b610baa565b60405161038f919061421e565b60405180910390f35b6103b260048036038101906103ad9190613bd2565b610cc3565b6040516103bf9190614277565b60405180910390f35b6103d0610cd7565b6040516103dd9190614277565b60405180910390f35b61040060048036038101906103fb919061377f565b610cee565b005b61040a610d8b565b005b61042660048036038101906104219190613998565b610e13565b005b610430610e58565b60405161043d9190614292565b60405180910390f35b61044e610e7c565b005b61046a60048036038101906104659190613bff565b610eb9565b005b610474610f64565b6040516104819190614141565b60405180910390f35b6104a4600480360381019061049f9190613b38565b610f8e565b6040516104b19190614277565b60405180910390f35b6104c2610ff9565b6040516104cf9190614292565b60405180910390f35b6104f260048036038101906104ed91906138c5565b611000565b005b61050e60048036038101906105099190613bd2565b611016565b60405161051b919061458f565b60405180910390f35b61052c611033565b6040516105399190614292565b60405180910390f35b61055c60048036038101906105579190613b38565b611057565b005b610566611080565b6040516105739190614292565b60405180910390f35b610596600480360381019061059191906135d9565b6110a4565b6040516105a39190614277565b60405180910390f35b6105c660048036038101906105c191906136e8565b611138565b005b6105e260048036038101906105dd91906135ac565b6111d9565b005b6105fe60048036038101906105f99190613945565b6112d1565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610671576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106689061436f565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b7f7804d923f43a17d325d77e781528e0793b2edd9890ab45fc64efd7b4b427744c6106fb816106f661136e565b611376565b815183511461073f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610736906144cf565b60405180910390fd5b60005b835181101561082057600061077085838151811061076357610762614a32565b5b6020026020010151611016565b14156107b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a8906144af565b60405180910390fd5b8281815181106107c4576107c3614a32565b5b6020026020010151600760008684815181106107e3576107e2614a32565b5b60200260200101518152602001908152602001600020908051906020019061080c9291906131b3565b5080806108189061498b565b915050610742565b50505050565b600061083182611413565b9050919050565b60606006805461084790614928565b80601f016020809104026020016040519081016040528092919081815260200182805461087390614928565b80156108c05780601f10610895576101008083540402835291602001916108c0565b820191906000526020600020905b8154815290600101906020018083116108a357829003601f168201915b5050505050905090565b606060006108d783611016565b1415610918576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090f9061434f565b60405180910390fd5b60076000838152602001908152602001600020805461093690614928565b80601f016020809104026020016040519081016040528092919081815260200182805461096290614928565b80156109af5780601f10610984576101008083540402835291602001916109af565b820191906000526020600020905b81548152906001019060200180831161099257829003601f168201915b50505050509050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66109ed816109e861136e565b611376565b6109f98585858561148d565b5050505050565b600060046000838152602001908152602001600020600101549050919050565b610a2861136e565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610a6e5750610a6d85610a6861136e565b6110a4565b5b610aad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa49061442f565b60405180910390fd5b610aba85858585856116ab565b5050505050565b610aca82610a00565b610adb81610ad661136e565b611376565b610ae583836119bf565b505050565b610af261136e565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b569061456f565b60405180910390fd5b610b698282611aa0565b5050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610b9f81610b9a61136e565b611376565b610ba7611b82565b50565b60608151835114610bf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be79061450f565b60405180910390fd5b6000835167ffffffffffffffff811115610c0d57610c0c614a61565b5b604051908082528060200260200182016040528015610c3b5781602001602082028036833780820191505090505b50905060005b8451811015610cb857610c88858281518110610c6057610c5f614a32565b5b6020026020010151858381518110610c7b57610c7a614a32565b5b6020026020010151610600565b828281518110610c9b57610c9a614a32565b5b60200260200101818152505080610cb19061498b565b9050610c41565b508091505092915050565b600080610ccf83611016565b119050919050565b6000600560009054906101000a900460ff16905090565b610cf661136e565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480610d3c5750610d3b83610d3661136e565b6110a4565b5b610d7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d72906143cf565b60405180910390fd5b610d86838383611c24565b505050565b610d9361136e565b73ffffffffffffffffffffffffffffffffffffffff16610db1610f64565b73ffffffffffffffffffffffffffffffffffffffff1614610e07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfe9061448f565b60405180910390fd5b610e116000611ed5565b565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610e4581610e4061136e565b611376565b610e5185858585611f9b565b5050505050565b7f7804d923f43a17d325d77e781528e0793b2edd9890ab45fc64efd7b4b427744c81565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610eae81610ea961136e565b611376565b610eb6612131565b50565b7f7804d923f43a17d325d77e781528e0793b2edd9890ab45fc64efd7b4b427744c610eeb81610ee661136e565b611376565b6000610ef684611016565b1415610f37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2e906144af565b60405180910390fd5b81600760008581526020019081526020016000209080519060200190610f5e9291906131b3565b50505050565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006004600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000801b81565b61101261100b61136e565b83836121d4565b5050565b600060036000838152602001908152602001600020549050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b61106082610a00565b6110718161106c61136e565b611376565b61107b8383611aa0565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61114061136e565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061118657506111858561118061136e565b6110a4565b5b6111c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111bc906143cf565b60405180910390fd5b6111d28585858585612341565b5050505050565b6111e161136e565b73ffffffffffffffffffffffffffffffffffffffff166111ff610f64565b73ffffffffffffffffffffffffffffffffffffffff1614611255576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124c9061448f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112bc9061438f565b60405180910390fd5b6112ce81611ed5565b50565b6112d961136e565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148061131f575061131e8361131961136e565b6110a4565b5b61135e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611355906143cf565b60405180910390fd5b6113698383836125c3565b505050565b600033905090565b6113808282610f8e565b61140f576113a58173ffffffffffffffffffffffffffffffffffffffff1660146127e0565b6113b38360001c60206127e0565b6040516020016113c4929190614107565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140691906142ad565b60405180910390fd5b5050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611486575061148582612a1c565b5b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156114fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f49061454f565b60405180910390fd5b8151835114611541576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115389061452f565b60405180910390fd5b600061154b61136e565b905061155c81600087878787612afe565b60005b84518110156116155783818151811061157b5761157a614a32565b5b602002602001015160008087848151811061159957611598614a32565b5b6020026020010151815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115fb919061475a565b92505081905550808061160d9061498b565b91505061155f565b508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161168d929190614240565b60405180910390a46116a481600087878787612b5c565b5050505050565b81518351146116ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e69061452f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561175f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117569061440f565b60405180910390fd5b600061176961136e565b9050611779818787878787612afe565b60005b845181101561192a57600085828151811061179a57611799614a32565b5b6020026020010151905060008583815181106117b9576117b8614a32565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561185a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118519061446f565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461190f919061475a565b92505081905550505050806119239061498b565b905061177c565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516119a1929190614240565b60405180910390a46119b7818787878787612b5c565b505050505050565b6119c98282610f8e565b611a9c5760016004600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611a4161136e565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b611aaa8282610f8e565b15611b7e5760006004600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611b2361136e565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b611b8a610cd7565b611bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc09061432f565b60405180910390fd5b6000600560006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611c0d61136e565b604051611c1a9190614141565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611c94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8b9061444f565b60405180910390fd5b8051825114611cd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccf9061452f565b60405180910390fd5b6000611ce261136e565b9050611d0281856000868660405180602001604052806000815250612afe565b60005b8351811015611e4f576000848281518110611d2357611d22614a32565b5b602002602001015190506000848381518110611d4257611d41614a32565b5b60200260200101519050600080600084815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611de3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dda906143af565b60405180910390fd5b81810360008085815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050508080611e479061498b565b915050611d05565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051611ec7929190614240565b60405180910390a450505050565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561200b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120029061454f565b60405180910390fd5b600061201561136e565b90506120368160008761202788612d43565b61203088612d43565b87612afe565b8260008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612095919061475a565b925050819055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6287876040516121139291906145aa565b60405180910390a461212a81600087878787612dbd565b5050505050565b612139610cd7565b15612179576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612170906143ef565b60405180910390fd5b6001600560006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586121bd61136e565b6040516121ca9190614141565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612243576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223a906144ef565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516123349190614277565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156123b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a89061440f565b60405180910390fd5b60006123bb61136e565b90506123db8187876123cc88612d43565b6123d588612d43565b87612afe565b600080600086815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015612472576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124699061446f565b60405180910390fd5b83810360008087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508360008087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612527919061475a565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6288886040516125a49291906145aa565b60405180910390a46125ba828888888888612dbd565b50505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612633576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262a9061444f565b60405180910390fd5b600061263d61136e565b905061266d8185600061264f87612d43565b61265887612d43565b60405180602001604052806000815250612afe565b600080600085815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015612704576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126fb906143af565b60405180910390fd5b82810360008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6287876040516127d19291906145aa565b60405180910390a45050505050565b6060600060028360026127f391906147b0565b6127fd919061475a565b67ffffffffffffffff81111561281657612815614a61565b5b6040519080825280601f01601f1916602001820160405280156128485781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106128805761287f614a32565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106128e4576128e3614a32565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000600184600261292491906147b0565b61292e919061475a565b90505b60018111156129ce577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106129705761296f614a32565b5b1a60f81b82828151811061298757612986614a32565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806129c7906148fe565b9050612931565b5060008414612a12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a09906142ef565b60405180910390fd5b8091505092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612ae757507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612af75750612af682612fa4565b5b9050919050565b612b06610cd7565b15612b46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3d906143ef565b60405180910390fd5b612b5486868686868661300e565b505050505050565b612b7b8473ffffffffffffffffffffffffffffffffffffffff16613188565b15612d3b578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401612bc195949392919061415c565b602060405180830381600087803b158015612bdb57600080fd5b505af1925050508015612c0c57506040513d601f19601f82011682018060405250810190612c099190613ba5565b60015b612cb257612c18614a90565b806308c379a01415612c755750612c2d615121565b80612c385750612c77565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c6c91906142ad565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ca9906142cf565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612d39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d309061430f565b60405180910390fd5b505b505050505050565b60606000600167ffffffffffffffff811115612d6257612d61614a61565b5b604051908082528060200260200182016040528015612d905781602001602082028036833780820191505090505b5090508281600081518110612da857612da7614a32565b5b60200260200101818152505080915050919050565b612ddc8473ffffffffffffffffffffffffffffffffffffffff16613188565b15612f9c578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401612e229594939291906141c4565b602060405180830381600087803b158015612e3c57600080fd5b505af1925050508015612e6d57506040513d601f19601f82011682018060405250810190612e6a9190613ba5565b60015b612f1357612e79614a90565b806308c379a01415612ed65750612e8e615121565b80612e995750612ed8565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ecd91906142ad565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f0a906142cf565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612f9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f919061430f565b60405180910390fd5b505b505050505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61301c8686868686866131ab565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156130ce5760005b83518110156130cc578281815181106130705761306f614a32565b5b60200260200101516003600086848151811061308f5761308e614a32565b5b6020026020010151815260200190815260200160002060008282546130b4919061475a565b92505081905550806130c59061498b565b9050613054565b505b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156131805760005b835181101561317e5782818151811061312257613121614a32565b5b60200260200101516003600086848151811061314157613140614a32565b5b602002602001015181526020019081526020016000206000828254613166919061480a565b92505081905550806131779061498b565b9050613106565b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050505050565b8280546131bf90614928565b90600052602060002090601f0160209004810192826131e15760008555613228565b82601f106131fa57805160ff1916838001178555613228565b82800160010185558215613228579182015b8281111561322757825182559160200191906001019061320c565b5b5090506132359190613239565b5090565b5b8082111561325257600081600090555060010161323a565b5090565b6000613269613264846145f8565b6145d3565b9050808382526020820190508285602086028201111561328c5761328b614ab7565b5b60005b858110156132bc57816132a28882613448565b84526020840193506020830192505060018101905061328f565b5050509392505050565b60006132d96132d484614624565b6145d3565b905080838252602082019050828560208602820111156132fc576132fb614ab7565b5b60005b8581101561334a57813567ffffffffffffffff81111561332257613321614ab2565b5b80860161332f8982613569565b855260208501945060208401935050506001810190506132ff565b5050509392505050565b600061336761336284614650565b6145d3565b9050808382526020820190508285602086028201111561338a57613389614ab7565b5b60005b858110156133ba57816133a08882613597565b84526020840193506020830192505060018101905061338d565b5050509392505050565b60006133d76133d28461467c565b6145d3565b9050828152602081018484840111156133f3576133f2614abc565b5b6133fe8482856148bc565b509392505050565b6000613419613414846146ad565b6145d3565b90508281526020810184848401111561343557613434614abc565b5b6134408482856148bc565b509392505050565b600081359050613457816151b7565b92915050565b600082601f83011261347257613471614ab2565b5b8135613482848260208601613256565b91505092915050565b600082601f8301126134a05761349f614ab2565b5b81356134b08482602086016132c6565b91505092915050565b600082601f8301126134ce576134cd614ab2565b5b81356134de848260208601613354565b91505092915050565b6000813590506134f6816151ce565b92915050565b60008135905061350b816151e5565b92915050565b600081359050613520816151fc565b92915050565b600081519050613535816151fc565b92915050565b600082601f8301126135505761354f614ab2565b5b81356135608482602086016133c4565b91505092915050565b600082601f83011261357e5761357d614ab2565b5b813561358e848260208601613406565b91505092915050565b6000813590506135a681615213565b92915050565b6000602082840312156135c2576135c1614ac6565b5b60006135d084828501613448565b91505092915050565b600080604083850312156135f0576135ef614ac6565b5b60006135fe85828601613448565b925050602061360f85828601613448565b9150509250929050565b600080600080600060a0868803121561363557613634614ac6565b5b600061364388828901613448565b955050602061365488828901613448565b945050604086013567ffffffffffffffff81111561367557613674614ac1565b5b613681888289016134b9565b935050606086013567ffffffffffffffff8111156136a2576136a1614ac1565b5b6136ae888289016134b9565b925050608086013567ffffffffffffffff8111156136cf576136ce614ac1565b5b6136db8882890161353b565b9150509295509295909350565b600080600080600060a0868803121561370457613703614ac6565b5b600061371288828901613448565b955050602061372388828901613448565b945050604061373488828901613597565b935050606061374588828901613597565b925050608086013567ffffffffffffffff81111561376657613765614ac1565b5b6137728882890161353b565b9150509295509295909350565b60008060006060848603121561379857613797614ac6565b5b60006137a686828701613448565b935050602084013567ffffffffffffffff8111156137c7576137c6614ac1565b5b6137d3868287016134b9565b925050604084013567ffffffffffffffff8111156137f4576137f3614ac1565b5b613800868287016134b9565b9150509250925092565b6000806000806080858703121561382457613823614ac6565b5b600061383287828801613448565b945050602085013567ffffffffffffffff81111561385357613852614ac1565b5b61385f878288016134b9565b935050604085013567ffffffffffffffff8111156138805761387f614ac1565b5b61388c878288016134b9565b925050606085013567ffffffffffffffff8111156138ad576138ac614ac1565b5b6138b98782880161353b565b91505092959194509250565b600080604083850312156138dc576138db614ac6565b5b60006138ea85828601613448565b92505060206138fb858286016134e7565b9150509250929050565b6000806040838503121561391c5761391b614ac6565b5b600061392a85828601613448565b925050602061393b85828601613597565b9150509250929050565b60008060006060848603121561395e5761395d614ac6565b5b600061396c86828701613448565b935050602061397d86828701613597565b925050604061398e86828701613597565b9150509250925092565b600080600080608085870312156139b2576139b1614ac6565b5b60006139c087828801613448565b94505060206139d187828801613597565b93505060406139e287828801613597565b925050606085013567ffffffffffffffff811115613a0357613a02614ac1565b5b613a0f8782880161353b565b91505092959194509250565b60008060408385031215613a3257613a31614ac6565b5b600083013567ffffffffffffffff811115613a5057613a4f614ac1565b5b613a5c8582860161345d565b925050602083013567ffffffffffffffff811115613a7d57613a7c614ac1565b5b613a89858286016134b9565b9150509250929050565b60008060408385031215613aaa57613aa9614ac6565b5b600083013567ffffffffffffffff811115613ac857613ac7614ac1565b5b613ad4858286016134b9565b925050602083013567ffffffffffffffff811115613af557613af4614ac1565b5b613b018582860161348b565b9150509250929050565b600060208284031215613b2157613b20614ac6565b5b6000613b2f848285016134fc565b91505092915050565b60008060408385031215613b4f57613b4e614ac6565b5b6000613b5d858286016134fc565b9250506020613b6e85828601613448565b9150509250929050565b600060208284031215613b8e57613b8d614ac6565b5b6000613b9c84828501613511565b91505092915050565b600060208284031215613bbb57613bba614ac6565b5b6000613bc984828501613526565b91505092915050565b600060208284031215613be857613be7614ac6565b5b6000613bf684828501613597565b91505092915050565b60008060408385031215613c1657613c15614ac6565b5b6000613c2485828601613597565b925050602083013567ffffffffffffffff811115613c4557613c44614ac1565b5b613c5185828601613569565b9150509250929050565b6000613c6783836140e9565b60208301905092915050565b613c7c8161483e565b82525050565b6000613c8d826146ee565b613c97818561471c565b9350613ca2836146de565b8060005b83811015613cd3578151613cba8882613c5b565b9750613cc58361470f565b925050600181019050613ca6565b5085935050505092915050565b613ce981614850565b82525050565b613cf88161485c565b82525050565b6000613d09826146f9565b613d13818561472d565b9350613d238185602086016148cb565b613d2c81614acb565b840191505092915050565b6000613d4282614704565b613d4c818561473e565b9350613d5c8185602086016148cb565b613d6581614acb565b840191505092915050565b6000613d7b82614704565b613d85818561474f565b9350613d958185602086016148cb565b80840191505092915050565b6000613dae60348361473e565b9150613db982614ae9565b604082019050919050565b6000613dd160208361473e565b9150613ddc82614b38565b602082019050919050565b6000613df460288361473e565b9150613dff82614b61565b604082019050919050565b6000613e1760148361473e565b9150613e2282614bb0565b602082019050919050565b6000613e3a601f8361473e565b9150613e4582614bd9565b602082019050919050565b6000613e5d602b8361473e565b9150613e6882614c02565b604082019050919050565b6000613e8060268361473e565b9150613e8b82614c51565b604082019050919050565b6000613ea360248361473e565b9150613eae82614ca0565b604082019050919050565b6000613ec660298361473e565b9150613ed182614cef565b604082019050919050565b6000613ee960108361473e565b9150613ef482614d3e565b602082019050919050565b6000613f0c60258361473e565b9150613f1782614d67565b604082019050919050565b6000613f2f60328361473e565b9150613f3a82614db6565b604082019050919050565b6000613f5260238361473e565b9150613f5d82614e05565b604082019050919050565b6000613f75602a8361473e565b9150613f8082614e54565b604082019050919050565b6000613f9860208361473e565b9150613fa382614ea3565b602082019050919050565b6000613fbb601c8361473e565b9150613fc682614ecc565b602082019050919050565b6000613fde60218361473e565b9150613fe982614ef5565b604082019050919050565b600061400160178361474f565b915061400c82614f44565b601782019050919050565b600061402460298361473e565b915061402f82614f6d565b604082019050919050565b600061404760298361473e565b915061405282614fbc565b604082019050919050565b600061406a60288361473e565b91506140758261500b565b604082019050919050565b600061408d60218361473e565b91506140988261505a565b604082019050919050565b60006140b060118361474f565b91506140bb826150a9565b601182019050919050565b60006140d3602f8361473e565b91506140de826150d2565b604082019050919050565b6140f2816148b2565b82525050565b614101816148b2565b82525050565b600061411282613ff4565b915061411e8285613d70565b9150614129826140a3565b91506141358284613d70565b91508190509392505050565b60006020820190506141566000830184613c73565b92915050565b600060a0820190506141716000830188613c73565b61417e6020830187613c73565b81810360408301526141908186613c82565b905081810360608301526141a48185613c82565b905081810360808301526141b88184613cfe565b90509695505050505050565b600060a0820190506141d96000830188613c73565b6141e66020830187613c73565b6141f360408301866140f8565b61420060608301856140f8565b81810360808301526142128184613cfe565b90509695505050505050565b600060208201905081810360008301526142388184613c82565b905092915050565b6000604082019050818103600083015261425a8185613c82565b9050818103602083015261426e8184613c82565b90509392505050565b600060208201905061428c6000830184613ce0565b92915050565b60006020820190506142a76000830184613cef565b92915050565b600060208201905081810360008301526142c78184613d37565b905092915050565b600060208201905081810360008301526142e881613da1565b9050919050565b6000602082019050818103600083015261430881613dc4565b9050919050565b6000602082019050818103600083015261432881613de7565b9050919050565b6000602082019050818103600083015261434881613e0a565b9050919050565b6000602082019050818103600083015261436881613e2d565b9050919050565b6000602082019050818103600083015261438881613e50565b9050919050565b600060208201905081810360008301526143a881613e73565b9050919050565b600060208201905081810360008301526143c881613e96565b9050919050565b600060208201905081810360008301526143e881613eb9565b9050919050565b6000602082019050818103600083015261440881613edc565b9050919050565b6000602082019050818103600083015261442881613eff565b9050919050565b6000602082019050818103600083015261444881613f22565b9050919050565b6000602082019050818103600083015261446881613f45565b9050919050565b6000602082019050818103600083015261448881613f68565b9050919050565b600060208201905081810360008301526144a881613f8b565b9050919050565b600060208201905081810360008301526144c881613fae565b9050919050565b600060208201905081810360008301526144e881613fd1565b9050919050565b6000602082019050818103600083015261450881614017565b9050919050565b600060208201905081810360008301526145288161403a565b9050919050565b600060208201905081810360008301526145488161405d565b9050919050565b6000602082019050818103600083015261456881614080565b9050919050565b60006020820190508181036000830152614588816140c6565b9050919050565b60006020820190506145a460008301846140f8565b92915050565b60006040820190506145bf60008301856140f8565b6145cc60208301846140f8565b9392505050565b60006145dd6145ee565b90506145e9828261495a565b919050565b6000604051905090565b600067ffffffffffffffff82111561461357614612614a61565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561463f5761463e614a61565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561466b5761466a614a61565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561469757614696614a61565b5b6146a082614acb565b9050602081019050919050565b600067ffffffffffffffff8211156146c8576146c7614a61565b5b6146d182614acb565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614765826148b2565b9150614770836148b2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156147a5576147a46149d4565b5b828201905092915050565b60006147bb826148b2565b91506147c6836148b2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156147ff576147fe6149d4565b5b828202905092915050565b6000614815826148b2565b9150614820836148b2565b925082821015614833576148326149d4565b5b828203905092915050565b600061484982614892565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156148e95780820151818401526020810190506148ce565b838111156148f8576000848401525b50505050565b6000614909826148b2565b9150600082141561491d5761491c6149d4565b5b600182039050919050565b6000600282049050600182168061494057607f821691505b6020821081141561495457614953614a03565b5b50919050565b61496382614acb565b810181811067ffffffffffffffff8211171561498257614981614a61565b5b80604052505050565b6000614996826148b2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156149c9576149c86149d4565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d1115614aaf5760046000803e614aac600051614adc565b90505b90565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160e01c9050919050565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00600082015250565b7f455243313135353a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f55524920736574206f66206e6f6e6578697374656e7420746f6b656e00000000600082015250565b7f746f6b656e49647320616e642075726973206c656e677468206d69736d61746360008201527f6800000000000000000000000000000000000000000000000000000000000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b600060443d1015615131576151b4565b6151396145ee565b60043d036004823e80513d602482011167ffffffffffffffff821117156151615750506151b4565b808201805167ffffffffffffffff81111561517f57505050506151b4565b80602083010160043d03850181111561519c5750505050506151b4565b6151ab8260200185018661495a565b82955050505050505b90565b6151c08161483e565b81146151cb57600080fd5b50565b6151d781614850565b81146151e257600080fd5b50565b6151ee8161485c565b81146151f957600080fd5b50565b61520581614866565b811461521057600080fd5b50565b61521c816148b2565b811461522757600080fd5b5056fea2646970667358221220f260cc0e7a5f241d3d831f0379454de79d60250e934ac429fe3eb0833ab0338a64736f6c63430008070033

Deployed Bytecode Sourcemap

54921:2974:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38436:231;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56213:404;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57682:210;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56625:91;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55777:210;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57079:203;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25373:131;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40375:442;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25766:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26814:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56805:77;;;:::i;:::-;;38833:524;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53995:122;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9720:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52699:353;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7771:103;;;:::i;:::-;;56890:181;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55018:70;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56724:73;;;:::i;:::-;;55995:210;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7120:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24242:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23333:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39430:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53784:113;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55164:62;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26158:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55095:62;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39657:168;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39897:401;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8029:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52370:321;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38436:231;38522:7;38569:1;38550:21;;:7;:21;;;;38542:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;38637:9;:13;38647:2;38637:13;;;;;;;;;;;:22;38651:7;38637:22;;;;;;;;;;;;;;;;38630:29;;38436:231;;;;:::o;56213:404::-;55060:28;23824:30;23835:4;23841:12;:10;:12::i;:::-;23824:10;:30::i;:::-;56355:5:::1;:12;56336:8;:15;:31;56328:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;56423:9;56418:192;56442:8;:15;56438:1;:19;56418:192;;;56515:1;56487:24;56499:8;56508:1;56499:11;;;;;;;;:::i;:::-;;;;;;;;56487;:24::i;:::-;:29;;56479:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;56590:5;56596:1;56590:8;;;;;;;;:::i;:::-;;;;;;;;56564:10;:23;56575:8;56584:1;56575:11;;;;;;;;:::i;:::-;;;;;;;;56564:23;;;;;;;;;;;:34;;;;;;;;;;;;:::i;:::-;;56459:3;;;;;:::i;:::-;;;;56418:192;;;;56213:404:::0;;;:::o;57682:210::-;57819:4;57848:36;57872:11;57848:23;:36::i;:::-;57841:43;;57682:210;;;:::o;56625:91::-;56670:13;56703:5;56696:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56625:91;:::o;55777:210::-;55845:13;55903:1;55879:20;55891:7;55879:11;:20::i;:::-;:25;;55871:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;55960:10;:19;55971:7;55960:19;;;;;;;;;;;55953:26;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55777:210;;;:::o;57079:203::-;55202:24;23824:30;23835:4;23841:12;:10;:12::i;:::-;23824:10;:30::i;:::-;57240:34:::1;57251:2;57255:3;57260:7;57269:4;57240:10;:34::i;:::-;57079:203:::0;;;;;:::o;25373:131::-;25447:7;25474:6;:12;25481:4;25474:12;;;;;;;;;;;:22;;;25467:29;;25373:131;;;:::o;40375:442::-;40616:12;:10;:12::i;:::-;40608:20;;:4;:20;;;:60;;;;40632:36;40649:4;40655:12;:10;:12::i;:::-;40632:16;:36::i;:::-;40608:60;40586:160;;;;;;;;;;;;:::i;:::-;;;;;;;;;40757:52;40780:4;40786:2;40790:3;40795:7;40804:4;40757:22;:52::i;:::-;40375:442;;;;;:::o;25766:147::-;25849:18;25862:4;25849:12;:18::i;:::-;23824:30;23835:4;23841:12;:10;:12::i;:::-;23824:10;:30::i;:::-;25880:25:::1;25891:4;25897:7;25880:10;:25::i;:::-;25766:147:::0;;;:::o;26814:218::-;26921:12;:10;:12::i;:::-;26910:23;;:7;:23;;;26902:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;26998:26;27010:4;27016:7;26998:11;:26::i;:::-;26814:218;;:::o;56805:77::-;55133:24;23824:30;23835:4;23841:12;:10;:12::i;:::-;23824:10;:30::i;:::-;56864:10:::1;:8;:10::i;:::-;56805:77:::0;:::o;38833:524::-;38989:16;39050:3;:10;39031:8;:15;:29;39023:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;39119:30;39166:8;:15;39152:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39119:63;;39200:9;39195:122;39219:8;:15;39215:1;:19;39195:122;;;39275:30;39285:8;39294:1;39285:11;;;;;;;;:::i;:::-;;;;;;;;39298:3;39302:1;39298:6;;;;;;;;:::i;:::-;;;;;;;;39275:9;:30::i;:::-;39256:13;39270:1;39256:16;;;;;;;;:::i;:::-;;;;;;;:49;;;;;39236:3;;;;:::i;:::-;;;39195:122;;;;39336:13;39329:20;;;38833:524;;;;:::o;53995:122::-;54052:4;54108:1;54076:29;54102:2;54076:25;:29::i;:::-;:33;54069:40;;53995:122;;;:::o;9720:86::-;9767:4;9791:7;;;;;;;;;;;9784:14;;9720:86;:::o;52699:353::-;52875:12;:10;:12::i;:::-;52864:23;;:7;:23;;;:66;;;;52891:39;52908:7;52917:12;:10;:12::i;:::-;52891:16;:39::i;:::-;52864:66;52842:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;53012:32;53023:7;53032:3;53037:6;53012:10;:32::i;:::-;52699:353;;;:::o;7771:103::-;7351:12;:10;:12::i;:::-;7340:23;;:7;:5;:7::i;:::-;:23;;;7332:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7836:30:::1;7863:1;7836:18;:30::i;:::-;7771:103::o:0;56890:181::-;55202:24;23824:30;23835:4;23841:12;:10;:12::i;:::-;23824:10;:30::i;:::-;57031:32:::1;57037:7;57046:2;57050:6;57058:4;57031:5;:32::i;:::-;56890:181:::0;;;;;:::o;55018:70::-;55060:28;55018:70;:::o;56724:73::-;55133:24;23824:30;23835:4;23841:12;:10;:12::i;:::-;23824:10;:30::i;:::-;56781:8:::1;:6;:8::i;:::-;56724:73:::0;:::o;55995:210::-;55060:28;23824:30;23835:4;23841:12;:10;:12::i;:::-;23824:10;:30::i;:::-;56124:1:::1;56100:20;56112:7;56100:11;:20::i;:::-;:25;;56092:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;56193:4;56171:10;:19;56182:7;56171:19;;;;;;;;;;;:26;;;;;;;;;;;;:::i;:::-;;55995:210:::0;;;:::o;7120:87::-;7166:7;7193:6;;;;;;;;;;;7186:13;;7120:87;:::o;24242:147::-;24328:4;24352:6;:12;24359:4;24352:12;;;;;;;;;;;:20;;:29;24373:7;24352:29;;;;;;;;;;;;;;;;;;;;;;;;;24345:36;;24242:147;;;;:::o;23333:49::-;23378:4;23333:49;;;:::o;39430:155::-;39525:52;39544:12;:10;:12::i;:::-;39558:8;39568;39525:18;:52::i;:::-;39430:155;;:::o;53784:113::-;53846:7;53873:12;:16;53886:2;53873:16;;;;;;;;;;;;53866:23;;53784:113;;;:::o;55164:62::-;55202:24;55164:62;:::o;26158:149::-;26242:18;26255:4;26242:12;:18::i;:::-;23824:30;23835:4;23841:12;:10;:12::i;:::-;23824:10;:30::i;:::-;26273:26:::1;26285:4;26291:7;26273:11;:26::i;:::-;26158:149:::0;;;:::o;55095:62::-;55133:24;55095:62;:::o;39657:168::-;39756:4;39780:18;:27;39799:7;39780:27;;;;;;;;;;;;;;;:37;39808:8;39780:37;;;;;;;;;;;;;;;;;;;;;;;;;39773:44;;39657:168;;;;:::o;39897:401::-;40113:12;:10;:12::i;:::-;40105:20;;:4;:20;;;:60;;;;40129:36;40146:4;40152:12;:10;:12::i;:::-;40129:16;:36::i;:::-;40105:60;40083:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;40245:45;40263:4;40269:2;40273;40277:6;40285:4;40245:17;:45::i;:::-;39897:401;;;;;:::o;8029:201::-;7351:12;:10;:12::i;:::-;7340:23;;:7;:5;:7::i;:::-;:23;;;7332:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;8138:1:::1;8118:22;;:8;:22;;;;8110:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;8194:28;8213:8;8194:18;:28::i;:::-;8029:201:::0;:::o;52370:321::-;52521:12;:10;:12::i;:::-;52510:23;;:7;:23;;;:66;;;;52537:39;52554:7;52563:12;:10;:12::i;:::-;52537:16;:39::i;:::-;52510:66;52488:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;52658:25;52664:7;52673:2;52677:5;52658;:25::i;:::-;52370:321;;;:::o;5844:98::-;5897:7;5924:10;5917:17;;5844:98;:::o;24679:505::-;24768:22;24776:4;24782:7;24768;:22::i;:::-;24763:414;;24956:41;24984:7;24956:41;;24994:2;24956:19;:41::i;:::-;25070:38;25098:4;25090:13;;25105:2;25070:19;:38::i;:::-;24861:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;24807:358;;;;;;;;;;;:::i;:::-;;;;;;;;24763:414;24679:505;;:::o;23946:204::-;24031:4;24070:32;24055:47;;;:11;:47;;;;:87;;;;24106:36;24130:11;24106:23;:36::i;:::-;24055:87;24048:94;;23946:204;;;:::o;45776:735::-;45968:1;45954:16;;:2;:16;;;;45946:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;46041:7;:14;46027:3;:10;:28;46019:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;46113:16;46132:12;:10;:12::i;:::-;46113:31;;46157:66;46178:8;46196:1;46200:2;46204:3;46209:7;46218:4;46157:20;:66::i;:::-;46241:9;46236:103;46260:3;:10;46256:1;:14;46236:103;;;46317:7;46325:1;46317:10;;;;;;;;:::i;:::-;;;;;;;;46292:9;:17;46302:3;46306:1;46302:6;;;;;;;;:::i;:::-;;;;;;;;46292:17;;;;;;;;;;;:21;46310:2;46292:21;;;;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;;;;;46272:3;;;;;:::i;:::-;;;;46236:103;;;;46392:2;46356:53;;46388:1;46356:53;;46370:8;46356:53;;;46396:3;46401:7;46356:53;;;;;;;:::i;:::-;;;;;;;;46422:81;46458:8;46476:1;46480:2;46484:3;46489:7;46498:4;46422:35;:81::i;:::-;45935:576;45776:735;;;;:::o;42459:1074::-;42686:7;:14;42672:3;:10;:28;42664:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;42778:1;42764:16;;:2;:16;;;;42756:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;42835:16;42854:12;:10;:12::i;:::-;42835:31;;42879:60;42900:8;42910:4;42916:2;42920:3;42925:7;42934:4;42879:20;:60::i;:::-;42957:9;42952:421;42976:3;:10;42972:1;:14;42952:421;;;43008:10;43021:3;43025:1;43021:6;;;;;;;;:::i;:::-;;;;;;;;43008:19;;43042:14;43059:7;43067:1;43059:10;;;;;;;;:::i;:::-;;;;;;;;43042:27;;43086:19;43108:9;:13;43118:2;43108:13;;;;;;;;;;;:19;43122:4;43108:19;;;;;;;;;;;;;;;;43086:41;;43165:6;43150:11;:21;;43142:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;43298:6;43284:11;:20;43262:9;:13;43272:2;43262:13;;;;;;;;;;;:19;43276:4;43262:19;;;;;;;;;;;;;;;:42;;;;43355:6;43334:9;:13;43344:2;43334:13;;;;;;;;;;;:17;43348:2;43334:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;42993:380;;;42988:3;;;;:::i;:::-;;;42952:421;;;;43420:2;43390:47;;43414:4;43390:47;;43404:8;43390:47;;;43424:3;43429:7;43390:47;;;;;;;:::i;:::-;;;;;;;;43450:75;43486:8;43496:4;43502:2;43506:3;43511:7;43520:4;43450:35;:75::i;:::-;42653:880;42459:1074;;;;;:::o;28315:238::-;28399:22;28407:4;28413:7;28399;:22::i;:::-;28394:152;;28470:4;28438:6;:12;28445:4;28438:12;;;;;;;;;;;:20;;:29;28459:7;28438:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;28521:12;:10;:12::i;:::-;28494:40;;28512:7;28494:40;;28506:4;28494:40;;;;;;;;;;28394:152;28315:238;;:::o;28685:239::-;28769:22;28777:4;28783:7;28769;:22::i;:::-;28765:152;;;28840:5;28808:6;:12;28815:4;28808:12;;;;;;;;;;;:20;;:29;28829:7;28808:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;28892:12;:10;:12::i;:::-;28865:40;;28883:7;28865:40;;28877:4;28865:40;;;;;;;;;;28765:152;28685:239;;:::o;10779:120::-;10323:8;:6;:8::i;:::-;10315:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;10848:5:::1;10838:7;;:15;;;;;;;;;;;;;;;;;;10869:22;10878:12;:10;:12::i;:::-;10869:22;;;;;;:::i;:::-;;;;;;;;10779:120::o:0;47612:891::-;47780:1;47764:18;;:4;:18;;;;47756:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;47855:7;:14;47841:3;:10;:28;47833:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;47927:16;47946:12;:10;:12::i;:::-;47927:31;;47971:66;47992:8;48002:4;48016:1;48020:3;48025:7;47971:66;;;;;;;;;;;;:20;:66::i;:::-;48055:9;48050:373;48074:3;:10;48070:1;:14;48050:373;;;48106:10;48119:3;48123:1;48119:6;;;;;;;;:::i;:::-;;;;;;;;48106:19;;48140:14;48157:7;48165:1;48157:10;;;;;;;;:::i;:::-;;;;;;;;48140:27;;48184:19;48206:9;:13;48216:2;48206:13;;;;;;;;;;;:19;48220:4;48206:19;;;;;;;;;;;;;;;;48184:41;;48263:6;48248:11;:21;;48240:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;48390:6;48376:11;:20;48354:9;:13;48364:2;48354:13;;;;;;;;;;;:19;48368:4;48354:19;;;;;;;;;;;;;;;:42;;;;48091:332;;;48086:3;;;;;:::i;:::-;;;;48050:373;;;;48478:1;48440:55;;48464:4;48440:55;;48454:8;48440:55;;;48482:3;48487:7;48440:55;;;;;;;:::i;:::-;;;;;;;;47745:758;47612:891;;;:::o;8390:191::-;8464:16;8483:6;;;;;;;;;;;8464:25;;8509:8;8500:6;;:17;;;;;;;;;;;;;;;;;;8564:8;8533:40;;8554:8;8533:40;;;;;;;;;;;;8453:128;8390:191;:::o;44851:569::-;45018:1;45004:16;;:2;:16;;;;44996:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;45071:16;45090:12;:10;:12::i;:::-;45071:31;;45115:102;45136:8;45154:1;45158:2;45162:21;45180:2;45162:17;:21::i;:::-;45185:25;45203:6;45185:17;:25::i;:::-;45212:4;45115:20;:102::i;:::-;45251:6;45230:9;:13;45240:2;45230:13;;;;;;;;;;;:17;45244:2;45230:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;45310:2;45273:52;;45306:1;45273:52;;45288:8;45273:52;;;45314:2;45318:6;45273:52;;;;;;;:::i;:::-;;;;;;;;45338:74;45369:8;45387:1;45391:2;45395;45399:6;45407:4;45338:30;:74::i;:::-;44985:435;44851:569;;;;:::o;10520:118::-;10046:8;:6;:8::i;:::-;10045:9;10037:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;10590:4:::1;10580:7;;:14;;;;;;;;;;;;;;;;;;10610:20;10617:12;:10;:12::i;:::-;10610:20;;;;;;:::i;:::-;;;;;;;;10520:118::o:0;48645:331::-;48800:8;48791:17;;:5;:17;;;;48783:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;48903:8;48865:18;:25;48884:5;48865:25;;;;;;;;;;;;;;;:35;48891:8;48865:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;48949:8;48927:41;;48942:5;48927:41;;;48959:8;48927:41;;;;;;:::i;:::-;;;;;;;;48645:331;;;:::o;41281:820::-;41483:1;41469:16;;:2;:16;;;;41461:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;41540:16;41559:12;:10;:12::i;:::-;41540:31;;41584:96;41605:8;41615:4;41621:2;41625:21;41643:2;41625:17;:21::i;:::-;41648:25;41666:6;41648:17;:25::i;:::-;41675:4;41584:20;:96::i;:::-;41693:19;41715:9;:13;41725:2;41715:13;;;;;;;;;;;:19;41729:4;41715:19;;;;;;;;;;;;;;;;41693:41;;41768:6;41753:11;:21;;41745:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;41893:6;41879:11;:20;41857:9;:13;41867:2;41857:13;;;;;;;;;;;:19;41871:4;41857:19;;;;;;;;;;;;;;;:42;;;;41942:6;41921:9;:13;41931:2;41921:13;;;;;;;;;;;:17;41935:2;41921:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;41997:2;41966:46;;41991:4;41966:46;;41981:8;41966:46;;;42001:2;42005:6;41966:46;;;;;;;:::i;:::-;;;;;;;;42025:68;42056:8;42066:4;42072:2;42076;42080:6;42088:4;42025:30;:68::i;:::-;41450:651;;41281:820;;;;;:::o;46761:648::-;46904:1;46888:18;;:4;:18;;;;46880:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;46959:16;46978:12;:10;:12::i;:::-;46959:31;;47003:102;47024:8;47034:4;47048:1;47052:21;47070:2;47052:17;:21::i;:::-;47075:25;47093:6;47075:17;:25::i;:::-;47003:102;;;;;;;;;;;;:20;:102::i;:::-;47118:19;47140:9;:13;47150:2;47140:13;;;;;;;;;;;:19;47154:4;47140:19;;;;;;;;;;;;;;;;47118:41;;47193:6;47178:11;:21;;47170:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;47312:6;47298:11;:20;47276:9;:13;47286:2;47276:13;;;;;;;;;;;:19;47290:4;47276:19;;;;;;;;;;;;;;;:42;;;;47386:1;47347:54;;47372:4;47347:54;;47362:8;47347:54;;;47390:2;47394:6;47347:54;;;;;;;:::i;:::-;;;;;;;;46869:540;;46761:648;;;:::o;1666:451::-;1741:13;1767:19;1812:1;1803:6;1799:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;1789:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1767:47;;1825:15;:6;1832:1;1825:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;1851;:6;1858:1;1851:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;1882:9;1907:1;1898:6;1894:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;1882:26;;1877:135;1914:1;1910;:5;1877:135;;;1949:12;1970:3;1962:5;:11;1949:25;;;;;;;:::i;:::-;;;;;1937:6;1944:1;1937:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;1999:1;1989:11;;;;;1917:3;;;;:::i;:::-;;;1877:135;;;;2039:1;2030:5;:10;2022:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;2102:6;2088:21;;;1666:451;;;;:::o;37459:310::-;37561:4;37613:26;37598:41;;;:11;:41;;;;:110;;;;37671:37;37656:52;;;:11;:52;;;;37598:110;:163;;;;37725:36;37749:11;37725:23;:36::i;:::-;37598:163;37578:183;;37459:310;;;:::o;57290:314::-;10046:8;:6;:8::i;:::-;10045:9;10037:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;57530:66:::1;57557:8;57567:4;57573:2;57577:3;57582:7;57591:4;57530:26;:66::i;:::-;57290:314:::0;;;;;;:::o;50913:813::-;51153:15;:2;:13;;;:15::i;:::-;51149:570;;;51206:2;51189:43;;;51233:8;51243:4;51249:3;51254:7;51263:4;51189:79;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;51185:523;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;51581:6;51574:14;;;;;;;;;;;:::i;:::-;;;;;;;;51185:523;;;51630:62;;;;;;;;;;:::i;:::-;;;;;;;;51185:523;51362:48;;;51350:60;;;:8;:60;;;;51346:159;;51435:50;;;;;;;;;;:::i;:::-;;;;;;;;51346:159;51269:251;51149:570;50913:813;;;;;;:::o;51734:198::-;51800:16;51829:22;51868:1;51854:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51829:41;;51892:7;51881:5;51887:1;51881:8;;;;;;;;:::i;:::-;;;;;;;:18;;;;;51919:5;51912:12;;;51734:198;;;:::o;50161:744::-;50376:15;:2;:13;;;:15::i;:::-;50372:526;;;50429:2;50412:38;;;50451:8;50461:4;50467:2;50471:6;50479:4;50412:72;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;50408:479;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;50760:6;50753:14;;;;;;;;;;;:::i;:::-;;;;;;;;50408:479;;;50809:62;;;;;;;;;;:::i;:::-;;;;;;;;50408:479;50546:43;;;50534:55;;;:8;:55;;;;50530:154;;50614:50;;;;;;;;;;:::i;:::-;;;;;;;;50530:154;50485:214;50372:526;50161:744;;;;;;:::o;21191:157::-;21276:4;21315:25;21300:40;;;:11;:40;;;;21293:47;;21191:157;;;:::o;54192:655::-;54431:66;54458:8;54468:4;54474:2;54478:3;54483:7;54492:4;54431:26;:66::i;:::-;54530:1;54514:18;;:4;:18;;;54510:160;;;54554:9;54549:110;54573:3;:10;54569:1;:14;54549:110;;;54633:7;54641:1;54633:10;;;;;;;;:::i;:::-;;;;;;;;54609:12;:20;54622:3;54626:1;54622:6;;;;;;;;:::i;:::-;;;;;;;;54609:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;;;;;54585:3;;;;:::i;:::-;;;54549:110;;;;54510:160;54700:1;54686:16;;:2;:16;;;54682:158;;;54724:9;54719:110;54743:3;:10;54739:1;:14;54719:110;;;54803:7;54811:1;54803:10;;;;;;;;:::i;:::-;;;;;;;;54779:12;:20;54792:3;54796:1;54792:6;;;;;;;;:::i;:::-;;;;;;;;54779:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;;;;;54755:3;;;;:::i;:::-;;;54719:110;;;;54682:158;54192:655;;;;;;:::o;12139:326::-;12199:4;12456:1;12434:7;:19;;;:23;12427:30;;12139:326;;;:::o;49932:221::-;;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;768:957::-;874:5;899:91;915:74;982:6;915:74;:::i;:::-;899:91;:::i;:::-;890:100;;1010:5;1039:6;1032:5;1025:21;1073:4;1066:5;1062:16;1055:23;;1099:6;1149:3;1141:4;1133:6;1129:17;1124:3;1120:27;1117:36;1114:143;;;1168:79;;:::i;:::-;1114:143;1281:1;1266:453;1291:6;1288:1;1285:13;1266:453;;;1373:3;1360:17;1409:18;1396:11;1393:35;1390:122;;;1431:79;;:::i;:::-;1390:122;1555:11;1547:6;1543:24;1593:47;1636:3;1624:10;1593:47;:::i;:::-;1588:3;1581:60;1670:4;1665:3;1661:14;1654:21;;1704:4;1699:3;1695:14;1688:21;;1326:393;;1313:1;1310;1306:9;1301:14;;1266:453;;;1270:14;880:845;;768:957;;;;;:::o;1748:722::-;1844:5;1869:81;1885:64;1942:6;1885:64;:::i;:::-;1869:81;:::i;:::-;1860:90;;1970:5;1999:6;1992:5;1985:21;2033:4;2026:5;2022:16;2015:23;;2059:6;2109:3;2101:4;2093:6;2089:17;2084:3;2080:27;2077:36;2074:143;;;2128:79;;:::i;:::-;2074:143;2241:1;2226:238;2251:6;2248:1;2245:13;2226:238;;;2319:3;2348:37;2381:3;2369:10;2348:37;:::i;:::-;2343:3;2336:50;2415:4;2410:3;2406:14;2399:21;;2449:4;2444:3;2440:14;2433:21;;2286:178;2273:1;2270;2266:9;2261:14;;2226:238;;;2230:14;1850:620;;1748:722;;;;;:::o;2476:410::-;2553:5;2578:65;2594:48;2635:6;2594:48;:::i;:::-;2578:65;:::i;:::-;2569:74;;2666:6;2659:5;2652:21;2704:4;2697:5;2693:16;2742:3;2733:6;2728:3;2724:16;2721:25;2718:112;;;2749:79;;:::i;:::-;2718:112;2839:41;2873:6;2868:3;2863;2839:41;:::i;:::-;2559:327;2476:410;;;;;:::o;2892:412::-;2970:5;2995:66;3011:49;3053:6;3011:49;:::i;:::-;2995:66;:::i;:::-;2986:75;;3084:6;3077:5;3070:21;3122:4;3115:5;3111:16;3160:3;3151:6;3146:3;3142:16;3139:25;3136:112;;;3167:79;;:::i;:::-;3136:112;3257:41;3291:6;3286:3;3281;3257:41;:::i;:::-;2976:328;2892:412;;;;;:::o;3310:139::-;3356:5;3394:6;3381:20;3372:29;;3410:33;3437:5;3410:33;:::i;:::-;3310:139;;;;:::o;3472:370::-;3543:5;3592:3;3585:4;3577:6;3573:17;3569:27;3559:122;;3600:79;;:::i;:::-;3559:122;3717:6;3704:20;3742:94;3832:3;3824:6;3817:4;3809:6;3805:17;3742:94;:::i;:::-;3733:103;;3549:293;3472:370;;;;:::o;3864:390::-;3945:5;3994:3;3987:4;3979:6;3975:17;3971:27;3961:122;;4002:79;;:::i;:::-;3961:122;4119:6;4106:20;4144:104;4244:3;4236:6;4229:4;4221:6;4217:17;4144:104;:::i;:::-;4135:113;;3951:303;3864:390;;;;:::o;4277:370::-;4348:5;4397:3;4390:4;4382:6;4378:17;4374:27;4364:122;;4405:79;;:::i;:::-;4364:122;4522:6;4509:20;4547:94;4637:3;4629:6;4622:4;4614:6;4610:17;4547:94;:::i;:::-;4538:103;;4354:293;4277:370;;;;:::o;4653:133::-;4696:5;4734:6;4721:20;4712:29;;4750:30;4774:5;4750:30;:::i;:::-;4653:133;;;;:::o;4792:139::-;4838:5;4876:6;4863:20;4854:29;;4892:33;4919:5;4892:33;:::i;:::-;4792:139;;;;:::o;4937:137::-;4982:5;5020:6;5007:20;4998:29;;5036:32;5062:5;5036:32;:::i;:::-;4937:137;;;;:::o;5080:141::-;5136:5;5167:6;5161:13;5152:22;;5183:32;5209:5;5183:32;:::i;:::-;5080:141;;;;:::o;5240:338::-;5295:5;5344:3;5337:4;5329:6;5325:17;5321:27;5311:122;;5352:79;;:::i;:::-;5311:122;5469:6;5456:20;5494:78;5568:3;5560:6;5553:4;5545:6;5541:17;5494:78;:::i;:::-;5485:87;;5301:277;5240:338;;;;:::o;5598:340::-;5654:5;5703:3;5696:4;5688:6;5684:17;5680:27;5670:122;;5711:79;;:::i;:::-;5670:122;5828:6;5815:20;5853:79;5928:3;5920:6;5913:4;5905:6;5901:17;5853:79;:::i;:::-;5844:88;;5660:278;5598:340;;;;:::o;5944:139::-;5990:5;6028:6;6015:20;6006:29;;6044:33;6071:5;6044:33;:::i;:::-;5944:139;;;;:::o;6089:329::-;6148:6;6197:2;6185:9;6176:7;6172:23;6168:32;6165:119;;;6203:79;;:::i;:::-;6165:119;6323:1;6348:53;6393:7;6384:6;6373:9;6369:22;6348:53;:::i;:::-;6338:63;;6294:117;6089:329;;;;:::o;6424:474::-;6492:6;6500;6549:2;6537:9;6528:7;6524:23;6520:32;6517:119;;;6555:79;;:::i;:::-;6517:119;6675:1;6700:53;6745:7;6736:6;6725:9;6721:22;6700:53;:::i;:::-;6690:63;;6646:117;6802:2;6828:53;6873:7;6864:6;6853:9;6849:22;6828:53;:::i;:::-;6818:63;;6773:118;6424:474;;;;;:::o;6904:1509::-;7058:6;7066;7074;7082;7090;7139:3;7127:9;7118:7;7114:23;7110:33;7107:120;;;7146:79;;:::i;:::-;7107:120;7266:1;7291:53;7336:7;7327:6;7316:9;7312:22;7291:53;:::i;:::-;7281:63;;7237:117;7393:2;7419:53;7464:7;7455:6;7444:9;7440:22;7419:53;:::i;:::-;7409:63;;7364:118;7549:2;7538:9;7534:18;7521:32;7580:18;7572:6;7569:30;7566:117;;;7602:79;;:::i;:::-;7566:117;7707:78;7777:7;7768:6;7757:9;7753:22;7707:78;:::i;:::-;7697:88;;7492:303;7862:2;7851:9;7847:18;7834:32;7893:18;7885:6;7882:30;7879:117;;;7915:79;;:::i;:::-;7879:117;8020:78;8090:7;8081:6;8070:9;8066:22;8020:78;:::i;:::-;8010:88;;7805:303;8175:3;8164:9;8160:19;8147:33;8207:18;8199:6;8196:30;8193:117;;;8229:79;;:::i;:::-;8193:117;8334:62;8388:7;8379:6;8368:9;8364:22;8334:62;:::i;:::-;8324:72;;8118:288;6904:1509;;;;;;;;:::o;8419:1089::-;8523:6;8531;8539;8547;8555;8604:3;8592:9;8583:7;8579:23;8575:33;8572:120;;;8611:79;;:::i;:::-;8572:120;8731:1;8756:53;8801:7;8792:6;8781:9;8777:22;8756:53;:::i;:::-;8746:63;;8702:117;8858:2;8884:53;8929:7;8920:6;8909:9;8905:22;8884:53;:::i;:::-;8874:63;;8829:118;8986:2;9012:53;9057:7;9048:6;9037:9;9033:22;9012:53;:::i;:::-;9002:63;;8957:118;9114:2;9140:53;9185:7;9176:6;9165:9;9161:22;9140:53;:::i;:::-;9130:63;;9085:118;9270:3;9259:9;9255:19;9242:33;9302:18;9294:6;9291:30;9288:117;;;9324:79;;:::i;:::-;9288:117;9429:62;9483:7;9474:6;9463:9;9459:22;9429:62;:::i;:::-;9419:72;;9213:288;8419:1089;;;;;;;;:::o;9514:1039::-;9641:6;9649;9657;9706:2;9694:9;9685:7;9681:23;9677:32;9674:119;;;9712:79;;:::i;:::-;9674:119;9832:1;9857:53;9902:7;9893:6;9882:9;9878:22;9857:53;:::i;:::-;9847:63;;9803:117;9987:2;9976:9;9972:18;9959:32;10018:18;10010:6;10007:30;10004:117;;;10040:79;;:::i;:::-;10004:117;10145:78;10215:7;10206:6;10195:9;10191:22;10145:78;:::i;:::-;10135:88;;9930:303;10300:2;10289:9;10285:18;10272:32;10331:18;10323:6;10320:30;10317:117;;;10353:79;;:::i;:::-;10317:117;10458:78;10528:7;10519:6;10508:9;10504:22;10458:78;:::i;:::-;10448:88;;10243:303;9514:1039;;;;;:::o;10559:1363::-;10704:6;10712;10720;10728;10777:3;10765:9;10756:7;10752:23;10748:33;10745:120;;;10784:79;;:::i;:::-;10745:120;10904:1;10929:53;10974:7;10965:6;10954:9;10950:22;10929:53;:::i;:::-;10919:63;;10875:117;11059:2;11048:9;11044:18;11031:32;11090:18;11082:6;11079:30;11076:117;;;11112:79;;:::i;:::-;11076:117;11217:78;11287:7;11278:6;11267:9;11263:22;11217:78;:::i;:::-;11207:88;;11002:303;11372:2;11361:9;11357:18;11344:32;11403:18;11395:6;11392:30;11389:117;;;11425:79;;:::i;:::-;11389:117;11530:78;11600:7;11591:6;11580:9;11576:22;11530:78;:::i;:::-;11520:88;;11315:303;11685:2;11674:9;11670:18;11657:32;11716:18;11708:6;11705:30;11702:117;;;11738:79;;:::i;:::-;11702:117;11843:62;11897:7;11888:6;11877:9;11873:22;11843:62;:::i;:::-;11833:72;;11628:287;10559:1363;;;;;;;:::o;11928:468::-;11993:6;12001;12050:2;12038:9;12029:7;12025:23;12021:32;12018:119;;;12056:79;;:::i;:::-;12018:119;12176:1;12201:53;12246:7;12237:6;12226:9;12222:22;12201:53;:::i;:::-;12191:63;;12147:117;12303:2;12329:50;12371:7;12362:6;12351:9;12347:22;12329:50;:::i;:::-;12319:60;;12274:115;11928:468;;;;;:::o;12402:474::-;12470:6;12478;12527:2;12515:9;12506:7;12502:23;12498:32;12495:119;;;12533:79;;:::i;:::-;12495:119;12653:1;12678:53;12723:7;12714:6;12703:9;12699:22;12678:53;:::i;:::-;12668:63;;12624:117;12780:2;12806:53;12851:7;12842:6;12831:9;12827:22;12806:53;:::i;:::-;12796:63;;12751:118;12402:474;;;;;:::o;12882:619::-;12959:6;12967;12975;13024:2;13012:9;13003:7;12999:23;12995:32;12992:119;;;13030:79;;:::i;:::-;12992:119;13150:1;13175:53;13220:7;13211:6;13200:9;13196:22;13175:53;:::i;:::-;13165:63;;13121:117;13277:2;13303:53;13348:7;13339:6;13328:9;13324:22;13303:53;:::i;:::-;13293:63;;13248:118;13405:2;13431:53;13476:7;13467:6;13456:9;13452:22;13431:53;:::i;:::-;13421:63;;13376:118;12882:619;;;;;:::o;13507:943::-;13602:6;13610;13618;13626;13675:3;13663:9;13654:7;13650:23;13646:33;13643:120;;;13682:79;;:::i;:::-;13643:120;13802:1;13827:53;13872:7;13863:6;13852:9;13848:22;13827:53;:::i;:::-;13817:63;;13773:117;13929:2;13955:53;14000:7;13991:6;13980:9;13976:22;13955:53;:::i;:::-;13945:63;;13900:118;14057:2;14083:53;14128:7;14119:6;14108:9;14104:22;14083:53;:::i;:::-;14073:63;;14028:118;14213:2;14202:9;14198:18;14185:32;14244:18;14236:6;14233:30;14230:117;;;14266:79;;:::i;:::-;14230:117;14371:62;14425:7;14416:6;14405:9;14401:22;14371:62;:::i;:::-;14361:72;;14156:287;13507:943;;;;;;;:::o;14456:894::-;14574:6;14582;14631:2;14619:9;14610:7;14606:23;14602:32;14599:119;;;14637:79;;:::i;:::-;14599:119;14785:1;14774:9;14770:17;14757:31;14815:18;14807:6;14804:30;14801:117;;;14837:79;;:::i;:::-;14801:117;14942:78;15012:7;15003:6;14992:9;14988:22;14942:78;:::i;:::-;14932:88;;14728:302;15097:2;15086:9;15082:18;15069:32;15128:18;15120:6;15117:30;15114:117;;;15150:79;;:::i;:::-;15114:117;15255:78;15325:7;15316:6;15305:9;15301:22;15255:78;:::i;:::-;15245:88;;15040:303;14456:894;;;;;:::o;15356:914::-;15484:6;15492;15541:2;15529:9;15520:7;15516:23;15512:32;15509:119;;;15547:79;;:::i;:::-;15509:119;15695:1;15684:9;15680:17;15667:31;15725:18;15717:6;15714:30;15711:117;;;15747:79;;:::i;:::-;15711:117;15852:78;15922:7;15913:6;15902:9;15898:22;15852:78;:::i;:::-;15842:88;;15638:302;16007:2;15996:9;15992:18;15979:32;16038:18;16030:6;16027:30;16024:117;;;16060:79;;:::i;:::-;16024:117;16165:88;16245:7;16236:6;16225:9;16221:22;16165:88;:::i;:::-;16155:98;;15950:313;15356:914;;;;;:::o;16276:329::-;16335:6;16384:2;16372:9;16363:7;16359:23;16355:32;16352:119;;;16390:79;;:::i;:::-;16352:119;16510:1;16535:53;16580:7;16571:6;16560:9;16556:22;16535:53;:::i;:::-;16525:63;;16481:117;16276:329;;;;:::o;16611:474::-;16679:6;16687;16736:2;16724:9;16715:7;16711:23;16707:32;16704:119;;;16742:79;;:::i;:::-;16704:119;16862:1;16887:53;16932:7;16923:6;16912:9;16908:22;16887:53;:::i;:::-;16877:63;;16833:117;16989:2;17015:53;17060:7;17051:6;17040:9;17036:22;17015:53;:::i;:::-;17005:63;;16960:118;16611:474;;;;;:::o;17091:327::-;17149:6;17198:2;17186:9;17177:7;17173:23;17169:32;17166:119;;;17204:79;;:::i;:::-;17166:119;17324:1;17349:52;17393:7;17384:6;17373:9;17369:22;17349:52;:::i;:::-;17339:62;;17295:116;17091:327;;;;:::o;17424:349::-;17493:6;17542:2;17530:9;17521:7;17517:23;17513:32;17510:119;;;17548:79;;:::i;:::-;17510:119;17668:1;17693:63;17748:7;17739:6;17728:9;17724:22;17693:63;:::i;:::-;17683:73;;17639:127;17424:349;;;;:::o;17779:329::-;17838:6;17887:2;17875:9;17866:7;17862:23;17858:32;17855:119;;;17893:79;;:::i;:::-;17855:119;18013:1;18038:53;18083:7;18074:6;18063:9;18059:22;18038:53;:::i;:::-;18028:63;;17984:117;17779:329;;;;:::o;18114:654::-;18192:6;18200;18249:2;18237:9;18228:7;18224:23;18220:32;18217:119;;;18255:79;;:::i;:::-;18217:119;18375:1;18400:53;18445:7;18436:6;18425:9;18421:22;18400:53;:::i;:::-;18390:63;;18346:117;18530:2;18519:9;18515:18;18502:32;18561:18;18553:6;18550:30;18547:117;;;18583:79;;:::i;:::-;18547:117;18688:63;18743:7;18734:6;18723:9;18719:22;18688:63;:::i;:::-;18678:73;;18473:288;18114:654;;;;;:::o;18774:179::-;18843:10;18864:46;18906:3;18898:6;18864:46;:::i;:::-;18942:4;18937:3;18933:14;18919:28;;18774:179;;;;:::o;18959:118::-;19046:24;19064:5;19046:24;:::i;:::-;19041:3;19034:37;18959:118;;:::o;19113:732::-;19232:3;19261:54;19309:5;19261:54;:::i;:::-;19331:86;19410:6;19405:3;19331:86;:::i;:::-;19324:93;;19441:56;19491:5;19441:56;:::i;:::-;19520:7;19551:1;19536:284;19561:6;19558:1;19555:13;19536:284;;;19637:6;19631:13;19664:63;19723:3;19708:13;19664:63;:::i;:::-;19657:70;;19750:60;19803:6;19750:60;:::i;:::-;19740:70;;19596:224;19583:1;19580;19576:9;19571:14;;19536:284;;;19540:14;19836:3;19829:10;;19237:608;;;19113:732;;;;:::o;19851:109::-;19932:21;19947:5;19932:21;:::i;:::-;19927:3;19920:34;19851:109;;:::o;19966:118::-;20053:24;20071:5;20053:24;:::i;:::-;20048:3;20041:37;19966:118;;:::o;20090:360::-;20176:3;20204:38;20236:5;20204:38;:::i;:::-;20258:70;20321:6;20316:3;20258:70;:::i;:::-;20251:77;;20337:52;20382:6;20377:3;20370:4;20363:5;20359:16;20337:52;:::i;:::-;20414:29;20436:6;20414:29;:::i;:::-;20409:3;20405:39;20398:46;;20180:270;20090:360;;;;:::o;20456:364::-;20544:3;20572:39;20605:5;20572:39;:::i;:::-;20627:71;20691:6;20686:3;20627:71;:::i;:::-;20620:78;;20707:52;20752:6;20747:3;20740:4;20733:5;20729:16;20707:52;:::i;:::-;20784:29;20806:6;20784:29;:::i;:::-;20779:3;20775:39;20768:46;;20548:272;20456:364;;;;:::o;20826:377::-;20932:3;20960:39;20993:5;20960:39;:::i;:::-;21015:89;21097:6;21092:3;21015:89;:::i;:::-;21008:96;;21113:52;21158:6;21153:3;21146:4;21139:5;21135:16;21113:52;:::i;:::-;21190:6;21185:3;21181:16;21174:23;;20936:267;20826:377;;;;:::o;21209:366::-;21351:3;21372:67;21436:2;21431:3;21372:67;:::i;:::-;21365:74;;21448:93;21537:3;21448:93;:::i;:::-;21566:2;21561:3;21557:12;21550:19;;21209:366;;;:::o;21581:::-;21723:3;21744:67;21808:2;21803:3;21744:67;:::i;:::-;21737:74;;21820:93;21909:3;21820:93;:::i;:::-;21938:2;21933:3;21929:12;21922:19;;21581:366;;;:::o;21953:::-;22095:3;22116:67;22180:2;22175:3;22116:67;:::i;:::-;22109:74;;22192:93;22281:3;22192:93;:::i;:::-;22310:2;22305:3;22301:12;22294:19;;21953:366;;;:::o;22325:::-;22467:3;22488:67;22552:2;22547:3;22488:67;:::i;:::-;22481:74;;22564:93;22653:3;22564:93;:::i;:::-;22682:2;22677:3;22673:12;22666:19;;22325:366;;;:::o;22697:::-;22839:3;22860:67;22924:2;22919:3;22860:67;:::i;:::-;22853:74;;22936:93;23025:3;22936:93;:::i;:::-;23054:2;23049:3;23045:12;23038:19;;22697:366;;;:::o;23069:::-;23211:3;23232:67;23296:2;23291:3;23232:67;:::i;:::-;23225:74;;23308:93;23397:3;23308:93;:::i;:::-;23426:2;23421:3;23417:12;23410:19;;23069:366;;;:::o;23441:::-;23583:3;23604:67;23668:2;23663:3;23604:67;:::i;:::-;23597:74;;23680:93;23769:3;23680:93;:::i;:::-;23798:2;23793:3;23789:12;23782:19;;23441:366;;;:::o;23813:::-;23955:3;23976:67;24040:2;24035:3;23976:67;:::i;:::-;23969:74;;24052:93;24141:3;24052:93;:::i;:::-;24170:2;24165:3;24161:12;24154:19;;23813:366;;;:::o;24185:::-;24327:3;24348:67;24412:2;24407:3;24348:67;:::i;:::-;24341:74;;24424:93;24513:3;24424:93;:::i;:::-;24542:2;24537:3;24533:12;24526:19;;24185:366;;;:::o;24557:::-;24699:3;24720:67;24784:2;24779:3;24720:67;:::i;:::-;24713:74;;24796:93;24885:3;24796:93;:::i;:::-;24914:2;24909:3;24905:12;24898:19;;24557:366;;;:::o;24929:::-;25071:3;25092:67;25156:2;25151:3;25092:67;:::i;:::-;25085:74;;25168:93;25257:3;25168:93;:::i;:::-;25286:2;25281:3;25277:12;25270:19;;24929:366;;;:::o;25301:::-;25443:3;25464:67;25528:2;25523:3;25464:67;:::i;:::-;25457:74;;25540:93;25629:3;25540:93;:::i;:::-;25658:2;25653:3;25649:12;25642:19;;25301:366;;;:::o;25673:::-;25815:3;25836:67;25900:2;25895:3;25836:67;:::i;:::-;25829:74;;25912:93;26001:3;25912:93;:::i;:::-;26030:2;26025:3;26021:12;26014:19;;25673:366;;;:::o;26045:::-;26187:3;26208:67;26272:2;26267:3;26208:67;:::i;:::-;26201:74;;26284:93;26373:3;26284:93;:::i;:::-;26402:2;26397:3;26393:12;26386:19;;26045:366;;;:::o;26417:::-;26559:3;26580:67;26644:2;26639:3;26580:67;:::i;:::-;26573:74;;26656:93;26745:3;26656:93;:::i;:::-;26774:2;26769:3;26765:12;26758:19;;26417:366;;;:::o;26789:::-;26931:3;26952:67;27016:2;27011:3;26952:67;:::i;:::-;26945:74;;27028:93;27117:3;27028:93;:::i;:::-;27146:2;27141:3;27137:12;27130:19;;26789:366;;;:::o;27161:::-;27303:3;27324:67;27388:2;27383:3;27324:67;:::i;:::-;27317:74;;27400:93;27489:3;27400:93;:::i;:::-;27518:2;27513:3;27509:12;27502:19;;27161:366;;;:::o;27533:402::-;27693:3;27714:85;27796:2;27791:3;27714:85;:::i;:::-;27707:92;;27808:93;27897:3;27808:93;:::i;:::-;27926:2;27921:3;27917:12;27910:19;;27533:402;;;:::o;27941:366::-;28083:3;28104:67;28168:2;28163:3;28104:67;:::i;:::-;28097:74;;28180:93;28269:3;28180:93;:::i;:::-;28298:2;28293:3;28289:12;28282:19;;27941:366;;;:::o;28313:::-;28455:3;28476:67;28540:2;28535:3;28476:67;:::i;:::-;28469:74;;28552:93;28641:3;28552:93;:::i;:::-;28670:2;28665:3;28661:12;28654:19;;28313:366;;;:::o;28685:::-;28827:3;28848:67;28912:2;28907:3;28848:67;:::i;:::-;28841:74;;28924:93;29013:3;28924:93;:::i;:::-;29042:2;29037:3;29033:12;29026:19;;28685:366;;;:::o;29057:::-;29199:3;29220:67;29284:2;29279:3;29220:67;:::i;:::-;29213:74;;29296:93;29385:3;29296:93;:::i;:::-;29414:2;29409:3;29405:12;29398:19;;29057:366;;;:::o;29429:402::-;29589:3;29610:85;29692:2;29687:3;29610:85;:::i;:::-;29603:92;;29704:93;29793:3;29704:93;:::i;:::-;29822:2;29817:3;29813:12;29806:19;;29429:402;;;:::o;29837:366::-;29979:3;30000:67;30064:2;30059:3;30000:67;:::i;:::-;29993:74;;30076:93;30165:3;30076:93;:::i;:::-;30194:2;30189:3;30185:12;30178:19;;29837:366;;;:::o;30209:108::-;30286:24;30304:5;30286:24;:::i;:::-;30281:3;30274:37;30209:108;;:::o;30323:118::-;30410:24;30428:5;30410:24;:::i;:::-;30405:3;30398:37;30323:118;;:::o;30447:967::-;30829:3;30851:148;30995:3;30851:148;:::i;:::-;30844:155;;31016:95;31107:3;31098:6;31016:95;:::i;:::-;31009:102;;31128:148;31272:3;31128:148;:::i;:::-;31121:155;;31293:95;31384:3;31375:6;31293:95;:::i;:::-;31286:102;;31405:3;31398:10;;30447:967;;;;;:::o;31420:222::-;31513:4;31551:2;31540:9;31536:18;31528:26;;31564:71;31632:1;31621:9;31617:17;31608:6;31564:71;:::i;:::-;31420:222;;;;:::o;31648:1053::-;31971:4;32009:3;31998:9;31994:19;31986:27;;32023:71;32091:1;32080:9;32076:17;32067:6;32023:71;:::i;:::-;32104:72;32172:2;32161:9;32157:18;32148:6;32104:72;:::i;:::-;32223:9;32217:4;32213:20;32208:2;32197:9;32193:18;32186:48;32251:108;32354:4;32345:6;32251:108;:::i;:::-;32243:116;;32406:9;32400:4;32396:20;32391:2;32380:9;32376:18;32369:48;32434:108;32537:4;32528:6;32434:108;:::i;:::-;32426:116;;32590:9;32584:4;32580:20;32574:3;32563:9;32559:19;32552:49;32618:76;32689:4;32680:6;32618:76;:::i;:::-;32610:84;;31648:1053;;;;;;;;:::o;32707:751::-;32930:4;32968:3;32957:9;32953:19;32945:27;;32982:71;33050:1;33039:9;33035:17;33026:6;32982:71;:::i;:::-;33063:72;33131:2;33120:9;33116:18;33107:6;33063:72;:::i;:::-;33145;33213:2;33202:9;33198:18;33189:6;33145:72;:::i;:::-;33227;33295:2;33284:9;33280:18;33271:6;33227:72;:::i;:::-;33347:9;33341:4;33337:20;33331:3;33320:9;33316:19;33309:49;33375:76;33446:4;33437:6;33375:76;:::i;:::-;33367:84;;32707:751;;;;;;;;:::o;33464:373::-;33607:4;33645:2;33634:9;33630:18;33622:26;;33694:9;33688:4;33684:20;33680:1;33669:9;33665:17;33658:47;33722:108;33825:4;33816:6;33722:108;:::i;:::-;33714:116;;33464:373;;;;:::o;33843:634::-;34064:4;34102:2;34091:9;34087:18;34079:26;;34151:9;34145:4;34141:20;34137:1;34126:9;34122:17;34115:47;34179:108;34282:4;34273:6;34179:108;:::i;:::-;34171:116;;34334:9;34328:4;34324:20;34319:2;34308:9;34304:18;34297:48;34362:108;34465:4;34456:6;34362:108;:::i;:::-;34354:116;;33843:634;;;;;:::o;34483:210::-;34570:4;34608:2;34597:9;34593:18;34585:26;;34621:65;34683:1;34672:9;34668:17;34659:6;34621:65;:::i;:::-;34483:210;;;;:::o;34699:222::-;34792:4;34830:2;34819:9;34815:18;34807:26;;34843:71;34911:1;34900:9;34896:17;34887:6;34843:71;:::i;:::-;34699:222;;;;:::o;34927:313::-;35040:4;35078:2;35067:9;35063:18;35055:26;;35127:9;35121:4;35117:20;35113:1;35102:9;35098:17;35091:47;35155:78;35228:4;35219:6;35155:78;:::i;:::-;35147:86;;34927:313;;;;:::o;35246:419::-;35412:4;35450:2;35439:9;35435:18;35427:26;;35499:9;35493:4;35489:20;35485:1;35474:9;35470:17;35463:47;35527:131;35653:4;35527:131;:::i;:::-;35519:139;;35246:419;;;:::o;35671:::-;35837:4;35875:2;35864:9;35860:18;35852:26;;35924:9;35918:4;35914:20;35910:1;35899:9;35895:17;35888:47;35952:131;36078:4;35952:131;:::i;:::-;35944:139;;35671:419;;;:::o;36096:::-;36262:4;36300:2;36289:9;36285:18;36277:26;;36349:9;36343:4;36339:20;36335:1;36324:9;36320:17;36313:47;36377:131;36503:4;36377:131;:::i;:::-;36369:139;;36096:419;;;:::o;36521:::-;36687:4;36725:2;36714:9;36710:18;36702:26;;36774:9;36768:4;36764:20;36760:1;36749:9;36745:17;36738:47;36802:131;36928:4;36802:131;:::i;:::-;36794:139;;36521:419;;;:::o;36946:::-;37112:4;37150:2;37139:9;37135:18;37127:26;;37199:9;37193:4;37189:20;37185:1;37174:9;37170:17;37163:47;37227:131;37353:4;37227:131;:::i;:::-;37219:139;;36946:419;;;:::o;37371:::-;37537:4;37575:2;37564:9;37560:18;37552:26;;37624:9;37618:4;37614:20;37610:1;37599:9;37595:17;37588:47;37652:131;37778:4;37652:131;:::i;:::-;37644:139;;37371:419;;;:::o;37796:::-;37962:4;38000:2;37989:9;37985:18;37977:26;;38049:9;38043:4;38039:20;38035:1;38024:9;38020:17;38013:47;38077:131;38203:4;38077:131;:::i;:::-;38069:139;;37796:419;;;:::o;38221:::-;38387:4;38425:2;38414:9;38410:18;38402:26;;38474:9;38468:4;38464:20;38460:1;38449:9;38445:17;38438:47;38502:131;38628:4;38502:131;:::i;:::-;38494:139;;38221:419;;;:::o;38646:::-;38812:4;38850:2;38839:9;38835:18;38827:26;;38899:9;38893:4;38889:20;38885:1;38874:9;38870:17;38863:47;38927:131;39053:4;38927:131;:::i;:::-;38919:139;;38646:419;;;:::o;39071:::-;39237:4;39275:2;39264:9;39260:18;39252:26;;39324:9;39318:4;39314:20;39310:1;39299:9;39295:17;39288:47;39352:131;39478:4;39352:131;:::i;:::-;39344:139;;39071:419;;;:::o;39496:::-;39662:4;39700:2;39689:9;39685:18;39677:26;;39749:9;39743:4;39739:20;39735:1;39724:9;39720:17;39713:47;39777:131;39903:4;39777:131;:::i;:::-;39769:139;;39496:419;;;:::o;39921:::-;40087:4;40125:2;40114:9;40110:18;40102:26;;40174:9;40168:4;40164:20;40160:1;40149:9;40145:17;40138:47;40202:131;40328:4;40202:131;:::i;:::-;40194:139;;39921:419;;;:::o;40346:::-;40512:4;40550:2;40539:9;40535:18;40527:26;;40599:9;40593:4;40589:20;40585:1;40574:9;40570:17;40563:47;40627:131;40753:4;40627:131;:::i;:::-;40619:139;;40346:419;;;:::o;40771:::-;40937:4;40975:2;40964:9;40960:18;40952:26;;41024:9;41018:4;41014:20;41010:1;40999:9;40995:17;40988:47;41052:131;41178:4;41052:131;:::i;:::-;41044:139;;40771:419;;;:::o;41196:::-;41362:4;41400:2;41389:9;41385:18;41377:26;;41449:9;41443:4;41439:20;41435:1;41424:9;41420:17;41413:47;41477:131;41603:4;41477:131;:::i;:::-;41469:139;;41196:419;;;:::o;41621:::-;41787:4;41825:2;41814:9;41810:18;41802:26;;41874:9;41868:4;41864:20;41860:1;41849:9;41845:17;41838:47;41902:131;42028:4;41902:131;:::i;:::-;41894:139;;41621:419;;;:::o;42046:::-;42212:4;42250:2;42239:9;42235:18;42227:26;;42299:9;42293:4;42289:20;42285:1;42274:9;42270:17;42263:47;42327:131;42453:4;42327:131;:::i;:::-;42319:139;;42046:419;;;:::o;42471:::-;42637:4;42675:2;42664:9;42660:18;42652:26;;42724:9;42718:4;42714:20;42710:1;42699:9;42695:17;42688:47;42752:131;42878:4;42752:131;:::i;:::-;42744:139;;42471:419;;;:::o;42896:::-;43062:4;43100:2;43089:9;43085:18;43077:26;;43149:9;43143:4;43139:20;43135:1;43124:9;43120:17;43113:47;43177:131;43303:4;43177:131;:::i;:::-;43169:139;;42896:419;;;:::o;43321:::-;43487:4;43525:2;43514:9;43510:18;43502:26;;43574:9;43568:4;43564:20;43560:1;43549:9;43545:17;43538:47;43602:131;43728:4;43602:131;:::i;:::-;43594:139;;43321:419;;;:::o;43746:::-;43912:4;43950:2;43939:9;43935:18;43927:26;;43999:9;43993:4;43989:20;43985:1;43974:9;43970:17;43963:47;44027:131;44153:4;44027:131;:::i;:::-;44019:139;;43746:419;;;:::o;44171:::-;44337:4;44375:2;44364:9;44360:18;44352:26;;44424:9;44418:4;44414:20;44410:1;44399:9;44395:17;44388:47;44452:131;44578:4;44452:131;:::i;:::-;44444:139;;44171:419;;;:::o;44596:222::-;44689:4;44727:2;44716:9;44712:18;44704:26;;44740:71;44808:1;44797:9;44793:17;44784:6;44740:71;:::i;:::-;44596:222;;;;:::o;44824:332::-;44945:4;44983:2;44972:9;44968:18;44960:26;;44996:71;45064:1;45053:9;45049:17;45040:6;44996:71;:::i;:::-;45077:72;45145:2;45134:9;45130:18;45121:6;45077:72;:::i;:::-;44824:332;;;;;:::o;45162:129::-;45196:6;45223:20;;:::i;:::-;45213:30;;45252:33;45280:4;45272:6;45252:33;:::i;:::-;45162:129;;;:::o;45297:75::-;45330:6;45363:2;45357:9;45347:19;;45297:75;:::o;45378:311::-;45455:4;45545:18;45537:6;45534:30;45531:56;;;45567:18;;:::i;:::-;45531:56;45617:4;45609:6;45605:17;45597:25;;45677:4;45671;45667:15;45659:23;;45378:311;;;:::o;45695:321::-;45782:4;45872:18;45864:6;45861:30;45858:56;;;45894:18;;:::i;:::-;45858:56;45944:4;45936:6;45932:17;45924:25;;46004:4;45998;45994:15;45986:23;;45695:321;;;:::o;46022:311::-;46099:4;46189:18;46181:6;46178:30;46175:56;;;46211:18;;:::i;:::-;46175:56;46261:4;46253:6;46249:17;46241:25;;46321:4;46315;46311:15;46303:23;;46022:311;;;:::o;46339:307::-;46400:4;46490:18;46482:6;46479:30;46476:56;;;46512:18;;:::i;:::-;46476:56;46550:29;46572:6;46550:29;:::i;:::-;46542:37;;46634:4;46628;46624:15;46616:23;;46339:307;;;:::o;46652:308::-;46714:4;46804:18;46796:6;46793:30;46790:56;;;46826:18;;:::i;:::-;46790:56;46864:29;46886:6;46864:29;:::i;:::-;46856:37;;46948:4;46942;46938:15;46930:23;;46652:308;;;:::o;46966:132::-;47033:4;47056:3;47048:11;;47086:4;47081:3;47077:14;47069:22;;46966:132;;;:::o;47104:114::-;47171:6;47205:5;47199:12;47189:22;;47104:114;;;:::o;47224:98::-;47275:6;47309:5;47303:12;47293:22;;47224:98;;;:::o;47328:99::-;47380:6;47414:5;47408:12;47398:22;;47328:99;;;:::o;47433:113::-;47503:4;47535;47530:3;47526:14;47518:22;;47433:113;;;:::o;47552:184::-;47651:11;47685:6;47680:3;47673:19;47725:4;47720:3;47716:14;47701:29;;47552:184;;;;:::o;47742:168::-;47825:11;47859:6;47854:3;47847:19;47899:4;47894:3;47890:14;47875:29;;47742:168;;;;:::o;47916:169::-;48000:11;48034:6;48029:3;48022:19;48074:4;48069:3;48065:14;48050:29;;47916:169;;;;:::o;48091:148::-;48193:11;48230:3;48215:18;;48091:148;;;;:::o;48245:305::-;48285:3;48304:20;48322:1;48304:20;:::i;:::-;48299:25;;48338:20;48356:1;48338:20;:::i;:::-;48333:25;;48492:1;48424:66;48420:74;48417:1;48414:81;48411:107;;;48498:18;;:::i;:::-;48411:107;48542:1;48539;48535:9;48528:16;;48245:305;;;;:::o;48556:348::-;48596:7;48619:20;48637:1;48619:20;:::i;:::-;48614:25;;48653:20;48671:1;48653:20;:::i;:::-;48648:25;;48841:1;48773:66;48769:74;48766:1;48763:81;48758:1;48751:9;48744:17;48740:105;48737:131;;;48848:18;;:::i;:::-;48737:131;48896:1;48893;48889:9;48878:20;;48556:348;;;;:::o;48910:191::-;48950:4;48970:20;48988:1;48970:20;:::i;:::-;48965:25;;49004:20;49022:1;49004:20;:::i;:::-;48999:25;;49043:1;49040;49037:8;49034:34;;;49048:18;;:::i;:::-;49034:34;49093:1;49090;49086:9;49078:17;;48910:191;;;;:::o;49107:96::-;49144:7;49173:24;49191:5;49173:24;:::i;:::-;49162:35;;49107:96;;;:::o;49209:90::-;49243:7;49286:5;49279:13;49272:21;49261:32;;49209:90;;;:::o;49305:77::-;49342:7;49371:5;49360:16;;49305:77;;;:::o;49388:149::-;49424:7;49464:66;49457:5;49453:78;49442:89;;49388:149;;;:::o;49543:126::-;49580:7;49620:42;49613:5;49609:54;49598:65;;49543:126;;;:::o;49675:77::-;49712:7;49741:5;49730:16;;49675:77;;;:::o;49758:154::-;49842:6;49837:3;49832;49819:30;49904:1;49895:6;49890:3;49886:16;49879:27;49758:154;;;:::o;49918:307::-;49986:1;49996:113;50010:6;50007:1;50004:13;49996:113;;;50095:1;50090:3;50086:11;50080:18;50076:1;50071:3;50067:11;50060:39;50032:2;50029:1;50025:10;50020:15;;49996:113;;;50127:6;50124:1;50121:13;50118:101;;;50207:1;50198:6;50193:3;50189:16;50182:27;50118:101;49967:258;49918:307;;;:::o;50231:171::-;50270:3;50293:24;50311:5;50293:24;:::i;:::-;50284:33;;50339:4;50332:5;50329:15;50326:41;;;50347:18;;:::i;:::-;50326:41;50394:1;50387:5;50383:13;50376:20;;50231:171;;;:::o;50408:320::-;50452:6;50489:1;50483:4;50479:12;50469:22;;50536:1;50530:4;50526:12;50557:18;50547:81;;50613:4;50605:6;50601:17;50591:27;;50547:81;50675:2;50667:6;50664:14;50644:18;50641:38;50638:84;;;50694:18;;:::i;:::-;50638:84;50459:269;50408:320;;;:::o;50734:281::-;50817:27;50839:4;50817:27;:::i;:::-;50809:6;50805:40;50947:6;50935:10;50932:22;50911:18;50899:10;50896:34;50893:62;50890:88;;;50958:18;;:::i;:::-;50890:88;50998:10;50994:2;50987:22;50777:238;50734:281;;:::o;51021:233::-;51060:3;51083:24;51101:5;51083:24;:::i;:::-;51074:33;;51129:66;51122:5;51119:77;51116:103;;;51199:18;;:::i;:::-;51116:103;51246:1;51239:5;51235:13;51228:20;;51021:233;;;:::o;51260:180::-;51308:77;51305:1;51298:88;51405:4;51402:1;51395:15;51429:4;51426:1;51419:15;51446:180;51494:77;51491:1;51484:88;51591:4;51588:1;51581:15;51615:4;51612:1;51605:15;51632:180;51680:77;51677:1;51670:88;51777:4;51774:1;51767:15;51801:4;51798:1;51791:15;51818:180;51866:77;51863:1;51856:88;51963:4;51960:1;51953:15;51987:4;51984:1;51977:15;52004:183;52039:3;52077:1;52059:16;52056:23;52053:128;;;52115:1;52112;52109;52094:23;52137:34;52168:1;52162:8;52137:34;:::i;:::-;52130:41;;52053:128;52004:183;:::o;52193:117::-;52302:1;52299;52292:12;52316:117;52425:1;52422;52415:12;52439:117;52548:1;52545;52538:12;52562:117;52671:1;52668;52661:12;52685:117;52794:1;52791;52784:12;52808:102;52849:6;52900:2;52896:7;52891:2;52884:5;52880:14;52876:28;52866:38;;52808:102;;;:::o;52916:106::-;52960:8;53009:5;53004:3;53000:15;52979:36;;52916:106;;;:::o;53028:239::-;53168:34;53164:1;53156:6;53152:14;53145:58;53237:22;53232:2;53224:6;53220:15;53213:47;53028:239;:::o;53273:182::-;53413:34;53409:1;53401:6;53397:14;53390:58;53273:182;:::o;53461:227::-;53601:34;53597:1;53589:6;53585:14;53578:58;53670:10;53665:2;53657:6;53653:15;53646:35;53461:227;:::o;53694:170::-;53834:22;53830:1;53822:6;53818:14;53811:46;53694:170;:::o;53870:181::-;54010:33;54006:1;53998:6;53994:14;53987:57;53870:181;:::o;54057:230::-;54197:34;54193:1;54185:6;54181:14;54174:58;54266:13;54261:2;54253:6;54249:15;54242:38;54057:230;:::o;54293:225::-;54433:34;54429:1;54421:6;54417:14;54410:58;54502:8;54497:2;54489:6;54485:15;54478:33;54293:225;:::o;54524:223::-;54664:34;54660:1;54652:6;54648:14;54641:58;54733:6;54728:2;54720:6;54716:15;54709:31;54524:223;:::o;54753:228::-;54893:34;54889:1;54881:6;54877:14;54870:58;54962:11;54957:2;54949:6;54945:15;54938:36;54753:228;:::o;54987:166::-;55127:18;55123:1;55115:6;55111:14;55104:42;54987:166;:::o;55159:224::-;55299:34;55295:1;55287:6;55283:14;55276:58;55368:7;55363:2;55355:6;55351:15;55344:32;55159:224;:::o;55389:237::-;55529:34;55525:1;55517:6;55513:14;55506:58;55598:20;55593:2;55585:6;55581:15;55574:45;55389:237;:::o;55632:222::-;55772:34;55768:1;55760:6;55756:14;55749:58;55841:5;55836:2;55828:6;55824:15;55817:30;55632:222;:::o;55860:229::-;56000:34;55996:1;55988:6;55984:14;55977:58;56069:12;56064:2;56056:6;56052:15;56045:37;55860:229;:::o;56095:182::-;56235:34;56231:1;56223:6;56219:14;56212:58;56095:182;:::o;56283:178::-;56423:30;56419:1;56411:6;56407:14;56400:54;56283:178;:::o;56467:220::-;56607:34;56603:1;56595:6;56591:14;56584:58;56676:3;56671:2;56663:6;56659:15;56652:28;56467:220;:::o;56693:173::-;56833:25;56829:1;56821:6;56817:14;56810:49;56693:173;:::o;56872:228::-;57012:34;57008:1;57000:6;56996:14;56989:58;57081:11;57076:2;57068:6;57064:15;57057:36;56872:228;:::o;57106:::-;57246:34;57242:1;57234:6;57230:14;57223:58;57315:11;57310:2;57302:6;57298:15;57291:36;57106:228;:::o;57340:227::-;57480:34;57476:1;57468:6;57464:14;57457:58;57549:10;57544:2;57536:6;57532:15;57525:35;57340:227;:::o;57573:220::-;57713:34;57709:1;57701:6;57697:14;57690:58;57782:3;57777:2;57769:6;57765:15;57758:28;57573:220;:::o;57799:167::-;57939:19;57935:1;57927:6;57923:14;57916:43;57799:167;:::o;57972:234::-;58112:34;58108:1;58100:6;58096:14;58089:58;58181:17;58176:2;58168:6;58164:15;58157:42;57972:234;:::o;58212:711::-;58251:3;58289:4;58271:16;58268:26;58265:39;;;58297:5;;58265:39;58326:20;;:::i;:::-;58401:1;58383:16;58379:24;58376:1;58370:4;58355:49;58434:4;58428:11;58533:16;58526:4;58518:6;58514:17;58511:39;58478:18;58470:6;58467:30;58451:113;58448:146;;;58579:5;;;;58448:146;58625:6;58619:4;58615:17;58661:3;58655:10;58688:18;58680:6;58677:30;58674:43;;;58710:5;;;;;;58674:43;58758:6;58751:4;58746:3;58742:14;58738:27;58817:1;58799:16;58795:24;58789:4;58785:35;58780:3;58777:44;58774:57;;;58824:5;;;;;;;58774:57;58841;58889:6;58883:4;58879:17;58871:6;58867:30;58861:4;58841:57;:::i;:::-;58914:3;58907:10;;58255:668;;;;;58212:711;;:::o;58929:122::-;59002:24;59020:5;59002:24;:::i;:::-;58995:5;58992:35;58982:63;;59041:1;59038;59031:12;58982:63;58929:122;:::o;59057:116::-;59127:21;59142:5;59127:21;:::i;:::-;59120:5;59117:32;59107:60;;59163:1;59160;59153:12;59107:60;59057:116;:::o;59179:122::-;59252:24;59270:5;59252:24;:::i;:::-;59245:5;59242:35;59232:63;;59291:1;59288;59281:12;59232:63;59179:122;:::o;59307:120::-;59379:23;59396:5;59379:23;:::i;:::-;59372:5;59369:34;59359:62;;59417:1;59414;59407:12;59359:62;59307:120;:::o;59433:122::-;59506:24;59524:5;59506:24;:::i;:::-;59499:5;59496:35;59486:63;;59545:1;59542;59535:12;59486:63;59433:122;:::o

Swarm Source

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

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