ETH Price: $2,720.09 (-1.64%)

Token

Chic-A-Dees (CHIC)
 

Overview

Max Total Supply

706 CHIC

Holders

178

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
0x727ead3816d36727f813bca4420a0484f9682520
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
ChicADees

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-09-07
*/

pragma solidity ^0.8.0;

/**
* The Chic-A-Dees contract was deployed by Ownerfy Inc. of Ownerfy.com
* Visit Ownerfy.com for exclusive NFT drops or inquiries for your project.
*
* This contract is not a proxy.
* This contract is not pausable.
* This contract is not lockable.
* This contract cannot be rug pulled.
* The URIs are not changeable after mint.
* This contract uses IPFS
* This contract puts SHA256 media hash into the Update event for permanent on-chain documentation
* The NFT Owners and only the NFT Owners have complete control over their NFTs
*/

// From base:
// https://docs.openzeppelin.com/contracts/4.x/erc1155

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

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

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

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

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

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

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

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

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

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

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



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



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



/**
 * @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
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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



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



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

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

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

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

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

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

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

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

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

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

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

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

        return batchBalances;
    }

    /**
     * @dev See {IERC1155-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(_msgSender() != operator, "ERC1155: setting approval status for self");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
                if (response != IERC1155Receiver(to).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(to).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;
    }
}



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

        _burn(account, id, value);
    }

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

        _burnBatch(account, ids, values);
    }
}







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

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

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

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

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

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

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

    function grantRole(bytes32 role, address account) external;

    function revokeRole(bytes32 role, address account) external;

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

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

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

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

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

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

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

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

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

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

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

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

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

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

        _revokeRole(role, account);
    }

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

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

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

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



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

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

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

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

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

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

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

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

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

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

            return true;
        } else {
            return false;
        }
    }

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

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

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

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

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

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

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

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

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

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

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

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

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

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

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

    // UintSet

    struct UintSet {
        Set _inner;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}



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

contract ChicADees is Context, AccessControlEnumerable, ERC1155Burnable {

  using SafeMath for uint256;
  using Counters for Counters.Counter;

  Counters.Counter private _tokenIdTracker;

  string public constant name = 'Chic-A-Dees';
  string public constant symbol = 'CHIC';
  bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");
  uint256 public constant MAX_ELEMENTS = 11111;
  address public constant creatorAddress = 0x6c474099ad6d9Af49201a38b9842111d4ACd10BC;

  event Update(string _value, uint256 indexed _id);

  // CIDs
    mapping (uint256 => string) public cids;

    /**
     * @dev Grants `DEFAULT_ADMIN_ROLE`, `MINTER_ROLE`, and `AUDITOR_ROL` to the account that
     * deploys the contract.
     */
    constructor(string memory _uri) ERC1155(_uri) {
        _setupRole(DEFAULT_ADMIN_ROLE, _msgSender());
        _setupRole(MINTER_ROLE, _msgSender());
    }

    function _totalSupply() internal view returns (uint) {
        return _tokenIdTracker.current();
    }

    /**
     * @dev Creates `amount` new tokens for `to`, of token type `id`.
     *
     * See {ERC1155-_mint}.
     *
     * Requirements:
     *
     * - the caller must have the `MINTER_ROLE`.
     */
    function mint(address to, uint256 id, uint256 amount, bytes memory data, string calldata _update, string calldata cid) public virtual {

        uint256 total = _totalSupply();
        require(total + 1 <= MAX_ELEMENTS, "Max limit");
        require(total <= MAX_ELEMENTS, "Sale end");
        require(hasRole(MINTER_ROLE, _msgSender()), "Ownerfy: must have minter role to mint");

        if (bytes(_update).length > 0) {
          emit Update(_update, id);
        }

        _tokenIdTracker.increment();

        cids[id] = cid;

        _mint(to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] variant of {mint}.
     */
    function mintBatch(address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data, string[] calldata updates, string[] calldata _cids) public virtual {

        uint256 total = _totalSupply();
        require(total + ids.length <= MAX_ELEMENTS, "Max limit");
        require(total <= MAX_ELEMENTS, "Sale end");
        require(hasRole(MINTER_ROLE, _msgSender()), "Ownerfy: must have minter role to mint");

        _mintBatch(to, ids, amounts, data);

        for (uint i = 0; i < ids.length; i++) {
          _tokenIdTracker.increment();

          if (bytes(_cids[i]).length > 0) {
            cids[ids[i]] = _cids[i];
          }
          if (bytes(updates[i]).length > 0) {
            emit Update(updates[i], ids[i]);
          }
        }
    }

    function uri(uint256 _id) public view virtual override returns (string memory) {
        return string(abi.encodePacked('https://gateway.pinata.cloud/ipfs/', cids[_id]));
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(AccessControlEnumerable, ERC1155) returns (bool) {
        return super.supportsInterface(interfaceId);
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_value","type":"string"},{"indexed":true,"internalType":"uint256","name":"_id","type":"uint256"}],"name":"Update","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_ELEMENTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"cids","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"creatorAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"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":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"string","name":"_update","type":"string"},{"internalType":"string","name":"cid","type":"string"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"string[]","name":"updates","type":"string[]"},{"internalType":"string[]","name":"_cids","type":"string[]"}],"name":"mintBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b506040516200578d3803806200578d83398181016040528101906200003791906200048a565b806200004981620000b660201b60201c565b506200006e6000801b62000062620000d260201b60201c565b620000da60201b60201c565b620000af7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6620000a3620000d260201b60201c565b620000da60201b60201c565b5062000600565b8060049080519060200190620000ce92919062000368565b5050565b600033905090565b620000f182826200012260201b620014751760201c565b6200011d81600160008581526020019081526020016000206200013860201b620014831790919060201c565b505050565b6200013482826200017060201b60201c565b5050565b600062000168836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6200026160201b60201c565b905092915050565b620001828282620002db60201b60201c565b6200025d57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555062000202620000d260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006200027583836200034560201b60201c565b620002d0578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050620002d5565b600090505b92915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b82805462000376906200056c565b90600052602060002090601f0160209004810192826200039a5760008555620003e6565b82601f10620003b557805160ff1916838001178555620003e6565b82800160010185558215620003e6579182015b82811115620003e5578251825591602001919060010190620003c8565b5b509050620003f59190620003f9565b5090565b5b8082111562000414576000816000905550600101620003fa565b5090565b60006200042f620004298462000503565b620004cf565b9050828152602081018484840111156200044857600080fd5b6200045584828562000536565b509392505050565b600082601f8301126200046f57600080fd5b81516200048184826020860162000418565b91505092915050565b6000602082840312156200049d57600080fd5b600082015167ffffffffffffffff811115620004b857600080fd5b620004c6848285016200045d565b91505092915050565b6000604051905081810181811067ffffffffffffffff82111715620004f957620004f8620005d1565b5b8060405250919050565b600067ffffffffffffffff821115620005215762000520620005d1565b5b601f19601f8301169050602081019050919050565b60005b838110156200055657808201518184015260208101905062000539565b8381111562000566576000848401525b50505050565b600060028204905060018216806200058557607f821691505b602082108114156200059c576200059b620005a2565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61517d80620006106000396000f3fe608060405234801561001057600080fd5b506004361061018d5760003560e01c80639010d07c116100de578063d539139311610097578063e927fc5c11610071578063e927fc5c146104b8578063e985e9c5146104d6578063f242432a14610506578063f5298aca146105225761018d565b8063d539139314610462578063d547741f14610480578063d5e8e3531461049c5761018d565b80639010d07c1461037a57806391d14854146103aa57806395d89b41146103da578063a217fddf146103f8578063a22cb46514610416578063ca15c873146104325761018d565b80632f2ff15d1161014b5780634e1273f4116101255780634e1273f4146102e2578063571b76f5146103125780636b20c4541461032e578063704fe7101461034a5761018d565b80632f2ff15d1461028c5780633502a716146102a857806336568abe146102c65761018d565b8062fdd58e1461019257806301ffc9a7146101c257806306fdde03146101f25780630e89341c14610210578063248a9ca3146102405780632eb2c2d614610270575b600080fd5b6101ac60048036038101906101a79190613a59565b61053e565b6040516101b99190614b45565b60405180910390f35b6101dc60048036038101906101d79190613ccc565b610608565b6040516101e99190614889565b60405180910390f35b6101fa61061a565b60405161020791906148e3565b60405180910390f35b61022a60048036038101906102259190613d1e565b610653565b60405161023791906148e3565b60405180910390f35b61025a60048036038101906102559190613c2b565b61068e565b60405161026791906148a4565b60405180910390f35b61028a60048036038101906102859190613745565b6106ad565b005b6102a660048036038101906102a19190613c54565b61074e565b005b6102b0610782565b6040516102bd9190614b45565b60405180910390f35b6102e060048036038101906102db9190613c54565b610788565b005b6102fc60048036038101906102f79190613bbf565b6107bc565b6040516103099190614830565b60405180910390f35b61032c60048036038101906103279190613912565b61096d565b005b61034860048036038101906103439190613893565b610cdb565b005b610364600480360381019061035f9190613d1e565b610d78565b60405161037191906148e3565b60405180910390f35b610394600480360381019061038f9190613c90565b610e18565b6040516103a19190614753565b60405180910390f35b6103c460048036038101906103bf9190613c54565b610e47565b6040516103d19190614889565b60405180910390f35b6103e2610eb1565b6040516103ef91906148e3565b60405180910390f35b610400610eea565b60405161040d91906148a4565b60405180910390f35b610430600480360381019061042b9190613a1d565b610ef1565b005b61044c60048036038101906104479190613c2b565b611072565b6040516104599190614b45565b60405180910390f35b61046a611096565b60405161047791906148a4565b60405180910390f35b61049a60048036038101906104959190613c54565b6110ba565b005b6104b660048036038101906104b19190613ae4565b6110ee565b005b6104c061128b565b6040516104cd9190614753565b60405180910390f35b6104f060048036038101906104eb9190613709565b6112a3565b6040516104fd9190614889565b60405180910390f35b610520600480360381019061051b9190613804565b611337565b005b61053c60048036038101906105379190613a95565b6113d8565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156105af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105a690614965565b60405180910390fd5b6002600083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000610613826114b3565b9050919050565b6040518060400160405280600b81526020017f436869632d412d4465657300000000000000000000000000000000000000000081525081565b60606006600083815260200190815260200160002060405160200161067891906146f7565b6040516020818303038152906040529050919050565b6000806000838152602001908152602001600020600101549050919050565b6106b5611595565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806106fb57506106fa856106f5611595565b6112a3565b5b61073a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073190614a05565b60405180910390fd5b610747858585858561159d565b5050505050565b6107588282611900565b61077d816001600085815260200190815260200160002061148390919063ffffffff16565b505050565b612b6781565b6107928282611929565b6107b781600160008581526020019081526020016000206119ac90919063ffffffff16565b505050565b60608151835114610802576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f990614ac5565b60405180910390fd5b6000835167ffffffffffffffff811115610845577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156108735781602001602082028036833780820191505090505b50905060005b84518110156109625761090c8582815181106108be577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101518583815181106108ff577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015161053e565b828281518110610945577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508061095b90614f2a565b9050610879565b508091505092915050565b60006109776119dc565b9050612b678851826109899190614d2a565b11156109ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c1906149c5565b60405180910390fd5b612b67811115610a0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0690614a45565b60405180910390fd5b610a407f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610a3b611595565b610e47565b610a7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7690614a85565b60405180910390fd5b610a8b898989896119ed565b60005b8851811015610ccf57610aa16005611c58565b6000848483818110610adc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002810190610aee9190614b89565b90501115610ba357838382818110610b2f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002810190610b419190614b89565b600660008c8581518110610b7e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015181526020019081526020016000209190610ba19291906133c0565b505b6000868683818110610bde577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002810190610bf09190614b89565b90501115610cbc57888181518110610c31577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101517f68569b533bfdeb53ee0f87318e7aa1ad56335f80086c45dfaa733c24fa43ea7b878784818110610c93577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002810190610ca59190614b89565b604051610cb39291906148bf565b60405180910390a25b8080610cc790614f2a565b915050610a8e565b50505050505050505050565b610ce3611595565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480610d295750610d2883610d23611595565b6112a3565b5b610d68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5f906149a5565b60405180910390fd5b610d73838383611c6e565b505050565b60066020528060005260406000206000915090508054610d9790614ef8565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc390614ef8565b8015610e105780601f10610de557610100808354040283529160200191610e10565b820191906000526020600020905b815481529060010190602001808311610df357829003601f168201915b505050505081565b6000610e3f8260016000868152602001908152602001600020611f6d90919063ffffffff16565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6040518060400160405280600481526020017f434849430000000000000000000000000000000000000000000000000000000081525081565b6000801b81565b8173ffffffffffffffffffffffffffffffffffffffff16610f10611595565b73ffffffffffffffffffffffffffffffffffffffff161415610f67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5e90614aa5565b60405180910390fd5b8060036000610f74611595565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611021611595565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516110669190614889565b60405180910390a35050565b600061108f60016000848152602001908152602001600020611f87565b9050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b6110c48282611f9c565b6110e981600160008581526020019081526020016000206119ac90919063ffffffff16565b505050565b60006110f86119dc565b9050612b6760018261110a9190614d2a565b111561114b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611142906149c5565b60405180910390fd5b612b67811115611190576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118790614a45565b60405180910390fd5b6111c17f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66111bc611595565b610e47565b611200576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f790614a85565b60405180910390fd5b600085859050111561124757877f68569b533bfdeb53ee0f87318e7aa1ad56335f80086c45dfaa733c24fa43ea7b868660405161123e9291906148bf565b60405180910390a25b6112516005611c58565b8282600660008b815260200190815260200160002091906112739291906133c0565b5061128089898989611fc5565b505050505050505050565b736c474099ad6d9af49201a38b9842111d4acd10bc81565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61133f611595565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061138557506113848561137f611595565b6112a3565b5b6113c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bb906149a5565b60405180910390fd5b6113d1858585858561215c565b5050505050565b6113e0611595565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480611426575061142583611420611595565b6112a3565b5b611465576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145c906149a5565b60405180910390fd5b6114708383836123e1565b505050565b61147f8282612600565b5050565b60006114ab836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6126e0565b905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061157e57507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061158e575061158d82612750565b5b9050919050565b600033905090565b81518351146115e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d890614ae5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611651576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611648906149e5565b60405180910390fd5b600061165b611595565b905061166b8187878787876127ca565b60005b845181101561186b5760008582815181106116b2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151905060008583815181106116f7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151905060006002600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611799576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179090614a65565b60405180910390fd5b8181036002600085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816002600085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118509190614d2a565b925050819055505050508061186490614f2a565b905061166e565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516118e2929190614852565b60405180910390a46118f88187878787876127d2565b505050505050565b6119098261068e565b61191a81611915611595565b6129a2565b6119248383612600565b505050565b611931611595565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461199e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199590614b25565b60405180910390fd5b6119a88282612a3f565b5050565b60006119d4836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612b20565b905092915050565b60006119e86005612ca6565b905090565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611a5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5490614b05565b60405180910390fd5b8151835114611aa1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9890614ae5565b60405180910390fd5b6000611aab611595565b9050611abc816000878787876127ca565b60005b8451811015611bc257838181518110611b01577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015160026000878481518110611b46577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ba89190614d2a565b925050819055508080611bba90614f2a565b915050611abf565b508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611c3a929190614852565b60405180910390a4611c51816000878787876127d2565b5050505050565b6001816000016000828254019250508190555050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611cde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd590614a25565b60405180910390fd5b8051825114611d22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1990614ae5565b60405180910390fd5b6000611d2c611595565b9050611d4c818560008686604051806020016040528060008152506127ca565b60005b8351811015611ee7576000848281518110611d93577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190506000848381518110611dd8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151905060006002600084815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611e7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7190614985565b60405180910390fd5b8181036002600085815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050508080611edf90614f2a565b915050611d4f565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051611f5f929190614852565b60405180910390a450505050565b6000611f7c8360000183612cb4565b60001c905092915050565b6000611f9582600001612d05565b9050919050565b611fa58261068e565b611fb681611fb1611595565b6129a2565b611fc08383612a3f565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612035576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202c90614b05565b60405180910390fd5b600061203f611595565b90506120608160008761205188612d16565b61205a88612d16565b876127ca565b826002600086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120c09190614d2a565b925050819055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62878760405161213e929190614b60565b60405180910390a461215581600087878787612ddc565b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156121cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c3906149e5565b60405180910390fd5b60006121d6611595565b90506121f68187876121e788612d16565b6121f088612d16565b876127ca565b60006002600086815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508381101561228e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228590614a65565b60405180910390fd5b8381036002600087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550836002600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123459190614d2a565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6288886040516123c2929190614b60565b60405180910390a46123d8828888888888612ddc565b50505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612451576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244890614a25565b60405180910390fd5b600061245b611595565b905061248b8185600061246d87612d16565b61247687612d16565b604051806020016040528060008152506127ca565b60006002600085815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015612523576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251a90614985565b60405180910390fd5b8281036002600086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6287876040516125f1929190614b60565b60405180910390a45050505050565b61260a8282610e47565b6126dc57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612681611595565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006126ec8383612fac565b61274557826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905061274a565b600090505b92915050565b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806127c357506127c282612fcf565b5b9050919050565b505050505050565b6127f18473ffffffffffffffffffffffffffffffffffffffff16613049565b1561299a578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b815260040161283795949392919061476e565b602060405180830381600087803b15801561285157600080fd5b505af192505050801561288257506040513d601f19601f8201168201806040525081019061287f9190613cf5565b60015b6129115761288e61501e565b8061289957506128d6565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128cd91906148e3565b60405180910390fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290890614905565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612998576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298f90614945565b60405180910390fd5b505b505050505050565b6129ac8282610e47565b612a3b576129d18173ffffffffffffffffffffffffffffffffffffffff16601461305c565b6129df8360001c602061305c565b6040516020016129f0929190614719565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a3291906148e3565b60405180910390fd5b5050565b612a498282610e47565b15612b1c57600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612ac1611595565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b60008083600101600084815260200190815260200160002054905060008114612c9a576000600182612b529190614dda565b9050600060018660000180549050612b6a9190614dda565b9050818114612c25576000866000018281548110612bb1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080876000018481548110612bfb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b85600001805480612c5f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050612ca0565b60009150505b92915050565b600081600001549050919050565b6000826000018281548110612cf2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905092915050565b600081600001805490509050919050565b60606000600167ffffffffffffffff811115612d5b577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015612d895781602001602082028036833780820191505090505b5090508281600081518110612dc7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080915050919050565b612dfb8473ffffffffffffffffffffffffffffffffffffffff16613049565b15612fa4578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401612e419594939291906147d6565b602060405180830381600087803b158015612e5b57600080fd5b505af1925050508015612e8c57506040513d601f19601f82011682018060405250810190612e899190613cf5565b60015b612f1b57612e9861501e565b80612ea35750612ee0565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ed791906148e3565b60405180910390fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f1290614905565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612fa2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f9990614945565b60405180910390fd5b505b505050505050565b600080836001016000848152602001908152602001600020541415905092915050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480613042575061304182613356565b5b9050919050565b600080823b905060008111915050919050565b60606000600283600261306f9190614d80565b6130799190614d2a565b67ffffffffffffffff8111156130b8577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156130ea5781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110613148577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106131d2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026132129190614d80565b61321c9190614d2a565b90505b6001811115613308577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110613284577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b8282815181106132c1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061330190614ece565b905061321f565b506000841461334c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161334390614925565b60405180910390fd5b8091505092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b8280546133cc90614ef8565b90600052602060002090601f0160209004810192826133ee5760008555613435565b82601f1061340757803560ff1916838001178555613435565b82800160010185558215613435579182015b82811115613434578235825591602001919060010190613419565b5b5090506134429190613446565b5090565b5b8082111561345f576000816000905550600101613447565b5090565b600061347661347184614c11565b614be0565b9050808382526020820190508285602086028201111561349557600080fd5b60005b858110156134c557816134ab8882613579565b845260208401935060208301925050600181019050613498565b5050509392505050565b60006134e26134dd84614c3d565b614be0565b9050808382526020820190508285602086028201111561350157600080fd5b60005b85811015613531578161351788826136f4565b845260208401935060208301925050600181019050613504565b5050509392505050565b600061354e61354984614c69565b614be0565b90508281526020810184848401111561356657600080fd5b613571848285614e8c565b509392505050565b600081359050613588816150d4565b92915050565b600082601f83011261359f57600080fd5b81356135af848260208601613463565b91505092915050565b60008083601f8401126135ca57600080fd5b8235905067ffffffffffffffff8111156135e357600080fd5b6020830191508360208202830111156135fb57600080fd5b9250929050565b600082601f83011261361357600080fd5b81356136238482602086016134cf565b91505092915050565b60008135905061363b816150eb565b92915050565b60008135905061365081615102565b92915050565b60008135905061366581615119565b92915050565b60008151905061367a81615119565b92915050565b600082601f83011261369157600080fd5b81356136a184826020860161353b565b91505092915050565b60008083601f8401126136bc57600080fd5b8235905067ffffffffffffffff8111156136d557600080fd5b6020830191508360018202830111156136ed57600080fd5b9250929050565b60008135905061370381615130565b92915050565b6000806040838503121561371c57600080fd5b600061372a85828601613579565b925050602061373b85828601613579565b9150509250929050565b600080600080600060a0868803121561375d57600080fd5b600061376b88828901613579565b955050602061377c88828901613579565b945050604086013567ffffffffffffffff81111561379957600080fd5b6137a588828901613602565b935050606086013567ffffffffffffffff8111156137c257600080fd5b6137ce88828901613602565b925050608086013567ffffffffffffffff8111156137eb57600080fd5b6137f788828901613680565b9150509295509295909350565b600080600080600060a0868803121561381c57600080fd5b600061382a88828901613579565b955050602061383b88828901613579565b945050604061384c888289016136f4565b935050606061385d888289016136f4565b925050608086013567ffffffffffffffff81111561387a57600080fd5b61388688828901613680565b9150509295509295909350565b6000806000606084860312156138a857600080fd5b60006138b686828701613579565b935050602084013567ffffffffffffffff8111156138d357600080fd5b6138df86828701613602565b925050604084013567ffffffffffffffff8111156138fc57600080fd5b61390886828701613602565b9150509250925092565b60008060008060008060008060c0898b03121561392e57600080fd5b600061393c8b828c01613579565b985050602089013567ffffffffffffffff81111561395957600080fd5b6139658b828c01613602565b975050604089013567ffffffffffffffff81111561398257600080fd5b61398e8b828c01613602565b965050606089013567ffffffffffffffff8111156139ab57600080fd5b6139b78b828c01613680565b955050608089013567ffffffffffffffff8111156139d457600080fd5b6139e08b828c016135b8565b945094505060a089013567ffffffffffffffff8111156139ff57600080fd5b613a0b8b828c016135b8565b92509250509295985092959890939650565b60008060408385031215613a3057600080fd5b6000613a3e85828601613579565b9250506020613a4f8582860161362c565b9150509250929050565b60008060408385031215613a6c57600080fd5b6000613a7a85828601613579565b9250506020613a8b858286016136f4565b9150509250929050565b600080600060608486031215613aaa57600080fd5b6000613ab886828701613579565b9350506020613ac9868287016136f4565b9250506040613ada868287016136f4565b9150509250925092565b60008060008060008060008060c0898b031215613b0057600080fd5b6000613b0e8b828c01613579565b9850506020613b1f8b828c016136f4565b9750506040613b308b828c016136f4565b965050606089013567ffffffffffffffff811115613b4d57600080fd5b613b598b828c01613680565b955050608089013567ffffffffffffffff811115613b7657600080fd5b613b828b828c016136aa565b945094505060a089013567ffffffffffffffff811115613ba157600080fd5b613bad8b828c016136aa565b92509250509295985092959890939650565b60008060408385031215613bd257600080fd5b600083013567ffffffffffffffff811115613bec57600080fd5b613bf88582860161358e565b925050602083013567ffffffffffffffff811115613c1557600080fd5b613c2185828601613602565b9150509250929050565b600060208284031215613c3d57600080fd5b6000613c4b84828501613641565b91505092915050565b60008060408385031215613c6757600080fd5b6000613c7585828601613641565b9250506020613c8685828601613579565b9150509250929050565b60008060408385031215613ca357600080fd5b6000613cb185828601613641565b9250506020613cc2858286016136f4565b9150509250929050565b600060208284031215613cde57600080fd5b6000613cec84828501613656565b91505092915050565b600060208284031215613d0757600080fd5b6000613d158482850161366b565b91505092915050565b600060208284031215613d3057600080fd5b6000613d3e848285016136f4565b91505092915050565b6000613d5383836146d9565b60208301905092915050565b613d6881614e0e565b82525050565b6000613d7982614cbe565b613d838185614cec565b9350613d8e83614c99565b8060005b83811015613dbf578151613da68882613d47565b9750613db183614cdf565b925050600181019050613d92565b5085935050505092915050565b613dd581614e20565b82525050565b613de481614e2c565b82525050565b6000613df582614cc9565b613dff8185614cfd565b9350613e0f818560208601614e9b565b613e1881615000565b840191505092915050565b6000613e2f8385614d0e565b9350613e3c838584614e8c565b613e4583615000565b840190509392505050565b6000613e5b82614cd4565b613e658185614d0e565b9350613e75818560208601614e9b565b613e7e81615000565b840191505092915050565b6000613e9482614cd4565b613e9e8185614d1f565b9350613eae818560208601614e9b565b80840191505092915050565b60008154613ec781614ef8565b613ed18186614d1f565b94506001821660008114613eec5760018114613efd57613f30565b60ff19831686528186019350613f30565b613f0685614ca9565b60005b83811015613f2857815481890152600182019150602081019050613f09565b838801955050505b50505092915050565b6000613f46603483614d0e565b91507f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008301527f526563656976657220696d706c656d656e7465720000000000000000000000006020830152604082019050919050565b6000613fac602083614d0e565b91507f537472696e67733a20686578206c656e67746820696e73756666696369656e746000830152602082019050919050565b6000613fec602883614d0e565b91507f455243313135353a204552433131353552656365697665722072656a6563746560008301527f6420746f6b656e730000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614052602b83614d0e565b91507f455243313135353a2062616c616e636520717565727920666f7220746865207a60008301527f65726f20616464726573730000000000000000000000000000000000000000006020830152604082019050919050565b60006140b8602483614d0e565b91507f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008301527f616e6365000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061411e602983614d0e565b91507f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008301527f20617070726f76656400000000000000000000000000000000000000000000006020830152604082019050919050565b6000614184600983614d0e565b91507f4d6178206c696d697400000000000000000000000000000000000000000000006000830152602082019050919050565b60006141c4602583614d0e565b91507f455243313135353a207472616e7366657220746f20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061422a603283614d0e565b91507f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008301527f6f776e6572206e6f7220617070726f76656400000000000000000000000000006020830152604082019050919050565b6000614290602383614d0e565b91507f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142f6600883614d0e565b91507f53616c6520656e640000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614336602a83614d0e565b91507f455243313135353a20696e73756666696369656e742062616c616e636520666f60008301527f72207472616e73666572000000000000000000000000000000000000000000006020830152604082019050919050565b600061439c602683614d0e565b91507f4f776e657266793a206d7573742068617665206d696e74657220726f6c65207460008301527f6f206d696e7400000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614402602283614d1f565b91507f68747470733a2f2f676174657761792e70696e6174612e636c6f75642f69706660008301527f732f0000000000000000000000000000000000000000000000000000000000006020830152602282019050919050565b6000614468601783614d1f565b91507f416363657373436f6e74726f6c3a206163636f756e74200000000000000000006000830152601782019050919050565b60006144a8602983614d0e565b91507f455243313135353a2073657474696e6720617070726f76616c2073746174757360008301527f20666f722073656c6600000000000000000000000000000000000000000000006020830152604082019050919050565b600061450e602983614d0e565b91507f455243313135353a206163636f756e747320616e6420696473206c656e67746860008301527f206d69736d6174636800000000000000000000000000000000000000000000006020830152604082019050919050565b6000614574602883614d0e565b91507f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008301527f6d69736d617463680000000000000000000000000000000000000000000000006020830152604082019050919050565b60006145da602183614d0e565b91507f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614640601183614d1f565b91507f206973206d697373696e6720726f6c65200000000000000000000000000000006000830152601182019050919050565b6000614680602f83614d0e565b91507f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008301527f20726f6c657320666f722073656c6600000000000000000000000000000000006020830152604082019050919050565b6146e281614e82565b82525050565b6146f181614e82565b82525050565b6000614702826143f5565b915061470e8284613eba565b915081905092915050565b60006147248261445b565b91506147308285613e89565b915061473b82614633565b91506147478284613e89565b91508190509392505050565b60006020820190506147686000830184613d5f565b92915050565b600060a0820190506147836000830188613d5f565b6147906020830187613d5f565b81810360408301526147a28186613d6e565b905081810360608301526147b68185613d6e565b905081810360808301526147ca8184613dea565b90509695505050505050565b600060a0820190506147eb6000830188613d5f565b6147f86020830187613d5f565b61480560408301866146e8565b61481260608301856146e8565b81810360808301526148248184613dea565b90509695505050505050565b6000602082019050818103600083015261484a8184613d6e565b905092915050565b6000604082019050818103600083015261486c8185613d6e565b905081810360208301526148808184613d6e565b90509392505050565b600060208201905061489e6000830184613dcc565b92915050565b60006020820190506148b96000830184613ddb565b92915050565b600060208201905081810360008301526148da818486613e23565b90509392505050565b600060208201905081810360008301526148fd8184613e50565b905092915050565b6000602082019050818103600083015261491e81613f39565b9050919050565b6000602082019050818103600083015261493e81613f9f565b9050919050565b6000602082019050818103600083015261495e81613fdf565b9050919050565b6000602082019050818103600083015261497e81614045565b9050919050565b6000602082019050818103600083015261499e816140ab565b9050919050565b600060208201905081810360008301526149be81614111565b9050919050565b600060208201905081810360008301526149de81614177565b9050919050565b600060208201905081810360008301526149fe816141b7565b9050919050565b60006020820190508181036000830152614a1e8161421d565b9050919050565b60006020820190508181036000830152614a3e81614283565b9050919050565b60006020820190508181036000830152614a5e816142e9565b9050919050565b60006020820190508181036000830152614a7e81614329565b9050919050565b60006020820190508181036000830152614a9e8161438f565b9050919050565b60006020820190508181036000830152614abe8161449b565b9050919050565b60006020820190508181036000830152614ade81614501565b9050919050565b60006020820190508181036000830152614afe81614567565b9050919050565b60006020820190508181036000830152614b1e816145cd565b9050919050565b60006020820190508181036000830152614b3e81614673565b9050919050565b6000602082019050614b5a60008301846146e8565b92915050565b6000604082019050614b7560008301856146e8565b614b8260208301846146e8565b9392505050565b60008083356001602003843603038112614ba257600080fd5b80840192508235915067ffffffffffffffff821115614bc057600080fd5b602083019250600182023603831315614bd857600080fd5b509250929050565b6000604051905081810181811067ffffffffffffffff82111715614c0757614c06614fd1565b5b8060405250919050565b600067ffffffffffffffff821115614c2c57614c2b614fd1565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614c5857614c57614fd1565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614c8457614c83614fd1565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614d3582614e82565b9150614d4083614e82565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614d7557614d74614f73565b5b828201905092915050565b6000614d8b82614e82565b9150614d9683614e82565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614dcf57614dce614f73565b5b828202905092915050565b6000614de582614e82565b9150614df083614e82565b925082821015614e0357614e02614f73565b5b828203905092915050565b6000614e1982614e62565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614eb9578082015181840152602081019050614e9e565b83811115614ec8576000848401525b50505050565b6000614ed982614e82565b91506000821415614eed57614eec614f73565b5b600182039050919050565b60006002820490506001821680614f1057607f821691505b60208210811415614f2457614f23614fa2565b5b50919050565b6000614f3582614e82565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614f6857614f67614f73565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160e01c9050919050565b600060443d101561502e576150d1565b60046000803e61503f600051615011565b6308c379a0811461505057506150d1565b60405160043d036004823e80513d602482011167ffffffffffffffff8211171561507c575050506150d1565b808201805167ffffffffffffffff81111561509b5750505050506150d1565b8060208301013d85018111156150b6575050505050506150d1565b6150bf82615000565b60208401016040528296505050505050505b90565b6150dd81614e0e565b81146150e857600080fd5b50565b6150f481614e20565b81146150ff57600080fd5b50565b61510b81614e2c565b811461511657600080fd5b50565b61512281614e36565b811461512d57600080fd5b50565b61513981614e82565b811461514457600080fd5b5056fea2646970667358221220d7f5bfffef15d14d331ebb18cad9fc3374c57067229fb8a85e455cd1e13aafb564736f6c634300080000330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002968747470733a2f2f69706673676174657761792e6f776e657266792e636f6d2f697066732f7b69647d0000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061018d5760003560e01c80639010d07c116100de578063d539139311610097578063e927fc5c11610071578063e927fc5c146104b8578063e985e9c5146104d6578063f242432a14610506578063f5298aca146105225761018d565b8063d539139314610462578063d547741f14610480578063d5e8e3531461049c5761018d565b80639010d07c1461037a57806391d14854146103aa57806395d89b41146103da578063a217fddf146103f8578063a22cb46514610416578063ca15c873146104325761018d565b80632f2ff15d1161014b5780634e1273f4116101255780634e1273f4146102e2578063571b76f5146103125780636b20c4541461032e578063704fe7101461034a5761018d565b80632f2ff15d1461028c5780633502a716146102a857806336568abe146102c65761018d565b8062fdd58e1461019257806301ffc9a7146101c257806306fdde03146101f25780630e89341c14610210578063248a9ca3146102405780632eb2c2d614610270575b600080fd5b6101ac60048036038101906101a79190613a59565b61053e565b6040516101b99190614b45565b60405180910390f35b6101dc60048036038101906101d79190613ccc565b610608565b6040516101e99190614889565b60405180910390f35b6101fa61061a565b60405161020791906148e3565b60405180910390f35b61022a60048036038101906102259190613d1e565b610653565b60405161023791906148e3565b60405180910390f35b61025a60048036038101906102559190613c2b565b61068e565b60405161026791906148a4565b60405180910390f35b61028a60048036038101906102859190613745565b6106ad565b005b6102a660048036038101906102a19190613c54565b61074e565b005b6102b0610782565b6040516102bd9190614b45565b60405180910390f35b6102e060048036038101906102db9190613c54565b610788565b005b6102fc60048036038101906102f79190613bbf565b6107bc565b6040516103099190614830565b60405180910390f35b61032c60048036038101906103279190613912565b61096d565b005b61034860048036038101906103439190613893565b610cdb565b005b610364600480360381019061035f9190613d1e565b610d78565b60405161037191906148e3565b60405180910390f35b610394600480360381019061038f9190613c90565b610e18565b6040516103a19190614753565b60405180910390f35b6103c460048036038101906103bf9190613c54565b610e47565b6040516103d19190614889565b60405180910390f35b6103e2610eb1565b6040516103ef91906148e3565b60405180910390f35b610400610eea565b60405161040d91906148a4565b60405180910390f35b610430600480360381019061042b9190613a1d565b610ef1565b005b61044c60048036038101906104479190613c2b565b611072565b6040516104599190614b45565b60405180910390f35b61046a611096565b60405161047791906148a4565b60405180910390f35b61049a60048036038101906104959190613c54565b6110ba565b005b6104b660048036038101906104b19190613ae4565b6110ee565b005b6104c061128b565b6040516104cd9190614753565b60405180910390f35b6104f060048036038101906104eb9190613709565b6112a3565b6040516104fd9190614889565b60405180910390f35b610520600480360381019061051b9190613804565b611337565b005b61053c60048036038101906105379190613a95565b6113d8565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156105af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105a690614965565b60405180910390fd5b6002600083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000610613826114b3565b9050919050565b6040518060400160405280600b81526020017f436869632d412d4465657300000000000000000000000000000000000000000081525081565b60606006600083815260200190815260200160002060405160200161067891906146f7565b6040516020818303038152906040529050919050565b6000806000838152602001908152602001600020600101549050919050565b6106b5611595565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806106fb57506106fa856106f5611595565b6112a3565b5b61073a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073190614a05565b60405180910390fd5b610747858585858561159d565b5050505050565b6107588282611900565b61077d816001600085815260200190815260200160002061148390919063ffffffff16565b505050565b612b6781565b6107928282611929565b6107b781600160008581526020019081526020016000206119ac90919063ffffffff16565b505050565b60608151835114610802576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f990614ac5565b60405180910390fd5b6000835167ffffffffffffffff811115610845577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156108735781602001602082028036833780820191505090505b50905060005b84518110156109625761090c8582815181106108be577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101518583815181106108ff577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015161053e565b828281518110610945577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508061095b90614f2a565b9050610879565b508091505092915050565b60006109776119dc565b9050612b678851826109899190614d2a565b11156109ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c1906149c5565b60405180910390fd5b612b67811115610a0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0690614a45565b60405180910390fd5b610a407f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610a3b611595565b610e47565b610a7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7690614a85565b60405180910390fd5b610a8b898989896119ed565b60005b8851811015610ccf57610aa16005611c58565b6000848483818110610adc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002810190610aee9190614b89565b90501115610ba357838382818110610b2f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002810190610b419190614b89565b600660008c8581518110610b7e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015181526020019081526020016000209190610ba19291906133c0565b505b6000868683818110610bde577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002810190610bf09190614b89565b90501115610cbc57888181518110610c31577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101517f68569b533bfdeb53ee0f87318e7aa1ad56335f80086c45dfaa733c24fa43ea7b878784818110610c93577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002810190610ca59190614b89565b604051610cb39291906148bf565b60405180910390a25b8080610cc790614f2a565b915050610a8e565b50505050505050505050565b610ce3611595565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480610d295750610d2883610d23611595565b6112a3565b5b610d68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5f906149a5565b60405180910390fd5b610d73838383611c6e565b505050565b60066020528060005260406000206000915090508054610d9790614ef8565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc390614ef8565b8015610e105780601f10610de557610100808354040283529160200191610e10565b820191906000526020600020905b815481529060010190602001808311610df357829003601f168201915b505050505081565b6000610e3f8260016000868152602001908152602001600020611f6d90919063ffffffff16565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6040518060400160405280600481526020017f434849430000000000000000000000000000000000000000000000000000000081525081565b6000801b81565b8173ffffffffffffffffffffffffffffffffffffffff16610f10611595565b73ffffffffffffffffffffffffffffffffffffffff161415610f67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5e90614aa5565b60405180910390fd5b8060036000610f74611595565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611021611595565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516110669190614889565b60405180910390a35050565b600061108f60016000848152602001908152602001600020611f87565b9050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b6110c48282611f9c565b6110e981600160008581526020019081526020016000206119ac90919063ffffffff16565b505050565b60006110f86119dc565b9050612b6760018261110a9190614d2a565b111561114b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611142906149c5565b60405180910390fd5b612b67811115611190576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118790614a45565b60405180910390fd5b6111c17f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66111bc611595565b610e47565b611200576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f790614a85565b60405180910390fd5b600085859050111561124757877f68569b533bfdeb53ee0f87318e7aa1ad56335f80086c45dfaa733c24fa43ea7b868660405161123e9291906148bf565b60405180910390a25b6112516005611c58565b8282600660008b815260200190815260200160002091906112739291906133c0565b5061128089898989611fc5565b505050505050505050565b736c474099ad6d9af49201a38b9842111d4acd10bc81565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61133f611595565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061138557506113848561137f611595565b6112a3565b5b6113c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bb906149a5565b60405180910390fd5b6113d1858585858561215c565b5050505050565b6113e0611595565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480611426575061142583611420611595565b6112a3565b5b611465576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145c906149a5565b60405180910390fd5b6114708383836123e1565b505050565b61147f8282612600565b5050565b60006114ab836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6126e0565b905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061157e57507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061158e575061158d82612750565b5b9050919050565b600033905090565b81518351146115e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d890614ae5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611651576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611648906149e5565b60405180910390fd5b600061165b611595565b905061166b8187878787876127ca565b60005b845181101561186b5760008582815181106116b2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151905060008583815181106116f7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151905060006002600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611799576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179090614a65565b60405180910390fd5b8181036002600085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816002600085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118509190614d2a565b925050819055505050508061186490614f2a565b905061166e565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516118e2929190614852565b60405180910390a46118f88187878787876127d2565b505050505050565b6119098261068e565b61191a81611915611595565b6129a2565b6119248383612600565b505050565b611931611595565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461199e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199590614b25565b60405180910390fd5b6119a88282612a3f565b5050565b60006119d4836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612b20565b905092915050565b60006119e86005612ca6565b905090565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611a5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5490614b05565b60405180910390fd5b8151835114611aa1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9890614ae5565b60405180910390fd5b6000611aab611595565b9050611abc816000878787876127ca565b60005b8451811015611bc257838181518110611b01577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015160026000878481518110611b46577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ba89190614d2a565b925050819055508080611bba90614f2a565b915050611abf565b508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611c3a929190614852565b60405180910390a4611c51816000878787876127d2565b5050505050565b6001816000016000828254019250508190555050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611cde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd590614a25565b60405180910390fd5b8051825114611d22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1990614ae5565b60405180910390fd5b6000611d2c611595565b9050611d4c818560008686604051806020016040528060008152506127ca565b60005b8351811015611ee7576000848281518110611d93577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190506000848381518110611dd8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151905060006002600084815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611e7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7190614985565b60405180910390fd5b8181036002600085815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050508080611edf90614f2a565b915050611d4f565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051611f5f929190614852565b60405180910390a450505050565b6000611f7c8360000183612cb4565b60001c905092915050565b6000611f9582600001612d05565b9050919050565b611fa58261068e565b611fb681611fb1611595565b6129a2565b611fc08383612a3f565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612035576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202c90614b05565b60405180910390fd5b600061203f611595565b90506120608160008761205188612d16565b61205a88612d16565b876127ca565b826002600086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120c09190614d2a565b925050819055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62878760405161213e929190614b60565b60405180910390a461215581600087878787612ddc565b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156121cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c3906149e5565b60405180910390fd5b60006121d6611595565b90506121f68187876121e788612d16565b6121f088612d16565b876127ca565b60006002600086815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508381101561228e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228590614a65565b60405180910390fd5b8381036002600087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550836002600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123459190614d2a565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6288886040516123c2929190614b60565b60405180910390a46123d8828888888888612ddc565b50505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612451576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244890614a25565b60405180910390fd5b600061245b611595565b905061248b8185600061246d87612d16565b61247687612d16565b604051806020016040528060008152506127ca565b60006002600085815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015612523576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251a90614985565b60405180910390fd5b8281036002600086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6287876040516125f1929190614b60565b60405180910390a45050505050565b61260a8282610e47565b6126dc57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612681611595565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006126ec8383612fac565b61274557826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905061274a565b600090505b92915050565b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806127c357506127c282612fcf565b5b9050919050565b505050505050565b6127f18473ffffffffffffffffffffffffffffffffffffffff16613049565b1561299a578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b815260040161283795949392919061476e565b602060405180830381600087803b15801561285157600080fd5b505af192505050801561288257506040513d601f19601f8201168201806040525081019061287f9190613cf5565b60015b6129115761288e61501e565b8061289957506128d6565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128cd91906148e3565b60405180910390fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290890614905565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612998576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298f90614945565b60405180910390fd5b505b505050505050565b6129ac8282610e47565b612a3b576129d18173ffffffffffffffffffffffffffffffffffffffff16601461305c565b6129df8360001c602061305c565b6040516020016129f0929190614719565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a3291906148e3565b60405180910390fd5b5050565b612a498282610e47565b15612b1c57600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612ac1611595565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b60008083600101600084815260200190815260200160002054905060008114612c9a576000600182612b529190614dda565b9050600060018660000180549050612b6a9190614dda565b9050818114612c25576000866000018281548110612bb1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080876000018481548110612bfb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b85600001805480612c5f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050612ca0565b60009150505b92915050565b600081600001549050919050565b6000826000018281548110612cf2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905092915050565b600081600001805490509050919050565b60606000600167ffffffffffffffff811115612d5b577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015612d895781602001602082028036833780820191505090505b5090508281600081518110612dc7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080915050919050565b612dfb8473ffffffffffffffffffffffffffffffffffffffff16613049565b15612fa4578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401612e419594939291906147d6565b602060405180830381600087803b158015612e5b57600080fd5b505af1925050508015612e8c57506040513d601f19601f82011682018060405250810190612e899190613cf5565b60015b612f1b57612e9861501e565b80612ea35750612ee0565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ed791906148e3565b60405180910390fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f1290614905565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612fa2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f9990614945565b60405180910390fd5b505b505050505050565b600080836001016000848152602001908152602001600020541415905092915050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480613042575061304182613356565b5b9050919050565b600080823b905060008111915050919050565b60606000600283600261306f9190614d80565b6130799190614d2a565b67ffffffffffffffff8111156130b8577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156130ea5781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110613148577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106131d2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026132129190614d80565b61321c9190614d2a565b90505b6001811115613308577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110613284577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b8282815181106132c1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061330190614ece565b905061321f565b506000841461334c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161334390614925565b60405180910390fd5b8091505092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b8280546133cc90614ef8565b90600052602060002090601f0160209004810192826133ee5760008555613435565b82601f1061340757803560ff1916838001178555613435565b82800160010185558215613435579182015b82811115613434578235825591602001919060010190613419565b5b5090506134429190613446565b5090565b5b8082111561345f576000816000905550600101613447565b5090565b600061347661347184614c11565b614be0565b9050808382526020820190508285602086028201111561349557600080fd5b60005b858110156134c557816134ab8882613579565b845260208401935060208301925050600181019050613498565b5050509392505050565b60006134e26134dd84614c3d565b614be0565b9050808382526020820190508285602086028201111561350157600080fd5b60005b85811015613531578161351788826136f4565b845260208401935060208301925050600181019050613504565b5050509392505050565b600061354e61354984614c69565b614be0565b90508281526020810184848401111561356657600080fd5b613571848285614e8c565b509392505050565b600081359050613588816150d4565b92915050565b600082601f83011261359f57600080fd5b81356135af848260208601613463565b91505092915050565b60008083601f8401126135ca57600080fd5b8235905067ffffffffffffffff8111156135e357600080fd5b6020830191508360208202830111156135fb57600080fd5b9250929050565b600082601f83011261361357600080fd5b81356136238482602086016134cf565b91505092915050565b60008135905061363b816150eb565b92915050565b60008135905061365081615102565b92915050565b60008135905061366581615119565b92915050565b60008151905061367a81615119565b92915050565b600082601f83011261369157600080fd5b81356136a184826020860161353b565b91505092915050565b60008083601f8401126136bc57600080fd5b8235905067ffffffffffffffff8111156136d557600080fd5b6020830191508360018202830111156136ed57600080fd5b9250929050565b60008135905061370381615130565b92915050565b6000806040838503121561371c57600080fd5b600061372a85828601613579565b925050602061373b85828601613579565b9150509250929050565b600080600080600060a0868803121561375d57600080fd5b600061376b88828901613579565b955050602061377c88828901613579565b945050604086013567ffffffffffffffff81111561379957600080fd5b6137a588828901613602565b935050606086013567ffffffffffffffff8111156137c257600080fd5b6137ce88828901613602565b925050608086013567ffffffffffffffff8111156137eb57600080fd5b6137f788828901613680565b9150509295509295909350565b600080600080600060a0868803121561381c57600080fd5b600061382a88828901613579565b955050602061383b88828901613579565b945050604061384c888289016136f4565b935050606061385d888289016136f4565b925050608086013567ffffffffffffffff81111561387a57600080fd5b61388688828901613680565b9150509295509295909350565b6000806000606084860312156138a857600080fd5b60006138b686828701613579565b935050602084013567ffffffffffffffff8111156138d357600080fd5b6138df86828701613602565b925050604084013567ffffffffffffffff8111156138fc57600080fd5b61390886828701613602565b9150509250925092565b60008060008060008060008060c0898b03121561392e57600080fd5b600061393c8b828c01613579565b985050602089013567ffffffffffffffff81111561395957600080fd5b6139658b828c01613602565b975050604089013567ffffffffffffffff81111561398257600080fd5b61398e8b828c01613602565b965050606089013567ffffffffffffffff8111156139ab57600080fd5b6139b78b828c01613680565b955050608089013567ffffffffffffffff8111156139d457600080fd5b6139e08b828c016135b8565b945094505060a089013567ffffffffffffffff8111156139ff57600080fd5b613a0b8b828c016135b8565b92509250509295985092959890939650565b60008060408385031215613a3057600080fd5b6000613a3e85828601613579565b9250506020613a4f8582860161362c565b9150509250929050565b60008060408385031215613a6c57600080fd5b6000613a7a85828601613579565b9250506020613a8b858286016136f4565b9150509250929050565b600080600060608486031215613aaa57600080fd5b6000613ab886828701613579565b9350506020613ac9868287016136f4565b9250506040613ada868287016136f4565b9150509250925092565b60008060008060008060008060c0898b031215613b0057600080fd5b6000613b0e8b828c01613579565b9850506020613b1f8b828c016136f4565b9750506040613b308b828c016136f4565b965050606089013567ffffffffffffffff811115613b4d57600080fd5b613b598b828c01613680565b955050608089013567ffffffffffffffff811115613b7657600080fd5b613b828b828c016136aa565b945094505060a089013567ffffffffffffffff811115613ba157600080fd5b613bad8b828c016136aa565b92509250509295985092959890939650565b60008060408385031215613bd257600080fd5b600083013567ffffffffffffffff811115613bec57600080fd5b613bf88582860161358e565b925050602083013567ffffffffffffffff811115613c1557600080fd5b613c2185828601613602565b9150509250929050565b600060208284031215613c3d57600080fd5b6000613c4b84828501613641565b91505092915050565b60008060408385031215613c6757600080fd5b6000613c7585828601613641565b9250506020613c8685828601613579565b9150509250929050565b60008060408385031215613ca357600080fd5b6000613cb185828601613641565b9250506020613cc2858286016136f4565b9150509250929050565b600060208284031215613cde57600080fd5b6000613cec84828501613656565b91505092915050565b600060208284031215613d0757600080fd5b6000613d158482850161366b565b91505092915050565b600060208284031215613d3057600080fd5b6000613d3e848285016136f4565b91505092915050565b6000613d5383836146d9565b60208301905092915050565b613d6881614e0e565b82525050565b6000613d7982614cbe565b613d838185614cec565b9350613d8e83614c99565b8060005b83811015613dbf578151613da68882613d47565b9750613db183614cdf565b925050600181019050613d92565b5085935050505092915050565b613dd581614e20565b82525050565b613de481614e2c565b82525050565b6000613df582614cc9565b613dff8185614cfd565b9350613e0f818560208601614e9b565b613e1881615000565b840191505092915050565b6000613e2f8385614d0e565b9350613e3c838584614e8c565b613e4583615000565b840190509392505050565b6000613e5b82614cd4565b613e658185614d0e565b9350613e75818560208601614e9b565b613e7e81615000565b840191505092915050565b6000613e9482614cd4565b613e9e8185614d1f565b9350613eae818560208601614e9b565b80840191505092915050565b60008154613ec781614ef8565b613ed18186614d1f565b94506001821660008114613eec5760018114613efd57613f30565b60ff19831686528186019350613f30565b613f0685614ca9565b60005b83811015613f2857815481890152600182019150602081019050613f09565b838801955050505b50505092915050565b6000613f46603483614d0e565b91507f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008301527f526563656976657220696d706c656d656e7465720000000000000000000000006020830152604082019050919050565b6000613fac602083614d0e565b91507f537472696e67733a20686578206c656e67746820696e73756666696369656e746000830152602082019050919050565b6000613fec602883614d0e565b91507f455243313135353a204552433131353552656365697665722072656a6563746560008301527f6420746f6b656e730000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614052602b83614d0e565b91507f455243313135353a2062616c616e636520717565727920666f7220746865207a60008301527f65726f20616464726573730000000000000000000000000000000000000000006020830152604082019050919050565b60006140b8602483614d0e565b91507f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008301527f616e6365000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061411e602983614d0e565b91507f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008301527f20617070726f76656400000000000000000000000000000000000000000000006020830152604082019050919050565b6000614184600983614d0e565b91507f4d6178206c696d697400000000000000000000000000000000000000000000006000830152602082019050919050565b60006141c4602583614d0e565b91507f455243313135353a207472616e7366657220746f20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061422a603283614d0e565b91507f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008301527f6f776e6572206e6f7220617070726f76656400000000000000000000000000006020830152604082019050919050565b6000614290602383614d0e565b91507f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142f6600883614d0e565b91507f53616c6520656e640000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614336602a83614d0e565b91507f455243313135353a20696e73756666696369656e742062616c616e636520666f60008301527f72207472616e73666572000000000000000000000000000000000000000000006020830152604082019050919050565b600061439c602683614d0e565b91507f4f776e657266793a206d7573742068617665206d696e74657220726f6c65207460008301527f6f206d696e7400000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614402602283614d1f565b91507f68747470733a2f2f676174657761792e70696e6174612e636c6f75642f69706660008301527f732f0000000000000000000000000000000000000000000000000000000000006020830152602282019050919050565b6000614468601783614d1f565b91507f416363657373436f6e74726f6c3a206163636f756e74200000000000000000006000830152601782019050919050565b60006144a8602983614d0e565b91507f455243313135353a2073657474696e6720617070726f76616c2073746174757360008301527f20666f722073656c6600000000000000000000000000000000000000000000006020830152604082019050919050565b600061450e602983614d0e565b91507f455243313135353a206163636f756e747320616e6420696473206c656e67746860008301527f206d69736d6174636800000000000000000000000000000000000000000000006020830152604082019050919050565b6000614574602883614d0e565b91507f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008301527f6d69736d617463680000000000000000000000000000000000000000000000006020830152604082019050919050565b60006145da602183614d0e565b91507f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614640601183614d1f565b91507f206973206d697373696e6720726f6c65200000000000000000000000000000006000830152601182019050919050565b6000614680602f83614d0e565b91507f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008301527f20726f6c657320666f722073656c6600000000000000000000000000000000006020830152604082019050919050565b6146e281614e82565b82525050565b6146f181614e82565b82525050565b6000614702826143f5565b915061470e8284613eba565b915081905092915050565b60006147248261445b565b91506147308285613e89565b915061473b82614633565b91506147478284613e89565b91508190509392505050565b60006020820190506147686000830184613d5f565b92915050565b600060a0820190506147836000830188613d5f565b6147906020830187613d5f565b81810360408301526147a28186613d6e565b905081810360608301526147b68185613d6e565b905081810360808301526147ca8184613dea565b90509695505050505050565b600060a0820190506147eb6000830188613d5f565b6147f86020830187613d5f565b61480560408301866146e8565b61481260608301856146e8565b81810360808301526148248184613dea565b90509695505050505050565b6000602082019050818103600083015261484a8184613d6e565b905092915050565b6000604082019050818103600083015261486c8185613d6e565b905081810360208301526148808184613d6e565b90509392505050565b600060208201905061489e6000830184613dcc565b92915050565b60006020820190506148b96000830184613ddb565b92915050565b600060208201905081810360008301526148da818486613e23565b90509392505050565b600060208201905081810360008301526148fd8184613e50565b905092915050565b6000602082019050818103600083015261491e81613f39565b9050919050565b6000602082019050818103600083015261493e81613f9f565b9050919050565b6000602082019050818103600083015261495e81613fdf565b9050919050565b6000602082019050818103600083015261497e81614045565b9050919050565b6000602082019050818103600083015261499e816140ab565b9050919050565b600060208201905081810360008301526149be81614111565b9050919050565b600060208201905081810360008301526149de81614177565b9050919050565b600060208201905081810360008301526149fe816141b7565b9050919050565b60006020820190508181036000830152614a1e8161421d565b9050919050565b60006020820190508181036000830152614a3e81614283565b9050919050565b60006020820190508181036000830152614a5e816142e9565b9050919050565b60006020820190508181036000830152614a7e81614329565b9050919050565b60006020820190508181036000830152614a9e8161438f565b9050919050565b60006020820190508181036000830152614abe8161449b565b9050919050565b60006020820190508181036000830152614ade81614501565b9050919050565b60006020820190508181036000830152614afe81614567565b9050919050565b60006020820190508181036000830152614b1e816145cd565b9050919050565b60006020820190508181036000830152614b3e81614673565b9050919050565b6000602082019050614b5a60008301846146e8565b92915050565b6000604082019050614b7560008301856146e8565b614b8260208301846146e8565b9392505050565b60008083356001602003843603038112614ba257600080fd5b80840192508235915067ffffffffffffffff821115614bc057600080fd5b602083019250600182023603831315614bd857600080fd5b509250929050565b6000604051905081810181811067ffffffffffffffff82111715614c0757614c06614fd1565b5b8060405250919050565b600067ffffffffffffffff821115614c2c57614c2b614fd1565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614c5857614c57614fd1565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614c8457614c83614fd1565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614d3582614e82565b9150614d4083614e82565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614d7557614d74614f73565b5b828201905092915050565b6000614d8b82614e82565b9150614d9683614e82565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614dcf57614dce614f73565b5b828202905092915050565b6000614de582614e82565b9150614df083614e82565b925082821015614e0357614e02614f73565b5b828203905092915050565b6000614e1982614e62565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614eb9578082015181840152602081019050614e9e565b83811115614ec8576000848401525b50505050565b6000614ed982614e82565b91506000821415614eed57614eec614f73565b5b600182039050919050565b60006002820490506001821680614f1057607f821691505b60208210811415614f2457614f23614fa2565b5b50919050565b6000614f3582614e82565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614f6857614f67614f73565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160e01c9050919050565b600060443d101561502e576150d1565b60046000803e61503f600051615011565b6308c379a0811461505057506150d1565b60405160043d036004823e80513d602482011167ffffffffffffffff8211171561507c575050506150d1565b808201805167ffffffffffffffff81111561509b5750505050506150d1565b8060208301013d85018111156150b6575050505050506150d1565b6150bf82615000565b60208401016040528296505050505050505b90565b6150dd81614e0e565b81146150e857600080fd5b50565b6150f481614e20565b81146150ff57600080fd5b50565b61510b81614e2c565b811461511657600080fd5b50565b61512281614e36565b811461512d57600080fd5b50565b61513981614e82565b811461514457600080fd5b5056fea2646970667358221220d7f5bfffef15d14d331ebb18cad9fc3374c57067229fb8a85e455cd1e13aafb564736f6c63430008000033

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

0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002968747470733a2f2f69706673676174657761792e6f776e657266792e636f6d2f697066732f7b69647d0000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _uri (string): https://ipfsgateway.ownerfy.com/ipfs/{id}

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000029
Arg [2] : 68747470733a2f2f69706673676174657761792e6f776e657266792e636f6d2f
Arg [3] : 697066732f7b69647d0000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

65070:3179:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19585:231;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68057:187;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65269:43;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67807:178;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41242:123;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21680:442;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55906:165;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65427:44;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56429:174;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19982:524;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67014:785;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33456:353;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65634:39;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55361:145;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40127:139;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65317:38;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38105:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20579:311;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55680:134;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65360:62;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56164:170;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66316:591;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65476:83;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20962:168;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21202:401;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33127:321;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19585:231;19671:7;19718:1;19699:21;;:7;:21;;;;19691:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;19786:9;:13;19796:2;19786:13;;;;;;;;;;;:22;19800:7;19786:22;;;;;;;;;;;;;;;;19779:29;;19585:231;;;;:::o;68057:187::-;68176:4;68200:36;68224:11;68200:23;:36::i;:::-;68193:43;;68057:187;;;:::o;65269:43::-;;;;;;;;;;;;;;;;;;;:::o;67807:178::-;67871:13;67966:4;:9;67971:3;67966:9;;;;;;;;;;;67911:65;;;;;;;;:::i;:::-;;;;;;;;;;;;;67897:80;;67807:178;;;:::o;41242:123::-;41308:7;41335:6;:12;41342:4;41335:12;;;;;;;;;;;:22;;;41328:29;;41242:123;;;:::o;21680:442::-;21921:12;:10;:12::i;:::-;21913:20;;:4;:20;;;:60;;;;21937:36;21954:4;21960:12;:10;:12::i;:::-;21937:16;:36::i;:::-;21913:60;21891:160;;;;;;;;;;;;:::i;:::-;;;;;;;;;22062:52;22085:4;22091:2;22095:3;22100:7;22109:4;22062:22;:52::i;:::-;21680:442;;;;;:::o;55906:165::-;55991:30;56007:4;56013:7;55991:15;:30::i;:::-;56032:31;56055:7;56032:12;:18;56045:4;56032:18;;;;;;;;;;;:22;;:31;;;;:::i;:::-;;55906:165;;:::o;65427:44::-;65466:5;65427:44;:::o;56429:174::-;56517:33;56536:4;56542:7;56517:18;:33::i;:::-;56561:34;56587:7;56561:12;:18;56574:4;56561:18;;;;;;;;;;;:25;;:34;;;;:::i;:::-;;56429:174;;:::o;19982:524::-;20138:16;20199:3;:10;20180:8;:15;:29;20172:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;20268:30;20315:8;:15;20301:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20268:63;;20349:9;20344:122;20368:8;:15;20364:1;:19;20344:122;;;20424:30;20434:8;20443:1;20434:11;;;;;;;;;;;;;;;;;;;;;;20447:3;20451:1;20447:6;;;;;;;;;;;;;;;;;;;;;;20424:9;:30::i;:::-;20405:13;20419:1;20405:16;;;;;;;;;;;;;;;;;;;;;:49;;;;;20385:3;;;;:::i;:::-;;;20344:122;;;;20485:13;20478:20;;;19982:524;;;;:::o;67014:785::-;67192:13;67208:14;:12;:14::i;:::-;67192:30;;65466:5;67249:3;:10;67241:5;:18;;;;:::i;:::-;:34;;67233:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;65466:5;67308;:21;;67300:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;67361:34;65398:24;67382:12;:10;:12::i;:::-;67361:7;:34::i;:::-;67353:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;67451:34;67462:2;67466:3;67471:7;67480:4;67451:10;:34::i;:::-;67503:6;67498:294;67519:3;:10;67515:1;:14;67498:294;;;67549:27;:15;:25;:27::i;:::-;67620:1;67601:5;;67607:1;67601:8;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67595:22;;:26;67591:84;;;67653:5;;67659:1;67653:8;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67638:4;:12;67643:3;67647:1;67643:6;;;;;;;;;;;;;;;;;;;;;;67638:12;;;;;;;;;;;:23;;;;;;;:::i;:::-;;67591:84;67718:1;67697:7;;67705:1;67697:10;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67691:24;;:28;67687:94;;;67760:3;67764:1;67760:6;;;;;;;;;;;;;;;;;;;;;;67741:26;67748:7;;67756:1;67748:10;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67741:26;;;;;;;:::i;:::-;;;;;;;;67687:94;67531:3;;;;;:::i;:::-;;;;67498:294;;;;67014:785;;;;;;;;;:::o;33456:353::-;33632:12;:10;:12::i;:::-;33621:23;;:7;:23;;;:66;;;;33648:39;33665:7;33674:12;:10;:12::i;:::-;33648:16;:39::i;:::-;33621:66;33599:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;33769:32;33780:7;33789:3;33794:6;33769:10;:32::i;:::-;33456:353;;;:::o;65634:39::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;55361:145::-;55443:7;55470:28;55492:5;55470:12;:18;55483:4;55470:18;;;;;;;;;;;:21;;:28;;;;:::i;:::-;55463:35;;55361:145;;;;:::o;40127:139::-;40205:4;40229:6;:12;40236:4;40229:12;;;;;;;;;;;:20;;:29;40250:7;40229:29;;;;;;;;;;;;;;;;;;;;;;;;;40222:36;;40127:139;;;;:::o;65317:38::-;;;;;;;;;;;;;;;;;;;:::o;38105:49::-;38150:4;38105:49;;;:::o;20579:311::-;20698:8;20682:24;;:12;:10;:12::i;:::-;:24;;;;20674:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;20810:8;20765:18;:32;20784:12;:10;:12::i;:::-;20765:32;;;;;;;;;;;;;;;:42;20798:8;20765:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;20863:8;20834:48;;20849:12;:10;:12::i;:::-;20834:48;;;20873:8;20834:48;;;;;;:::i;:::-;;;;;;;;20579:311;;:::o;55680:134::-;55752:7;55779:27;:12;:18;55792:4;55779:18;;;;;;;;;;;:25;:27::i;:::-;55772:34;;55680:134;;;:::o;65360:62::-;65398:24;65360:62;:::o;56164:170::-;56250:31;56267:4;56273:7;56250:16;:31::i;:::-;56292:34;56318:7;56292:12;:18;56305:4;56292:18;;;;;;;;;;;:25;;:34;;;;:::i;:::-;;56164:170;;:::o;66316:591::-;66463:13;66479:14;:12;:14::i;:::-;66463:30;;65466:5;66520:1;66512:5;:9;;;;:::i;:::-;:25;;66504:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;65466:5;66570;:21;;66562:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;66623:34;65398:24;66644:12;:10;:12::i;:::-;66623:7;:34::i;:::-;66615:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;66741:1;66723:7;;66717:21;;:25;66713:80;;;66778:2;66762:19;66769:7;;66762:19;;;;;;;:::i;:::-;;;;;;;;66713:80;66805:27;:15;:25;:27::i;:::-;66856:3;;66845:4;:8;66850:2;66845:8;;;;;;;;;;;:14;;;;;;;:::i;:::-;;66872:27;66878:2;66882;66886:6;66894:4;66872:5;:27::i;:::-;66316:591;;;;;;;;;:::o;65476:83::-;65517:42;65476:83;:::o;20962:168::-;21061:4;21085:18;:27;21104:7;21085:27;;;;;;;;;;;;;;;:37;21113:8;21085:37;;;;;;;;;;;;;;;;;;;;;;;;;21078:44;;20962:168;;;;:::o;21202:401::-;21418:12;:10;:12::i;:::-;21410:20;;:4;:20;;;:60;;;;21434:36;21451:4;21457:12;:10;:12::i;:::-;21434:16;:36::i;:::-;21410:60;21388:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;21550:45;21568:4;21574:2;21578;21582:6;21590:4;21550:17;:45::i;:::-;21202:401;;;;;:::o;33127:321::-;33278:12;:10;:12::i;:::-;33267:23;;:7;:23;;;:66;;;;33294:39;33311:7;33320:12;:10;:12::i;:::-;33294:16;:39::i;:::-;33267:66;33245:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;33415:25;33421:7;33430:2;33434:5;33415;:25::i;:::-;33127:321;;;:::o;43476:112::-;43555:25;43566:4;43572:7;43555:10;:25::i;:::-;43476:112;;:::o;50769:152::-;50839:4;50863:50;50868:3;:10;;50904:5;50888:23;;50880:32;;50863:4;:50::i;:::-;50856:57;;50769:152;;;;:::o;18608:310::-;18710:4;18762:26;18747:41;;;:11;:41;;;;:110;;;;18820:37;18805:52;;;:11;:52;;;;18747:110;:163;;;;18874:36;18898:11;18874:23;:36::i;:::-;18747:163;18727:183;;18608:310;;;:::o;16618:98::-;16671:7;16698:10;16691:17;;16618:98;:::o;23764:1074::-;23991:7;:14;23977:3;:10;:28;23969:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;24083:1;24069:16;;:2;:16;;;;24061:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;24140:16;24159:12;:10;:12::i;:::-;24140:31;;24184:60;24205:8;24215:4;24221:2;24225:3;24230:7;24239:4;24184:20;:60::i;:::-;24262:9;24257:421;24281:3;:10;24277:1;:14;24257:421;;;24313:10;24326:3;24330:1;24326:6;;;;;;;;;;;;;;;;;;;;;;24313:19;;24347:14;24364:7;24372:1;24364:10;;;;;;;;;;;;;;;;;;;;;;24347:27;;24391:19;24413:9;:13;24423:2;24413:13;;;;;;;;;;;:19;24427:4;24413:19;;;;;;;;;;;;;;;;24391:41;;24470:6;24455:11;:21;;24447:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;24603:6;24589:11;:20;24567:9;:13;24577:2;24567:13;;;;;;;;;;;:19;24581:4;24567:19;;;;;;;;;;;;;;;:42;;;;24660:6;24639:9;:13;24649:2;24639:13;;;;;;;;;;;:17;24653:2;24639:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;24257:421;;;24293:3;;;;:::i;:::-;;;24257:421;;;;24725:2;24695:47;;24719:4;24695:47;;24709:8;24695:47;;;24729:3;24734:7;24695:47;;;;;;;:::i;:::-;;;;;;;;24755:75;24791:8;24801:4;24807:2;24811:3;24816:7;24825:4;24755:35;:75::i;:::-;23764:1074;;;;;;:::o;41627:147::-;41710:18;41723:4;41710:12;:18::i;:::-;39709:30;39720:4;39726:12;:10;:12::i;:::-;39709:10;:30::i;:::-;41741:25:::1;41752:4;41758:7;41741:10;:25::i;:::-;41627:147:::0;;;:::o;42675:218::-;42782:12;:10;:12::i;:::-;42771:23;;:7;:23;;;42763:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;42859:26;42871:4;42877:7;42859:11;:26::i;:::-;42675:218;;:::o;51097:158::-;51170:4;51194:53;51202:3;:10;;51238:5;51222:23;;51214:32;;51194:7;:53::i;:::-;51187:60;;51097:158;;;;:::o;65990:104::-;66037:4;66061:25;:15;:23;:25::i;:::-;66054:32;;65990:104;:::o;27126:735::-;27318:1;27304:16;;:2;:16;;;;27296:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;27391:7;:14;27377:3;:10;:28;27369:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;27463:16;27482:12;:10;:12::i;:::-;27463:31;;27507:66;27528:8;27546:1;27550:2;27554:3;27559:7;27568:4;27507:20;:66::i;:::-;27591:9;27586:103;27610:3;:10;27606:1;:14;27586:103;;;27667:7;27675:1;27667:10;;;;;;;;;;;;;;;;;;;;;;27642:9;:17;27652:3;27656:1;27652:6;;;;;;;;;;;;;;;;;;;;;;27642:17;;;;;;;;;;;:21;27660:2;27642:21;;;;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;;;;;27622:3;;;;;:::i;:::-;;;;27586:103;;;;27742:2;27706:53;;27738:1;27706:53;;27720:8;27706:53;;;27746:3;27751:7;27706:53;;;;;;;:::i;:::-;;;;;;;;27772:81;27808:8;27826:1;27830:2;27834:3;27839:7;27848:4;27772:35;:81::i;:::-;27126:735;;;;;:::o;64599:127::-;64706:1;64688:7;:14;;;:19;;;;;;;;;;;64599:127;:::o;28998:918::-;29172:1;29153:21;;:7;:21;;;;29145:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;29247:7;:14;29233:3;:10;:28;29225:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;29319:16;29338:12;:10;:12::i;:::-;29319:31;;29363:69;29384:8;29394:7;29411:1;29415:3;29420:7;29363:69;;;;;;;;;;;;:20;:69::i;:::-;29450:9;29445:388;29469:3;:10;29465:1;:14;29445:388;;;29501:10;29514:3;29518:1;29514:6;;;;;;;;;;;;;;;;;;;;;;29501:19;;29535:14;29552:7;29560:1;29552:10;;;;;;;;;;;;;;;;;;;;;;29535:27;;29579:22;29604:9;:13;29614:2;29604:13;;;;;;;;;;;:22;29618:7;29604:22;;;;;;;;;;;;;;;;29579:47;;29667:6;29649:14;:24;;29641:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29800:6;29783:14;:23;29758:9;:13;29768:2;29758:13;;;;;;;;;;;:22;29772:7;29758:22;;;;;;;;;;;;;;;:48;;;;29445:388;;;29481:3;;;;;:::i;:::-;;;;29445:388;;;;29891:1;29850:58;;29874:7;29850:58;;29864:8;29850:58;;;29895:3;29900:7;29850:58;;;;;;;:::i;:::-;;;;;;;;28998:918;;;;:::o;52065:158::-;52139:7;52190:22;52194:3;:10;;52206:5;52190:3;:22::i;:::-;52182:31;;52159:56;;52065:158;;;;:::o;51594:117::-;51657:7;51684:19;51692:3;:10;;51684:7;:19::i;:::-;51677:26;;51594:117;;;:::o;42019:149::-;42103:18;42116:4;42103:12;:18::i;:::-;39709:30;39720:4;39726:12;:10;:12::i;:::-;39709:10;:30::i;:::-;42134:26:::1;42146:4;42152:7;42134:11;:26::i;:::-;42019:149:::0;;;:::o;26171:599::-;26348:1;26329:21;;:7;:21;;;;26321:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;26401:16;26420:12;:10;:12::i;:::-;26401:31;;26445:107;26466:8;26484:1;26488:7;26497:21;26515:2;26497:17;:21::i;:::-;26520:25;26538:6;26520:17;:25::i;:::-;26547:4;26445:20;:107::i;:::-;26591:6;26565:9;:13;26575:2;26565:13;;;;;;;;;;;:22;26579:7;26565:22;;;;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;26650:7;26613:57;;26646:1;26613:57;;26628:8;26613:57;;;26659:2;26663:6;26613:57;;;;;;;:::i;:::-;;;;;;;;26683:79;26714:8;26732:1;26736:7;26745:2;26749:6;26757:4;26683:30;:79::i;:::-;26171:599;;;;;:::o;22586:820::-;22788:1;22774:16;;:2;:16;;;;22766:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;22845:16;22864:12;:10;:12::i;:::-;22845:31;;22889:96;22910:8;22920:4;22926:2;22930:21;22948:2;22930:17;:21::i;:::-;22953:25;22971:6;22953:17;:25::i;:::-;22980:4;22889:20;:96::i;:::-;22998:19;23020:9;:13;23030:2;23020:13;;;;;;;;;;;:19;23034:4;23020:19;;;;;;;;;;;;;;;;22998:41;;23073:6;23058:11;:21;;23050:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;23198:6;23184:11;:20;23162:9;:13;23172:2;23162:13;;;;;;;;;;;:19;23176:4;23162:19;;;;;;;;;;;;;;;:42;;;;23247:6;23226:9;:13;23236:2;23226:13;;;;;;;;;;;:17;23240:2;23226:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;23302:2;23271:46;;23296:4;23271:46;;23286:8;23271:46;;;23306:2;23310:6;23271:46;;;;;;;:::i;:::-;;;;;;;;23330:68;23361:8;23371:4;23377:2;23381;23385:6;23393:4;23330:30;:68::i;:::-;22586:820;;;;;;;:::o;28120:675::-;28269:1;28250:21;;:7;:21;;;;28242:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;28324:16;28343:12;:10;:12::i;:::-;28324:31;;28368:105;28389:8;28399:7;28416:1;28420:21;28438:2;28420:17;:21::i;:::-;28443:25;28461:6;28443:17;:25::i;:::-;28368:105;;;;;;;;;;;;:20;:105::i;:::-;28486:22;28511:9;:13;28521:2;28511:13;;;;;;;;;;;:22;28525:7;28511:22;;;;;;;;;;;;;;;;28486:47;;28570:6;28552:14;:24;;28544:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28695:6;28678:14;:23;28653:9;:13;28663:2;28653:13;;;;;;;;;;;:22;28667:7;28653:22;;;;;;;;;;;;;;;:48;;;;28772:1;28730:57;;28755:7;28730:57;;28745:8;28730:57;;;28776:2;28780:6;28730:57;;;;;;;:::i;:::-;;;;;;;;28120:675;;;;;:::o;43923:229::-;43998:22;44006:4;44012:7;43998;:22::i;:::-;43993:152;;44069:4;44037:6;:12;44044:4;44037:12;;;;;;;;;;;:20;;:29;44058:7;44037:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;44120:12;:10;:12::i;:::-;44093:40;;44111:7;44093:40;;44105:4;44093:40;;;;;;;;;;43993:152;43923:229;;:::o;46021:414::-;46084:4;46106:21;46116:3;46121:5;46106:9;:21::i;:::-;46101:327;;46144:3;:11;;46161:5;46144:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46327:3;:11;;:18;;;;46305:3;:12;;:19;46318:5;46305:19;;;;;;;;;;;:40;;;;46367:4;46360:11;;;;46101:327;46411:5;46404:12;;46021:414;;;;;:::o;54548:214::-;54633:4;54672:42;54657:57;;;:11;:57;;;;:97;;;;54718:36;54742:11;54718:23;:36::i;:::-;54657:97;54650:104;;54548:214;;;:::o;30872:221::-;;;;;;;:::o;31857:817::-;32097:15;:2;:13;;;:15::i;:::-;32093:574;;;32150:2;32133:43;;;32177:8;32187:4;32193:3;32198:7;32207:4;32133:79;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;32129:527;;;;:::i;:::-;;;;;;;;32529:6;32522:14;;;;;;;;;;;:::i;:::-;;;;;;;;32129:527;32578:62;;;;;;;;;;:::i;:::-;;;;;;;;32129:527;32306:52;;;32294:64;;;:8;:64;;;;32290:163;;32383:50;;;;;;;;;;:::i;:::-;;;;;;;;32290:163;32213:255;32093:574;31857:817;;;;;;:::o;40556:497::-;40637:22;40645:4;40651:7;40637;:22::i;:::-;40632:414;;40825:41;40853:7;40825:41;;40863:2;40825:19;:41::i;:::-;40939:38;40967:4;40959:13;;40974:2;40939:19;:38::i;:::-;40730:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;40676:358;;;;;;;;;;;:::i;:::-;;;;;;;;40632:414;40556:497;;:::o;44160:230::-;44235:22;44243:4;44249:7;44235;:22::i;:::-;44231:152;;;44306:5;44274:6;:12;44281:4;44274:12;;;;;;;;;;;:20;;:29;44295:7;44274:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;44358:12;:10;:12::i;:::-;44331:40;;44349:7;44331:40;;44343:4;44331:40;;;;;;;;;;44231:152;44160:230;;:::o;46611:1420::-;46677:4;46795:18;46816:3;:12;;:19;46829:5;46816:19;;;;;;;;;;;;46795:40;;46866:1;46852:10;:15;46848:1176;;47227:21;47264:1;47251:10;:14;;;;:::i;:::-;47227:38;;47280:17;47321:1;47300:3;:11;;:18;;;;:22;;;;:::i;:::-;47280:42;;47356:13;47343:9;:26;47339:405;;47390:17;47410:3;:11;;47422:9;47410:22;;;;;;;;;;;;;;;;;;;;;;;;47390:42;;47564:9;47535:3;:11;;47547:13;47535:26;;;;;;;;;;;;;;;;;;;;;;;:38;;;;47675:10;47649:3;:12;;:23;47662:9;47649:23;;;;;;;;;;;:36;;;;47339:405;;47825:3;:11;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47920:3;:12;;:19;47933:5;47920:19;;;;;;;;;;;47913:26;;;47963:4;47956:11;;;;;;;46848:1176;48007:5;48000:12;;;46611:1420;;;;;:::o;64477:114::-;64542:7;64569;:14;;;64562:21;;64477:114;;;:::o;48795:120::-;48862:7;48889:3;:11;;48901:5;48889:18;;;;;;;;;;;;;;;;;;;;;;;;48882:25;;48795:120;;;;:::o;48332:109::-;48388:7;48415:3;:11;;:18;;;;48408:25;;48332:109;;;:::o;32682:198::-;32748:16;32777:22;32816:1;32802:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32777:41;;32840:7;32829:5;32835:1;32829:8;;;;;;;;;;;;;;;;;;;;;:18;;;;;32867:5;32860:12;;;32682:198;;;:::o;31101:748::-;31316:15;:2;:13;;;:15::i;:::-;31312:530;;;31369:2;31352:38;;;31391:8;31401:4;31407:2;31411:6;31419:4;31352:72;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31348:483;;;;:::i;:::-;;;;;;;;31704:6;31697:14;;;;;;;;;;;:::i;:::-;;;;;;;;31348:483;31753:62;;;;;;;;;;:::i;:::-;;;;;;;;31348:483;31486:47;;;31474:59;;;:8;:59;;;;31470:158;;31558:50;;;;;;;;;;:::i;:::-;;;;;;;;31470:158;31425:218;31312:530;31101:748;;;;;;:::o;48117:129::-;48190:4;48237:1;48214:3;:12;;:19;48227:5;48214:19;;;;;;;;;;;;:24;;48207:31;;48117:129;;;;:::o;39831:204::-;39916:4;39955:32;39940:47;;;:11;:47;;;;:87;;;;39991:36;40015:11;39991:23;:36::i;:::-;39940:87;39933:94;;39831:204;;;:::o;8961:387::-;9021:4;9229:12;9296:7;9284:20;9276:28;;9339:1;9332:4;:8;9325:15;;;8961:387;;;:::o;35355:451::-;35430:13;35456:19;35501:1;35492:6;35488:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;35478:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35456:47;;35514:15;:6;35521:1;35514:9;;;;;;;;;;;;;;;;;;;:15;;;;;;;;;;;35540;:6;35547:1;35540:9;;;;;;;;;;;;;;;;;;;:15;;;;;;;;;;;35571:9;35596:1;35587:6;35583:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;35571:26;;35566:135;35603:1;35599;:5;35566:135;;;35638:12;35659:3;35651:5;:11;35638:25;;;;;;;;;;;;;;;;;;35626:6;35633:1;35626:9;;;;;;;;;;;;;;;;;;;:37;;;;;;;;;;;35688:1;35678:11;;;;;35606:3;;;;:::i;:::-;;;35566:135;;;;35728:1;35719:5;:10;35711:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;35791:6;35777:21;;;35355:451;;;;:::o;17534:157::-;17619:4;17658:25;17643:40;;;:11;:40;;;;17636:47;;17534:157;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:622:1:-;;145:80;160:64;217:6;160:64;:::i;:::-;145:80;:::i;:::-;136:89;;245:5;273:6;266:5;259:21;299:4;292:5;288:16;281:23;;324:6;374:3;366:4;358:6;354:17;349:3;345:27;342:36;339:2;;;391:1;388;381:12;339:2;419:1;404:236;429:6;426:1;423:13;404:236;;;496:3;524:37;557:3;545:10;524:37;:::i;:::-;519:3;512:50;591:4;586:3;582:14;575:21;;625:4;620:3;616:14;609:21;;464:176;451:1;448;444:9;439:14;;404:236;;;408:14;126:520;;;;;;;:::o;669:622::-;;790:80;805:64;862:6;805:64;:::i;:::-;790:80;:::i;:::-;781:89;;890:5;918:6;911:5;904:21;944:4;937:5;933:16;926:23;;969:6;1019:3;1011:4;1003:6;999:17;994:3;990:27;987:36;984:2;;;1036:1;1033;1026:12;984:2;1064:1;1049:236;1074:6;1071:1;1068:13;1049:236;;;1141:3;1169:37;1202:3;1190:10;1169:37;:::i;:::-;1164:3;1157:50;1236:4;1231:3;1227:14;1220:21;;1270:4;1265:3;1261:14;1254:21;;1109:176;1096:1;1093;1089:9;1084:14;;1049:236;;;1053:14;771:520;;;;;;;:::o;1297:342::-;;1399:64;1414:48;1455:6;1414:48;:::i;:::-;1399:64;:::i;:::-;1390:73;;1486:6;1479:5;1472:21;1524:4;1517:5;1513:16;1562:3;1553:6;1548:3;1544:16;1541:25;1538:2;;;1579:1;1576;1569:12;1538:2;1592:41;1626:6;1621:3;1616;1592:41;:::i;:::-;1380:259;;;;;;:::o;1645:139::-;;1729:6;1716:20;1707:29;;1745:33;1772:5;1745:33;:::i;:::-;1697:87;;;;:::o;1807:303::-;;1927:3;1920:4;1912:6;1908:17;1904:27;1894:2;;1945:1;1942;1935:12;1894:2;1985:6;1972:20;2010:94;2100:3;2092:6;2085:4;2077:6;2073:17;2010:94;:::i;:::-;2001:103;;1884:226;;;;;:::o;2132:379::-;;;2277:3;2270:4;2262:6;2258:17;2254:27;2244:2;;2295:1;2292;2285:12;2244:2;2331:6;2318:20;2308:30;;2361:18;2353:6;2350:30;2347:2;;;2393:1;2390;2383:12;2347:2;2430:4;2422:6;2418:17;2406:29;;2484:3;2476:4;2468:6;2464:17;2454:8;2450:32;2447:41;2444:2;;;2501:1;2498;2491:12;2444:2;2234:277;;;;;:::o;2534:303::-;;2654:3;2647:4;2639:6;2635:17;2631:27;2621:2;;2672:1;2669;2662:12;2621:2;2712:6;2699:20;2737:94;2827:3;2819:6;2812:4;2804:6;2800:17;2737:94;:::i;:::-;2728:103;;2611:226;;;;;:::o;2843:133::-;;2924:6;2911:20;2902:29;;2940:30;2964:5;2940:30;:::i;:::-;2892:84;;;;:::o;2982:139::-;;3066:6;3053:20;3044:29;;3082:33;3109:5;3082:33;:::i;:::-;3034:87;;;;:::o;3127:137::-;;3210:6;3197:20;3188:29;;3226:32;3252:5;3226:32;:::i;:::-;3178:86;;;;:::o;3270:141::-;;3357:6;3351:13;3342:22;;3373:32;3399:5;3373:32;:::i;:::-;3332:79;;;;:::o;3430:271::-;;3534:3;3527:4;3519:6;3515:17;3511:27;3501:2;;3552:1;3549;3542:12;3501:2;3592:6;3579:20;3617:78;3691:3;3683:6;3676:4;3668:6;3664:17;3617:78;:::i;:::-;3608:87;;3491:210;;;;;:::o;3721:352::-;;;3839:3;3832:4;3824:6;3820:17;3816:27;3806:2;;3857:1;3854;3847:12;3806:2;3893:6;3880:20;3870:30;;3923:18;3915:6;3912:30;3909:2;;;3955:1;3952;3945:12;3909:2;3992:4;3984:6;3980:17;3968:29;;4046:3;4038:4;4030:6;4026:17;4016:8;4012:32;4009:41;4006:2;;;4063:1;4060;4053:12;4006:2;3796:277;;;;;:::o;4079:139::-;;4163:6;4150:20;4141:29;;4179:33;4206:5;4179:33;:::i;:::-;4131:87;;;;:::o;4224:407::-;;;4349:2;4337:9;4328:7;4324:23;4320:32;4317:2;;;4365:1;4362;4355:12;4317:2;4408:1;4433:53;4478:7;4469:6;4458:9;4454:22;4433:53;:::i;:::-;4423:63;;4379:117;4535:2;4561:53;4606:7;4597:6;4586:9;4582:22;4561:53;:::i;:::-;4551:63;;4506:118;4307:324;;;;;:::o;4637:1241::-;;;;;;4872:3;4860:9;4851:7;4847:23;4843:33;4840:2;;;4889:1;4886;4879:12;4840:2;4932:1;4957:53;5002:7;4993:6;4982:9;4978:22;4957:53;:::i;:::-;4947:63;;4903:117;5059:2;5085:53;5130:7;5121:6;5110:9;5106:22;5085:53;:::i;:::-;5075:63;;5030:118;5215:2;5204:9;5200:18;5187:32;5246:18;5238:6;5235:30;5232:2;;;5278:1;5275;5268:12;5232:2;5306:78;5376:7;5367:6;5356:9;5352:22;5306:78;:::i;:::-;5296:88;;5158:236;5461:2;5450:9;5446:18;5433:32;5492:18;5484:6;5481:30;5478:2;;;5524:1;5521;5514:12;5478:2;5552:78;5622:7;5613:6;5602:9;5598:22;5552:78;:::i;:::-;5542:88;;5404:236;5707:3;5696:9;5692:19;5679:33;5739:18;5731:6;5728:30;5725:2;;;5771:1;5768;5761:12;5725:2;5799:62;5853:7;5844:6;5833:9;5829:22;5799:62;:::i;:::-;5789:72;;5650:221;4830:1048;;;;;;;;:::o;5884:955::-;;;;;;6069:3;6057:9;6048:7;6044:23;6040:33;6037:2;;;6086:1;6083;6076:12;6037:2;6129:1;6154:53;6199:7;6190:6;6179:9;6175:22;6154:53;:::i;:::-;6144:63;;6100:117;6256:2;6282:53;6327:7;6318:6;6307:9;6303:22;6282:53;:::i;:::-;6272:63;;6227:118;6384:2;6410:53;6455:7;6446:6;6435:9;6431:22;6410:53;:::i;:::-;6400:63;;6355:118;6512:2;6538:53;6583:7;6574:6;6563:9;6559:22;6538:53;:::i;:::-;6528:63;;6483:118;6668:3;6657:9;6653:19;6640:33;6700:18;6692:6;6689:30;6686:2;;;6732:1;6729;6722:12;6686:2;6760:62;6814:7;6805:6;6794:9;6790:22;6760:62;:::i;:::-;6750:72;;6611:221;6027:812;;;;;;;;:::o;6845:838::-;;;;7037:2;7025:9;7016:7;7012:23;7008:32;7005:2;;;7053:1;7050;7043:12;7005:2;7096:1;7121:53;7166:7;7157:6;7146:9;7142:22;7121:53;:::i;:::-;7111:63;;7067:117;7251:2;7240:9;7236:18;7223:32;7282:18;7274:6;7271:30;7268:2;;;7314:1;7311;7304:12;7268:2;7342:78;7412:7;7403:6;7392:9;7388:22;7342:78;:::i;:::-;7332:88;;7194:236;7497:2;7486:9;7482:18;7469:32;7528:18;7520:6;7517:30;7514:2;;;7560:1;7557;7550:12;7514:2;7588:78;7658:7;7649:6;7638:9;7634:22;7588:78;:::i;:::-;7578:88;;7440:236;6995:688;;;;;:::o;7689:1761::-;;;;;;;;;8035:3;8023:9;8014:7;8010:23;8006:33;8003:2;;;8052:1;8049;8042:12;8003:2;8095:1;8120:53;8165:7;8156:6;8145:9;8141:22;8120:53;:::i;:::-;8110:63;;8066:117;8250:2;8239:9;8235:18;8222:32;8281:18;8273:6;8270:30;8267:2;;;8313:1;8310;8303:12;8267:2;8341:78;8411:7;8402:6;8391:9;8387:22;8341:78;:::i;:::-;8331:88;;8193:236;8496:2;8485:9;8481:18;8468:32;8527:18;8519:6;8516:30;8513:2;;;8559:1;8556;8549:12;8513:2;8587:78;8657:7;8648:6;8637:9;8633:22;8587:78;:::i;:::-;8577:88;;8439:236;8742:2;8731:9;8727:18;8714:32;8773:18;8765:6;8762:30;8759:2;;;8805:1;8802;8795:12;8759:2;8833:62;8887:7;8878:6;8867:9;8863:22;8833:62;:::i;:::-;8823:72;;8685:220;8972:3;8961:9;8957:19;8944:33;9004:18;8996:6;8993:30;8990:2;;;9036:1;9033;9026:12;8990:2;9072:92;9156:7;9147:6;9136:9;9132:22;9072:92;:::i;:::-;9054:110;;;;8915:259;9241:3;9230:9;9226:19;9213:33;9273:18;9265:6;9262:30;9259:2;;;9305:1;9302;9295:12;9259:2;9341:92;9425:7;9416:6;9405:9;9401:22;9341:92;:::i;:::-;9323:110;;;;9184:259;7993:1457;;;;;;;;;;;:::o;9456:401::-;;;9578:2;9566:9;9557:7;9553:23;9549:32;9546:2;;;9594:1;9591;9584:12;9546:2;9637:1;9662:53;9707:7;9698:6;9687:9;9683:22;9662:53;:::i;:::-;9652:63;;9608:117;9764:2;9790:50;9832:7;9823:6;9812:9;9808:22;9790:50;:::i;:::-;9780:60;;9735:115;9536:321;;;;;:::o;9863:407::-;;;9988:2;9976:9;9967:7;9963:23;9959:32;9956:2;;;10004:1;10001;9994:12;9956:2;10047:1;10072:53;10117:7;10108:6;10097:9;10093:22;10072:53;:::i;:::-;10062:63;;10018:117;10174:2;10200:53;10245:7;10236:6;10225:9;10221:22;10200:53;:::i;:::-;10190:63;;10145:118;9946:324;;;;;:::o;10276:552::-;;;;10418:2;10406:9;10397:7;10393:23;10389:32;10386:2;;;10434:1;10431;10424:12;10386:2;10477:1;10502:53;10547:7;10538:6;10527:9;10523:22;10502:53;:::i;:::-;10492:63;;10448:117;10604:2;10630:53;10675:7;10666:6;10655:9;10651:22;10630:53;:::i;:::-;10620:63;;10575:118;10732:2;10758:53;10803:7;10794:6;10783:9;10779:22;10758:53;:::i;:::-;10748:63;;10703:118;10376:452;;;;;:::o;10834:1367::-;;;;;;;;;11076:3;11064:9;11055:7;11051:23;11047:33;11044:2;;;11093:1;11090;11083:12;11044:2;11136:1;11161:53;11206:7;11197:6;11186:9;11182:22;11161:53;:::i;:::-;11151:63;;11107:117;11263:2;11289:53;11334:7;11325:6;11314:9;11310:22;11289:53;:::i;:::-;11279:63;;11234:118;11391:2;11417:53;11462:7;11453:6;11442:9;11438:22;11417:53;:::i;:::-;11407:63;;11362:118;11547:2;11536:9;11532:18;11519:32;11578:18;11570:6;11567:30;11564:2;;;11610:1;11607;11600:12;11564:2;11638:62;11692:7;11683:6;11672:9;11668:22;11638:62;:::i;:::-;11628:72;;11490:220;11777:3;11766:9;11762:19;11749:33;11809:18;11801:6;11798:30;11795:2;;;11841:1;11838;11831:12;11795:2;11877:65;11934:7;11925:6;11914:9;11910:22;11877:65;:::i;:::-;11859:83;;;;11720:232;12019:3;12008:9;12004:19;11991:33;12051:18;12043:6;12040:30;12037:2;;;12083:1;12080;12073:12;12037:2;12119:65;12176:7;12167:6;12156:9;12152:22;12119:65;:::i;:::-;12101:83;;;;11962:232;11034:1167;;;;;;;;;;;:::o;12207:693::-;;;12382:2;12370:9;12361:7;12357:23;12353:32;12350:2;;;12398:1;12395;12388:12;12350:2;12469:1;12458:9;12454:17;12441:31;12499:18;12491:6;12488:30;12485:2;;;12531:1;12528;12521:12;12485:2;12559:78;12629:7;12620:6;12609:9;12605:22;12559:78;:::i;:::-;12549:88;;12412:235;12714:2;12703:9;12699:18;12686:32;12745:18;12737:6;12734:30;12731:2;;;12777:1;12774;12767:12;12731:2;12805:78;12875:7;12866:6;12855:9;12851:22;12805:78;:::i;:::-;12795:88;;12657:236;12340:560;;;;;:::o;12906:262::-;;13014:2;13002:9;12993:7;12989:23;12985:32;12982:2;;;13030:1;13027;13020:12;12982:2;13073:1;13098:53;13143:7;13134:6;13123:9;13119:22;13098:53;:::i;:::-;13088:63;;13044:117;12972:196;;;;:::o;13174:407::-;;;13299:2;13287:9;13278:7;13274:23;13270:32;13267:2;;;13315:1;13312;13305:12;13267:2;13358:1;13383:53;13428:7;13419:6;13408:9;13404:22;13383:53;:::i;:::-;13373:63;;13329:117;13485:2;13511:53;13556:7;13547:6;13536:9;13532:22;13511:53;:::i;:::-;13501:63;;13456:118;13257:324;;;;;:::o;13587:407::-;;;13712:2;13700:9;13691:7;13687:23;13683:32;13680:2;;;13728:1;13725;13718:12;13680:2;13771:1;13796:53;13841:7;13832:6;13821:9;13817:22;13796:53;:::i;:::-;13786:63;;13742:117;13898:2;13924:53;13969:7;13960:6;13949:9;13945:22;13924:53;:::i;:::-;13914:63;;13869:118;13670:324;;;;;:::o;14000:260::-;;14107:2;14095:9;14086:7;14082:23;14078:32;14075:2;;;14123:1;14120;14113:12;14075:2;14166:1;14191:52;14235:7;14226:6;14215:9;14211:22;14191:52;:::i;:::-;14181:62;;14137:116;14065:195;;;;:::o;14266:282::-;;14384:2;14372:9;14363:7;14359:23;14355:32;14352:2;;;14400:1;14397;14390:12;14352:2;14443:1;14468:63;14523:7;14514:6;14503:9;14499:22;14468:63;:::i;:::-;14458:73;;14414:127;14342:206;;;;:::o;14554:262::-;;14662:2;14650:9;14641:7;14637:23;14633:32;14630:2;;;14678:1;14675;14668:12;14630:2;14721:1;14746:53;14791:7;14782:6;14771:9;14767:22;14746:53;:::i;:::-;14736:63;;14692:117;14620:196;;;;:::o;14822:179::-;;14912:46;14954:3;14946:6;14912:46;:::i;:::-;14990:4;14985:3;14981:14;14967:28;;14902:99;;;;:::o;15007:118::-;15094:24;15112:5;15094:24;:::i;:::-;15089:3;15082:37;15072:53;;:::o;15161:732::-;;15309:54;15357:5;15309:54;:::i;:::-;15379:86;15458:6;15453:3;15379:86;:::i;:::-;15372:93;;15489:56;15539:5;15489:56;:::i;:::-;15568:7;15599:1;15584:284;15609:6;15606:1;15603:13;15584:284;;;15685:6;15679:13;15712:63;15771:3;15756:13;15712:63;:::i;:::-;15705:70;;15798:60;15851:6;15798:60;:::i;:::-;15788:70;;15644:224;15631:1;15628;15624:9;15619:14;;15584:284;;;15588:14;15884:3;15877:10;;15285:608;;;;;;;:::o;15899:109::-;15980:21;15995:5;15980:21;:::i;:::-;15975:3;15968:34;15958:50;;:::o;16014:118::-;16101:24;16119:5;16101:24;:::i;:::-;16096:3;16089:37;16079:53;;:::o;16138:360::-;;16252:38;16284:5;16252:38;:::i;:::-;16306:70;16369:6;16364:3;16306:70;:::i;:::-;16299:77;;16385:52;16430:6;16425:3;16418:4;16411:5;16407:16;16385:52;:::i;:::-;16462:29;16484:6;16462:29;:::i;:::-;16457:3;16453:39;16446:46;;16228:270;;;;;:::o;16528:304::-;;16647:71;16711:6;16706:3;16647:71;:::i;:::-;16640:78;;16728:43;16764:6;16759:3;16752:5;16728:43;:::i;:::-;16796:29;16818:6;16796:29;:::i;:::-;16791:3;16787:39;16780:46;;16630:202;;;;;:::o;16838:364::-;;16954:39;16987:5;16954:39;:::i;:::-;17009:71;17073:6;17068:3;17009:71;:::i;:::-;17002:78;;17089:52;17134:6;17129:3;17122:4;17115:5;17111:16;17089:52;:::i;:::-;17166:29;17188:6;17166:29;:::i;:::-;17161:3;17157:39;17150:46;;16930:272;;;;;:::o;17208:377::-;;17342:39;17375:5;17342:39;:::i;:::-;17397:89;17479:6;17474:3;17397:89;:::i;:::-;17390:96;;17495:52;17540:6;17535:3;17528:4;17521:5;17517:16;17495:52;:::i;:::-;17572:6;17567:3;17563:16;17556:23;;17318:267;;;;;:::o;17615:845::-;;17755:5;17749:12;17784:36;17810:9;17784:36;:::i;:::-;17836:89;17918:6;17913:3;17836:89;:::i;:::-;17829:96;;17956:1;17945:9;17941:17;17972:1;17967:137;;;;18118:1;18113:341;;;;17934:520;;17967:137;18051:4;18047:9;18036;18032:25;18027:3;18020:38;18087:6;18082:3;18078:16;18071:23;;17967:137;;18113:341;18180:38;18212:5;18180:38;:::i;:::-;18240:1;18254:154;18268:6;18265:1;18262:13;18254:154;;;18342:7;18336:14;18332:1;18327:3;18323:11;18316:35;18392:1;18383:7;18379:15;18368:26;;18290:4;18287:1;18283:12;18278:17;;18254:154;;;18437:6;18432:3;18428:16;18421:23;;18120:334;;17934:520;;17722:738;;;;;;:::o;18466:384::-;;18629:67;18693:2;18688:3;18629:67;:::i;:::-;18622:74;;18726:34;18722:1;18717:3;18713:11;18706:55;18792:22;18787:2;18782:3;18778:12;18771:44;18841:2;18836:3;18832:12;18825:19;;18612:238;;;:::o;18856:330::-;;19019:67;19083:2;19078:3;19019:67;:::i;:::-;19012:74;;19116:34;19112:1;19107:3;19103:11;19096:55;19177:2;19172:3;19168:12;19161:19;;19002:184;;;:::o;19192:372::-;;19355:67;19419:2;19414:3;19355:67;:::i;:::-;19348:74;;19452:34;19448:1;19443:3;19439:11;19432:55;19518:10;19513:2;19508:3;19504:12;19497:32;19555:2;19550:3;19546:12;19539:19;;19338:226;;;:::o;19570:375::-;;19733:67;19797:2;19792:3;19733:67;:::i;:::-;19726:74;;19830:34;19826:1;19821:3;19817:11;19810:55;19896:13;19891:2;19886:3;19882:12;19875:35;19936:2;19931:3;19927:12;19920:19;;19716:229;;;:::o;19951:368::-;;20114:67;20178:2;20173:3;20114:67;:::i;:::-;20107:74;;20211:34;20207:1;20202:3;20198:11;20191:55;20277:6;20272:2;20267:3;20263:12;20256:28;20310:2;20305:3;20301:12;20294:19;;20097:222;;;:::o;20325:373::-;;20488:67;20552:2;20547:3;20488:67;:::i;:::-;20481:74;;20585:34;20581:1;20576:3;20572:11;20565:55;20651:11;20646:2;20641:3;20637:12;20630:33;20689:2;20684:3;20680:12;20673:19;;20471:227;;;:::o;20704:306::-;;20867:66;20931:1;20926:3;20867:66;:::i;:::-;20860:73;;20963:11;20959:1;20954:3;20950:11;20943:32;21001:2;20996:3;20992:12;20985:19;;20850:160;;;:::o;21016:369::-;;21179:67;21243:2;21238:3;21179:67;:::i;:::-;21172:74;;21276:34;21272:1;21267:3;21263:11;21256:55;21342:7;21337:2;21332:3;21328:12;21321:29;21376:2;21371:3;21367:12;21360:19;;21162:223;;;:::o;21391:382::-;;21554:67;21618:2;21613:3;21554:67;:::i;:::-;21547:74;;21651:34;21647:1;21642:3;21638:11;21631:55;21717:20;21712:2;21707:3;21703:12;21696:42;21764:2;21759:3;21755:12;21748:19;;21537:236;;;:::o;21779:367::-;;21942:67;22006:2;22001:3;21942:67;:::i;:::-;21935:74;;22039:34;22035:1;22030:3;22026:11;22019:55;22105:5;22100:2;22095:3;22091:12;22084:27;22137:2;22132:3;22128:12;22121:19;;21925:221;;;:::o;22152:305::-;;22315:66;22379:1;22374:3;22315:66;:::i;:::-;22308:73;;22411:10;22407:1;22402:3;22398:11;22391:31;22448:2;22443:3;22439:12;22432:19;;22298:159;;;:::o;22463:374::-;;22626:67;22690:2;22685:3;22626:67;:::i;:::-;22619:74;;22723:34;22719:1;22714:3;22710:11;22703:55;22789:12;22784:2;22779:3;22775:12;22768:34;22828:2;22823:3;22819:12;22812:19;;22609:228;;;:::o;22843:370::-;;23006:67;23070:2;23065:3;23006:67;:::i;:::-;22999:74;;23103:34;23099:1;23094:3;23090:11;23083:55;23169:8;23164:2;23159:3;23155:12;23148:30;23204:2;23199:3;23195:12;23188:19;;22989:224;;;:::o;23219:414::-;;23400:85;23482:2;23477:3;23400:85;:::i;:::-;23393:92;;23515:34;23511:1;23506:3;23502:11;23495:55;23585:4;23580:2;23575:3;23571:12;23564:26;23620:2;23615:3;23611:12;23604:19;;23383:250;;;:::o;23643:373::-;;23828:85;23910:2;23905:3;23828:85;:::i;:::-;23821:92;;23947:25;23943:1;23938:3;23934:11;23927:46;24003:2;23998:3;23994:12;23987:19;;23807:209;;;:::o;24026:393::-;;24193:67;24257:2;24252:3;24193:67;:::i;:::-;24186:74;;24294:34;24290:1;24285:3;24281:11;24274:55;24364:11;24359:2;24354:3;24350:12;24343:33;24406:2;24401:3;24397:12;24390:19;;24172:247;;;:::o;24429:393::-;;24596:67;24660:2;24655:3;24596:67;:::i;:::-;24589:74;;24697:34;24693:1;24688:3;24684:11;24677:55;24767:11;24762:2;24757:3;24753:12;24746:33;24809:2;24804:3;24800:12;24793:19;;24575:247;;;:::o;24832:392::-;;24999:67;25063:2;25058:3;24999:67;:::i;:::-;24992:74;;25100:34;25096:1;25091:3;25087:11;25080:55;25170:10;25165:2;25160:3;25156:12;25149:32;25211:2;25206:3;25202:12;25195:19;;24978:246;;;:::o;25234:385::-;;25401:67;25465:2;25460:3;25401:67;:::i;:::-;25394:74;;25502:34;25498:1;25493:3;25489:11;25482:55;25572:3;25567:2;25562:3;25558:12;25551:25;25606:2;25601:3;25597:12;25590:19;;25380:239;;;:::o;25629:367::-;;25814:85;25896:2;25891:3;25814:85;:::i;:::-;25807:92;;25933:19;25929:1;25924:3;25920:11;25913:40;25983:2;25978:3;25974:12;25967:19;;25793:203;;;:::o;26006:399::-;;26173:67;26237:2;26232:3;26173:67;:::i;:::-;26166:74;;26274:34;26270:1;26265:3;26261:11;26254:55;26344:17;26339:2;26334:3;26330:12;26323:39;26392:2;26387:3;26383:12;26376:19;;26152:253;;;:::o;26415:116::-;26496:24;26514:5;26496:24;:::i;:::-;26491:3;26484:37;26470:61;;:::o;26541:126::-;26632:24;26650:5;26632:24;:::i;:::-;26627:3;26620:37;26606:61;;:::o;26677:551::-;;26933:148;27077:3;26933:148;:::i;:::-;26926:155;;27102:92;27190:3;27181:6;27102:92;:::i;:::-;27095:99;;27215:3;27208:10;;26911:317;;;;:::o;27238:991::-;;27646:148;27790:3;27646:148;:::i;:::-;27639:155;;27815:95;27906:3;27897:6;27815:95;:::i;:::-;27808:102;;27931:148;28075:3;27931:148;:::i;:::-;27924:155;;28100:95;28191:3;28182:6;28100:95;:::i;:::-;28093:102;;28216:3;28209:10;;27624:605;;;;;:::o;28239:234::-;;28374:2;28363:9;28359:18;28351:26;;28391:71;28459:1;28448:9;28444:17;28435:6;28391:71;:::i;:::-;28337:136;;;;:::o;28483:1093::-;;28848:3;28837:9;28833:19;28825:27;;28866:71;28934:1;28923:9;28919:17;28910:6;28866:71;:::i;:::-;28951:72;29019:2;29008:9;29004:18;28995:6;28951:72;:::i;:::-;29074:9;29068:4;29064:20;29059:2;29048:9;29044:18;29037:48;29106:108;29209:4;29200:6;29106:108;:::i;:::-;29098:116;;29265:9;29259:4;29255:20;29250:2;29239:9;29235:18;29228:48;29297:108;29400:4;29391:6;29297:108;:::i;:::-;29289:116;;29457:9;29451:4;29447:20;29441:3;29430:9;29426:19;29419:49;29489:76;29560:4;29551:6;29489:76;:::i;:::-;29481:84;;28811:765;;;;;;;;:::o;29586:783::-;;29851:3;29840:9;29836:19;29828:27;;29869:71;29937:1;29926:9;29922:17;29913:6;29869:71;:::i;:::-;29954:72;30022:2;30011:9;30007:18;29998:6;29954:72;:::i;:::-;30040;30108:2;30097:9;30093:18;30084:6;30040:72;:::i;:::-;30126;30194:2;30183:9;30179:18;30170:6;30126:72;:::i;:::-;30250:9;30244:4;30240:20;30234:3;30223:9;30219:19;30212:49;30282:76;30353:4;30344:6;30282:76;:::i;:::-;30274:84;;29814:555;;;;;;;;:::o;30379:389::-;;30564:2;30553:9;30549:18;30541:26;;30617:9;30611:4;30607:20;30603:1;30592:9;30588:17;30581:47;30649:108;30752:4;30743:6;30649:108;:::i;:::-;30641:116;;30527:241;;;;:::o;30778:658::-;;31041:2;31030:9;31026:18;31018:26;;31094:9;31088:4;31084:20;31080:1;31069:9;31065:17;31058:47;31126:108;31229:4;31220:6;31126:108;:::i;:::-;31118:116;;31285:9;31279:4;31275:20;31270:2;31259:9;31255:18;31248:48;31317:108;31420:4;31411:6;31317:108;:::i;:::-;31309:116;;31004:432;;;;;:::o;31446:222::-;;31575:2;31564:9;31560:18;31552:26;;31592:65;31654:1;31643:9;31639:17;31630:6;31592:65;:::i;:::-;31538:130;;;;:::o;31678:234::-;;31813:2;31802:9;31798:18;31790:26;;31830:71;31898:1;31887:9;31883:17;31874:6;31830:71;:::i;:::-;31776:136;;;;:::o;31922:349::-;;32087:2;32076:9;32072:18;32064:26;;32140:9;32134:4;32130:20;32126:1;32115:9;32111:17;32104:47;32172:88;32255:4;32246:6;32238;32172:88;:::i;:::-;32164:96;;32050:221;;;;;:::o;32281:329::-;;32436:2;32425:9;32421:18;32413:26;;32489:9;32483:4;32479:20;32475:1;32464:9;32460:17;32453:47;32521:78;32594:4;32585:6;32521:78;:::i;:::-;32513:86;;32399:211;;;;:::o;32620:435::-;;32828:2;32817:9;32813:18;32805:26;;32881:9;32875:4;32871:20;32867:1;32856:9;32852:17;32845:47;32913:131;33039:4;32913:131;:::i;:::-;32905:139;;32791:264;;;:::o;33065:435::-;;33273:2;33262:9;33258:18;33250:26;;33326:9;33320:4;33316:20;33312:1;33301:9;33297:17;33290:47;33358:131;33484:4;33358:131;:::i;:::-;33350:139;;33236:264;;;:::o;33510:435::-;;33718:2;33707:9;33703:18;33695:26;;33771:9;33765:4;33761:20;33757:1;33746:9;33742:17;33735:47;33803:131;33929:4;33803:131;:::i;:::-;33795:139;;33681:264;;;:::o;33955:435::-;;34163:2;34152:9;34148:18;34140:26;;34216:9;34210:4;34206:20;34202:1;34191:9;34187:17;34180:47;34248:131;34374:4;34248:131;:::i;:::-;34240:139;;34126:264;;;:::o;34400:435::-;;34608:2;34597:9;34593:18;34585:26;;34661:9;34655:4;34651:20;34647:1;34636:9;34632:17;34625:47;34693:131;34819:4;34693:131;:::i;:::-;34685:139;;34571:264;;;:::o;34845:435::-;;35053:2;35042:9;35038:18;35030:26;;35106:9;35100:4;35096:20;35092:1;35081:9;35077:17;35070:47;35138:131;35264:4;35138:131;:::i;:::-;35130:139;;35016:264;;;:::o;35290:435::-;;35498:2;35487:9;35483:18;35475:26;;35551:9;35545:4;35541:20;35537:1;35526:9;35522:17;35515:47;35583:131;35709:4;35583:131;:::i;:::-;35575:139;;35461:264;;;:::o;35735:435::-;;35943:2;35932:9;35928:18;35920:26;;35996:9;35990:4;35986:20;35982:1;35971:9;35967:17;35960:47;36028:131;36154:4;36028:131;:::i;:::-;36020:139;;35906:264;;;:::o;36180:435::-;;36388:2;36377:9;36373:18;36365:26;;36441:9;36435:4;36431:20;36427:1;36416:9;36412:17;36405:47;36473:131;36599:4;36473:131;:::i;:::-;36465:139;;36351:264;;;:::o;36625:435::-;;36833:2;36822:9;36818:18;36810:26;;36886:9;36880:4;36876:20;36872:1;36861:9;36857:17;36850:47;36918:131;37044:4;36918:131;:::i;:::-;36910:139;;36796:264;;;:::o;37070:435::-;;37278:2;37267:9;37263:18;37255:26;;37331:9;37325:4;37321:20;37317:1;37306:9;37302:17;37295:47;37363:131;37489:4;37363:131;:::i;:::-;37355:139;;37241:264;;;:::o;37515:435::-;;37723:2;37712:9;37708:18;37700:26;;37776:9;37770:4;37766:20;37762:1;37751:9;37747:17;37740:47;37808:131;37934:4;37808:131;:::i;:::-;37800:139;;37686:264;;;:::o;37960:435::-;;38168:2;38157:9;38153:18;38145:26;;38221:9;38215:4;38211:20;38207:1;38196:9;38192:17;38185:47;38253:131;38379:4;38253:131;:::i;:::-;38245:139;;38131:264;;;:::o;38405:435::-;;38613:2;38602:9;38598:18;38590:26;;38666:9;38660:4;38656:20;38652:1;38641:9;38637:17;38630:47;38698:131;38824:4;38698:131;:::i;:::-;38690:139;;38576:264;;;:::o;38850:435::-;;39058:2;39047:9;39043:18;39035:26;;39111:9;39105:4;39101:20;39097:1;39086:9;39082:17;39075:47;39143:131;39269:4;39143:131;:::i;:::-;39135:139;;39021:264;;;:::o;39295:435::-;;39503:2;39492:9;39488:18;39480:26;;39556:9;39550:4;39546:20;39542:1;39531:9;39527:17;39520:47;39588:131;39714:4;39588:131;:::i;:::-;39580:139;;39466:264;;;:::o;39740:435::-;;39948:2;39937:9;39933:18;39925:26;;40001:9;39995:4;39991:20;39987:1;39976:9;39972:17;39965:47;40033:131;40159:4;40033:131;:::i;:::-;40025:139;;39911:264;;;:::o;40185:435::-;;40393:2;40382:9;40378:18;40370:26;;40446:9;40440:4;40436:20;40432:1;40421:9;40417:17;40410:47;40478:131;40604:4;40478:131;:::i;:::-;40470:139;;40356:264;;;:::o;40630:234::-;;40765:2;40754:9;40750:18;40742:26;;40782:71;40850:1;40839:9;40835:17;40826:6;40782:71;:::i;:::-;40728:136;;;;:::o;40874:348::-;;41037:2;41026:9;41022:18;41014:26;;41054:71;41122:1;41111:9;41107:17;41098:6;41054:71;:::i;:::-;41139:72;41207:2;41196:9;41192:18;41183:6;41139:72;:::i;:::-;41000:222;;;;;:::o;41232:556::-;;;41376:11;41363:25;41480:1;41474:4;41470:12;41459:8;41443:14;41439:29;41435:48;41415:18;41411:73;41401:2;;41498:1;41495;41488:12;41401:2;41537:18;41527:8;41523:33;41515:41;;41593:4;41580:18;41570:28;;41625:18;41617:6;41614:30;41611:2;;;41657:1;41654;41647:12;41611:2;41692;41686:4;41682:13;41674:21;;41753:4;41745:6;41741:17;41725:14;41721:38;41715:4;41711:49;41708:2;;;41773:1;41770;41763:12;41708:2;41323:465;;;;;;:::o;41798:307::-;;41868:2;41862:9;41852:19;;41914:4;41906:6;41902:17;42029:6;42017:10;42014:22;41993:18;41981:10;41978:34;41975:62;41972:2;;;42040:18;;:::i;:::-;41972:2;42084:10;42080:2;42073:22;41838:267;;;;:::o;42115:335::-;;42290:18;42282:6;42279:30;42276:2;;;42312:18;;:::i;:::-;42276:2;42366:4;42358:6;42354:17;42346:25;;42434:4;42428;42424:15;42416:23;;42197:253;;;:::o;42460:335::-;;42635:18;42627:6;42624:30;42621:2;;;42657:18;;:::i;:::-;42621:2;42711:4;42703:6;42699:17;42691:25;;42779:4;42773;42769:15;42761:23;;42542:253;;;:::o;42805:359::-;;42964:18;42956:6;42953:30;42950:2;;;42986:18;;:::i;:::-;42950:2;43079:4;43075:9;43068:4;43060:6;43056:17;43052:33;43044:41;;43148:4;43142;43138:15;43130:23;;42871:293;;;:::o;43174:144::-;;43268:3;43260:11;;43302:4;43297:3;43293:14;43285:22;;43246:72;;;:::o;43328:157::-;;43404:3;43396:11;;43431:3;43428:1;43421:14;43469:4;43466:1;43456:18;43448:26;;43382:103;;;:::o;43495:122::-;;43600:5;43594:12;43584:22;;43569:48;;;:::o;43627:106::-;;43716:5;43710:12;43700:22;;43685:48;;;:::o;43743:107::-;;43833:5;43827:12;43817:22;;43802:48;;;:::o;43860:121::-;;43966:4;43961:3;43957:14;43949:22;;43935:46;;;:::o;43991:196::-;;44128:6;44123:3;44116:19;44172:4;44167:3;44163:14;44148:29;;44102:85;;;;:::o;44197:180::-;;44318:6;44313:3;44306:19;44362:4;44357:3;44353:14;44338:29;;44292:85;;;;:::o;44387:181::-;;44509:6;44504:3;44497:19;44553:4;44548:3;44544:14;44529:29;;44483:85;;;;:::o;44578:156::-;;44721:3;44706:18;;44692:42;;;;:::o;44744:329::-;;44807:20;44825:1;44807:20;:::i;:::-;44802:25;;44845:20;44863:1;44845:20;:::i;:::-;44840:25;;45007:1;44939:66;44935:74;44932:1;44929:81;44926:2;;;45013:18;;:::i;:::-;44926:2;45061:1;45058;45054:9;45047:16;;44788:285;;;;:::o;45083:372::-;;45150:20;45168:1;45150:20;:::i;:::-;45145:25;;45188:20;45206:1;45188:20;:::i;:::-;45183:25;;45384:1;45316:66;45312:74;45309:1;45306:81;45301:1;45294:9;45287:17;45283:105;45280:2;;;45391:18;;:::i;:::-;45280:2;45443:1;45440;45436:9;45425:20;;45131:324;;;;:::o;45465:211::-;;45529:20;45547:1;45529:20;:::i;:::-;45524:25;;45567:20;45585:1;45567:20;:::i;:::-;45562:25;;45610:1;45607;45604:8;45601:2;;;45615:18;;:::i;:::-;45601:2;45664:1;45661;45657:9;45649:17;;45510:166;;;;:::o;45686:104::-;;45756:24;45774:5;45756:24;:::i;:::-;45745:35;;45731:59;;;:::o;45800:98::-;;45881:5;45874:13;45867:21;45856:32;;45842:56;;;:::o;45908:85::-;;45978:5;45967:16;;45953:40;;;:::o;46003:157::-;;46083:66;46076:5;46072:78;46061:89;;46047:113;;;:::o;46170:134::-;;46251:42;46244:5;46240:54;46229:65;;46215:89;;;:::o;46314:85::-;;46384:5;46373:16;;46359:40;;;:::o;46409:170::-;46497:6;46492:3;46487;46474:30;46567:1;46558:6;46553:3;46549:16;46542:27;46460:119;;;:::o;46589:351::-;46661:1;46675:125;46689:6;46686:1;46683:13;46675:125;;;46782:1;46777:3;46773:11;46767:18;46763:1;46758:3;46754:11;46747:39;46711:2;46708:1;46704:10;46699:15;;46675:125;;;46822:6;46819:1;46816:13;46813:2;;;46914:1;46905:6;46900:3;46896:16;46889:27;46813:2;46638:302;;;;:::o;46950:187::-;;47016:24;47034:5;47016:24;:::i;:::-;47007:33;;47066:4;47059:5;47056:15;47053:2;;;47074:18;;:::i;:::-;47053:2;47125:1;47118:5;47114:13;47107:20;;46993:144;;;:::o;47147:356::-;;47232:1;47226:4;47222:12;47212:22;;47283:1;47277:4;47273:12;47308:18;47298:2;;47368:4;47360:6;47356:17;47346:27;;47298:2;47438;47430:6;47427:14;47407:18;47404:38;47401:2;;;47461:18;;:::i;:::-;47401:2;47198:305;;;;:::o;47513:249::-;;47579:24;47597:5;47579:24;:::i;:::-;47570:33;;47629:66;47622:5;47619:77;47616:2;;;47699:18;;:::i;:::-;47616:2;47750:1;47743:5;47739:13;47732:20;;47556:206;;;:::o;47772:196::-;47824:77;47821:1;47814:88;47925:4;47922:1;47915:15;47953:4;47950:1;47943:15;47978:196;48030:77;48027:1;48020:88;48131:4;48128:1;48121:15;48159:4;48156:1;48149:15;48184:196;48236:77;48233:1;48226:88;48337:4;48334:1;48327:15;48365:4;48362:1;48355:15;48390:110;;48486:2;48482:7;48477:2;48470:5;48466:14;48462:28;48452:38;;48438:62;;;:::o;48510:118::-;;48611:5;48606:3;48602:15;48577:40;;48563:65;;;:::o;48638:917::-;;48719:4;48701:16;48698:26;48695:2;;;48727:5;;48695:2;48769:1;48766;48763;48748:23;48795:34;48826:1;48820:8;48795:34;:::i;:::-;48860:10;48855:3;48852:19;48842:2;;48875:5;;;48842:2;48914;48908:9;48976:1;48958:16;48954:24;48951:1;48945:4;48930:49;49013:4;49007:11;49124:16;49117:4;49109:6;49105:17;49102:39;49065:18;49057:6;49054:30;49034:125;49031:2;;;49178:5;;;;;49031:2;49232:6;49226:4;49222:17;49272:3;49266:10;49303:18;49295:6;49292:30;49289:2;;;49325:5;;;;;;;49289:2;49377:6;49370:4;49365:3;49361:14;49357:27;49418:16;49412:4;49408:27;49403:3;49400:36;49397:2;;;49439:5;;;;;;;;49397:2;49491:29;49513:6;49491:29;:::i;:::-;49484:4;49479:3;49475:14;49471:50;49467:2;49460:62;49542:3;49535:10;;48681:874;;;;;;;;:::o;49565:130::-;49642:24;49660:5;49642:24;:::i;:::-;49635:5;49632:35;49622:2;;49681:1;49678;49671:12;49622:2;49608:87;:::o;49705:124::-;49779:21;49794:5;49779:21;:::i;:::-;49772:5;49769:32;49759:2;;49815:1;49812;49805:12;49759:2;49745:84;:::o;49839:130::-;49916:24;49934:5;49916:24;:::i;:::-;49909:5;49906:35;49896:2;;49955:1;49952;49945:12;49896:2;49882:87;:::o;49979:128::-;50055:23;50072:5;50055:23;:::i;:::-;50048:5;50045:34;50035:2;;50093:1;50090;50083:12;50035:2;50021:86;:::o;50117:130::-;50194:24;50212:5;50194:24;:::i;:::-;50187:5;50184:35;50174:2;;50233:1;50230;50223:12;50174:2;50160:87;:::o

Swarm Source

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

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