Token Revv Creator Badges

Overview ERC1155

Total Supply:
0 Revv Creator Badges

Holders:
1 addresses

Transfers:
-

Loading
[ Download CSV Export  ] 
Loading
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
CreatorBadges

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at zkevm.polygonscan.com on 2023-05-20
*/

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

// File: @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/security/Pausable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (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 Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        _requireNotPaused();
        _;
    }

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

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

    /**
     * @dev Throws if the contract is paused.
     */
    function _requireNotPaused() internal view virtual {
        require(!paused(), "Pausable: paused");
    }

    /**
     * @dev Throws if the contract is not paused.
     */
    function _requirePaused() internal view virtual {
        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/access/Ownable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (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 Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        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: Permissions.sol


// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC1155/ERC1155.sol)
pragma solidity ^0.8.9;


abstract contract Permissions is Ownable {
    // NOTE :: Addresses that can perform specific functions
    mapping(address => bool) private _admins;

    /* MANAGEMENT OF ADMINS */
    function _isAdmin(address _account) internal view virtual returns (bool) {
        return _admins[_account];
    }

    modifier onlyAdmins() {
        require(!!_isAdmin(msg.sender) || msg.sender == owner(), "Unauthorized");
        _;
    }

    function addAdmins(address[] memory accounts) public onlyOwner {
        for (uint256 i; i < accounts.length;) {
            _admins[accounts[i]] = true;
            unchecked{ i++; }
        }
    }

    function removeAdmins(address[] memory accounts) public onlyOwner {
        for (uint256 i; i < accounts.length;) {
            delete _admins[accounts[i]];
            unchecked{ i++; }
        }

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


// OpenZeppelin Contracts (last updated v4.8.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 functionCallWithValue(target, data, 0, "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");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, 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) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, 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) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or 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 {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // 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
            /// @solidity memory-safe-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/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 (last updated v4.7.0) (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 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 (last updated v4.8.0) (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: address zero is not a valid owner");
        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 token owner or 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: caller is not token owner or 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();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, to, ids, amounts, 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);

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

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

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

        _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();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

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

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

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

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

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * 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 _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);

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

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

    /**
     * @dev Destroys `amount` tokens of token type `id` from `from`
     *
     * Emits a {TransferSingle} event.
     *
     * 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();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

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

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

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Emits a {TransferBatch} event.
     *
     * 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);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits an {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 `ids` and `amounts` 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 {}

    /**
     * @dev Hook that is called after 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 _afterTokenTransfer(
        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/ERC1155Supply.sol


// OpenZeppelin Contracts (last updated v4.6.0) (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) {
                uint256 id = ids[i];
                uint256 amount = amounts[i];
                uint256 supply = _totalSupply[id];
                require(supply >= amount, "ERC1155: burn amount exceeds totalSupply");
                unchecked {
                    _totalSupply[id] = supply - amount;
                }
            }
        }
    }
}

// File: CreatorBadges.sol


pragma solidity ^0.8.9;







/// @custom:security-contact [email protected]
contract CreatorBadges is ERC1155, Ownable, Pausable, ERC1155Supply, Permissions {
    using Counters for Counters.Counter;

    event LogBadgeCreation(uint256 badgeId);

    struct Badge {
        bytes32 hash;
        uint256 expiry;
    }

    struct ReadableBadge {
        string uri;
        uint256 expiry;
    }

    constructor() ERC1155("https://badges.revv.gg/") {
        address[] memory admins = new address[](1);
        admins[0] = 0xc84B0B177b69BA985AF19bfE2c5AdA4Fd4B520e4;
        addAdmins(admins);
    }

    // NOTE :: Associate a badge id with a badge's details || badge_id => Badge
    mapping(uint256 => Badge) private _badgeMapping;

    Counters.Counter private _badgeIdCounter;

    string private _name = "Revv Creator Badges";


    /* MANAGEMENT OF CONTRACT DETAILS */
    function name() external view returns (string memory) {
        return _name;
    }
    
    function updateName(string memory newName) external onlyAdmins {
        _name = newName;
    }

    function setURI(string memory newuri) external onlyAdmins {
        _setURI(newuri);
    }

    function uri(uint256 id) public view virtual override returns (string memory) {
        if (id >= _badgeIdCounter.current()) return "";
        Badge memory badge = _badgeMapping[id];
        return string(abi.encodePacked(super.uri(id), badge.hash));
    }

    function pause() external onlyAdmins {
        _pause();
    }

    function unpause() external onlyAdmins {
        _unpause();
    }


    /* MANAGEMENT OF TOKENS */
    function createBadge(string memory hash, uint256 expiry) external onlyAdmins {
        bytes32 _hashBytes = bytes32(bytes(hash));
        uint256 id = _badgeIdCounter.current();
        _badgeMapping[id] = Badge(_hashBytes, expiry);
        emit LogBadgeCreation(id);

        _badgeIdCounter.increment();
    }

    function updateBadge(uint256 id, string memory hash, uint256 expiry) external onlyAdmins {
        bytes32 _hashBytes = bytes32(bytes(hash));
        _badgeMapping[id] = Badge(_hashBytes, expiry);
    }

    function mint(address account, uint256 id) external onlyAdmins {
        _mint(account, id, 1, "");
    }

    function mintBatch(address to, uint256[] memory ids) external onlyAdmins {
        uint256[] memory amounts = new uint256[](ids.length);
        for (uint256 i; i < ids.length;) {
            amounts[i] = 1;
            unchecked{ i++; }
        }

        _mintBatch(to, ids, amounts, "");
    }

    function mintBatchBadge(address[] memory tos, uint256 id) external onlyAdmins {
        for (uint256 i; i < tos.length;) {
            _mint(tos[i], id, 1, "");
            unchecked{ i++; }
        }
    }

    function burn(address account, uint256 id) external virtual {
        require(
            account == _msgSender() || isApprovedForAll(account, _msgSender()),
            "ERC1155: caller is not badge owner or approved"
        );

        _burn(account, id, 1);
    }

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

        uint256[] memory values = new uint256[](ids.length);
        for (uint256 i; i < ids.length;) {
            values[i] = 1;
            unchecked{ i++; }
        }

        _burnBatch(account, ids, values);
    }

    function batchTransferFrom(address from, address to, uint256[] memory ids) external onlyAdmins {
        uint256[] memory amounts = new uint256[](ids.length);
        for (uint256 i; i < ids.length;) {
            amounts[i] = 1;
            unchecked{ i++; }
        }

        safeBatchTransferFrom(from, to, ids, amounts, "");
    }

    function safeTransferFrom(
        address from, address to, uint256 id, uint256 amount, bytes memory data
    ) public onlyAdmins override {
        super.safeTransferFrom(from, to, id, amount, data);
    }

    function safeBatchTransferFrom(
        address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data
    ) public virtual onlyAdmins override {
        super.safeBatchTransferFrom(from, to, ids, amounts, data);
    }


    /* MANAGEMENT OF ADDRESSES THAT CAN HAVE ASSETS TRANSFERRED */
    // NOTE :: Wallets whose assets can be transferred
    mapping(address => bool) private _allowedWallets;

    // NOTE :: Wallet is enabling to have its assets transferred
    function addWalletToAllowlist() public {
        _allowedWallets[msg.sender] = true;
        super.setApprovalForAll(super.owner(), true);
    }

    // NOTE :: Wallet is revoking permissions to transfer its assets
    function removeWalletFromAllowlist() public {
        delete _allowedWallets[msg.sender];
        super.setApprovalForAll(super.owner(), false);
    }


    /* MANAGEMENT OF ASSETS TRANSFERRING FUNCTIONS */
    function _beforeTokenTransfer(
        address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data
    ) internal whenNotPaused override(ERC1155, ERC1155Supply) {
        if (from != address(0) && to != address(0)) {
            require(!!_isAdmin(msg.sender), "Badges can only be transferred with the approval of the contract owner.");
            require(!!_allowedWallets[from], "Wallet owner hasn't enable badges to be transferred.");
        }

        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);
    }

    /* MANAGEMENT OF RETRIEVING DATA */
    function getBadgeDetails(uint256 id) external view returns (ReadableBadge memory) {
        Badge memory badge = _badgeMapping[id];
        return ReadableBadge(uri(id), badge.expiry);
    }

    function isMintable(address account, uint256 id) external view returns (bool) {
        require(id < _badgeIdCounter.current(), "Badge does not exist.");
        require(block.timestamp <= _badgeMapping[id].expiry, "Minting window has expired.");
        require(super.balanceOf(account, id) == 0, "Wallet already holds badge.");
        return true;
    }

    function currentActiveBadgeId() public view returns (uint256) {
        return _badgeIdCounter.current() - 1;
    }
}

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":false,"internalType":"uint256","name":"badgeId","type":"uint256"}],"name":"LogBadgeCreation","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":"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":[{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"addAdmins","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"addWalletToAllowlist","outputs":[],"stateMutability":"nonpayable","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":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"batchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"hash","type":"string"},{"internalType":"uint256","name":"expiry","type":"uint256"}],"name":"createBadge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentActiveBadgeId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getBadgeDetails","outputs":[{"components":[{"internalType":"string","name":"uri","type":"string"},{"internalType":"uint256","name":"expiry","type":"uint256"}],"internalType":"struct CreatorBadges.ReadableBadge","name":"","type":"tuple"}],"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"}],"name":"isMintable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"mintBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"tos","type":"address[]"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"mintBatchBadge","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":[{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"removeAdmins","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeWalletFromAllowlist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","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":"string","name":"newuri","type":"string"}],"name":"setURI","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":"id","type":"uint256"},{"internalType":"string","name":"hash","type":"string"},{"internalType":"uint256","name":"expiry","type":"uint256"}],"name":"updateBadge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newName","type":"string"}],"name":"updateName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

60806040526040518060400160405280601381526020017f526576762043726561746f722042616467657300000000000000000000000000815250600890816200004a919062000668565b503480156200005857600080fd5b506040518060400160405280601781526020017f68747470733a2f2f6261646765732e726576762e67672f000000000000000000815250620000a081620001ac60201b60201c565b50620000c1620000b5620001c160201b60201c565b620001c960201b60201c565b6000600360146101000a81548160ff0219169083151502179055506000600167ffffffffffffffff811115620000fc57620000fb620003f9565b5b6040519080825280602002602001820160405280156200012b5781602001602082028036833780820191505090505b50905073c84b0b177b69ba985af19bfe2c5ada4fd4b520e4816000815181106200015a57620001596200074f565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050620001a5816200028f60201b60201c565b5062000801565b8060029081620001bd919062000668565b5050565b600033905090565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200029f6200033360201b60201c565b60005b81518110156200032f57600160056000848481518110620002c857620002c76200074f565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080600101915050620002a2565b5050565b62000343620001c160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000369620003c460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620003c2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003b990620007df565b60405180910390fd5b565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200047057607f821691505b60208210810362000486576200048562000428565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620004f07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620004b1565b620004fc8683620004b1565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000549620005436200053d8462000514565b6200051e565b62000514565b9050919050565b6000819050919050565b620005658362000528565b6200057d620005748262000550565b848454620004be565b825550505050565b600090565b6200059462000585565b620005a18184846200055a565b505050565b5b81811015620005c957620005bd6000826200058a565b600181019050620005a7565b5050565b601f8211156200061857620005e2816200048c565b620005ed84620004a1565b81016020851015620005fd578190505b620006156200060c85620004a1565b830182620005a6565b50505b505050565b600082821c905092915050565b60006200063d600019846008026200061d565b1980831691505092915050565b60006200065883836200062a565b9150826002028217905092915050565b6200067382620003ee565b67ffffffffffffffff8111156200068f576200068e620003f9565b5b6200069b825462000457565b620006a8828285620005cd565b600060209050601f831160018114620006e05760008415620006cb578287015190505b620006d785826200064a565b86555062000747565b601f198416620006f0866200048c565b60005b828110156200071a57848901518255600182019150602085019450602081019050620006f3565b868310156200073a578489015162000736601f8916826200062a565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000620007c76020836200077e565b9150620007d4826200078f565b602082019050919050565b60006020820190508181036000830152620007fa81620007b8565b9050919050565b61591280620008116000396000f3fe608060405234801561001057600080fd5b50600436106102055760003560e01c806384da92a71161011a578063bd85b039116100ad578063f242432a1161007c578063f242432a146105aa578063f2fde38b146105c6578063f3993d11146105e2578063f43956b5146105fe578063f9b70f681461060857610205565b8063bd85b039146104fc578063cc471bf81461052c578063dec34e111461055c578063e985e9c51461057a57610205565b8063a22cb465116100e9578063a22cb4651461049e578063b2dc5dc3146104ba578063b34951c2146104d6578063bb3d8a77146104e057610205565b806384da92a71461042c5780638da5cb5b146104485780639c54df64146104665780639dc29fac1461048257610205565b80633f4ba83a1161019d5780635c975abb1161016c5780635c975abb146103c2578063715018a6146103e057806375ceb341146103ea5780637b93a271146104065780638456cb591461042257610205565b80633f4ba83a1461033c57806340c10f19146103465780634e1273f4146103625780634f558e791461039257610205565b80630e89341c116101d95780630e89341c146102a45780632950c4bd146102d45780632eb2c2d614610304578063377e11e01461032057610205565b8062fdd58e1461020a57806301ffc9a71461023a57806302fe53051461026a57806306fdde0314610286575b600080fd5b610224600480360381019061021f919061383e565b610624565b604051610231919061388d565b60405180910390f35b610254600480360381019061024f9190613900565b6106ec565b6040516102619190613948565b60405180910390f35b610284600480360381019061027f9190613aa9565b6107ce565b005b61028e610861565b60405161029b9190613b71565b60405180910390f35b6102be60048036038101906102b99190613b93565b6108f3565b6040516102cb9190613b71565b60405180910390f35b6102ee60048036038101906102e99190613b93565b610989565b6040516102fb9190613c56565b60405180910390f35b61031e60048036038101906103199190613de1565b6109f0565b005b61033a60048036038101906103359190613f73565b610a8b565b005b610344610b19565b005b610360600480360381019061035b919061383e565b610baa565b005b61037c60048036038101906103779190613fbc565b610c51565b60405161038991906140e3565b60405180910390f35b6103ac60048036038101906103a79190613b93565b610d6a565b6040516103b99190613948565b60405180910390f35b6103ca610d7e565b6040516103d79190613948565b60405180910390f35b6103e8610d95565b005b61040460048036038101906103ff9190614105565b610da9565b005b610420600480360381019061041b9190614161565b610ed9565b005b61042a610fb4565b005b61044660048036038101906104419190613aa9565b611045565b005b6104506110df565b60405161045d91906141cc565b60405180910390f35b610480600480360381019061047b9190613f73565b611109565b005b61049c6004803603810190610497919061383e565b6111a0565b005b6104b860048036038101906104b39190614213565b61123d565b005b6104d460048036038101906104cf9190614105565b611253565b005b6104de611379565b005b6104fa60048036038101906104f59190614253565b6113dc565b005b61051660048036038101906105119190613b93565b6114b6565b604051610523919061388d565b60405180910390f35b6105466004803603810190610541919061383e565b6114d3565b6040516105539190613948565b60405180910390f35b6105646115cf565b604051610571919061388d565b60405180910390f35b610594600480360381019061058f91906142c2565b6115ec565b6040516105a19190613948565b60405180910390f35b6105c460048036038101906105bf9190614302565b611680565b005b6105e060048036038101906105db9190614399565b61171b565b005b6105fc60048036038101906105f791906143c6565b61179e565b005b6106066118d0565b005b610622600480360381019061061d9190614435565b61193c565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610694576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068b90614503565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107b757507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107c757506107c682611a65565b5b9050919050565b6107d733611acf565b15158061081657506107e76110df565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610855576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161084c9061456f565b60405180910390fd5b61085e81611b25565b50565b606060088054610870906145be565b80601f016020809104026020016040519081016040528092919081815260200182805461089c906145be565b80156108e95780601f106108be576101008083540402835291602001916108e9565b820191906000526020600020905b8154815290600101906020018083116108cc57829003601f168201915b5050505050905090565b60606108ff6007611b38565b821061091c57604051806020016040528060008152509050610984565b60006006600084815260200190815260200160002060405180604001604052908160008201548152602001600182015481525050905061095b83611b46565b8160000151604051602001610971929190614656565b6040516020818303038152906040529150505b919050565b61099161377c565b60006006600084815260200190815260200160002060405180604001604052908160008201548152602001600182015481525050905060405180604001604052806109db856108f3565b81526020018260200151815250915050919050565b6109f933611acf565b151580610a385750610a096110df565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610a77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6e9061456f565b60405180910390fd5b610a848585858585611bda565b5050505050565b610a93611c7b565b60005b8151811015610b155760056000838381518110610ab657610ab561467e565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff02191690558080600101915050610a96565b5050565b610b2233611acf565b151580610b615750610b326110df565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610ba0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b979061456f565b60405180910390fd5b610ba8611cf9565b565b610bb333611acf565b151580610bf25750610bc36110df565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610c31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c289061456f565b60405180910390fd5b610c4d8282600160405180602001604052806000815250611d5c565b5050565b60608151835114610c97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8e9061471f565b60405180910390fd5b6000835167ffffffffffffffff811115610cb457610cb361397e565b5b604051908082528060200260200182016040528015610ce25781602001602082028036833780820191505090505b50905060005b8451811015610d5f57610d2f858281518110610d0757610d0661467e565b5b6020026020010151858381518110610d2257610d2161467e565b5b6020026020010151610624565b828281518110610d4257610d4161467e565b5b60200260200101818152505080610d589061476e565b9050610ce8565b508091505092915050565b600080610d76836114b6565b119050919050565b6000600360149054906101000a900460ff16905090565b610d9d611c7b565b610da76000611f0c565b565b610db233611acf565b151580610df15750610dc26110df565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610e30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e279061456f565b60405180910390fd5b6000815167ffffffffffffffff811115610e4d57610e4c61397e565b5b604051908082528060200260200182016040528015610e7b5781602001602082028036833780820191505090505b50905060005b8251811015610eb8576001828281518110610e9f57610e9e61467e565b5b6020026020010181815250508080600101915050610e81565b50610ed483838360405180602001604052806000815250611fd2565b505050565b610ee233611acf565b151580610f215750610ef26110df565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610f60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f579061456f565b60405180910390fd5b60005b8251811015610faf57610fa2838281518110610f8257610f8161467e565b5b602002602001015183600160405180602001604052806000815250611d5c565b8080600101915050610f63565b505050565b610fbd33611acf565b151580610ffc5750610fcd6110df565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61103b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110329061456f565b60405180910390fd5b6110436121fe565b565b61104e33611acf565b15158061108d575061105e6110df565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6110cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c39061456f565b60405180910390fd5b80600890816110db9190614962565b5050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611111611c7b565b60005b815181101561119c576001600560008484815181106111365761113561467e565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080600101915050611114565b5050565b6111a8612261565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614806111ee57506111ed826111e8612261565b6115ec565b5b61122d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122490614aa6565b60405180910390fd5b61123982826001612269565b5050565b61124f611248612261565b83836124af565b5050565b61125b612261565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614806112a157506112a08261129b612261565b6115ec565b5b6112e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d790614aa6565b60405180910390fd5b6000815167ffffffffffffffff8111156112fd576112fc61397e565b5b60405190808252806020026020018201604052801561132b5781602001602082028036833780820191505090505b50905060005b825181101561136857600182828151811061134f5761134e61467e565b5b6020026020010181815250508080600101915050611331565b5061137483838361261b565b505050565b600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff02191690556113da6113d36110df565b600061123d565b565b6113e533611acf565b15158061142457506113f56110df565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611463576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145a9061456f565b60405180910390fd5b60008261146f90614af6565b905060405180604001604052808281526020018381525060066000868152602001908152602001600020600082015181600001556020820151816001015590505050505050565b600060046000838152602001908152602001600020549050919050565b60006114df6007611b38565b8210611520576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151790614ba9565b60405180910390fd5b6006600083815260200190815260200160002060010154421115611579576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157090614c15565b60405180910390fd5b60006115858484610624565b146115c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115bc90614c81565b60405180910390fd5b6001905092915050565b600060016115dd6007611b38565b6115e79190614ca1565b905090565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61168933611acf565b1515806116c857506116996110df565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611707576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fe9061456f565b60405180910390fd5b61171485858585856128e9565b5050505050565b611723611c7b565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611792576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178990614d47565b60405180910390fd5b61179b81611f0c565b50565b6117a733611acf565b1515806117e657506117b76110df565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611825576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181c9061456f565b60405180910390fd5b6000815167ffffffffffffffff8111156118425761184161397e565b5b6040519080825280602002602001820160405280156118705781602001602082028036833780820191505090505b50905060005b82518110156118ad5760018282815181106118945761189361467e565b5b6020026020010181815250508080600101915050611876565b506118ca84848484604051806020016040528060008152506109f0565b50505050565b6001600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061193a6119336110df565b600161123d565b565b61194533611acf565b15158061198457506119556110df565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6119c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ba9061456f565b60405180910390fd5b6000826119cf90614af6565b905060006119dd6007611b38565b90506040518060400160405280838152602001848152506006600083815260200190815260200160002060008201518160000155602082015181600101559050507fea43e983d26a11f192685eda8c641b4b9b00767506935336ff3ef7b9ed7230e781604051611a4d919061388d565b60405180910390a1611a5f600761298a565b50505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b8060029081611b349190614962565b5050565b600081600001549050919050565b606060028054611b55906145be565b80601f0160208091040260200160405190810160405280929190818152602001828054611b81906145be565b8015611bce5780601f10611ba357610100808354040283529160200191611bce565b820191906000526020600020905b815481529060010190602001808311611bb157829003601f168201915b50505050509050919050565b611be2612261565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611c285750611c2785611c22612261565b6115ec565b5b611c67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5e90614dd9565b60405180910390fd5b611c7485858585856129a0565b5050505050565b611c83612261565b73ffffffffffffffffffffffffffffffffffffffff16611ca16110df565b73ffffffffffffffffffffffffffffffffffffffff1614611cf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cee90614e45565b60405180910390fd5b565b611d01612cc1565b6000600360146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611d45612261565b604051611d5291906141cc565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611dcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc290614ed7565b60405180910390fd5b6000611dd5612261565b90506000611de285612d0a565b90506000611def85612d0a565b9050611e0083600089858589612d84565b8460008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e5f9190614ef7565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628989604051611edd929190614f2b565b60405180910390a4611ef483600089858589612ee6565b611f0383600089898989612eee565b50505050505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612041576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203890614ed7565b60405180910390fd5b8151835114612085576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207c90614fc6565b60405180910390fd5b600061208f612261565b90506120a081600087878787612d84565b60005b8451811015612159578381815181106120bf576120be61467e565b5b60200260200101516000808784815181106120dd576120dc61467e565b5b6020026020010151815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461213f9190614ef7565b9250508190555080806121519061476e565b9150506120a3565b508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516121d1929190614fe6565b60405180910390a46121e881600087878787612ee6565b6121f7816000878787876130c5565b5050505050565b61220661329c565b6001600360146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861224a612261565b60405161225791906141cc565b60405180910390a1565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036122d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122cf9061508f565b60405180910390fd5b60006122e2612261565b905060006122ef84612d0a565b905060006122fc84612d0a565b905061231c83876000858560405180602001604052806000815250612d84565b600080600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050848110156123b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123aa90615121565b60405180910390fd5b84810360008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628989604051612480929190614f2b565b60405180910390a46124a684886000868660405180602001604052806000815250612ee6565b50505050505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361251d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612514906151b3565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161260e9190613948565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361268a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126819061508f565b60405180910390fd5b80518251146126ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c590614fc6565b60405180910390fd5b60006126d8612261565b90506126f881856000868660405180602001604052806000815250612d84565b60005b83518110156128455760008482815181106127195761271861467e565b5b6020026020010151905060008483815181106127385761273761467e565b5b60200260200101519050600080600084815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156127d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127d090615121565b60405180910390fd5b81810360008085815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050808061283d9061476e565b9150506126fb565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb86866040516128bd929190614fe6565b60405180910390a46128e381856000868660405180602001604052806000815250612ee6565b50505050565b6128f1612261565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480612937575061293685612931612261565b6115ec565b5b612976576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296d90614dd9565b60405180910390fd5b61298385858585856132e6565b5050505050565b6001816000016000828254019250508190555050565b81518351146129e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129db90614fc6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612a53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4a90615245565b60405180910390fd5b6000612a5d612261565b9050612a6d818787878787612d84565b60005b8451811015612c1e576000858281518110612a8e57612a8d61467e565b5b602002602001015190506000858381518110612aad57612aac61467e565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612b4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b45906152d7565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c039190614ef7565b9250508190555050505080612c179061476e565b9050612a70565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051612c95929190614fe6565b60405180910390a4612cab818787878787612ee6565b612cb98187878787876130c5565b505050505050565b612cc9610d7e565b612d08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cff90615343565b60405180910390fd5b565b60606000600167ffffffffffffffff811115612d2957612d2861397e565b5b604051908082528060200260200182016040528015612d575781602001602082028036833780820191505090505b5090508281600081518110612d6f57612d6e61467e565b5b60200260200101818152505080915050919050565b612d8c61329c565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614158015612df65750600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b15612ed057612e0433611acf565b612e43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e3a906153fb565b60405180910390fd5b600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612ecf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ec69061548d565b60405180910390fd5b5b612ede868686868686613581565b505050505050565b505050505050565b612f0d8473ffffffffffffffffffffffffffffffffffffffff16613751565b156130bd578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401612f539594939291906154f7565b6020604051808303816000875af1925050508015612f8f57506040513d601f19601f82011682018060405250810190612f8c9190615566565b60015b61303457612f9b6155a0565b806308c379a003612ff75750612faf6155c2565b80612fba5750612ff9565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fee9190613b71565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161302b906156c4565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146130bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130b290615756565b60405180910390fd5b505b505050505050565b6130e48473ffffffffffffffffffffffffffffffffffffffff16613751565b15613294578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b815260040161312a959493929190615776565b6020604051808303816000875af192505050801561316657506040513d601f19601f820116820180604052508101906131639190615566565b60015b61320b576131726155a0565b806308c379a0036131ce57506131866155c2565b8061319157506131d0565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131c59190613b71565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613202906156c4565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614613292576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161328990615756565b60405180910390fd5b505b505050505050565b6132a4610d7e565b156132e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132db9061582a565b60405180910390fd5b565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603613355576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161334c90615245565b60405180910390fd5b600061335f612261565b9050600061336c85612d0a565b9050600061337985612d0a565b9050613389838989858589612d84565b600080600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905085811015613420576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613417906152d7565b60405180910390fd5b85810360008089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560008089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546134d59190614ef7565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a604051613552929190614f2b565b60405180910390a4613568848a8a86868a612ee6565b613576848a8a8a8a8a612eee565b505050505050505050565b61358f868686868686613774565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036136405760005b835181101561363e578281815181106135e2576135e161467e565b5b6020026020010151600460008684815181106136015761360061467e565b5b6020026020010151815260200190815260200160002060008282546136269190614ef7565b92505081905550806136379061476e565b90506135c6565b505b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036137495760005b83518110156137475760008482815181106136955761369461467e565b5b6020026020010151905060008483815181106136b4576136b361467e565b5b6020026020010151905060006004600084815260200190815260200160002054905081811015613719576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613710906158bc565b60405180910390fd5b8181036004600085815260200190815260200160002081905550505050806137409061476e565b9050613677565b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050505050565b604051806040016040528060608152602001600081525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006137d5826137aa565b9050919050565b6137e5816137ca565b81146137f057600080fd5b50565b600081359050613802816137dc565b92915050565b6000819050919050565b61381b81613808565b811461382657600080fd5b50565b60008135905061383881613812565b92915050565b60008060408385031215613855576138546137a0565b5b6000613863858286016137f3565b925050602061387485828601613829565b9150509250929050565b61388781613808565b82525050565b60006020820190506138a2600083018461387e565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6138dd816138a8565b81146138e857600080fd5b50565b6000813590506138fa816138d4565b92915050565b600060208284031215613916576139156137a0565b5b6000613924848285016138eb565b91505092915050565b60008115159050919050565b6139428161392d565b82525050565b600060208201905061395d6000830184613939565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6139b68261396d565b810181811067ffffffffffffffff821117156139d5576139d461397e565b5b80604052505050565b60006139e8613796565b90506139f482826139ad565b919050565b600067ffffffffffffffff821115613a1457613a1361397e565b5b613a1d8261396d565b9050602081019050919050565b82818337600083830152505050565b6000613a4c613a47846139f9565b6139de565b905082815260208101848484011115613a6857613a67613968565b5b613a73848285613a2a565b509392505050565b600082601f830112613a9057613a8f613963565b5b8135613aa0848260208601613a39565b91505092915050565b600060208284031215613abf57613abe6137a0565b5b600082013567ffffffffffffffff811115613add57613adc6137a5565b5b613ae984828501613a7b565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613b2c578082015181840152602081019050613b11565b60008484015250505050565b6000613b4382613af2565b613b4d8185613afd565b9350613b5d818560208601613b0e565b613b668161396d565b840191505092915050565b60006020820190508181036000830152613b8b8184613b38565b905092915050565b600060208284031215613ba957613ba86137a0565b5b6000613bb784828501613829565b91505092915050565b600082825260208201905092915050565b6000613bdc82613af2565b613be68185613bc0565b9350613bf6818560208601613b0e565b613bff8161396d565b840191505092915050565b613c1381613808565b82525050565b60006040830160008301518482036000860152613c368282613bd1565b9150506020830151613c4b6020860182613c0a565b508091505092915050565b60006020820190508181036000830152613c708184613c19565b905092915050565b600067ffffffffffffffff821115613c9357613c9261397e565b5b602082029050602081019050919050565b600080fd5b6000613cbc613cb784613c78565b6139de565b90508083825260208201905060208402830185811115613cdf57613cde613ca4565b5b835b81811015613d085780613cf48882613829565b845260208401935050602081019050613ce1565b5050509392505050565b600082601f830112613d2757613d26613963565b5b8135613d37848260208601613ca9565b91505092915050565b600067ffffffffffffffff821115613d5b57613d5a61397e565b5b613d648261396d565b9050602081019050919050565b6000613d84613d7f84613d40565b6139de565b905082815260208101848484011115613da057613d9f613968565b5b613dab848285613a2a565b509392505050565b600082601f830112613dc857613dc7613963565b5b8135613dd8848260208601613d71565b91505092915050565b600080600080600060a08688031215613dfd57613dfc6137a0565b5b6000613e0b888289016137f3565b9550506020613e1c888289016137f3565b945050604086013567ffffffffffffffff811115613e3d57613e3c6137a5565b5b613e4988828901613d12565b935050606086013567ffffffffffffffff811115613e6a57613e696137a5565b5b613e7688828901613d12565b925050608086013567ffffffffffffffff811115613e9757613e966137a5565b5b613ea388828901613db3565b9150509295509295909350565b600067ffffffffffffffff821115613ecb57613eca61397e565b5b602082029050602081019050919050565b6000613eef613eea84613eb0565b6139de565b90508083825260208201905060208402830185811115613f1257613f11613ca4565b5b835b81811015613f3b5780613f2788826137f3565b845260208401935050602081019050613f14565b5050509392505050565b600082601f830112613f5a57613f59613963565b5b8135613f6a848260208601613edc565b91505092915050565b600060208284031215613f8957613f886137a0565b5b600082013567ffffffffffffffff811115613fa757613fa66137a5565b5b613fb384828501613f45565b91505092915050565b60008060408385031215613fd357613fd26137a0565b5b600083013567ffffffffffffffff811115613ff157613ff06137a5565b5b613ffd85828601613f45565b925050602083013567ffffffffffffffff81111561401e5761401d6137a5565b5b61402a85828601613d12565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600061406c8383613c0a565b60208301905092915050565b6000602082019050919050565b600061409082614034565b61409a818561403f565b93506140a583614050565b8060005b838110156140d65781516140bd8882614060565b97506140c883614078565b9250506001810190506140a9565b5085935050505092915050565b600060208201905081810360008301526140fd8184614085565b905092915050565b6000806040838503121561411c5761411b6137a0565b5b600061412a858286016137f3565b925050602083013567ffffffffffffffff81111561414b5761414a6137a5565b5b61415785828601613d12565b9150509250929050565b60008060408385031215614178576141776137a0565b5b600083013567ffffffffffffffff811115614196576141956137a5565b5b6141a285828601613f45565b92505060206141b385828601613829565b9150509250929050565b6141c6816137ca565b82525050565b60006020820190506141e160008301846141bd565b92915050565b6141f08161392d565b81146141fb57600080fd5b50565b60008135905061420d816141e7565b92915050565b6000806040838503121561422a576142296137a0565b5b6000614238858286016137f3565b9250506020614249858286016141fe565b9150509250929050565b60008060006060848603121561426c5761426b6137a0565b5b600061427a86828701613829565b935050602084013567ffffffffffffffff81111561429b5761429a6137a5565b5b6142a786828701613a7b565b92505060406142b886828701613829565b9150509250925092565b600080604083850312156142d9576142d86137a0565b5b60006142e7858286016137f3565b92505060206142f8858286016137f3565b9150509250929050565b600080600080600060a0868803121561431e5761431d6137a0565b5b600061432c888289016137f3565b955050602061433d888289016137f3565b945050604061434e88828901613829565b935050606061435f88828901613829565b925050608086013567ffffffffffffffff8111156143805761437f6137a5565b5b61438c88828901613db3565b9150509295509295909350565b6000602082840312156143af576143ae6137a0565b5b60006143bd848285016137f3565b91505092915050565b6000806000606084860312156143df576143de6137a0565b5b60006143ed868287016137f3565b93505060206143fe868287016137f3565b925050604084013567ffffffffffffffff81111561441f5761441e6137a5565b5b61442b86828701613d12565b9150509250925092565b6000806040838503121561444c5761444b6137a0565b5b600083013567ffffffffffffffff81111561446a576144696137a5565b5b61447685828601613a7b565b925050602061448785828601613829565b9150509250929050565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b60006144ed602a83613afd565b91506144f882614491565b604082019050919050565b6000602082019050818103600083015261451c816144e0565b9050919050565b7f556e617574686f72697a65640000000000000000000000000000000000000000600082015250565b6000614559600c83613afd565b915061456482614523565b602082019050919050565b600060208201905081810360008301526145888161454c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806145d657607f821691505b6020821081036145e9576145e861458f565b5b50919050565b600081905092915050565b600061460582613af2565b61460f81856145ef565b935061461f818560208601613b0e565b80840191505092915050565b6000819050919050565b6000819050919050565b61465061464b8261462b565b614635565b82525050565b600061466282856145fa565b915061466e828461463f565b6020820191508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b6000614709602983613afd565b9150614714826146ad565b604082019050919050565b60006020820190508181036000830152614738816146fc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061477982613808565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036147ab576147aa61473f565b5b600182019050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026148187fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826147db565b61482286836147db565b95508019841693508086168417925050509392505050565b6000819050919050565b600061485f61485a61485584613808565b61483a565b613808565b9050919050565b6000819050919050565b61487983614844565b61488d61488582614866565b8484546147e8565b825550505050565b600090565b6148a2614895565b6148ad818484614870565b505050565b5b818110156148d1576148c660008261489a565b6001810190506148b3565b5050565b601f821115614916576148e7816147b6565b6148f0846147cb565b810160208510156148ff578190505b61491361490b856147cb565b8301826148b2565b50505b505050565b600082821c905092915050565b60006149396000198460080261491b565b1980831691505092915050565b60006149528383614928565b9150826002028217905092915050565b61496b82613af2565b67ffffffffffffffff8111156149845761498361397e565b5b61498e82546145be565b6149998282856148d5565b600060209050601f8311600181146149cc57600084156149ba578287015190505b6149c48582614946565b865550614a2c565b601f1984166149da866147b6565b60005b82811015614a02578489015182556001820191506020850194506020810190506149dd565b86831015614a1f5784890151614a1b601f891682614928565b8355505b6001600288020188555050505b505050505050565b7f455243313135353a2063616c6c6572206973206e6f74206261646765206f776e60008201527f6572206f7220617070726f766564000000000000000000000000000000000000602082015250565b6000614a90602e83613afd565b9150614a9b82614a34565b604082019050919050565b60006020820190508181036000830152614abf81614a83565b9050919050565b600081519050919050565b6000819050602082019050919050565b6000614aed825161462b565b80915050919050565b6000614b0182614ac6565b82614b0b84614ad1565b9050614b1681614ae1565b92506020821015614b5657614b517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff836020036008026147db565b831692505b5050919050565b7f426164676520646f6573206e6f742065786973742e0000000000000000000000600082015250565b6000614b93601583613afd565b9150614b9e82614b5d565b602082019050919050565b60006020820190508181036000830152614bc281614b86565b9050919050565b7f4d696e74696e672077696e646f772068617320657870697265642e0000000000600082015250565b6000614bff601b83613afd565b9150614c0a82614bc9565b602082019050919050565b60006020820190508181036000830152614c2e81614bf2565b9050919050565b7f57616c6c657420616c726561647920686f6c64732062616467652e0000000000600082015250565b6000614c6b601b83613afd565b9150614c7682614c35565b602082019050919050565b60006020820190508181036000830152614c9a81614c5e565b9050919050565b6000614cac82613808565b9150614cb783613808565b9250828203905081811115614ccf57614cce61473f565b5b92915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614d31602683613afd565b9150614d3c82614cd5565b604082019050919050565b60006020820190508181036000830152614d6081614d24565b9050919050565b7f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206f7220617070726f766564000000000000000000000000000000000000602082015250565b6000614dc3602e83613afd565b9150614dce82614d67565b604082019050919050565b60006020820190508181036000830152614df281614db6565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614e2f602083613afd565b9150614e3a82614df9565b602082019050919050565b60006020820190508181036000830152614e5e81614e22565b9050919050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000614ec1602183613afd565b9150614ecc82614e65565b604082019050919050565b60006020820190508181036000830152614ef081614eb4565b9050919050565b6000614f0282613808565b9150614f0d83613808565b9250828201905080821115614f2557614f2461473f565b5b92915050565b6000604082019050614f40600083018561387e565b614f4d602083018461387e565b9392505050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b6000614fb0602883613afd565b9150614fbb82614f54565b604082019050919050565b60006020820190508181036000830152614fdf81614fa3565b9050919050565b600060408201905081810360008301526150008185614085565b905081810360208301526150148184614085565b90509392505050565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000615079602383613afd565b91506150848261501d565b604082019050919050565b600060208201905081810360008301526150a88161506c565b9050919050565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b600061510b602483613afd565b9150615116826150af565b604082019050919050565b6000602082019050818103600083015261513a816150fe565b9050919050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b600061519d602983613afd565b91506151a882615141565b604082019050919050565b600060208201905081810360008301526151cc81615190565b9050919050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061522f602583613afd565b915061523a826151d3565b604082019050919050565b6000602082019050818103600083015261525e81615222565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b60006152c1602a83613afd565b91506152cc82615265565b604082019050919050565b600060208201905081810360008301526152f0816152b4565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b600061532d601483613afd565b9150615338826152f7565b602082019050919050565b6000602082019050818103600083015261535c81615320565b9050919050565b7f4261646765732063616e206f6e6c79206265207472616e73666572726564207760008201527f6974682074686520617070726f76616c206f662074686520636f6e747261637460208201527f206f776e65722e00000000000000000000000000000000000000000000000000604082015250565b60006153e5604783613afd565b91506153f082615363565b606082019050919050565b60006020820190508181036000830152615414816153d8565b9050919050565b7f57616c6c6574206f776e6572206861736e277420656e61626c6520626164676560008201527f7320746f206265207472616e736665727265642e000000000000000000000000602082015250565b6000615477603483613afd565b91506154828261541b565b604082019050919050565b600060208201905081810360008301526154a68161546a565b9050919050565b600082825260208201905092915050565b60006154c982614ac6565b6154d381856154ad565b93506154e3818560208601613b0e565b6154ec8161396d565b840191505092915050565b600060a08201905061550c60008301886141bd565b61551960208301876141bd565b615526604083018661387e565b615533606083018561387e565b818103608083015261554581846154be565b90509695505050505050565b600081519050615560816138d4565b92915050565b60006020828403121561557c5761557b6137a0565b5b600061558a84828501615551565b91505092915050565b60008160e01c9050919050565b600060033d11156155bf5760046000803e6155bc600051615593565b90505b90565b600060443d1061564f576155d4613796565b60043d036004823e80513d602482011167ffffffffffffffff821117156155fc57505061564f565b808201805167ffffffffffffffff81111561561a575050505061564f565b80602083010160043d03850181111561563757505050505061564f565b615646826020018501866139ad565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e2d4552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b60006156ae603483613afd565b91506156b982615652565b604082019050919050565b600060208201905081810360008301526156dd816156a1565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b6000615740602883613afd565b915061574b826156e4565b604082019050919050565b6000602082019050818103600083015261576f81615733565b9050919050565b600060a08201905061578b60008301886141bd565b61579860208301876141bd565b81810360408301526157aa8186614085565b905081810360608301526157be8185614085565b905081810360808301526157d281846154be565b90509695505050505050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000615814601083613afd565b915061581f826157de565b602082019050919050565b6000602082019050818103600083015261584381615807565b9050919050565b7f455243313135353a206275726e20616d6f756e74206578636565647320746f7460008201527f616c537570706c79000000000000000000000000000000000000000000000000602082015250565b60006158a6602883613afd565b91506158b18261584a565b604082019050919050565b600060208201905081810360008301526158d581615899565b905091905056fea26469706673582212200bb34b9c1272dddb1794407233d915ebb6f10cd658ecfd20d710c17fec4cf1ae64736f6c63430008120033

Deployed ByteCode Sourcemap

47353:6392:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29629:230;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28652:310;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48389:92;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48187:85;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48489:261;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53055:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51465:251;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8509:209;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48830:68;;;:::i;:::-;;49479:107;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30025:524;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46105:122;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4031:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6896:103;;;:::i;:::-;;49594:304;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49906:211;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48758:64;;;:::i;:::-;;48284:97;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6248:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8297:204;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50125:275;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30622:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50408:479;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52198:153;;;:::i;:::-;;49266:205;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45894:113;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53256:361;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53625:117;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30849:168;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51246:211;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7154:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50895:343;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51973:147;;;:::i;:::-;;48940:318;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29629:230;29715:7;29762:1;29743:21;;:7;:21;;;29735:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;29829:9;:13;29839:2;29829:13;;;;;;;;;;;:22;29843:7;29829:22;;;;;;;;;;;;;;;;29822:29;;29629:230;;;;:::o;28652:310::-;28754:4;28806:26;28791:41;;;:11;:41;;;;:110;;;;28864:37;28849:52;;;:11;:52;;;;28791:110;:163;;;;28918:36;28942:11;28918:23;:36::i;:::-;28791:163;28771:183;;28652:310;;;:::o;48389:92::-;8207:20;8216:10;8207:8;:20::i;:::-;8206:21;8205:22;:47;;;;8245:7;:5;:7::i;:::-;8231:21;;:10;:21;;;8205:47;8197:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;48458:15:::1;48466:6;48458:7;:15::i;:::-;48389:92:::0;:::o;48187:85::-;48226:13;48259:5;48252:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48187:85;:::o;48489:261::-;48552:13;48588:25;:15;:23;:25::i;:::-;48582:2;:31;48578:46;;48615:9;;;;;;;;;;;;;;;;48578:46;48635:18;48656:13;:17;48670:2;48656:17;;;;;;;;;;;48635:38;;;;;;;;;;;;;;;;;;;;;;;;;;;48715:13;48725:2;48715:9;:13::i;:::-;48730:5;:10;;;48698:43;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48684:58;;;48489:261;;;;:::o;53055:193::-;53115:20;;:::i;:::-;53148:18;53169:13;:17;53183:2;53169:17;;;;;;;;;;;53148:38;;;;;;;;;;;;;;;;;;;;;;;;;;;53204:36;;;;;;;;53218:7;53222:2;53218:3;:7::i;:::-;53204:36;;;;53227:5;:12;;;53204:36;;;53197:43;;;53055:193;;;:::o;51465:251::-;8207:20;8216:10;8207:8;:20::i;:::-;8206:21;8205:22;:47;;;;8245:7;:5;:7::i;:::-;8231:21;;:10;:21;;;8205:47;8197:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;51651:57:::1;51679:4;51685:2;51689:3;51694:7;51703:4;51651:27;:57::i;:::-;51465:251:::0;;;;;:::o;8509:209::-;6134:13;:11;:13::i;:::-;8591:9:::1;8586:123;8606:8;:15;8602:1;:19;8586:123;;;8646:7;:20;8654:8;8663:1;8654:11;;;;;;;;:::i;:::-;;;;;;;;8646:20;;;;;;;;;;;;;;;;8639:27;;;;;;;;;;;8692:3;;;;;;;8586:123;;;;8509:209:::0;:::o;48830:68::-;8207:20;8216:10;8207:8;:20::i;:::-;8206:21;8205:22;:47;;;;8245:7;:5;:7::i;:::-;8231:21;;:10;:21;;;8205:47;8197:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;48880:10:::1;:8;:10::i;:::-;48830:68::o:0;49479:107::-;8207:20;8216:10;8207:8;:20::i;:::-;8206:21;8205:22;:47;;;;8245:7;:5;:7::i;:::-;8231:21;;:10;:21;;;8205:47;8197:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;49553:25:::1;49559:7;49568:2;49572:1;49553:25;;;;;;;;;;;::::0;:5:::1;:25::i;:::-;49479:107:::0;;:::o;30025:524::-;30181:16;30242:3;:10;30223:8;:15;:29;30215:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;30311:30;30358:8;:15;30344:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30311:63;;30392:9;30387:122;30411:8;:15;30407:1;:19;30387:122;;;30467:30;30477:8;30486:1;30477:11;;;;;;;;:::i;:::-;;;;;;;;30490:3;30494:1;30490:6;;;;;;;;:::i;:::-;;;;;;;;30467:9;:30::i;:::-;30448:13;30462:1;30448:16;;;;;;;;:::i;:::-;;;;;;;:49;;;;;30428:3;;;;:::i;:::-;;;30387:122;;;;30528:13;30521:20;;;30025:524;;;;:::o;46105:122::-;46162:4;46218:1;46186:29;46212:2;46186:25;:29::i;:::-;:33;46179:40;;46105:122;;;:::o;4031:86::-;4078:4;4102:7;;;;;;;;;;;4095:14;;4031:86;:::o;6896:103::-;6134:13;:11;:13::i;:::-;6961:30:::1;6988:1;6961:18;:30::i;:::-;6896:103::o:0;49594:304::-;8207:20;8216:10;8207:8;:20::i;:::-;8206:21;8205:22;:47;;;;8245:7;:5;:7::i;:::-;8231:21;;:10;:21;;;8205:47;8197:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;49678:24:::1;49719:3;:10;49705:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49678:52;;49746:9;49741:105;49761:3;:10;49757:1;:14;49741:105;;;49802:1;49789:7;49797:1;49789:10;;;;;;;;:::i;:::-;;;;;;;:14;;;::::0;::::1;49829:3;;;;;;;49741:105;;;;49858:32;49869:2;49873:3;49878:7;49858:32;;;;;;;;;;;::::0;:10:::1;:32::i;:::-;49667:231;49594:304:::0;;:::o;49906:211::-;8207:20;8216:10;8207:8;:20::i;:::-;8206:21;8205:22;:47;;;;8245:7;:5;:7::i;:::-;8231:21;;:10;:21;;;8205:47;8197:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;50000:9:::1;49995:115;50015:3;:10;50011:1;:14;49995:115;;;50043:24;50049:3;50053:1;50049:6;;;;;;;;:::i;:::-;;;;;;;;50057:2;50061:1;50043:24;;;;;;;;;;;::::0;:5:::1;:24::i;:::-;50093:3;;;;;;;49995:115;;;;49906:211:::0;;:::o;48758:64::-;8207:20;8216:10;8207:8;:20::i;:::-;8206:21;8205:22;:47;;;;8245:7;:5;:7::i;:::-;8231:21;;:10;:21;;;8205:47;8197:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;48806:8:::1;:6;:8::i;:::-;48758:64::o:0;48284:97::-;8207:20;8216:10;8207:8;:20::i;:::-;8206:21;8205:22;:47;;;;8245:7;:5;:7::i;:::-;8231:21;;:10;:21;;;8205:47;8197:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;48366:7:::1;48358:5;:15;;;;;;:::i;:::-;;48284:97:::0;:::o;6248:87::-;6294:7;6321:6;;;;;;;;;;;6314:13;;6248:87;:::o;8297:204::-;6134:13;:11;:13::i;:::-;8376:9:::1;8371:123;8391:8;:15;8387:1;:19;8371:123;;;8447:4;8424:7;:20;8432:8;8441:1;8432:11;;;;;;;;:::i;:::-;;;;;;;;8424:20;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;8477:3;;;;;;;8371:123;;;;8297:204:::0;:::o;50125:275::-;50229:12;:10;:12::i;:::-;50218:23;;:7;:23;;;:66;;;;50245:39;50262:7;50271:12;:10;:12::i;:::-;50245:16;:39::i;:::-;50218:66;50196:162;;;;;;;;;;;;:::i;:::-;;;;;;;;;50371:21;50377:7;50386:2;50390:1;50371:5;:21::i;:::-;50125:275;;:::o;30622:155::-;30717:52;30736:12;:10;:12::i;:::-;30750:8;30760;30717:18;:52::i;:::-;30622:155;;:::o;50408:479::-;50527:12;:10;:12::i;:::-;50516:23;;:7;:23;;;:66;;;;50543:39;50560:7;50569:12;:10;:12::i;:::-;50543:16;:39::i;:::-;50516:66;50494:162;;;;;;;;;;;;:::i;:::-;;;;;;;;;50669:23;50709:3;:10;50695:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50669:51;;50736:9;50731:104;50751:3;:10;50747:1;:14;50731:104;;;50791:1;50779:6;50786:1;50779:9;;;;;;;;:::i;:::-;;;;;;;:13;;;;;50818:3;;;;;;;50731:104;;;;50847:32;50858:7;50867:3;50872:6;50847:10;:32::i;:::-;50483:404;50408:479;;:::o;52198:153::-;52260:15;:27;52276:10;52260:27;;;;;;;;;;;;;;;;52253:34;;;;;;;;;;;52298:45;52322:13;:11;:13::i;:::-;52337:5;52298:23;:45::i;:::-;52198:153::o;49266:205::-;8207:20;8216:10;8207:8;:20::i;:::-;8206:21;8205:22;:47;;;;8245:7;:5;:7::i;:::-;8231:21;;:10;:21;;;8205:47;8197:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;49366:18:::1;49401:4;49387:20;;;:::i;:::-;49366:41;;49438:25;;;;;;;;49444:10;49438:25;;;;49456:6;49438:25;;::::0;49418:13:::1;:17;49432:2;49418:17;;;;;;;;;;;:45;;;;;;;;;;;;;;;;;;;49355:116;49266:205:::0;;;:::o;45894:113::-;45956:7;45983:12;:16;45996:2;45983:16;;;;;;;;;;;;45976:23;;45894:113;;;:::o;53256:361::-;53328:4;53358:25;:15;:23;:25::i;:::-;53353:2;:30;53345:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;53447:13;:17;53461:2;53447:17;;;;;;;;;;;:24;;;53428:15;:43;;53420:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;53554:1;53522:28;53538:7;53547:2;53522:15;:28::i;:::-;:33;53514:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;53605:4;53598:11;;53256:361;;;;:::o;53625:117::-;53678:7;53733:1;53705:25;:15;:23;:25::i;:::-;:29;;;;:::i;:::-;53698:36;;53625:117;:::o;30849:168::-;30948:4;30972:18;:27;30991:7;30972:27;;;;;;;;;;;;;;;:37;31000:8;30972:37;;;;;;;;;;;;;;;;;;;;;;;;;30965:44;;30849:168;;;;:::o;51246:211::-;8207:20;8216:10;8207:8;:20::i;:::-;8206:21;8205:22;:47;;;;8245:7;:5;:7::i;:::-;8231:21;;:10;:21;;;8205:47;8197:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;51399:50:::1;51422:4;51428:2;51432;51436:6;51444:4;51399:22;:50::i;:::-;51246:211:::0;;;;;:::o;7154:201::-;6134:13;:11;:13::i;:::-;7263:1:::1;7243:22;;:8;:22;;::::0;7235:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;7319:28;7338:8;7319:18;:28::i;:::-;7154:201:::0;:::o;50895:343::-;8207:20;8216:10;8207:8;:20::i;:::-;8206:21;8205:22;:47;;;;8245:7;:5;:7::i;:::-;8231:21;;:10;:21;;;8205:47;8197:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;51001:24:::1;51042:3;:10;51028:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51001:52;;51069:9;51064:105;51084:3;:10;51080:1;:14;51064:105;;;51125:1;51112:7;51120:1;51112:10;;;;;;;;:::i;:::-;;;;;;;:14;;;::::0;::::1;51152:3;;;;;;;51064:105;;;;51181:49;51203:4;51209:2;51213:3;51218:7;51181:49;;;;;;;;;;;::::0;:21:::1;:49::i;:::-;50990:248;50895:343:::0;;;:::o;51973:147::-;52053:4;52023:15;:27;52039:10;52023:27;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;52068:44;52092:13;:11;:13::i;:::-;52107:4;52068:23;:44::i;:::-;51973:147::o;48940:318::-;8207:20;8216:10;8207:8;:20::i;:::-;8206:21;8205:22;:47;;;;8245:7;:5;:7::i;:::-;8231:21;;:10;:21;;;8205:47;8197:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;49028:18:::1;49063:4;49049:20;;;:::i;:::-;49028:41;;49080:10;49093:25;:15;:23;:25::i;:::-;49080:38;;49149:25;;;;;;;;49155:10;49149:25;;;;49167:6;49149:25;;::::0;49129:13:::1;:17;49143:2;49129:17;;;;;;;;;;;:45;;;;;;;;;;;;;;;;;;;49190:20;49207:2;49190:20;;;;;;:::i;:::-;;;;;;;;49223:27;:15;:25;:27::i;:::-;49017:241;;48940:318:::0;;:::o;19933:157::-;20018:4;20057:25;20042:40;;;:11;:40;;;;20035:47;;19933:157;;;:::o;8040:116::-;8107:4;8131:7;:17;8139:8;8131:17;;;;;;;;;;;;;;;;;;;;;;;;;8124:24;;8040:116;;;:::o;35796:88::-;35870:6;35863:4;:13;;;;;;:::i;:::-;;35796:88;:::o;872:114::-;937:7;964;:14;;;957:21;;872:114;;;:::o;29373:105::-;29433:13;29466:4;29459:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29373:105;;;:::o;31572:438::-;31813:12;:10;:12::i;:::-;31805:20;;:4;:20;;;:60;;;;31829:36;31846:4;31852:12;:10;:12::i;:::-;31829:16;:36::i;:::-;31805:60;31783:156;;;;;;;;;;;;:::i;:::-;;;;;;;;;31950:52;31973:4;31979:2;31983:3;31988:7;31997:4;31950:22;:52::i;:::-;31572:438;;;;;:::o;6413:132::-;6488:12;:10;:12::i;:::-;6477:23;;:7;:5;:7::i;:::-;:23;;;6469:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6413:132::o;4886:120::-;3895:16;:14;:16::i;:::-;4955:5:::1;4945:7;;:15;;;;;;;;;;;;;;;;;;4976:22;4985:12;:10;:12::i;:::-;4976:22;;;;;;:::i;:::-;;;;;;;;4886:120::o:0;36270:729::-;36437:1;36423:16;;:2;:16;;;36415:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;36490:16;36509:12;:10;:12::i;:::-;36490:31;;36532:20;36555:21;36573:2;36555:17;:21::i;:::-;36532:44;;36587:24;36614:25;36632:6;36614:17;:25::i;:::-;36587:52;;36652:66;36673:8;36691:1;36695:2;36699:3;36704:7;36713:4;36652:20;:66::i;:::-;36752:6;36731:9;:13;36741:2;36731:13;;;;;;;;;;;:17;36745:2;36731:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;36811:2;36774:52;;36807:1;36774:52;;36789:8;36774:52;;;36815:2;36819:6;36774:52;;;;;;;:::i;:::-;;;;;;;;36839:65;36859:8;36877:1;36881:2;36885:3;36890:7;36899:4;36839:19;:65::i;:::-;36917:74;36948:8;36966:1;36970:2;36974;36978:6;36986:4;36917:30;:74::i;:::-;36404:595;;;36270:729;;;;:::o;7515:191::-;7589:16;7608:6;;;;;;;;;;;7589:25;;7634:8;7625:6;;:17;;;;;;;;;;;;;;;;;;7689:8;7658:40;;7679:8;7658:40;;;;;;;;;;;;7578:128;7515:191;:::o;37402:813::-;37594:1;37580:16;;:2;:16;;;37572:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;37667:7;:14;37653:3;:10;:28;37645:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;37739:16;37758:12;:10;:12::i;:::-;37739:31;;37783:66;37804:8;37822:1;37826:2;37830:3;37835:7;37844:4;37783:20;:66::i;:::-;37867:9;37862:103;37886:3;:10;37882:1;:14;37862:103;;;37943:7;37951:1;37943:10;;;;;;;;:::i;:::-;;;;;;;;37918:9;:17;37928:3;37932:1;37928:6;;;;;;;;:::i;:::-;;;;;;;;37918:17;;;;;;;;;;;:21;37936:2;37918:21;;;;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;;;;;37898:3;;;;;:::i;:::-;;;;37862:103;;;;38018:2;37982:53;;38014:1;37982:53;;37996:8;37982:53;;;38022:3;38027:7;37982:53;;;;;;;:::i;:::-;;;;;;;;38048:65;38068:8;38086:1;38090:2;38094:3;38099:7;38108:4;38048:19;:65::i;:::-;38126:81;38162:8;38180:1;38184:2;38188:3;38193:7;38202:4;38126:35;:81::i;:::-;37561:654;37402:813;;;;:::o;4627:118::-;3636:19;:17;:19::i;:::-;4697:4:::1;4687:7;;:14;;;;;;;;;;;;;;;;;;4717:20;4724:12;:10;:12::i;:::-;4717:20;;;;;;:::i;:::-;;;;;;;;4627:118::o:0;2144:98::-;2197:7;2224:10;2217:17;;2144:98;:::o;38513:808::-;38656:1;38640:18;;:4;:18;;;38632:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;38711:16;38730:12;:10;:12::i;:::-;38711:31;;38753:20;38776:21;38794:2;38776:17;:21::i;:::-;38753:44;;38808:24;38835:25;38853:6;38835:17;:25::i;:::-;38808:52;;38873:66;38894:8;38904:4;38918:1;38922:3;38927:7;38873:66;;;;;;;;;;;;:20;:66::i;:::-;38952:19;38974:9;:13;38984:2;38974:13;;;;;;;;;;;:19;38988:4;38974:19;;;;;;;;;;;;;;;;38952:41;;39027:6;39012:11;:21;;39004:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;39146:6;39132:11;:20;39110:9;:13;39120:2;39110:13;;;;;;;;;;;:19;39124:4;39110:19;;;;;;;;;;;;;;;:42;;;;39220:1;39181:54;;39206:4;39181:54;;39196:8;39181:54;;;39224:2;39228:6;39181:54;;;;;;;:::i;:::-;;;;;;;;39248:65;39268:8;39278:4;39292:1;39296:3;39301:7;39248:65;;;;;;;;;;;;:19;:65::i;:::-;38621:700;;;;38513:808;;;:::o;40683:331::-;40838:8;40829:17;;:5;:17;;;40821:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;40941:8;40903:18;:25;40922:5;40903:25;;;;;;;;;;;;;;;:35;40929:8;40903:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;40987:8;40965:41;;40980:5;40965:41;;;40997:8;40965:41;;;;;;:::i;:::-;;;;;;;;40683:331;;;:::o;39571:969::-;39739:1;39723:18;;:4;:18;;;39715:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;39814:7;:14;39800:3;:10;:28;39792:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;39886:16;39905:12;:10;:12::i;:::-;39886:31;;39930:66;39951:8;39961:4;39975:1;39979:3;39984:7;39930:66;;;;;;;;;;;;:20;:66::i;:::-;40014:9;40009:373;40033:3;:10;40029:1;:14;40009:373;;;40065:10;40078:3;40082:1;40078:6;;;;;;;;:::i;:::-;;;;;;;;40065:19;;40099:14;40116:7;40124:1;40116:10;;;;;;;;:::i;:::-;;;;;;;;40099:27;;40143:19;40165:9;:13;40175:2;40165:13;;;;;;;;;;;:19;40179:4;40165:19;;;;;;;;;;;;;;;;40143:41;;40222:6;40207:11;:21;;40199:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;40349:6;40335:11;:20;40313:9;:13;40323:2;40313:13;;;;;;;;;;;:19;40327:4;40313:19;;;;;;;;;;;;;;;:42;;;;40050:332;;;40045:3;;;;;:::i;:::-;;;;40009:373;;;;40437:1;40399:55;;40423:4;40399:55;;40413:8;40399:55;;;40441:3;40446:7;40399:55;;;;;;;:::i;:::-;;;;;;;;40467:65;40487:8;40497:4;40511:1;40515:3;40520:7;40467:65;;;;;;;;;;;;:19;:65::i;:::-;39704:836;39571:969;;;:::o;31089:406::-;31305:12;:10;:12::i;:::-;31297:20;;:4;:20;;;:60;;;;31321:36;31338:4;31344:12;:10;:12::i;:::-;31321:16;:36::i;:::-;31297:60;31275:156;;;;;;;;;;;;:::i;:::-;;;;;;;;;31442:45;31460:4;31466:2;31470;31474:6;31482:4;31442:17;:45::i;:::-;31089:406;;;;;:::o;994:127::-;1101:1;1083:7;:14;;;:19;;;;;;;;;;;994:127;:::o;33806:1146::-;34033:7;:14;34019:3;:10;:28;34011:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;34125:1;34111:16;;:2;:16;;;34103:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;34182:16;34201:12;:10;:12::i;:::-;34182:31;;34226:60;34247:8;34257:4;34263:2;34267:3;34272:7;34281:4;34226:20;:60::i;:::-;34304:9;34299:421;34323:3;:10;34319:1;:14;34299:421;;;34355:10;34368:3;34372:1;34368:6;;;;;;;;:::i;:::-;;;;;;;;34355:19;;34389:14;34406:7;34414:1;34406:10;;;;;;;;:::i;:::-;;;;;;;;34389:27;;34433:19;34455:9;:13;34465:2;34455:13;;;;;;;;;;;:19;34469:4;34455:19;;;;;;;;;;;;;;;;34433:41;;34512:6;34497:11;:21;;34489:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;34645:6;34631:11;:20;34609:9;:13;34619:2;34609:13;;;;;;;;;;;:19;34623:4;34609:19;;;;;;;;;;;;;;;:42;;;;34702:6;34681:9;:13;34691:2;34681:13;;;;;;;;;;;:17;34695:2;34681:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;34340:380;;;34335:3;;;;:::i;:::-;;;34299:421;;;;34767:2;34737:47;;34761:4;34737:47;;34751:8;34737:47;;;34771:3;34776:7;34737:47;;;;;;;:::i;:::-;;;;;;;;34797:59;34817:8;34827:4;34833:2;34837:3;34842:7;34851:4;34797:19;:59::i;:::-;34869:75;34905:8;34915:4;34921:2;34925:3;34930:7;34939:4;34869:35;:75::i;:::-;34000:952;33806:1146;;;;;:::o;4375:108::-;4442:8;:6;:8::i;:::-;4434:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;4375:108::o;44949:198::-;45015:16;45044:22;45083:1;45069:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45044:41;;45107:7;45096:5;45102:1;45096:8;;;;;;;;:::i;:::-;;;;;;;:18;;;;;45134:5;45127:12;;;44949:198;;;:::o;52416:590::-;3636:19;:17;:19::i;:::-;52660:1:::1;52644:18;;:4;:18;;;;:38;;;;;52680:1;52666:16;;:2;:16;;;;52644:38;52640:280;;;52709:20;52718:10;52709:8;:20::i;:::-;52699:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;52830:15;:21;52846:4;52830:21;;;;;;;;;;;;;;;;;;;;;;;;;52820:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;52640:280;52932:66;52959:8;52969:4;52975:2;52979:3;52984:7;52993:4;52932:26;:66::i;:::-;52416:590:::0;;;;;;:::o;43148:220::-;;;;;;;:::o;43376:744::-;43591:15;:2;:13;;;:15::i;:::-;43587:526;;;43644:2;43627:38;;;43666:8;43676:4;43682:2;43686:6;43694:4;43627:72;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;43623:479;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;43975:6;43968:14;;;;;;;;;;;:::i;:::-;;;;;;;;43623:479;;;44024:62;;;;;;;;;;:::i;:::-;;;;;;;;43623:479;43761:43;;;43749:55;;;:8;:55;;;;43745:154;;43829:50;;;;;;;;;;:::i;:::-;;;;;;;;43745:154;43700:214;43587:526;43376:744;;;;;;:::o;44128:813::-;44368:15;:2;:13;;;:15::i;:::-;44364:570;;;44421:2;44404:43;;;44448:8;44458:4;44464:3;44469:7;44478:4;44404:79;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;44400:523;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;44796:6;44789:14;;;;;;;;;;;:::i;:::-;;;;;;;;44400:523;;;44845:62;;;;;;;;;;:::i;:::-;;;;;;;;44400:523;44577:48;;;44565:60;;;:8;:60;;;;44561:159;;44650:50;;;;;;;;;;:::i;:::-;;;;;;;;44561:159;44484:251;44364:570;44128:813;;;;;;:::o;4190:108::-;4261:8;:6;:8::i;:::-;4260:9;4252:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;4190:108::o;32474:974::-;32676:1;32662:16;;:2;:16;;;32654:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;32733:16;32752:12;:10;:12::i;:::-;32733:31;;32775:20;32798:21;32816:2;32798:17;:21::i;:::-;32775:44;;32830:24;32857:25;32875:6;32857:17;:25::i;:::-;32830:52;;32895:60;32916:8;32926:4;32932:2;32936:3;32941:7;32950:4;32895:20;:60::i;:::-;32968:19;32990:9;:13;33000:2;32990:13;;;;;;;;;;;:19;33004:4;32990:19;;;;;;;;;;;;;;;;32968:41;;33043:6;33028:11;:21;;33020:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;33168:6;33154:11;:20;33132:9;:13;33142:2;33132:13;;;;;;;;;;;:19;33146:4;33132:19;;;;;;;;;;;;;;;:42;;;;33217:6;33196:9;:13;33206:2;33196:13;;;;;;;;;;;:17;33210:2;33196:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;33272:2;33241:46;;33266:4;33241:46;;33256:8;33241:46;;;33276:2;33280:6;33241:46;;;;;;;:::i;:::-;;;;;;;;33300:59;33320:8;33330:4;33336:2;33340:3;33345:7;33354:4;33300:19;:59::i;:::-;33372:68;33403:8;33413:4;33419:2;33423;33427:6;33435:4;33372:30;:68::i;:::-;32643:805;;;;32474:974;;;;;:::o;46302:931::-;46541:66;46568:8;46578:4;46584:2;46588:3;46593:7;46602:4;46541:26;:66::i;:::-;46640:1;46624:18;;:4;:18;;;46620:160;;46664:9;46659:110;46683:3;:10;46679:1;:14;46659:110;;;46743:7;46751:1;46743:10;;;;;;;;:::i;:::-;;;;;;;;46719:12;:20;46732:3;46736:1;46732:6;;;;;;;;:::i;:::-;;;;;;;;46719:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;;;;;46695:3;;;;:::i;:::-;;;46659:110;;;;46620:160;46810:1;46796:16;;:2;:16;;;46792:434;;46834:9;46829:386;46853:3;:10;46849:1;:14;46829:386;;;46889:10;46902:3;46906:1;46902:6;;;;;;;;:::i;:::-;;;;;;;;46889:19;;46927:14;46944:7;46952:1;46944:10;;;;;;;;:::i;:::-;;;;;;;;46927:27;;46973:14;46990:12;:16;47003:2;46990:16;;;;;;;;;;;;46973:33;;47043:6;47033;:16;;47025:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;47174:6;47165;:15;47146:12;:16;47159:2;47146:16;;;;;;;;;;;:34;;;;46870:345;;;46865:3;;;;:::i;:::-;;;46829:386;;;;46792:434;46302:931;;;;;;:::o;9956:326::-;10016:4;10273:1;10251:7;:19;;;:23;10244:30;;9956:326;;;:::o;41972:221::-;;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:77::-;878:7;907:5;896:16;;841:77;;;:::o;924:122::-;997:24;1015:5;997:24;:::i;:::-;990:5;987:35;977:63;;1036:1;1033;1026:12;977:63;924:122;:::o;1052:139::-;1098:5;1136:6;1123:20;1114:29;;1152:33;1179:5;1152:33;:::i;:::-;1052:139;;;;:::o;1197:474::-;1265:6;1273;1322:2;1310:9;1301:7;1297:23;1293:32;1290:119;;;1328:79;;:::i;:::-;1290:119;1448:1;1473:53;1518:7;1509:6;1498:9;1494:22;1473:53;:::i;:::-;1463:63;;1419:117;1575:2;1601:53;1646:7;1637:6;1626:9;1622:22;1601:53;:::i;:::-;1591:63;;1546:118;1197:474;;;;;:::o;1677:118::-;1764:24;1782:5;1764:24;:::i;:::-;1759:3;1752:37;1677:118;;:::o;1801:222::-;1894:4;1932:2;1921:9;1917:18;1909:26;;1945:71;2013:1;2002:9;1998:17;1989:6;1945:71;:::i;:::-;1801:222;;;;:::o;2029:149::-;2065:7;2105:66;2098:5;2094:78;2083:89;;2029:149;;;:::o;2184:120::-;2256:23;2273:5;2256:23;:::i;:::-;2249:5;2246:34;2236:62;;2294:1;2291;2284:12;2236:62;2184:120;:::o;2310:137::-;2355:5;2393:6;2380:20;2371:29;;2409:32;2435:5;2409:32;:::i;:::-;2310:137;;;;:::o;2453:327::-;2511:6;2560:2;2548:9;2539:7;2535:23;2531:32;2528:119;;;2566:79;;:::i;:::-;2528:119;2686:1;2711:52;2755:7;2746:6;2735:9;2731:22;2711:52;:::i;:::-;2701:62;;2657:116;2453:327;;;;:::o;2786:90::-;2820:7;2863:5;2856:13;2849:21;2838:32;;2786:90;;;:::o;2882:109::-;2963:21;2978:5;2963:21;:::i;:::-;2958:3;2951:34;2882:109;;:::o;2997:210::-;3084:4;3122:2;3111:9;3107:18;3099:26;;3135:65;3197:1;3186:9;3182:17;3173:6;3135:65;:::i;:::-;2997:210;;;;:::o;3213:117::-;3322:1;3319;3312:12;3336:117;3445:1;3442;3435:12;3459:102;3500:6;3551:2;3547:7;3542:2;3535:5;3531:14;3527:28;3517:38;;3459:102;;;:::o;3567:180::-;3615:77;3612:1;3605:88;3712:4;3709:1;3702:15;3736:4;3733:1;3726:15;3753:281;3836:27;3858:4;3836:27;:::i;:::-;3828:6;3824:40;3966:6;3954:10;3951:22;3930:18;3918:10;3915:34;3912:62;3909:88;;;3977:18;;:::i;:::-;3909:88;4017:10;4013:2;4006:22;3796:238;3753:281;;:::o;4040:129::-;4074:6;4101:20;;:::i;:::-;4091:30;;4130:33;4158:4;4150:6;4130:33;:::i;:::-;4040:129;;;:::o;4175:308::-;4237:4;4327:18;4319:6;4316:30;4313:56;;;4349:18;;:::i;:::-;4313:56;4387:29;4409:6;4387:29;:::i;:::-;4379:37;;4471:4;4465;4461:15;4453:23;;4175:308;;;:::o;4489:146::-;4586:6;4581:3;4576;4563:30;4627:1;4618:6;4613:3;4609:16;4602:27;4489:146;;;:::o;4641:425::-;4719:5;4744:66;4760:49;4802:6;4760:49;:::i;:::-;4744:66;:::i;:::-;4735:75;;4833:6;4826:5;4819:21;4871:4;4864:5;4860:16;4909:3;4900:6;4895:3;4891:16;4888:25;4885:112;;;4916:79;;:::i;:::-;4885:112;5006:54;5053:6;5048:3;5043;5006:54;:::i;:::-;4725:341;4641:425;;;;;:::o;5086:340::-;5142:5;5191:3;5184:4;5176:6;5172:17;5168:27;5158:122;;5199:79;;:::i;:::-;5158:122;5316:6;5303:20;5341:79;5416:3;5408:6;5401:4;5393:6;5389:17;5341:79;:::i;:::-;5332:88;;5148:278;5086:340;;;;:::o;5432:509::-;5501:6;5550:2;5538:9;5529:7;5525:23;5521:32;5518:119;;;5556:79;;:::i;:::-;5518:119;5704:1;5693:9;5689:17;5676:31;5734:18;5726:6;5723:30;5720:117;;;5756:79;;:::i;:::-;5720:117;5861:63;5916:7;5907:6;5896:9;5892:22;5861:63;:::i;:::-;5851:73;;5647:287;5432:509;;;;:::o;5947:99::-;5999:6;6033:5;6027:12;6017:22;;5947:99;;;:::o;6052:169::-;6136:11;6170:6;6165:3;6158:19;6210:4;6205:3;6201:14;6186:29;;6052:169;;;;:::o;6227:246::-;6308:1;6318:113;6332:6;6329:1;6326:13;6318:113;;;6417:1;6412:3;6408:11;6402:18;6398:1;6393:3;6389:11;6382:39;6354:2;6351:1;6347:10;6342:15;;6318:113;;;6465:1;6456:6;6451:3;6447:16;6440:27;6289:184;6227:246;;;:::o;6479:377::-;6567:3;6595:39;6628:5;6595:39;:::i;:::-;6650:71;6714:6;6709:3;6650:71;:::i;:::-;6643:78;;6730:65;6788:6;6783:3;6776:4;6769:5;6765:16;6730:65;:::i;:::-;6820:29;6842:6;6820:29;:::i;:::-;6815:3;6811:39;6804:46;;6571:285;6479:377;;;;:::o;6862:313::-;6975:4;7013:2;7002:9;6998:18;6990:26;;7062:9;7056:4;7052:20;7048:1;7037:9;7033:17;7026:47;7090:78;7163:4;7154:6;7090:78;:::i;:::-;7082:86;;6862:313;;;;:::o;7181:329::-;7240:6;7289:2;7277:9;7268:7;7264:23;7260:32;7257:119;;;7295:79;;:::i;:::-;7257:119;7415:1;7440:53;7485:7;7476:6;7465:9;7461:22;7440:53;:::i;:::-;7430:63;;7386:117;7181:329;;;;:::o;7516:159::-;7590:11;7624:6;7619:3;7612:19;7664:4;7659:3;7655:14;7640:29;;7516:159;;;;:::o;7681:357::-;7759:3;7787:39;7820:5;7787:39;:::i;:::-;7842:61;7896:6;7891:3;7842:61;:::i;:::-;7835:68;;7912:65;7970:6;7965:3;7958:4;7951:5;7947:16;7912:65;:::i;:::-;8002:29;8024:6;8002:29;:::i;:::-;7997:3;7993:39;7986:46;;7763:275;7681:357;;;;:::o;8044:108::-;8121:24;8139:5;8121:24;:::i;:::-;8116:3;8109:37;8044:108;;:::o;8238:619::-;8369:3;8405:4;8400:3;8396:14;8491:4;8484:5;8480:16;8474:23;8544:3;8538:4;8534:14;8527:4;8522:3;8518:14;8511:38;8570:73;8638:4;8624:12;8570:73;:::i;:::-;8562:81;;8420:234;8738:4;8731:5;8727:16;8721:23;8757:63;8814:4;8809:3;8805:14;8791:12;8757:63;:::i;:::-;8664:166;8847:4;8840:11;;8374:483;8238:619;;;;:::o;8863:397::-;9018:4;9056:2;9045:9;9041:18;9033:26;;9105:9;9099:4;9095:20;9091:1;9080:9;9076:17;9069:47;9133:120;9248:4;9239:6;9133:120;:::i;:::-;9125:128;;8863:397;;;;:::o;9266:311::-;9343:4;9433:18;9425:6;9422:30;9419:56;;;9455:18;;:::i;:::-;9419:56;9505:4;9497:6;9493:17;9485:25;;9565:4;9559;9555:15;9547:23;;9266:311;;;:::o;9583:117::-;9692:1;9689;9682:12;9723:710;9819:5;9844:81;9860:64;9917:6;9860:64;:::i;:::-;9844:81;:::i;:::-;9835:90;;9945:5;9974:6;9967:5;9960:21;10008:4;10001:5;9997:16;9990:23;;10061:4;10053:6;10049:17;10041:6;10037:30;10090:3;10082:6;10079:15;10076:122;;;10109:79;;:::i;:::-;10076:122;10224:6;10207:220;10241:6;10236:3;10233:15;10207:220;;;10316:3;10345:37;10378:3;10366:10;10345:37;:::i;:::-;10340:3;10333:50;10412:4;10407:3;10403:14;10396:21;;10283:144;10267:4;10262:3;10258:14;10251:21;;10207:220;;;10211:21;9825:608;;9723:710;;;;;:::o;10456:370::-;10527:5;10576:3;10569:4;10561:6;10557:17;10553:27;10543:122;;10584:79;;:::i;:::-;10543:122;10701:6;10688:20;10726:94;10816:3;10808:6;10801:4;10793:6;10789:17;10726:94;:::i;:::-;10717:103;;10533:293;10456:370;;;;:::o;10832:307::-;10893:4;10983:18;10975:6;10972:30;10969:56;;;11005:18;;:::i;:::-;10969:56;11043:29;11065:6;11043:29;:::i;:::-;11035:37;;11127:4;11121;11117:15;11109:23;;10832:307;;;:::o;11145:423::-;11222:5;11247:65;11263:48;11304:6;11263:48;:::i;:::-;11247:65;:::i;:::-;11238:74;;11335:6;11328:5;11321:21;11373:4;11366:5;11362:16;11411:3;11402:6;11397:3;11393:16;11390:25;11387:112;;;11418:79;;:::i;:::-;11387:112;11508:54;11555:6;11550:3;11545;11508:54;:::i;:::-;11228:340;11145:423;;;;;:::o;11587:338::-;11642:5;11691:3;11684:4;11676:6;11672:17;11668:27;11658:122;;11699:79;;:::i;:::-;11658:122;11816:6;11803:20;11841:78;11915:3;11907:6;11900:4;11892:6;11888:17;11841:78;:::i;:::-;11832:87;;11648:277;11587:338;;;;:::o;11931:1509::-;12085:6;12093;12101;12109;12117;12166:3;12154:9;12145:7;12141:23;12137:33;12134:120;;;12173:79;;:::i;:::-;12134:120;12293:1;12318:53;12363:7;12354:6;12343:9;12339:22;12318:53;:::i;:::-;12308:63;;12264:117;12420:2;12446:53;12491:7;12482:6;12471:9;12467:22;12446:53;:::i;:::-;12436:63;;12391:118;12576:2;12565:9;12561:18;12548:32;12607:18;12599:6;12596:30;12593:117;;;12629:79;;:::i;:::-;12593:117;12734:78;12804:7;12795:6;12784:9;12780:22;12734:78;:::i;:::-;12724:88;;12519:303;12889:2;12878:9;12874:18;12861:32;12920:18;12912:6;12909:30;12906:117;;;12942:79;;:::i;:::-;12906:117;13047:78;13117:7;13108:6;13097:9;13093:22;13047:78;:::i;:::-;13037:88;;12832:303;13202:3;13191:9;13187:19;13174:33;13234:18;13226:6;13223:30;13220:117;;;13256:79;;:::i;:::-;13220:117;13361:62;13415:7;13406:6;13395:9;13391:22;13361:62;:::i;:::-;13351:72;;13145:288;11931:1509;;;;;;;;:::o;13446:311::-;13523:4;13613:18;13605:6;13602:30;13599:56;;;13635:18;;:::i;:::-;13599:56;13685:4;13677:6;13673:17;13665:25;;13745:4;13739;13735:15;13727:23;;13446:311;;;:::o;13780:710::-;13876:5;13901:81;13917:64;13974:6;13917:64;:::i;:::-;13901:81;:::i;:::-;13892:90;;14002:5;14031:6;14024:5;14017:21;14065:4;14058:5;14054:16;14047:23;;14118:4;14110:6;14106:17;14098:6;14094:30;14147:3;14139:6;14136:15;14133:122;;;14166:79;;:::i;:::-;14133:122;14281:6;14264:220;14298:6;14293:3;14290:15;14264:220;;;14373:3;14402:37;14435:3;14423:10;14402:37;:::i;:::-;14397:3;14390:50;14469:4;14464:3;14460:14;14453:21;;14340:144;14324:4;14319:3;14315:14;14308:21;;14264:220;;;14268:21;13882:608;;13780:710;;;;;:::o;14513:370::-;14584:5;14633:3;14626:4;14618:6;14614:17;14610:27;14600:122;;14641:79;;:::i;:::-;14600:122;14758:6;14745:20;14783:94;14873:3;14865:6;14858:4;14850:6;14846:17;14783:94;:::i;:::-;14774:103;;14590:293;14513:370;;;;:::o;14889:539::-;14973:6;15022:2;15010:9;15001:7;14997:23;14993:32;14990:119;;;15028:79;;:::i;:::-;14990:119;15176:1;15165:9;15161:17;15148:31;15206:18;15198:6;15195:30;15192:117;;;15228:79;;:::i;:::-;15192:117;15333:78;15403:7;15394:6;15383:9;15379:22;15333:78;:::i;:::-;15323:88;;15119:302;14889:539;;;;:::o;15434:894::-;15552:6;15560;15609:2;15597:9;15588:7;15584:23;15580:32;15577:119;;;15615:79;;:::i;:::-;15577:119;15763:1;15752:9;15748:17;15735:31;15793:18;15785:6;15782:30;15779:117;;;15815:79;;:::i;:::-;15779:117;15920:78;15990:7;15981:6;15970:9;15966:22;15920:78;:::i;:::-;15910:88;;15706:302;16075:2;16064:9;16060:18;16047:32;16106:18;16098:6;16095:30;16092:117;;;16128:79;;:::i;:::-;16092:117;16233:78;16303:7;16294:6;16283:9;16279:22;16233:78;:::i;:::-;16223:88;;16018:303;15434:894;;;;;:::o;16334:114::-;16401:6;16435:5;16429:12;16419:22;;16334:114;;;:::o;16454:184::-;16553:11;16587:6;16582:3;16575:19;16627:4;16622:3;16618:14;16603:29;;16454:184;;;;:::o;16644:132::-;16711:4;16734:3;16726:11;;16764:4;16759:3;16755:14;16747:22;;16644:132;;;:::o;16782:179::-;16851:10;16872:46;16914:3;16906:6;16872:46;:::i;:::-;16950:4;16945:3;16941:14;16927:28;;16782:179;;;;:::o;16967:113::-;17037:4;17069;17064:3;17060:14;17052:22;;16967:113;;;:::o;17116:732::-;17235:3;17264:54;17312:5;17264:54;:::i;:::-;17334:86;17413:6;17408:3;17334:86;:::i;:::-;17327:93;;17444:56;17494:5;17444:56;:::i;:::-;17523:7;17554:1;17539:284;17564:6;17561:1;17558:13;17539:284;;;17640:6;17634:13;17667:63;17726:3;17711:13;17667:63;:::i;:::-;17660:70;;17753:60;17806:6;17753:60;:::i;:::-;17743:70;;17599:224;17586:1;17583;17579:9;17574:14;;17539:284;;;17543:14;17839:3;17832:10;;17240:608;;;17116:732;;;;:::o;17854:373::-;17997:4;18035:2;18024:9;18020:18;18012:26;;18084:9;18078:4;18074:20;18070:1;18059:9;18055:17;18048:47;18112:108;18215:4;18206:6;18112:108;:::i;:::-;18104:116;;17854:373;;;;:::o;18233:684::-;18326:6;18334;18383:2;18371:9;18362:7;18358:23;18354:32;18351:119;;;18389:79;;:::i;:::-;18351:119;18509:1;18534:53;18579:7;18570:6;18559:9;18555:22;18534:53;:::i;:::-;18524:63;;18480:117;18664:2;18653:9;18649:18;18636:32;18695:18;18687:6;18684:30;18681:117;;;18717:79;;:::i;:::-;18681:117;18822:78;18892:7;18883:6;18872:9;18868:22;18822:78;:::i;:::-;18812:88;;18607:303;18233:684;;;;;:::o;18923:::-;19016:6;19024;19073:2;19061:9;19052:7;19048:23;19044:32;19041:119;;;19079:79;;:::i;:::-;19041:119;19227:1;19216:9;19212:17;19199:31;19257:18;19249:6;19246:30;19243:117;;;19279:79;;:::i;:::-;19243:117;19384:78;19454:7;19445:6;19434:9;19430:22;19384:78;:::i;:::-;19374:88;;19170:302;19511:2;19537:53;19582:7;19573:6;19562:9;19558:22;19537:53;:::i;:::-;19527:63;;19482:118;18923:684;;;;;:::o;19613:118::-;19700:24;19718:5;19700:24;:::i;:::-;19695:3;19688:37;19613:118;;:::o;19737:222::-;19830:4;19868:2;19857:9;19853:18;19845:26;;19881:71;19949:1;19938:9;19934:17;19925:6;19881:71;:::i;:::-;19737:222;;;;:::o;19965:116::-;20035:21;20050:5;20035:21;:::i;:::-;20028:5;20025:32;20015:60;;20071:1;20068;20061:12;20015:60;19965:116;:::o;20087:133::-;20130:5;20168:6;20155:20;20146:29;;20184:30;20208:5;20184:30;:::i;:::-;20087:133;;;;:::o;20226:468::-;20291:6;20299;20348:2;20336:9;20327:7;20323:23;20319:32;20316:119;;;20354:79;;:::i;:::-;20316:119;20474:1;20499:53;20544:7;20535:6;20524:9;20520:22;20499:53;:::i;:::-;20489:63;;20445:117;20601:2;20627:50;20669:7;20660:6;20649:9;20645:22;20627:50;:::i;:::-;20617:60;;20572:115;20226:468;;;;;:::o;20700:799::-;20787:6;20795;20803;20852:2;20840:9;20831:7;20827:23;20823:32;20820:119;;;20858:79;;:::i;:::-;20820:119;20978:1;21003:53;21048:7;21039:6;21028:9;21024:22;21003:53;:::i;:::-;20993:63;;20949:117;21133:2;21122:9;21118:18;21105:32;21164:18;21156:6;21153:30;21150:117;;;21186:79;;:::i;:::-;21150:117;21291:63;21346:7;21337:6;21326:9;21322:22;21291:63;:::i;:::-;21281:73;;21076:288;21403:2;21429:53;21474:7;21465:6;21454:9;21450:22;21429:53;:::i;:::-;21419:63;;21374:118;20700:799;;;;;:::o;21505:474::-;21573:6;21581;21630:2;21618:9;21609:7;21605:23;21601:32;21598:119;;;21636:79;;:::i;:::-;21598:119;21756:1;21781:53;21826:7;21817:6;21806:9;21802:22;21781:53;:::i;:::-;21771:63;;21727:117;21883:2;21909:53;21954:7;21945:6;21934:9;21930:22;21909:53;:::i;:::-;21899:63;;21854:118;21505:474;;;;;:::o;21985:1089::-;22089:6;22097;22105;22113;22121;22170:3;22158:9;22149:7;22145:23;22141:33;22138:120;;;22177:79;;:::i;:::-;22138:120;22297:1;22322:53;22367:7;22358:6;22347:9;22343:22;22322:53;:::i;:::-;22312:63;;22268:117;22424:2;22450:53;22495:7;22486:6;22475:9;22471:22;22450:53;:::i;:::-;22440:63;;22395:118;22552:2;22578:53;22623:7;22614:6;22603:9;22599:22;22578:53;:::i;:::-;22568:63;;22523:118;22680:2;22706:53;22751:7;22742:6;22731:9;22727:22;22706:53;:::i;:::-;22696:63;;22651:118;22836:3;22825:9;22821:19;22808:33;22868:18;22860:6;22857:30;22854:117;;;22890:79;;:::i;:::-;22854:117;22995:62;23049:7;23040:6;23029:9;23025:22;22995:62;:::i;:::-;22985:72;;22779:288;21985:1089;;;;;;;;:::o;23080:329::-;23139:6;23188:2;23176:9;23167:7;23163:23;23159:32;23156:119;;;23194:79;;:::i;:::-;23156:119;23314:1;23339:53;23384:7;23375:6;23364:9;23360:22;23339:53;:::i;:::-;23329:63;;23285:117;23080:329;;;;:::o;23415:829::-;23517:6;23525;23533;23582:2;23570:9;23561:7;23557:23;23553:32;23550:119;;;23588:79;;:::i;:::-;23550:119;23708:1;23733:53;23778:7;23769:6;23758:9;23754:22;23733:53;:::i;:::-;23723:63;;23679:117;23835:2;23861:53;23906:7;23897:6;23886:9;23882:22;23861:53;:::i;:::-;23851:63;;23806:118;23991:2;23980:9;23976:18;23963:32;24022:18;24014:6;24011:30;24008:117;;;24044:79;;:::i;:::-;24008:117;24149:78;24219:7;24210:6;24199:9;24195:22;24149:78;:::i;:::-;24139:88;;23934:303;23415:829;;;;;:::o;24250:654::-;24328:6;24336;24385:2;24373:9;24364:7;24360:23;24356:32;24353:119;;;24391:79;;:::i;:::-;24353:119;24539:1;24528:9;24524:17;24511:31;24569:18;24561:6;24558:30;24555:117;;;24591:79;;:::i;:::-;24555:117;24696:63;24751:7;24742:6;24731:9;24727:22;24696:63;:::i;:::-;24686:73;;24482:287;24808:2;24834:53;24879:7;24870:6;24859:9;24855:22;24834:53;:::i;:::-;24824:63;;24779:118;24250:654;;;;;:::o;24910:229::-;25050:34;25046:1;25038:6;25034:14;25027:58;25119:12;25114:2;25106:6;25102:15;25095:37;24910:229;:::o;25145:366::-;25287:3;25308:67;25372:2;25367:3;25308:67;:::i;:::-;25301:74;;25384:93;25473:3;25384:93;:::i;:::-;25502:2;25497:3;25493:12;25486:19;;25145:366;;;:::o;25517:419::-;25683:4;25721:2;25710:9;25706:18;25698:26;;25770:9;25764:4;25760:20;25756:1;25745:9;25741:17;25734:47;25798:131;25924:4;25798:131;:::i;:::-;25790:139;;25517:419;;;:::o;25942:162::-;26082:14;26078:1;26070:6;26066:14;26059:38;25942:162;:::o;26110:366::-;26252:3;26273:67;26337:2;26332:3;26273:67;:::i;:::-;26266:74;;26349:93;26438:3;26349:93;:::i;:::-;26467:2;26462:3;26458:12;26451:19;;26110:366;;;:::o;26482:419::-;26648:4;26686:2;26675:9;26671:18;26663:26;;26735:9;26729:4;26725:20;26721:1;26710:9;26706:17;26699:47;26763:131;26889:4;26763:131;:::i;:::-;26755:139;;26482:419;;;:::o;26907:180::-;26955:77;26952:1;26945:88;27052:4;27049:1;27042:15;27076:4;27073:1;27066:15;27093:320;27137:6;27174:1;27168:4;27164:12;27154:22;;27221:1;27215:4;27211:12;27242:18;27232:81;;27298:4;27290:6;27286:17;27276:27;;27232:81;27360:2;27352:6;27349:14;27329:18;27326:38;27323:84;;27379:18;;:::i;:::-;27323:84;27144:269;27093:320;;;:::o;27419:148::-;27521:11;27558:3;27543:18;;27419:148;;;;:::o;27573:390::-;27679:3;27707:39;27740:5;27707:39;:::i;:::-;27762:89;27844:6;27839:3;27762:89;:::i;:::-;27755:96;;27860:65;27918:6;27913:3;27906:4;27899:5;27895:16;27860:65;:::i;:::-;27950:6;27945:3;27941:16;27934:23;;27683:280;27573:390;;;;:::o;27969:77::-;28006:7;28035:5;28024:16;;27969:77;;;:::o;28052:79::-;28091:7;28120:5;28109:16;;28052:79;;;:::o;28137:157::-;28242:45;28262:24;28280:5;28262:24;:::i;:::-;28242:45;:::i;:::-;28237:3;28230:58;28137:157;;:::o;28300:416::-;28460:3;28482:95;28573:3;28564:6;28482:95;:::i;:::-;28475:102;;28587:75;28658:3;28649:6;28587:75;:::i;:::-;28687:2;28682:3;28678:12;28671:19;;28707:3;28700:10;;28300:416;;;;;:::o;28722:180::-;28770:77;28767:1;28760:88;28867:4;28864:1;28857:15;28891:4;28888:1;28881:15;28908:228;29048:34;29044:1;29036:6;29032:14;29025:58;29117:11;29112:2;29104:6;29100:15;29093:36;28908:228;:::o;29142:366::-;29284:3;29305:67;29369:2;29364:3;29305:67;:::i;:::-;29298:74;;29381:93;29470:3;29381:93;:::i;:::-;29499:2;29494:3;29490:12;29483:19;;29142:366;;;:::o;29514:419::-;29680:4;29718:2;29707:9;29703:18;29695:26;;29767:9;29761:4;29757:20;29753:1;29742:9;29738:17;29731:47;29795:131;29921:4;29795:131;:::i;:::-;29787:139;;29514:419;;;:::o;29939:180::-;29987:77;29984:1;29977:88;30084:4;30081:1;30074:15;30108:4;30105:1;30098:15;30125:233;30164:3;30187:24;30205:5;30187:24;:::i;:::-;30178:33;;30233:66;30226:5;30223:77;30220:103;;30303:18;;:::i;:::-;30220:103;30350:1;30343:5;30339:13;30332:20;;30125:233;;;:::o;30364:141::-;30413:4;30436:3;30428:11;;30459:3;30456:1;30449:14;30493:4;30490:1;30480:18;30472:26;;30364:141;;;:::o;30511:93::-;30548:6;30595:2;30590;30583:5;30579:14;30575:23;30565:33;;30511:93;;;:::o;30610:107::-;30654:8;30704:5;30698:4;30694:16;30673:37;;30610:107;;;;:::o;30723:393::-;30792:6;30842:1;30830:10;30826:18;30865:97;30895:66;30884:9;30865:97;:::i;:::-;30983:39;31013:8;31002:9;30983:39;:::i;:::-;30971:51;;31055:4;31051:9;31044:5;31040:21;31031:30;;31104:4;31094:8;31090:19;31083:5;31080:30;31070:40;;30799:317;;30723:393;;;;;:::o;31122:60::-;31150:3;31171:5;31164:12;;31122:60;;;:::o;31188:142::-;31238:9;31271:53;31289:34;31298:24;31316:5;31298:24;:::i;:::-;31289:34;:::i;:::-;31271:53;:::i;:::-;31258:66;;31188:142;;;:::o;31336:75::-;31379:3;31400:5;31393:12;;31336:75;;;:::o;31417:269::-;31527:39;31558:7;31527:39;:::i;:::-;31588:91;31637:41;31661:16;31637:41;:::i;:::-;31629:6;31622:4;31616:11;31588:91;:::i;:::-;31582:4;31575:105;31493:193;31417:269;;;:::o;31692:73::-;31737:3;31692:73;:::o;31771:189::-;31848:32;;:::i;:::-;31889:65;31947:6;31939;31933:4;31889:65;:::i;:::-;31824:136;31771:189;;:::o;31966:186::-;32026:120;32043:3;32036:5;32033:14;32026:120;;;32097:39;32134:1;32127:5;32097:39;:::i;:::-;32070:1;32063:5;32059:13;32050:22;;32026:120;;;31966:186;;:::o;32158:543::-;32259:2;32254:3;32251:11;32248:446;;;32293:38;32325:5;32293:38;:::i;:::-;32377:29;32395:10;32377:29;:::i;:::-;32367:8;32363:44;32560:2;32548:10;32545:18;32542:49;;;32581:8;32566:23;;32542:49;32604:80;32660:22;32678:3;32660:22;:::i;:::-;32650:8;32646:37;32633:11;32604:80;:::i;:::-;32263:431;;32248:446;32158:543;;;:::o;32707:117::-;32761:8;32811:5;32805:4;32801:16;32780:37;;32707:117;;;;:::o;32830:169::-;32874:6;32907:51;32955:1;32951:6;32943:5;32940:1;32936:13;32907:51;:::i;:::-;32903:56;32988:4;32982;32978:15;32968:25;;32881:118;32830:169;;;;:::o;33004:295::-;33080:4;33226:29;33251:3;33245:4;33226:29;:::i;:::-;33218:37;;33288:3;33285:1;33281:11;33275:4;33272:21;33264:29;;33004:295;;;;:::o;33304:1395::-;33421:37;33454:3;33421:37;:::i;:::-;33523:18;33515:6;33512:30;33509:56;;;33545:18;;:::i;:::-;33509:56;33589:38;33621:4;33615:11;33589:38;:::i;:::-;33674:67;33734:6;33726;33720:4;33674:67;:::i;:::-;33768:1;33792:4;33779:17;;33824:2;33816:6;33813:14;33841:1;33836:618;;;;34498:1;34515:6;34512:77;;;34564:9;34559:3;34555:19;34549:26;34540:35;;34512:77;34615:67;34675:6;34668:5;34615:67;:::i;:::-;34609:4;34602:81;34471:222;33806:887;;33836:618;33888:4;33884:9;33876:6;33872:22;33922:37;33954:4;33922:37;:::i;:::-;33981:1;33995:208;34009:7;34006:1;34003:14;33995:208;;;34088:9;34083:3;34079:19;34073:26;34065:6;34058:42;34139:1;34131:6;34127:14;34117:24;;34186:2;34175:9;34171:18;34158:31;;34032:4;34029:1;34025:12;34020:17;;33995:208;;;34231:6;34222:7;34219:19;34216:179;;;34289:9;34284:3;34280:19;34274:26;34332:48;34374:4;34366:6;34362:17;34351:9;34332:48;:::i;:::-;34324:6;34317:64;34239:156;34216:179;34441:1;34437;34429:6;34425:14;34421:22;34415:4;34408:36;33843:611;;;33806:887;;33396:1303;;;33304:1395;;:::o;34705:233::-;34845:34;34841:1;34833:6;34829:14;34822:58;34914:16;34909:2;34901:6;34897:15;34890:41;34705:233;:::o;34944:366::-;35086:3;35107:67;35171:2;35166:3;35107:67;:::i;:::-;35100:74;;35183:93;35272:3;35183:93;:::i;:::-;35301:2;35296:3;35292:12;35285:19;;34944:366;;;:::o;35316:419::-;35482:4;35520:2;35509:9;35505:18;35497:26;;35569:9;35563:4;35559:20;35555:1;35544:9;35540:17;35533:47;35597:131;35723:4;35597:131;:::i;:::-;35589:139;;35316:419;;;:::o;35741:98::-;35792:6;35826:5;35820:12;35810:22;;35741:98;;;:::o;35845:116::-;35896:4;35919:3;35911:11;;35949:4;35944:3;35940:14;35932:22;;35845:116;;;:::o;35967:154::-;36010:11;36046:29;36070:3;36064:10;36046:29;:::i;:::-;36109:5;36085:29;;36022:99;35967:154;;;:::o;36127:594::-;36211:5;36242:38;36274:5;36242:38;:::i;:::-;36305:5;36332:40;36366:5;36332:40;:::i;:::-;36320:52;;36391:35;36417:8;36391:35;:::i;:::-;36382:44;;36450:2;36442:6;36439:14;36436:278;;;36521:169;36606:66;36576:6;36572:2;36568:15;36565:1;36561:23;36521:169;:::i;:::-;36498:5;36477:227;36468:236;;36436:278;36217:504;;36127:594;;;:::o;36727:171::-;36867:23;36863:1;36855:6;36851:14;36844:47;36727:171;:::o;36904:366::-;37046:3;37067:67;37131:2;37126:3;37067:67;:::i;:::-;37060:74;;37143:93;37232:3;37143:93;:::i;:::-;37261:2;37256:3;37252:12;37245:19;;36904:366;;;:::o;37276:419::-;37442:4;37480:2;37469:9;37465:18;37457:26;;37529:9;37523:4;37519:20;37515:1;37504:9;37500:17;37493:47;37557:131;37683:4;37557:131;:::i;:::-;37549:139;;37276:419;;;:::o;37701:177::-;37841:29;37837:1;37829:6;37825:14;37818:53;37701:177;:::o;37884:366::-;38026:3;38047:67;38111:2;38106:3;38047:67;:::i;:::-;38040:74;;38123:93;38212:3;38123:93;:::i;:::-;38241:2;38236:3;38232:12;38225:19;;37884:366;;;:::o;38256:419::-;38422:4;38460:2;38449:9;38445:18;38437:26;;38509:9;38503:4;38499:20;38495:1;38484:9;38480:17;38473:47;38537:131;38663:4;38537:131;:::i;:::-;38529:139;;38256:419;;;:::o;38681:177::-;38821:29;38817:1;38809:6;38805:14;38798:53;38681:177;:::o;38864:366::-;39006:3;39027:67;39091:2;39086:3;39027:67;:::i;:::-;39020:74;;39103:93;39192:3;39103:93;:::i;:::-;39221:2;39216:3;39212:12;39205:19;;38864:366;;;:::o;39236:419::-;39402:4;39440:2;39429:9;39425:18;39417:26;;39489:9;39483:4;39479:20;39475:1;39464:9;39460:17;39453:47;39517:131;39643:4;39517:131;:::i;:::-;39509:139;;39236:419;;;:::o;39661:194::-;39701:4;39721:20;39739:1;39721:20;:::i;:::-;39716:25;;39755:20;39773:1;39755:20;:::i;:::-;39750:25;;39799:1;39796;39792:9;39784:17;;39823:1;39817:4;39814:11;39811:37;;;39828:18;;:::i;:::-;39811:37;39661:194;;;;:::o;39861:225::-;40001:34;39997:1;39989:6;39985:14;39978:58;40070:8;40065:2;40057:6;40053:15;40046:33;39861:225;:::o;40092:366::-;40234:3;40255:67;40319:2;40314:3;40255:67;:::i;:::-;40248:74;;40331:93;40420:3;40331:93;:::i;:::-;40449:2;40444:3;40440:12;40433:19;;40092:366;;;:::o;40464:419::-;40630:4;40668:2;40657:9;40653:18;40645:26;;40717:9;40711:4;40707:20;40703:1;40692:9;40688:17;40681:47;40745:131;40871:4;40745:131;:::i;:::-;40737:139;;40464:419;;;:::o;40889:233::-;41029:34;41025:1;41017:6;41013:14;41006:58;41098:16;41093:2;41085:6;41081:15;41074:41;40889:233;:::o;41128:366::-;41270:3;41291:67;41355:2;41350:3;41291:67;:::i;:::-;41284:74;;41367:93;41456:3;41367:93;:::i;:::-;41485:2;41480:3;41476:12;41469:19;;41128:366;;;:::o;41500:419::-;41666:4;41704:2;41693:9;41689:18;41681:26;;41753:9;41747:4;41743:20;41739:1;41728:9;41724:17;41717:47;41781:131;41907:4;41781:131;:::i;:::-;41773:139;;41500:419;;;:::o;41925:182::-;42065:34;42061:1;42053:6;42049:14;42042:58;41925:182;:::o;42113:366::-;42255:3;42276:67;42340:2;42335:3;42276:67;:::i;:::-;42269:74;;42352:93;42441:3;42352:93;:::i;:::-;42470:2;42465:3;42461:12;42454:19;;42113:366;;;:::o;42485:419::-;42651:4;42689:2;42678:9;42674:18;42666:26;;42738:9;42732:4;42728:20;42724:1;42713:9;42709:17;42702:47;42766:131;42892:4;42766:131;:::i;:::-;42758:139;;42485:419;;;:::o;42910:220::-;43050:34;43046:1;43038:6;43034:14;43027:58;43119:3;43114:2;43106:6;43102:15;43095:28;42910:220;:::o;43136:366::-;43278:3;43299:67;43363:2;43358:3;43299:67;:::i;:::-;43292:74;;43375:93;43464:3;43375:93;:::i;:::-;43493:2;43488:3;43484:12;43477:19;;43136:366;;;:::o;43508:419::-;43674:4;43712:2;43701:9;43697:18;43689:26;;43761:9;43755:4;43751:20;43747:1;43736:9;43732:17;43725:47;43789:131;43915:4;43789:131;:::i;:::-;43781:139;;43508:419;;;:::o;43933:191::-;43973:3;43992:20;44010:1;43992:20;:::i;:::-;43987:25;;44026:20;44044:1;44026:20;:::i;:::-;44021:25;;44069:1;44066;44062:9;44055:16;;44090:3;44087:1;44084:10;44081:36;;;44097:18;;:::i;:::-;44081:36;43933:191;;;;:::o;44130:332::-;44251:4;44289:2;44278:9;44274:18;44266:26;;44302:71;44370:1;44359:9;44355:17;44346:6;44302:71;:::i;:::-;44383:72;44451:2;44440:9;44436:18;44427:6;44383:72;:::i;:::-;44130:332;;;;;:::o;44468:227::-;44608:34;44604:1;44596:6;44592:14;44585:58;44677:10;44672:2;44664:6;44660:15;44653:35;44468:227;:::o;44701:366::-;44843:3;44864:67;44928:2;44923:3;44864:67;:::i;:::-;44857:74;;44940:93;45029:3;44940:93;:::i;:::-;45058:2;45053:3;45049:12;45042:19;;44701:366;;;:::o;45073:419::-;45239:4;45277:2;45266:9;45262:18;45254:26;;45326:9;45320:4;45316:20;45312:1;45301:9;45297:17;45290:47;45354:131;45480:4;45354:131;:::i;:::-;45346:139;;45073:419;;;:::o;45498:634::-;45719:4;45757:2;45746:9;45742:18;45734:26;;45806:9;45800:4;45796:20;45792:1;45781:9;45777:17;45770:47;45834:108;45937:4;45928:6;45834:108;:::i;:::-;45826:116;;45989:9;45983:4;45979:20;45974:2;45963:9;45959:18;45952:48;46017:108;46120:4;46111:6;46017:108;:::i;:::-;46009:116;;45498:634;;;;;:::o;46138:222::-;46278:34;46274:1;46266:6;46262:14;46255:58;46347:5;46342:2;46334:6;46330:15;46323:30;46138:222;:::o;46366:366::-;46508:3;46529:67;46593:2;46588:3;46529:67;:::i;:::-;46522:74;;46605:93;46694:3;46605:93;:::i;:::-;46723:2;46718:3;46714:12;46707:19;;46366:366;;;:::o;46738:419::-;46904:4;46942:2;46931:9;46927:18;46919:26;;46991:9;46985:4;46981:20;46977:1;46966:9;46962:17;46955:47;47019:131;47145:4;47019:131;:::i;:::-;47011:139;;46738:419;;;:::o;47163:223::-;47303:34;47299:1;47291:6;47287:14;47280:58;47372:6;47367:2;47359:6;47355:15;47348:31;47163:223;:::o;47392:366::-;47534:3;47555:67;47619:2;47614:3;47555:67;:::i;:::-;47548:74;;47631:93;47720:3;47631:93;:::i;:::-;47749:2;47744:3;47740:12;47733:19;;47392:366;;;:::o;47764:419::-;47930:4;47968:2;47957:9;47953:18;47945:26;;48017:9;48011:4;48007:20;48003:1;47992:9;47988:17;47981:47;48045:131;48171:4;48045:131;:::i;:::-;48037:139;;47764:419;;;:::o;48189:228::-;48329:34;48325:1;48317:6;48313:14;48306:58;48398:11;48393:2;48385:6;48381:15;48374:36;48189:228;:::o;48423:366::-;48565:3;48586:67;48650:2;48645:3;48586:67;:::i;:::-;48579:74;;48662:93;48751:3;48662:93;:::i;:::-;48780:2;48775:3;48771:12;48764:19;;48423:366;;;:::o;48795:419::-;48961:4;48999:2;48988:9;48984:18;48976:26;;49048:9;49042:4;49038:20;49034:1;49023:9;49019:17;49012:47;49076:131;49202:4;49076:131;:::i;:::-;49068:139;;48795:419;;;:::o;49220:224::-;49360:34;49356:1;49348:6;49344:14;49337:58;49429:7;49424:2;49416:6;49412:15;49405:32;49220:224;:::o;49450:366::-;49592:3;49613:67;49677:2;49672:3;49613:67;:::i;:::-;49606:74;;49689:93;49778:3;49689:93;:::i;:::-;49807:2;49802:3;49798:12;49791:19;;49450:366;;;:::o;49822:419::-;49988:4;50026:2;50015:9;50011:18;50003:26;;50075:9;50069:4;50065:20;50061:1;50050:9;50046:17;50039:47;50103:131;50229:4;50103:131;:::i;:::-;50095:139;;49822:419;;;:::o;50247:229::-;50387:34;50383:1;50375:6;50371:14;50364:58;50456:12;50451:2;50443:6;50439:15;50432:37;50247:229;:::o;50482:366::-;50624:3;50645:67;50709:2;50704:3;50645:67;:::i;:::-;50638:74;;50721:93;50810:3;50721:93;:::i;:::-;50839:2;50834:3;50830:12;50823:19;;50482:366;;;:::o;50854:419::-;51020:4;51058:2;51047:9;51043:18;51035:26;;51107:9;51101:4;51097:20;51093:1;51082:9;51078:17;51071:47;51135:131;51261:4;51135:131;:::i;:::-;51127:139;;50854:419;;;:::o;51279:170::-;51419:22;51415:1;51407:6;51403:14;51396:46;51279:170;:::o;51455:366::-;51597:3;51618:67;51682:2;51677:3;51618:67;:::i;:::-;51611:74;;51694:93;51783:3;51694:93;:::i;:::-;51812:2;51807:3;51803:12;51796:19;;51455:366;;;:::o;51827:419::-;51993:4;52031:2;52020:9;52016:18;52008:26;;52080:9;52074:4;52070:20;52066:1;52055:9;52051:17;52044:47;52108:131;52234:4;52108:131;:::i;:::-;52100:139;;51827:419;;;:::o;52252:295::-;52392:34;52388:1;52380:6;52376:14;52369:58;52461:34;52456:2;52448:6;52444:15;52437:59;52530:9;52525:2;52517:6;52513:15;52506:34;52252:295;:::o;52553:366::-;52695:3;52716:67;52780:2;52775:3;52716:67;:::i;:::-;52709:74;;52792:93;52881:3;52792:93;:::i;:::-;52910:2;52905:3;52901:12;52894:19;;52553:366;;;:::o;52925:419::-;53091:4;53129:2;53118:9;53114:18;53106:26;;53178:9;53172:4;53168:20;53164:1;53153:9;53149:17;53142:47;53206:131;53332:4;53206:131;:::i;:::-;53198:139;;52925:419;;;:::o;53350:239::-;53490:34;53486:1;53478:6;53474:14;53467:58;53559:22;53554:2;53546:6;53542:15;53535:47;53350:239;:::o;53595:366::-;53737:3;53758:67;53822:2;53817:3;53758:67;:::i;:::-;53751:74;;53834:93;53923:3;53834:93;:::i;:::-;53952:2;53947:3;53943:12;53936:19;;53595:366;;;:::o;53967:419::-;54133:4;54171:2;54160:9;54156:18;54148:26;;54220:9;54214:4;54210:20;54206:1;54195:9;54191:17;54184:47;54248:131;54374:4;54248:131;:::i;:::-;54240:139;;53967:419;;;:::o;54392:168::-;54475:11;54509:6;54504:3;54497:19;54549:4;54544:3;54540:14;54525:29;;54392:168;;;;:::o;54566:373::-;54652:3;54680:38;54712:5;54680:38;:::i;:::-;54734:70;54797:6;54792:3;54734:70;:::i;:::-;54727:77;;54813:65;54871:6;54866:3;54859:4;54852:5;54848:16;54813:65;:::i;:::-;54903:29;54925:6;54903:29;:::i;:::-;54898:3;54894:39;54887:46;;54656:283;54566:373;;;;:::o;54945:751::-;55168:4;55206:3;55195:9;55191:19;55183:27;;55220:71;55288:1;55277:9;55273:17;55264:6;55220:71;:::i;:::-;55301:72;55369:2;55358:9;55354:18;55345:6;55301:72;:::i;:::-;55383;55451:2;55440:9;55436:18;55427:6;55383:72;:::i;:::-;55465;55533:2;55522:9;55518:18;55509:6;55465:72;:::i;:::-;55585:9;55579:4;55575:20;55569:3;55558:9;55554:19;55547:49;55613:76;55684:4;55675:6;55613:76;:::i;:::-;55605:84;;54945:751;;;;;;;;:::o;55702:141::-;55758:5;55789:6;55783:13;55774:22;;55805:32;55831:5;55805:32;:::i;:::-;55702:141;;;;:::o;55849:349::-;55918:6;55967:2;55955:9;55946:7;55942:23;55938:32;55935:119;;;55973:79;;:::i;:::-;55935:119;56093:1;56118:63;56173:7;56164:6;56153:9;56149:22;56118:63;:::i;:::-;56108:73;;56064:127;55849:349;;;;:::o;56204:106::-;56248:8;56297:5;56292:3;56288:15;56267:36;;56204:106;;;:::o;56316:183::-;56351:3;56389:1;56371:16;56368:23;56365:128;;;56427:1;56424;56421;56406:23;56449:34;56480:1;56474:8;56449:34;:::i;:::-;56442:41;;56365:128;56316:183;:::o;56505:711::-;56544:3;56582:4;56564:16;56561:26;56590:5;56558:39;56619:20;;:::i;:::-;56694:1;56676:16;56672:24;56669:1;56663:4;56648:49;56727:4;56721:11;56826:16;56819:4;56811:6;56807:17;56804:39;56771:18;56763:6;56760:30;56744:113;56741:146;;;56872:5;;;;56741:146;56918:6;56912:4;56908:17;56954:3;56948:10;56981:18;56973:6;56970:30;56967:43;;;57003:5;;;;;;56967:43;57051:6;57044:4;57039:3;57035:14;57031:27;57110:1;57092:16;57088:24;57082:4;57078:35;57073:3;57070:44;57067:57;;;57117:5;;;;;;;57067:57;57134;57182:6;57176:4;57172:17;57164:6;57160:30;57154:4;57134:57;:::i;:::-;57207:3;57200:10;;56548:668;;;;;56505:711;;:::o;57222:239::-;57362:34;57358:1;57350:6;57346:14;57339:58;57431:22;57426:2;57418:6;57414:15;57407:47;57222:239;:::o;57467:366::-;57609:3;57630:67;57694:2;57689:3;57630:67;:::i;:::-;57623:74;;57706:93;57795:3;57706:93;:::i;:::-;57824:2;57819:3;57815:12;57808:19;;57467:366;;;:::o;57839:419::-;58005:4;58043:2;58032:9;58028:18;58020:26;;58092:9;58086:4;58082:20;58078:1;58067:9;58063:17;58056:47;58120:131;58246:4;58120:131;:::i;:::-;58112:139;;57839:419;;;:::o;58264:227::-;58404:34;58400:1;58392:6;58388:14;58381:58;58473:10;58468:2;58460:6;58456:15;58449:35;58264:227;:::o;58497:366::-;58639:3;58660:67;58724:2;58719:3;58660:67;:::i;:::-;58653:74;;58736:93;58825:3;58736:93;:::i;:::-;58854:2;58849:3;58845:12;58838:19;;58497:366;;;:::o;58869:419::-;59035:4;59073:2;59062:9;59058:18;59050:26;;59122:9;59116:4;59112:20;59108:1;59097:9;59093:17;59086:47;59150:131;59276:4;59150:131;:::i;:::-;59142:139;;58869:419;;;:::o;59294:1053::-;59617:4;59655:3;59644:9;59640:19;59632:27;;59669:71;59737:1;59726:9;59722:17;59713:6;59669:71;:::i;:::-;59750:72;59818:2;59807:9;59803:18;59794:6;59750:72;:::i;:::-;59869:9;59863:4;59859:20;59854:2;59843:9;59839:18;59832:48;59897:108;60000:4;59991:6;59897:108;:::i;:::-;59889:116;;60052:9;60046:4;60042:20;60037:2;60026:9;60022:18;60015:48;60080:108;60183:4;60174:6;60080:108;:::i;:::-;60072:116;;60236:9;60230:4;60226:20;60220:3;60209:9;60205:19;60198:49;60264:76;60335:4;60326:6;60264:76;:::i;:::-;60256:84;;59294:1053;;;;;;;;:::o;60353:166::-;60493:18;60489:1;60481:6;60477:14;60470:42;60353:166;:::o;60525:366::-;60667:3;60688:67;60752:2;60747:3;60688:67;:::i;:::-;60681:74;;60764:93;60853:3;60764:93;:::i;:::-;60882:2;60877:3;60873:12;60866:19;;60525:366;;;:::o;60897:419::-;61063:4;61101:2;61090:9;61086:18;61078:26;;61150:9;61144:4;61140:20;61136:1;61125:9;61121:17;61114:47;61178:131;61304:4;61178:131;:::i;:::-;61170:139;;60897:419;;;:::o;61322:227::-;61462:34;61458:1;61450:6;61446:14;61439:58;61531:10;61526:2;61518:6;61514:15;61507:35;61322:227;:::o;61555:366::-;61697:3;61718:67;61782:2;61777:3;61718:67;:::i;:::-;61711:74;;61794:93;61883:3;61794:93;:::i;:::-;61912:2;61907:3;61903:12;61896:19;;61555:366;;;:::o;61927:419::-;62093:4;62131:2;62120:9;62116:18;62108:26;;62180:9;62174:4;62170:20;62166:1;62155:9;62151:17;62144:47;62208:131;62334:4;62208:131;:::i;:::-;62200:139;;61927:419;;;:::o

Swarm Source

ipfs://0bb34b9c1272dddb1794407233d915ebb6f10cd658ecfd20d710c17fec4cf1ae
Loading