ETH Price: $3,466.72 (+0.55%)

Token

Verse Works v0.3.0 ()
 

Overview

Max Total Supply

50

Holders

39

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
0xe5d009bbce5a5d7ab9c6c2b1b0a56f9b98297cff
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:
LondonToken

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 14 of 18: LondonToken.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.13;

import "./Ownable.sol";
import "./ERC1155.sol";
import "./ERC2981PerTokenRoyalties.sol";
import {DefaultOperatorFilterer} from "./DefaultOperatorFilterer.sol";

/// @custom:security-contact [email protected]
contract LondonToken is
    ERC1155,
    Ownable,
    ERC2981PerTokenRoyalties,
    DefaultOperatorFilterer
{
    constructor(
        string memory uri_,
        address minter_,
        address gatewayManager_
    ) ERC1155(uri_) {
        mintingManager = minter_;
        gatewayManager = gatewayManager_;
    }

    string public constant name = "Verse Works v0.3.0";

    uint256 public totalSupply;

    address public mintingManager;

    address public gatewayManager;

    modifier onlyMinter() {
        require(msg.sender == mintingManager);
        _;
    }

    modifier onlyGatewayManager() {
        require(msg.sender == gatewayManager);
        _;
    }

    /**
     * @dev OS Operator filtering
     */
    function setApprovalForAll(address operator, bool approved)
        public
        override
        onlyAllowedOperatorApproval(operator)
    {
        super.setApprovalForAll(operator, approved);
    }

    /**
     * @dev OS Operator filtering
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        uint256 amount,
        bytes memory data
    ) public override onlyAllowedOperator(from) {
        super.safeTransferFrom(from, to, tokenId, amount, data);
    }

    /**
     * @dev OS Operator filtering
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override onlyAllowedOperator(from) {
        super.safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.
     * In additionit sets the royalties for `royaltyRecipient` of the value `royaltyValue`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function mint(
        address account,
        uint256 id,
        uint256 amount,
        string memory cid,
        address royaltyRecipient,
        uint256 royaltyValue
    ) public onlyMinter {
        _mint(account, id, amount, "");
        if (royaltyValue > 0) {
            _setTokenRoyalty(id, royaltyRecipient, royaltyValue);
        }
        cids[id] = cid;
        totalSupply += amount;
    }

    /**
     * @dev Batch 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,
        string[] memory tokenCids,
        address[] memory royaltyRecipients,
        uint256[] memory royaltyValues
    ) public onlyMinter {
        require(
            ids.length == royaltyRecipients.length &&
                ids.length == royaltyValues.length,
            "ERC1155: Arrays length mismatch"
        );
        _mintBatch(to, ids, amounts, "");

        for (uint256 i; i < ids.length; i++) {
            if (royaltyValues[i] > 0) {
                _setTokenRoyalty(
                    ids[i],
                    royaltyRecipients[i],
                    royaltyValues[i]
                );
            }

            // update IPFS CID
            cids[ids[i]] = tokenCids[i];
        }

        uint256 count;
        for (uint256 i = 0; i < ids.length; i++) {
            for (uint256 j = 0; j < amounts.length; j++) {
                count += ids[i] * amounts[j];
            }
        }
        totalSupply += count;
    }

    /**
     * @dev Checks for supported interface.
     *
     */
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(ERC1155, ERC2981Base)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.
     * In additionit sets the royalties for `royaltyRecipient` of the value `royaltyValue`.
     * Method emits two transfer events.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     */
    function mintWithCreator(
        address creator,
        address to,
        uint256 tokenId,
        string memory cid,
        address royaltyRecipient,
        uint256 royaltyValue
    ) public onlyMinter {
        require(to != address(0), "mint to the zero address");

        balances[tokenId][to] += 1;
        totalSupply += 1;
        cids[tokenId] = cid;

        if (royaltyValue > 0) {
            _setTokenRoyalty(tokenId, royaltyRecipient, royaltyValue);
        }

        address operator = _msgSender();
        emit TransferSingle(operator, address(0), creator, tokenId, 1);
        emit TransferSingle(operator, creator, to, tokenId, 1);
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.
     * In additionit sets the royalties for `royaltyRecipient` of the value `royaltyValue`.
     * Method emits two transfer events.
     *
     * Emits a {TransferSingle} events for intermediate artist.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function batchMintWithCreator(
        address to,
        address[] memory creators,
        uint256[] memory tokenIds,
        string[] memory tokenCids,
        address[] memory royaltyRecipients,
        uint256[] memory royaltyValues
    ) public onlyMinter {
        require(
            tokenIds.length == royaltyRecipients.length &&
                tokenIds.length == royaltyValues.length,
            "ERC1155: Arrays length mismatch"
        );

        address operator = _msgSender();

        for (uint256 i = 0; i < tokenIds.length; i++) {
            balances[tokenIds[i]][to] += 1;

            // check if recipient can accept NFT
            _doSafeTransferAcceptanceCheck(
                operator,
                address(0),
                to,
                tokenIds[i],
                1,
                ""
            );

            // update royalties
            if (royaltyValues[i] > 0) {
                _setTokenRoyalty(
                    tokenIds[i],
                    royaltyRecipients[i],
                    royaltyValues[i]
                );
            }

            // update IPFS CID
            cids[tokenIds[i]] = tokenCids[i];

            // emit events based on creator provided
            if (creators[i] == address(0)) {
                emit TransferSingle(operator, address(0), to, tokenIds[i], 1);
            } else {
                emit TransferSingle(
                    operator,
                    address(0),
                    creators[i],
                    tokenIds[i],
                    1
                );
                emit TransferSingle(operator, creators[i], to, tokenIds[i], 1);
            }
        }

        // update total supply
        totalSupply += tokenIds.length;
    }

    /**
     * @dev Sets base URI for metadata.
     *
     */
    function setURI(string memory newuri) public onlyGatewayManager {
        _setURI(newuri);
    }

    /**
     * @dev Sets new minter for the contract.
     *
     */
    function setMintingManager(address minter_) public onlyOwner {
        mintingManager = minter_;
    }

    /**
     * @dev Sets new gateway manager for the contract.
     *
     */
    function setGatewayManager(address gatewayManager_) public onlyOwner {
        gatewayManager = gatewayManager_;
    }

    /**
     * @dev Sets royalties for `tokenId` and `tokenRecipient` with royalty value `royaltyValue`.
     *
     */
    function setRoyalties(
        uint256 tokenId,
        address royaltyRecipient,
        uint256 royaltyValue
    ) public onlyOwner {
        _setTokenRoyalty(tokenId, royaltyRecipient, royaltyValue);
    }

    /**
     * @dev Sets IPFS cid metadata hash for token id `tokenId`.
     *
     */
    function setCID(uint256 tokenId, string memory cid)
        public
        onlyGatewayManager
    {
        cids[tokenId] = cid;
    }

    /**
     * @dev Sets IPFS cid metadata hash for token id `tokenId`.
     *
     */
    function setCIDs(uint256[] memory tokenIds, string[] memory cids_)
        public
        onlyGatewayManager
    {
        require(
            tokenIds.length == cids_.length,
            "ERC1155: Arrays length mismatch"
        );
        for (uint256 i = 0; i < tokenIds.length; i++) {
            cids[tokenIds[i]] = cids_[i];
        }
    }
}

File 1 of 18: Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

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

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

File 2 of 18: Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

File 3 of 18: DefaultOperatorFilterer.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

import {OperatorFilterer} from "./OperatorFilterer.sol";

/**
 * @title  DefaultOperatorFilterer
 * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription.
 */
abstract contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}

File 4 of 18: ERC1155.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC1155/ERC1155.sol)

pragma solidity 0.8.13;

import "./IERC1155.sol";
import "./IERC1155Receiver.sol";
import "./IERC1155MetadataURI.sol";
import "./Address.sol";
import "./Context.sol";
import "./ERC165.sol";
import "./Strings.sol";

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

    // Mapping from token ID to the IPFS cid
    mapping(uint256 => string) public cids;

    // 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.
    string public baseUri;

    /**
     * @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 id)
        public
        view
        virtual
        override
        returns (string memory)
    {
        return string(abi.encodePacked(baseUri, cids[id]));
    }

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

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

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

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

        return batchBalances;
    }

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

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

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

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

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

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

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

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

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

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

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

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

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

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

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

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

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * 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 TransferSingle(operator, address(0), to, ids[i], amounts[i]);
        }

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

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

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

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

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

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

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

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

        return array;
    }
}

File 5 of 18: ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

File 6 of 18: ERC2981Base.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.13;

import "./ERC165.sol";

import "./IERC2981Royalties.sol";

/// @dev This is a contract used to add ERC2981 support to ERC721 and 1155
abstract contract ERC2981Base is ERC165, IERC2981Royalties {
    struct RoyaltyInfo {
        address recipient;
        uint24 amount;
    }

    /// @inheritdoc	ERC165
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override
        returns (bool)
    {
        return
            interfaceId == type(IERC2981Royalties).interfaceId ||
            super.supportsInterface(interfaceId);
    }
}

File 7 of 18: ERC2981PerTokenRoyalties.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.13;

import "./ERC165.sol";

import "./ERC2981Base.sol";

/// @dev This is a contract used to add ERC2981 support to ERC721 and 1155
abstract contract ERC2981PerTokenRoyalties is ERC2981Base {
    mapping(uint256 => RoyaltyInfo) internal _royalties;

    /// @dev Sets token royalties
    /// @param tokenId the token id fir which we register the royalties
    /// @param recipient recipient of the royalties
    /// @param value percentage (using 2 decimals - 10000 = 100, 0 = 0)
    function _setTokenRoyalty(
        uint256 tokenId,
        address recipient,
        uint256 value
    ) internal {
        require(value <= 10000, "ERC2981Royalties: Too high");
        _royalties[tokenId] = RoyaltyInfo(recipient, uint24(value));
    }

    /// @inheritdoc	IERC2981Royalties
    function royaltyInfo(uint256 tokenId, uint256 value)
        external
        view
        override
        returns (address receiver, uint256 royaltyAmount)
    {
        RoyaltyInfo memory royalties = _royalties[tokenId];
        receiver = royalties.recipient;
        royaltyAmount = (value * royalties.amount) / 10000;
    }
}

File 8 of 18: IERC1155.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

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

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

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

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

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

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

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

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

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

File 9 of 18: IERC1155MetadataURI.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)

pragma solidity ^0.8.0;

import "./IERC1155.sol";

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

File 10 of 18: IERC1155Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

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

File 11 of 18: IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

File 12 of 18: IERC2981Royalties.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.13;

/// @title IERC2981Royalties
/// @dev Interface for the ERC2981 - Token Royalty standard
interface IERC2981Royalties {
    /// @notice Called with the sale price to determine how much royalty
    //          is owed and to whom.
    /// @param _tokenId - the NFT asset queried for royalty information
    /// @param _value - the sale price of the NFT asset specified by _tokenId
    /// @return _receiver - address of who should be sent the royalty payment
    /// @return _royaltyAmount - the royalty payment amount for value sale price
    function royaltyInfo(uint256 _tokenId, uint256 _value)
        external
        view
        returns (address _receiver, uint256 _royaltyAmount);
}

File 13 of 18: IOperatorFilterRegistry.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator) external view returns (bool);
    function register(address registrant) external;
    function registerAndSubscribe(address registrant, address subscription) external;
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;
    function unregister(address addr) external;
    function updateOperator(address registrant, address operator, bool filtered) external;
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
    function subscribe(address registrant, address registrantToSubscribe) external;
    function unsubscribe(address registrant, bool copyExistingEntries) external;
    function subscriptionOf(address addr) external returns (address registrant);
    function subscribers(address registrant) external returns (address[] memory);
    function subscriberAt(address registrant, uint256 index) external returns (address);
    function copyEntriesOf(address registrant, address registrantToCopy) external;
    function isOperatorFiltered(address registrant, address operator) external returns (bool);
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
    function filteredOperators(address addr) external returns (address[] memory);
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
    function isRegistered(address addr) external returns (bool);
    function codeHashOf(address addr) external returns (bytes32);
}

File 15 of 18: Math.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

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

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

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

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

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
     * with further edits by Uniswap Labs also under MIT license.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1);

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
            // in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator,
        Rounding rounding
    ) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10**64) {
                value /= 10**64;
                result += 64;
            }
            if (value >= 10**32) {
                value /= 10**32;
                result += 32;
            }
            if (value >= 10**16) {
                value /= 10**16;
                result += 16;
            }
            if (value >= 10**8) {
                value /= 10**8;
                result += 8;
            }
            if (value >= 10**4) {
                value /= 10**4;
                result += 4;
            }
            if (value >= 10**2) {
                value /= 10**2;
                result += 2;
            }
            if (value >= 10**1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);
        }
    }
}

File 16 of 18: OperatorFilterer.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

import {IOperatorFilterRegistry} from "./IOperatorFilterRegistry.sol";

/**
 * @title  OperatorFilterer
 * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another
 *         registrant's entries in the OperatorFilterRegistry.
 * @dev    This smart contract is meant to be inherited by token contracts so they can use the following:
 *         - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods.
 *         - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods.
 */
abstract contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (subscribe) {
                OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    OPERATOR_FILTER_REGISTRY.register(address(this));
                }
            }
        }
    }

    modifier onlyAllowedOperator(address from) virtual {
        // Allow spending tokens from addresses with balance
        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
        // from an EOA.
        if (from != msg.sender) {
            _checkFilterOperator(msg.sender);
        }
        _;
    }

    modifier onlyAllowedOperatorApproval(address operator) virtual {
        _checkFilterOperator(operator);
        _;
    }
    
    function _checkFilterOperator(address operator) internal view virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) {
                revert OperatorNotAllowed(operator);
            }
        }
    }
}

File 17 of 18: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "./Context.sol";

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

File 18 of 18: Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

import "./Math.sol";

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.log256(value) + 1);
        }
    }

    /**
     * @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] = _SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"uri_","type":"string"},{"internalType":"address","name":"minter_","type":"address"},{"internalType":"address","name":"gatewayManager_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":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"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"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":"_doSafeTransferAcceptanceCheck","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"balances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"address[]","name":"creators","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"string[]","name":"tokenCids","type":"string[]"},{"internalType":"address[]","name":"royaltyRecipients","type":"address[]"},{"internalType":"uint256[]","name":"royaltyValues","type":"uint256[]"}],"name":"batchMintWithCreator","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":"gatewayManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"cid","type":"string"},{"internalType":"address","name":"royaltyRecipient","type":"address"},{"internalType":"uint256","name":"royaltyValue","type":"uint256"}],"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":"string[]","name":"tokenCids","type":"string[]"},{"internalType":"address[]","name":"royaltyRecipients","type":"address[]"},{"internalType":"uint256[]","name":"royaltyValues","type":"uint256[]"}],"name":"mintBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"creator","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"cid","type":"string"},{"internalType":"address","name":"royaltyRecipient","type":"address"},{"internalType":"uint256","name":"royaltyValue","type":"uint256"}],"name":"mintWithCreator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintingManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"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":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"cid","type":"string"}],"name":"setCID","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"string[]","name":"cids_","type":"string[]"}],"name":"setCIDs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"gatewayManager_","type":"address"}],"name":"setGatewayManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"minter_","type":"address"}],"name":"setMintingManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"royaltyRecipient","type":"address"},{"internalType":"uint256","name":"royaltyValue","type":"uint256"}],"name":"setRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newuri","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b506040516200595f3803806200595f83398181016040528101906200003791906200069f565b733cc6cdda760b79bafa08df41ecfa224f810dceb660018462000060816200030360201b60201c565b5062000081620000756200031f60201b60201c565b6200032760201b60201c565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115620002765780156200013c576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b8152600401620001029291906200072b565b600060405180830381600087803b1580156200011d57600080fd5b505af115801562000132573d6000803e3d6000fd5b5050505062000275565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614620001f6576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b8152600401620001bc9291906200072b565b600060405180830381600087803b158015620001d757600080fd5b505af1158015620001ec573d6000803e3d6000fd5b5050505062000274565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b81526004016200023f919062000758565b600060405180830381600087803b1580156200025a57600080fd5b505af11580156200026f573d6000803e3d6000fd5b505050505b5b5b505081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050620007d9565b80600390805190602001906200031b929190620003ed565b5050565b600033905090565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620003fb90620007a4565b90600052602060002090601f0160209004810192826200041f57600085556200046b565b82601f106200043a57805160ff19168380011785556200046b565b828001600101855582156200046b579182015b828111156200046a5782518255916020019190600101906200044d565b5b5090506200047a91906200047e565b5090565b5b80821115620004995760008160009055506001016200047f565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200050682620004bb565b810181811067ffffffffffffffff82111715620005285762000527620004cc565b5b80604052505050565b60006200053d6200049d565b90506200054b8282620004fb565b919050565b600067ffffffffffffffff8211156200056e576200056d620004cc565b5b6200057982620004bb565b9050602081019050919050565b60005b83811015620005a657808201518184015260208101905062000589565b83811115620005b6576000848401525b50505050565b6000620005d3620005cd8462000550565b62000531565b905082815260208101848484011115620005f257620005f1620004b6565b5b620005ff84828562000586565b509392505050565b600082601f8301126200061f576200061e620004b1565b5b815162000631848260208601620005bc565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000667826200063a565b9050919050565b62000679816200065a565b81146200068557600080fd5b50565b60008151905062000699816200066e565b92915050565b600080600060608486031215620006bb57620006ba620004a7565b5b600084015167ffffffffffffffff811115620006dc57620006db620004ac565b5b620006ea8682870162000607565b9350506020620006fd8682870162000688565b9250506040620007108682870162000688565b9150509250925092565b62000725816200065a565b82525050565b60006040820190506200074260008301856200071a565b6200075160208301846200071a565b9392505050565b60006020820190506200076f60008301846200071a565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620007bd57607f821691505b602082108103620007d357620007d262000775565b5b50919050565b61517680620007e96000396000f3fe608060405234801561001057600080fd5b50600436106101e45760003560e01c806369b520171161010f5780639abc8320116100a2578063e2c7f33811610071578063e2c7f33814610566578063e985e9c514610582578063f242432a146105b2578063f2fde38b146105ce576101e4565b80639abc8320146104f2578063a22cb46514610510578063af8777071461052c578063d0414c9d14610548576101e4565b806382295a2d116100de57806382295a2d146104805780638d2bb0931461049c5780638da5cb5b146104b857806398faf29b146104d6576101e4565b806369b520171461040e5780636c52c3fb1461042a578063704fe71014610446578063715018a614610476576101e4565b80631f320331116101875780633a330022116101565780633a3300221461038657806341f43434146103a25780634e1273f4146103c057806358884432146103f0576101e4565b80631f320331146102ed5780632a55205a1461031d5780632eb2c2d61461034e578063337648b21461036a576101e4565b806306fdde03116101c357806306fdde0314610265578063084e9e24146102835780630e89341c1461029f57806318160ddd146102cf576101e4565b8062fdd58e146101e957806301ffc9a71461021957806302fe530514610249575b600080fd5b61020360048036038101906101fe91906131c8565b6105ea565b6040516102109190613217565b60405180910390f35b610233600480360381019061022e919061328a565b6106b2565b60405161024091906132d2565b60405180910390f35b610263600480360381019061025e9190613433565b6106c4565b005b61026d61072a565b60405161027a9190613504565b60405180910390f35b61029d600480360381019061029891906135c7565b610763565b005b6102b960048036038101906102b49190613670565b61093a565b6040516102c69190613504565b60405180910390f35b6102d7610978565b6040516102e49190613217565b60405180910390f35b6103076004803603810190610302919061369d565b61097e565b6040516103149190613217565b60405180910390f35b610337600480360381019061033291906136dd565b6109a3565b60405161034592919061372c565b60405180910390f35b6103686004803603810190610363919061381d565b610a74565b005b610384600480360381019061037f91906139cd565b610ac7565b005b6103a0600480360381019061039b9190613a45565b610be5565b005b6103aa610c31565b6040516103b79190613ad1565b60405180910390f35b6103da60048036038101906103d59190613baf565b610c43565b6040516103e79190613ce5565b60405180910390f35b6103f8610d5c565b6040516104059190613d07565b60405180910390f35b61042860048036038101906104239190613d22565b610d82565b005b610444600480360381019061043f9190613a45565b610ff5565b005b610460600480360381019061045b9190613670565b611041565b60405161046d9190613504565b60405180910390f35b61047e6110e1565b005b61049a60048036038101906104959190613e3b565b6110f5565b005b6104b660048036038101906104b19190613e97565b61117b565b005b6104c0611416565b6040516104cd9190613d07565b60405180910390f35b6104f060048036038101906104eb9190613f40565b611440565b005b6104fa611513565b6040516105079190613504565b60405180910390f35b61052a60048036038101906105259190614015565b6115a1565b005b61054660048036038101906105419190614055565b6115ba565b005b610550611a9c565b60405161055d9190613d07565b60405180910390f35b610580600480360381019061057b919061416e565b611ac2565b005b61059c600480360381019061059791906141c1565b611ada565b6040516105a991906132d2565b60405180910390f35b6105cc60048036038101906105c79190614201565b611b6e565b005b6105e860048036038101906105e39190613a45565b611bc1565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361065a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106519061430a565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60006106bd82611c44565b9050919050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461071e57600080fd5b61072781611cbe565b50565b6040518060400160405280601281526020017f566572736520576f726b732076302e332e30000000000000000000000000000081525081565b6107828473ffffffffffffffffffffffffffffffffffffffff16611cd8565b15610932578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b81526004016107c895949392919061437f565b6020604051808303816000875af192505050801561080457506040513d601f19601f8201168201806040525081019061080191906143ee565b60015b6108a957610810614428565b806308c379a00361086c575061082461444a565b8061082f575061086e565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108639190613504565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a09061454c565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610930576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610927906145de565b60405180910390fd5b505b505050505050565b60606003600160008481526020019081526020016000206040516020016109629291906146fd565b6040516020818303038152906040529050919050565b60065481565b6000602052816000526040600020602052806000526040600020600091509150505481565b6000806000600560008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900462ffffff1662ffffff1662ffffff1681525050905080600001519250612710816020015162ffffff1685610a609190614750565b610a6a91906147d9565b9150509250929050565b843373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ab257610ab133611cfb565b5b610abf8686868686611df8565b505050505050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b2157600080fd5b8051825114610b65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5c90614856565b60405180910390fd5b60005b8251811015610be057818181518110610b8457610b83614876565b5b602002602001015160016000858481518110610ba357610ba2614876565b5b602002602001015181526020019081526020016000209080519060200190610bcc92919061307d565b508080610bd8906148a5565b915050610b68565b505050565b610bed611e99565b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6daaeb6d7670e522a718067333cd4e81565b60608151835114610c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c809061495f565b60405180910390fd5b6000835167ffffffffffffffff811115610ca657610ca5613308565b5b604051908082528060200260200182016040528015610cd45781602001602082028036833780820191505090505b50905060005b8451811015610d5157610d21858281518110610cf957610cf8614876565b5b6020026020010151858381518110610d1457610d13614876565b5b60200260200101516105ea565b828281518110610d3457610d33614876565b5b60200260200101818152505080610d4a906148a5565b9050610cda565b508091505092915050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ddc57600080fd5b81518551148015610dee575080518551145b610e2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2490614856565b60405180910390fd5b610e4886868660405180602001604052806000815250611f17565b60005b8551811015610f40576000828281518110610e6957610e68614876565b5b60200260200101511115610ed157610ed0868281518110610e8d57610e8c614876565b5b6020026020010151848381518110610ea857610ea7614876565b5b6020026020010151848481518110610ec357610ec2614876565b5b6020026020010151612177565b5b838181518110610ee457610ee3614876565b5b602002602001015160016000888481518110610f0357610f02614876565b5b602002602001015181526020019081526020016000209080519060200190610f2c92919061307d565b508080610f38906148a5565b915050610e4b565b50600080600090505b8651811015610fd25760005b8651811015610fbe57868181518110610f7157610f70614876565b5b6020026020010151888381518110610f8c57610f8b614876565b5b6020026020010151610f9e9190614750565b83610fa9919061497f565b92508080610fb6906148a5565b915050610f55565b508080610fca906148a5565b915050610f49565b508060066000828254610fe5919061497f565b9250508190555050505050505050565b610ffd611e99565b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600160205280600052604060002060009150905080546110609061462d565b80601f016020809104026020016040519081016040528092919081815260200182805461108c9061462d565b80156110d95780601f106110ae576101008083540402835291602001916110d9565b820191906000526020600020905b8154815290600101906020018083116110bc57829003601f168201915b505050505081565b6110e9611e99565b6110f36000612273565b565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461114f57600080fd5b8060016000848152602001908152602001600020908051906020019061117692919061307d565b505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146111d557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611244576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123b90614a21565b60405180910390fd5b600160008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546112a4919061497f565b925050819055506001600660008282546112be919061497f565b92505081905550826001600086815260200190815260200160002090805190602001906112ec92919061307d565b50600081111561130257611301848383612177565b5b600061130c612339565b90508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62886001604051611386929190614a7c565b60405180910390a48573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62886001604051611405929190614a7c565b60405180910390a450505050505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461149a57600080fd5b6114b586868660405180602001604052806000815250612341565b60008111156114ca576114c9858383612177565b5b826001600087815260200190815260200160002090805190602001906114f192919061307d565b508360066000828254611504919061497f565b92505081905550505050505050565b600380546115209061462d565b80601f016020809104026020016040519081016040528092919081815260200182805461154c9061462d565b80156115995780601f1061156e57610100808354040283529160200191611599565b820191906000526020600020905b81548152906001019060200180831161157c57829003601f168201915b505050505081565b816115ab81611cfb565b6115b583836124f1565b505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461161457600080fd5b81518451148015611626575080518451145b611665576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165c90614856565b60405180910390fd5b600061166f612339565b905060005b8551811015611a7857600160008088848151811061169557611694614876565b5b6020026020010151815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116f7919061497f565b925050819055506117378260008a89858151811061171857611717614876565b5b6020026020010151600160405180602001604052806000815250610763565b600083828151811061174c5761174b614876565b5b602002602001015111156117b4576117b38682815181106117705761176f614876565b5b602002602001015185838151811061178b5761178a614876565b5b60200260200101518584815181106117a6576117a5614876565b5b6020026020010151612177565b5b8481815181106117c7576117c6614876565b5b6020026020010151600160008884815181106117e6576117e5614876565b5b60200260200101518152602001908152602001600020908051906020019061180f92919061307d565b50600073ffffffffffffffffffffffffffffffffffffffff1687828151811061183b5761183a614876565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16036118fd578773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628985815181106118d8576118d7614876565b5b602002602001015160016040516118f0929190614a7c565b60405180910390a4611a65565b8681815181106119105761190f614876565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6289858151811061199157611990614876565b5b602002602001015160016040516119a9929190614a7c565b60405180910390a48773ffffffffffffffffffffffffffffffffffffffff168782815181106119db576119da614876565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62898581518110611a4457611a43614876565b5b60200260200101516001604051611a5c929190614a7c565b60405180910390a45b8080611a70906148a5565b915050611674565b50845160066000828254611a8c919061497f565b9250508190555050505050505050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611aca611e99565b611ad5838383612177565b505050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b843373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611bac57611bab33611cfb565b5b611bb98686868686612507565b505050505050565b611bc9611e99565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611c38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2f90614b17565b60405180910390fd5b611c4181612273565b50565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611cb75750611cb6826125a8565b5b9050919050565b8060039080519060200190611cd492919061307d565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611df5576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611d72929190614b37565b602060405180830381865afa158015611d8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611db39190614b75565b611df457806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611deb9190613d07565b60405180910390fd5b5b50565b611e00612339565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611e465750611e4585611e40612339565b611ada565b5b611e85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7c90614c14565b60405180910390fd5b611e92858585858561268a565b5050505050565b611ea1612339565b73ffffffffffffffffffffffffffffffffffffffff16611ebf611416565b73ffffffffffffffffffffffffffffffffffffffff1614611f15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0c90614c80565b60405180910390fd5b565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611f86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7d90614d12565b60405180910390fd5b8151835114611fca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc190614da4565b60405180910390fd5b6000611fd4612339565b9050611fe5816000878787876129ab565b60005b84518110156121515783818151811061200457612003614876565b5b602002602001015160008087848151811061202257612021614876565b5b6020026020010151815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612084919061497f565b925050819055508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6288858151811061210557612104614876565b5b60200260200101518886815181106121205761211f614876565b5b6020026020010151604051612136929190614dc4565b60405180910390a48080612149906148a5565b915050611fe8565b50612161816000878787876129b3565b612170816000878787876129bb565b5050505050565b6127108111156121bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b390614e39565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff1681526020018262ffffff168152506005600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548162ffffff021916908362ffffff160217905550905050505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036123b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a790614d12565b60405180910390fd5b60006123ba612339565b905060006123c785612b92565b905060006123d485612b92565b90506123e5836000898585896129ab565b8460008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612444919061497f565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6289896040516124c2929190614dc4565b60405180910390a46124d9836000898585896129b3565b6124e883600089898989610763565b50505050505050565b6125036124fc612339565b8383612c0c565b5050565b61250f612339565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061255557506125548561254f612339565b611ada565b5b612594576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258b90614ecb565b60405180910390fd5b6125a18585858585612d78565b5050505050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061267357507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612683575061268282613013565b5b9050919050565b81518351146126ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c590614da4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361273d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273490614f5d565b60405180910390fd5b6000612747612339565b90506127578187878787876129ab565b60005b845181101561290857600085828151811061277857612777614876565b5b60200260200101519050600085838151811061279757612796614876565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612838576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282f90614fef565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128ed919061497f565b9250508190555050505080612901906148a5565b905061275a565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161297f92919061500f565b60405180910390a46129958187878787876129b3565b6129a38187878787876129bb565b505050505050565b505050505050565b505050505050565b6129da8473ffffffffffffffffffffffffffffffffffffffff16611cd8565b15612b8a578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401612a20959493929190615046565b6020604051808303816000875af1925050508015612a5c57506040513d601f19601f82011682018060405250810190612a5991906143ee565b60015b612b0157612a68614428565b806308c379a003612ac45750612a7c61444a565b80612a875750612ac6565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612abb9190613504565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af89061454c565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612b88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b7f906145de565b60405180910390fd5b505b505050505050565b60606000600167ffffffffffffffff811115612bb157612bb0613308565b5b604051908082528060200260200182016040528015612bdf5781602001602082028036833780820191505090505b5090508281600081518110612bf757612bf6614876565b5b60200260200101818152505080915050919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612c7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c7190615120565b60405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612d6b91906132d2565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612de7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dde90614f5d565b60405180910390fd5b6000612df1612339565b90506000612dfe85612b92565b90506000612e0b85612b92565b9050612e1b8389898585896129ab565b600080600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905085811015612eb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ea990614fef565b60405180910390fd5b85810360008089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560008089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f67919061497f565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a604051612fe4929190614dc4565b60405180910390a4612ffa848a8a86868a6129b3565b613008848a8a8a8a8a610763565b505050505050505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b8280546130899061462d565b90600052602060002090601f0160209004810192826130ab57600085556130f2565b82601f106130c457805160ff19168380011785556130f2565b828001600101855582156130f2579182015b828111156130f15782518255916020019190600101906130d6565b5b5090506130ff9190613103565b5090565b5b8082111561311c576000816000905550600101613104565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061315f82613134565b9050919050565b61316f81613154565b811461317a57600080fd5b50565b60008135905061318c81613166565b92915050565b6000819050919050565b6131a581613192565b81146131b057600080fd5b50565b6000813590506131c28161319c565b92915050565b600080604083850312156131df576131de61312a565b5b60006131ed8582860161317d565b92505060206131fe858286016131b3565b9150509250929050565b61321181613192565b82525050565b600060208201905061322c6000830184613208565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61326781613232565b811461327257600080fd5b50565b6000813590506132848161325e565b92915050565b6000602082840312156132a05761329f61312a565b5b60006132ae84828501613275565b91505092915050565b60008115159050919050565b6132cc816132b7565b82525050565b60006020820190506132e760008301846132c3565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613340826132f7565b810181811067ffffffffffffffff8211171561335f5761335e613308565b5b80604052505050565b6000613372613120565b905061337e8282613337565b919050565b600067ffffffffffffffff82111561339e5761339d613308565b5b6133a7826132f7565b9050602081019050919050565b82818337600083830152505050565b60006133d66133d184613383565b613368565b9050828152602081018484840111156133f2576133f16132f2565b5b6133fd8482856133b4565b509392505050565b600082601f83011261341a576134196132ed565b5b813561342a8482602086016133c3565b91505092915050565b6000602082840312156134495761344861312a565b5b600082013567ffffffffffffffff8111156134675761346661312f565b5b61347384828501613405565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156134b657808201518184015260208101905061349b565b838111156134c5576000848401525b50505050565b60006134d68261347c565b6134e08185613487565b93506134f0818560208601613498565b6134f9816132f7565b840191505092915050565b6000602082019050818103600083015261351e81846134cb565b905092915050565b600067ffffffffffffffff82111561354157613540613308565b5b61354a826132f7565b9050602081019050919050565b600061356a61356584613526565b613368565b905082815260208101848484011115613586576135856132f2565b5b6135918482856133b4565b509392505050565b600082601f8301126135ae576135ad6132ed565b5b81356135be848260208601613557565b91505092915050565b60008060008060008060c087890312156135e4576135e361312a565b5b60006135f289828a0161317d565b965050602061360389828a0161317d565b955050604061361489828a0161317d565b945050606061362589828a016131b3565b935050608061363689828a016131b3565b92505060a087013567ffffffffffffffff8111156136575761365661312f565b5b61366389828a01613599565b9150509295509295509295565b6000602082840312156136865761368561312a565b5b6000613694848285016131b3565b91505092915050565b600080604083850312156136b4576136b361312a565b5b60006136c2858286016131b3565b92505060206136d38582860161317d565b9150509250929050565b600080604083850312156136f4576136f361312a565b5b6000613702858286016131b3565b9250506020613713858286016131b3565b9150509250929050565b61372681613154565b82525050565b6000604082019050613741600083018561371d565b61374e6020830184613208565b9392505050565b600067ffffffffffffffff8211156137705761376f613308565b5b602082029050602081019050919050565b600080fd5b600061379961379484613755565b613368565b905080838252602082019050602084028301858111156137bc576137bb613781565b5b835b818110156137e557806137d188826131b3565b8452602084019350506020810190506137be565b5050509392505050565b600082601f830112613804576138036132ed565b5b8135613814848260208601613786565b91505092915050565b600080600080600060a086880312156138395761383861312a565b5b60006138478882890161317d565b95505060206138588882890161317d565b945050604086013567ffffffffffffffff8111156138795761387861312f565b5b613885888289016137ef565b935050606086013567ffffffffffffffff8111156138a6576138a561312f565b5b6138b2888289016137ef565b925050608086013567ffffffffffffffff8111156138d3576138d261312f565b5b6138df88828901613599565b9150509295509295909350565b600067ffffffffffffffff82111561390757613906613308565b5b602082029050602081019050919050565b600061392b613926846138ec565b613368565b9050808382526020820190506020840283018581111561394e5761394d613781565b5b835b8181101561399557803567ffffffffffffffff811115613973576139726132ed565b5b8086016139808982613405565b85526020850194505050602081019050613950565b5050509392505050565b600082601f8301126139b4576139b36132ed565b5b81356139c4848260208601613918565b91505092915050565b600080604083850312156139e4576139e361312a565b5b600083013567ffffffffffffffff811115613a0257613a0161312f565b5b613a0e858286016137ef565b925050602083013567ffffffffffffffff811115613a2f57613a2e61312f565b5b613a3b8582860161399f565b9150509250929050565b600060208284031215613a5b57613a5a61312a565b5b6000613a698482850161317d565b91505092915050565b6000819050919050565b6000613a97613a92613a8d84613134565b613a72565b613134565b9050919050565b6000613aa982613a7c565b9050919050565b6000613abb82613a9e565b9050919050565b613acb81613ab0565b82525050565b6000602082019050613ae66000830184613ac2565b92915050565b600067ffffffffffffffff821115613b0757613b06613308565b5b602082029050602081019050919050565b6000613b2b613b2684613aec565b613368565b90508083825260208201905060208402830185811115613b4e57613b4d613781565b5b835b81811015613b775780613b63888261317d565b845260208401935050602081019050613b50565b5050509392505050565b600082601f830112613b9657613b956132ed565b5b8135613ba6848260208601613b18565b91505092915050565b60008060408385031215613bc657613bc561312a565b5b600083013567ffffffffffffffff811115613be457613be361312f565b5b613bf085828601613b81565b925050602083013567ffffffffffffffff811115613c1157613c1061312f565b5b613c1d858286016137ef565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613c5c81613192565b82525050565b6000613c6e8383613c53565b60208301905092915050565b6000602082019050919050565b6000613c9282613c27565b613c9c8185613c32565b9350613ca783613c43565b8060005b83811015613cd8578151613cbf8882613c62565b9750613cca83613c7a565b925050600181019050613cab565b5085935050505092915050565b60006020820190508181036000830152613cff8184613c87565b905092915050565b6000602082019050613d1c600083018461371d565b92915050565b60008060008060008060c08789031215613d3f57613d3e61312a565b5b6000613d4d89828a0161317d565b965050602087013567ffffffffffffffff811115613d6e57613d6d61312f565b5b613d7a89828a016137ef565b955050604087013567ffffffffffffffff811115613d9b57613d9a61312f565b5b613da789828a016137ef565b945050606087013567ffffffffffffffff811115613dc857613dc761312f565b5b613dd489828a0161399f565b935050608087013567ffffffffffffffff811115613df557613df461312f565b5b613e0189828a01613b81565b92505060a087013567ffffffffffffffff811115613e2257613e2161312f565b5b613e2e89828a016137ef565b9150509295509295509295565b60008060408385031215613e5257613e5161312a565b5b6000613e60858286016131b3565b925050602083013567ffffffffffffffff811115613e8157613e8061312f565b5b613e8d85828601613405565b9150509250929050565b60008060008060008060c08789031215613eb457613eb361312a565b5b6000613ec289828a0161317d565b9650506020613ed389828a0161317d565b9550506040613ee489828a016131b3565b945050606087013567ffffffffffffffff811115613f0557613f0461312f565b5b613f1189828a01613405565b9350506080613f2289828a0161317d565b92505060a0613f3389828a016131b3565b9150509295509295509295565b60008060008060008060c08789031215613f5d57613f5c61312a565b5b6000613f6b89828a0161317d565b9650506020613f7c89828a016131b3565b9550506040613f8d89828a016131b3565b945050606087013567ffffffffffffffff811115613fae57613fad61312f565b5b613fba89828a01613405565b9350506080613fcb89828a0161317d565b92505060a0613fdc89828a016131b3565b9150509295509295509295565b613ff2816132b7565b8114613ffd57600080fd5b50565b60008135905061400f81613fe9565b92915050565b6000806040838503121561402c5761402b61312a565b5b600061403a8582860161317d565b925050602061404b85828601614000565b9150509250929050565b60008060008060008060c087890312156140725761407161312a565b5b600061408089828a0161317d565b965050602087013567ffffffffffffffff8111156140a1576140a061312f565b5b6140ad89828a01613b81565b955050604087013567ffffffffffffffff8111156140ce576140cd61312f565b5b6140da89828a016137ef565b945050606087013567ffffffffffffffff8111156140fb576140fa61312f565b5b61410789828a0161399f565b935050608087013567ffffffffffffffff8111156141285761412761312f565b5b61413489828a01613b81565b92505060a087013567ffffffffffffffff8111156141555761415461312f565b5b61416189828a016137ef565b9150509295509295509295565b6000806000606084860312156141875761418661312a565b5b6000614195868287016131b3565b93505060206141a68682870161317d565b92505060406141b7868287016131b3565b9150509250925092565b600080604083850312156141d8576141d761312a565b5b60006141e68582860161317d565b92505060206141f78582860161317d565b9150509250929050565b600080600080600060a0868803121561421d5761421c61312a565b5b600061422b8882890161317d565b955050602061423c8882890161317d565b945050604061424d888289016131b3565b935050606061425e888289016131b3565b925050608086013567ffffffffffffffff81111561427f5761427e61312f565b5b61428b88828901613599565b9150509295509295909350565b7f455243313135353a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b60006142f4602b83613487565b91506142ff82614298565b604082019050919050565b60006020820190508181036000830152614323816142e7565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006143518261432a565b61435b8185614335565b935061436b818560208601613498565b614374816132f7565b840191505092915050565b600060a082019050614394600083018861371d565b6143a1602083018761371d565b6143ae6040830186613208565b6143bb6060830185613208565b81810360808301526143cd8184614346565b90509695505050505050565b6000815190506143e88161325e565b92915050565b6000602082840312156144045761440361312a565b5b6000614412848285016143d9565b91505092915050565b60008160e01c9050919050565b600060033d11156144475760046000803e61444460005161441b565b90505b90565b600060443d106144d75761445c613120565b60043d036004823e80513d602482011167ffffffffffffffff821117156144845750506144d7565b808201805167ffffffffffffffff8111156144a257505050506144d7565b80602083010160043d0385018111156144bf5750505050506144d7565b6144ce82602001850186613337565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b6000614536603483613487565b9150614541826144da565b604082019050919050565b6000602082019050818103600083015261456581614529565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b60006145c8602883613487565b91506145d38261456c565b604082019050919050565b600060208201905081810360008301526145f7816145bb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061464557607f821691505b602082108103614658576146576145fe565b5b50919050565b600081905092915050565b60008190508160005260206000209050919050565b6000815461468b8161462d565b614695818661465e565b945060018216600081146146b057600181146146c1576146f4565b60ff198316865281860193506146f4565b6146ca85614669565b60005b838110156146ec578154818901526001820191506020810190506146cd565b838801955050505b50505092915050565b6000614709828561467e565b9150614715828461467e565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061475b82613192565b915061476683613192565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561479f5761479e614721565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006147e482613192565b91506147ef83613192565b9250826147ff576147fe6147aa565b5b828204905092915050565b7f455243313135353a20417272617973206c656e677468206d69736d6174636800600082015250565b6000614840601f83613487565b915061484b8261480a565b602082019050919050565b6000602082019050818103600083015261486f81614833565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006148b082613192565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036148e2576148e1614721565b5b600182019050919050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b6000614949602983613487565b9150614954826148ed565b604082019050919050565b600060208201905081810360008301526149788161493c565b9050919050565b600061498a82613192565b915061499583613192565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156149ca576149c9614721565b5b828201905092915050565b7f6d696e7420746f20746865207a65726f20616464726573730000000000000000600082015250565b6000614a0b601883613487565b9150614a16826149d5565b602082019050919050565b60006020820190508181036000830152614a3a816149fe565b9050919050565b6000819050919050565b6000614a66614a61614a5c84614a41565b613a72565b613192565b9050919050565b614a7681614a4b565b82525050565b6000604082019050614a916000830185613208565b614a9e6020830184614a6d565b9392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614b01602683613487565b9150614b0c82614aa5565b604082019050919050565b60006020820190508181036000830152614b3081614af4565b9050919050565b6000604082019050614b4c600083018561371d565b614b59602083018461371d565b9392505050565b600081519050614b6f81613fe9565b92915050565b600060208284031215614b8b57614b8a61312a565b5b6000614b9984828501614b60565b91505092915050565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b6000614bfe603283613487565b9150614c0982614ba2565b604082019050919050565b60006020820190508181036000830152614c2d81614bf1565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614c6a602083613487565b9150614c7582614c34565b602082019050919050565b60006020820190508181036000830152614c9981614c5d565b9050919050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000614cfc602183613487565b9150614d0782614ca0565b604082019050919050565b60006020820190508181036000830152614d2b81614cef565b9050919050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b6000614d8e602883613487565b9150614d9982614d32565b604082019050919050565b60006020820190508181036000830152614dbd81614d81565b9050919050565b6000604082019050614dd96000830185613208565b614de66020830184613208565b9392505050565b7f45524332393831526f79616c746965733a20546f6f2068696768000000000000600082015250565b6000614e23601a83613487565b9150614e2e82614ded565b602082019050919050565b60006020820190508181036000830152614e5281614e16565b9050919050565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b6000614eb5602983613487565b9150614ec082614e59565b604082019050919050565b60006020820190508181036000830152614ee481614ea8565b9050919050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614f47602583613487565b9150614f5282614eeb565b604082019050919050565b60006020820190508181036000830152614f7681614f3a565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b6000614fd9602a83613487565b9150614fe482614f7d565b604082019050919050565b6000602082019050818103600083015261500881614fcc565b9050919050565b600060408201905081810360008301526150298185613c87565b9050818103602083015261503d8184613c87565b90509392505050565b600060a08201905061505b600083018861371d565b615068602083018761371d565b818103604083015261507a8186613c87565b9050818103606083015261508e8185613c87565b905081810360808301526150a28184614346565b90509695505050505050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b600061510a602983613487565b9150615115826150ae565b604082019050919050565b60006020820190508181036000830152615139816150fd565b905091905056fea2646970667358221220084ff9b4b5a34813f16c5730e93ff260cc2a1c84d13f16b8cc25a87ff79867f664736f6c634300080d00330000000000000000000000000000000000000000000000000000000000000060000000000000000000000000e445fb0297f7d1f507df708185946210eb6a9de60000000000000000000000001bfe7452477accc0188c34b3a4e8e3b15bf671b00000000000000000000000000000000000000000000000000000000000000007697066733a2f2f00000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101e45760003560e01c806369b520171161010f5780639abc8320116100a2578063e2c7f33811610071578063e2c7f33814610566578063e985e9c514610582578063f242432a146105b2578063f2fde38b146105ce576101e4565b80639abc8320146104f2578063a22cb46514610510578063af8777071461052c578063d0414c9d14610548576101e4565b806382295a2d116100de57806382295a2d146104805780638d2bb0931461049c5780638da5cb5b146104b857806398faf29b146104d6576101e4565b806369b520171461040e5780636c52c3fb1461042a578063704fe71014610446578063715018a614610476576101e4565b80631f320331116101875780633a330022116101565780633a3300221461038657806341f43434146103a25780634e1273f4146103c057806358884432146103f0576101e4565b80631f320331146102ed5780632a55205a1461031d5780632eb2c2d61461034e578063337648b21461036a576101e4565b806306fdde03116101c357806306fdde0314610265578063084e9e24146102835780630e89341c1461029f57806318160ddd146102cf576101e4565b8062fdd58e146101e957806301ffc9a71461021957806302fe530514610249575b600080fd5b61020360048036038101906101fe91906131c8565b6105ea565b6040516102109190613217565b60405180910390f35b610233600480360381019061022e919061328a565b6106b2565b60405161024091906132d2565b60405180910390f35b610263600480360381019061025e9190613433565b6106c4565b005b61026d61072a565b60405161027a9190613504565b60405180910390f35b61029d600480360381019061029891906135c7565b610763565b005b6102b960048036038101906102b49190613670565b61093a565b6040516102c69190613504565b60405180910390f35b6102d7610978565b6040516102e49190613217565b60405180910390f35b6103076004803603810190610302919061369d565b61097e565b6040516103149190613217565b60405180910390f35b610337600480360381019061033291906136dd565b6109a3565b60405161034592919061372c565b60405180910390f35b6103686004803603810190610363919061381d565b610a74565b005b610384600480360381019061037f91906139cd565b610ac7565b005b6103a0600480360381019061039b9190613a45565b610be5565b005b6103aa610c31565b6040516103b79190613ad1565b60405180910390f35b6103da60048036038101906103d59190613baf565b610c43565b6040516103e79190613ce5565b60405180910390f35b6103f8610d5c565b6040516104059190613d07565b60405180910390f35b61042860048036038101906104239190613d22565b610d82565b005b610444600480360381019061043f9190613a45565b610ff5565b005b610460600480360381019061045b9190613670565b611041565b60405161046d9190613504565b60405180910390f35b61047e6110e1565b005b61049a60048036038101906104959190613e3b565b6110f5565b005b6104b660048036038101906104b19190613e97565b61117b565b005b6104c0611416565b6040516104cd9190613d07565b60405180910390f35b6104f060048036038101906104eb9190613f40565b611440565b005b6104fa611513565b6040516105079190613504565b60405180910390f35b61052a60048036038101906105259190614015565b6115a1565b005b61054660048036038101906105419190614055565b6115ba565b005b610550611a9c565b60405161055d9190613d07565b60405180910390f35b610580600480360381019061057b919061416e565b611ac2565b005b61059c600480360381019061059791906141c1565b611ada565b6040516105a991906132d2565b60405180910390f35b6105cc60048036038101906105c79190614201565b611b6e565b005b6105e860048036038101906105e39190613a45565b611bc1565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361065a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106519061430a565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60006106bd82611c44565b9050919050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461071e57600080fd5b61072781611cbe565b50565b6040518060400160405280601281526020017f566572736520576f726b732076302e332e30000000000000000000000000000081525081565b6107828473ffffffffffffffffffffffffffffffffffffffff16611cd8565b15610932578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b81526004016107c895949392919061437f565b6020604051808303816000875af192505050801561080457506040513d601f19601f8201168201806040525081019061080191906143ee565b60015b6108a957610810614428565b806308c379a00361086c575061082461444a565b8061082f575061086e565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108639190613504565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a09061454c565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610930576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610927906145de565b60405180910390fd5b505b505050505050565b60606003600160008481526020019081526020016000206040516020016109629291906146fd565b6040516020818303038152906040529050919050565b60065481565b6000602052816000526040600020602052806000526040600020600091509150505481565b6000806000600560008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900462ffffff1662ffffff1662ffffff1681525050905080600001519250612710816020015162ffffff1685610a609190614750565b610a6a91906147d9565b9150509250929050565b843373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ab257610ab133611cfb565b5b610abf8686868686611df8565b505050505050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b2157600080fd5b8051825114610b65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5c90614856565b60405180910390fd5b60005b8251811015610be057818181518110610b8457610b83614876565b5b602002602001015160016000858481518110610ba357610ba2614876565b5b602002602001015181526020019081526020016000209080519060200190610bcc92919061307d565b508080610bd8906148a5565b915050610b68565b505050565b610bed611e99565b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6daaeb6d7670e522a718067333cd4e81565b60608151835114610c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c809061495f565b60405180910390fd5b6000835167ffffffffffffffff811115610ca657610ca5613308565b5b604051908082528060200260200182016040528015610cd45781602001602082028036833780820191505090505b50905060005b8451811015610d5157610d21858281518110610cf957610cf8614876565b5b6020026020010151858381518110610d1457610d13614876565b5b60200260200101516105ea565b828281518110610d3457610d33614876565b5b60200260200101818152505080610d4a906148a5565b9050610cda565b508091505092915050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ddc57600080fd5b81518551148015610dee575080518551145b610e2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2490614856565b60405180910390fd5b610e4886868660405180602001604052806000815250611f17565b60005b8551811015610f40576000828281518110610e6957610e68614876565b5b60200260200101511115610ed157610ed0868281518110610e8d57610e8c614876565b5b6020026020010151848381518110610ea857610ea7614876565b5b6020026020010151848481518110610ec357610ec2614876565b5b6020026020010151612177565b5b838181518110610ee457610ee3614876565b5b602002602001015160016000888481518110610f0357610f02614876565b5b602002602001015181526020019081526020016000209080519060200190610f2c92919061307d565b508080610f38906148a5565b915050610e4b565b50600080600090505b8651811015610fd25760005b8651811015610fbe57868181518110610f7157610f70614876565b5b6020026020010151888381518110610f8c57610f8b614876565b5b6020026020010151610f9e9190614750565b83610fa9919061497f565b92508080610fb6906148a5565b915050610f55565b508080610fca906148a5565b915050610f49565b508060066000828254610fe5919061497f565b9250508190555050505050505050565b610ffd611e99565b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600160205280600052604060002060009150905080546110609061462d565b80601f016020809104026020016040519081016040528092919081815260200182805461108c9061462d565b80156110d95780601f106110ae576101008083540402835291602001916110d9565b820191906000526020600020905b8154815290600101906020018083116110bc57829003601f168201915b505050505081565b6110e9611e99565b6110f36000612273565b565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461114f57600080fd5b8060016000848152602001908152602001600020908051906020019061117692919061307d565b505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146111d557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611244576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123b90614a21565b60405180910390fd5b600160008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546112a4919061497f565b925050819055506001600660008282546112be919061497f565b92505081905550826001600086815260200190815260200160002090805190602001906112ec92919061307d565b50600081111561130257611301848383612177565b5b600061130c612339565b90508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62886001604051611386929190614a7c565b60405180910390a48573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62886001604051611405929190614a7c565b60405180910390a450505050505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461149a57600080fd5b6114b586868660405180602001604052806000815250612341565b60008111156114ca576114c9858383612177565b5b826001600087815260200190815260200160002090805190602001906114f192919061307d565b508360066000828254611504919061497f565b92505081905550505050505050565b600380546115209061462d565b80601f016020809104026020016040519081016040528092919081815260200182805461154c9061462d565b80156115995780601f1061156e57610100808354040283529160200191611599565b820191906000526020600020905b81548152906001019060200180831161157c57829003601f168201915b505050505081565b816115ab81611cfb565b6115b583836124f1565b505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461161457600080fd5b81518451148015611626575080518451145b611665576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165c90614856565b60405180910390fd5b600061166f612339565b905060005b8551811015611a7857600160008088848151811061169557611694614876565b5b6020026020010151815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116f7919061497f565b925050819055506117378260008a89858151811061171857611717614876565b5b6020026020010151600160405180602001604052806000815250610763565b600083828151811061174c5761174b614876565b5b602002602001015111156117b4576117b38682815181106117705761176f614876565b5b602002602001015185838151811061178b5761178a614876565b5b60200260200101518584815181106117a6576117a5614876565b5b6020026020010151612177565b5b8481815181106117c7576117c6614876565b5b6020026020010151600160008884815181106117e6576117e5614876565b5b60200260200101518152602001908152602001600020908051906020019061180f92919061307d565b50600073ffffffffffffffffffffffffffffffffffffffff1687828151811061183b5761183a614876565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16036118fd578773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628985815181106118d8576118d7614876565b5b602002602001015160016040516118f0929190614a7c565b60405180910390a4611a65565b8681815181106119105761190f614876565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6289858151811061199157611990614876565b5b602002602001015160016040516119a9929190614a7c565b60405180910390a48773ffffffffffffffffffffffffffffffffffffffff168782815181106119db576119da614876565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62898581518110611a4457611a43614876565b5b60200260200101516001604051611a5c929190614a7c565b60405180910390a45b8080611a70906148a5565b915050611674565b50845160066000828254611a8c919061497f565b9250508190555050505050505050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611aca611e99565b611ad5838383612177565b505050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b843373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611bac57611bab33611cfb565b5b611bb98686868686612507565b505050505050565b611bc9611e99565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611c38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2f90614b17565b60405180910390fd5b611c4181612273565b50565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611cb75750611cb6826125a8565b5b9050919050565b8060039080519060200190611cd492919061307d565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611df5576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611d72929190614b37565b602060405180830381865afa158015611d8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611db39190614b75565b611df457806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611deb9190613d07565b60405180910390fd5b5b50565b611e00612339565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611e465750611e4585611e40612339565b611ada565b5b611e85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7c90614c14565b60405180910390fd5b611e92858585858561268a565b5050505050565b611ea1612339565b73ffffffffffffffffffffffffffffffffffffffff16611ebf611416565b73ffffffffffffffffffffffffffffffffffffffff1614611f15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0c90614c80565b60405180910390fd5b565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611f86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7d90614d12565b60405180910390fd5b8151835114611fca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc190614da4565b60405180910390fd5b6000611fd4612339565b9050611fe5816000878787876129ab565b60005b84518110156121515783818151811061200457612003614876565b5b602002602001015160008087848151811061202257612021614876565b5b6020026020010151815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612084919061497f565b925050819055508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6288858151811061210557612104614876565b5b60200260200101518886815181106121205761211f614876565b5b6020026020010151604051612136929190614dc4565b60405180910390a48080612149906148a5565b915050611fe8565b50612161816000878787876129b3565b612170816000878787876129bb565b5050505050565b6127108111156121bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b390614e39565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff1681526020018262ffffff168152506005600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548162ffffff021916908362ffffff160217905550905050505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036123b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a790614d12565b60405180910390fd5b60006123ba612339565b905060006123c785612b92565b905060006123d485612b92565b90506123e5836000898585896129ab565b8460008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612444919061497f565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6289896040516124c2929190614dc4565b60405180910390a46124d9836000898585896129b3565b6124e883600089898989610763565b50505050505050565b6125036124fc612339565b8383612c0c565b5050565b61250f612339565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061255557506125548561254f612339565b611ada565b5b612594576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258b90614ecb565b60405180910390fd5b6125a18585858585612d78565b5050505050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061267357507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612683575061268282613013565b5b9050919050565b81518351146126ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c590614da4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361273d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273490614f5d565b60405180910390fd5b6000612747612339565b90506127578187878787876129ab565b60005b845181101561290857600085828151811061277857612777614876565b5b60200260200101519050600085838151811061279757612796614876565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612838576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282f90614fef565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128ed919061497f565b9250508190555050505080612901906148a5565b905061275a565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161297f92919061500f565b60405180910390a46129958187878787876129b3565b6129a38187878787876129bb565b505050505050565b505050505050565b505050505050565b6129da8473ffffffffffffffffffffffffffffffffffffffff16611cd8565b15612b8a578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401612a20959493929190615046565b6020604051808303816000875af1925050508015612a5c57506040513d601f19601f82011682018060405250810190612a5991906143ee565b60015b612b0157612a68614428565b806308c379a003612ac45750612a7c61444a565b80612a875750612ac6565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612abb9190613504565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af89061454c565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612b88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b7f906145de565b60405180910390fd5b505b505050505050565b60606000600167ffffffffffffffff811115612bb157612bb0613308565b5b604051908082528060200260200182016040528015612bdf5781602001602082028036833780820191505090505b5090508281600081518110612bf757612bf6614876565b5b60200260200101818152505080915050919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612c7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c7190615120565b60405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612d6b91906132d2565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612de7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dde90614f5d565b60405180910390fd5b6000612df1612339565b90506000612dfe85612b92565b90506000612e0b85612b92565b9050612e1b8389898585896129ab565b600080600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905085811015612eb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ea990614fef565b60405180910390fd5b85810360008089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560008089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f67919061497f565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a604051612fe4929190614dc4565b60405180910390a4612ffa848a8a86868a6129b3565b613008848a8a8a8a8a610763565b505050505050505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b8280546130899061462d565b90600052602060002090601f0160209004810192826130ab57600085556130f2565b82601f106130c457805160ff19168380011785556130f2565b828001600101855582156130f2579182015b828111156130f15782518255916020019190600101906130d6565b5b5090506130ff9190613103565b5090565b5b8082111561311c576000816000905550600101613104565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061315f82613134565b9050919050565b61316f81613154565b811461317a57600080fd5b50565b60008135905061318c81613166565b92915050565b6000819050919050565b6131a581613192565b81146131b057600080fd5b50565b6000813590506131c28161319c565b92915050565b600080604083850312156131df576131de61312a565b5b60006131ed8582860161317d565b92505060206131fe858286016131b3565b9150509250929050565b61321181613192565b82525050565b600060208201905061322c6000830184613208565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61326781613232565b811461327257600080fd5b50565b6000813590506132848161325e565b92915050565b6000602082840312156132a05761329f61312a565b5b60006132ae84828501613275565b91505092915050565b60008115159050919050565b6132cc816132b7565b82525050565b60006020820190506132e760008301846132c3565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613340826132f7565b810181811067ffffffffffffffff8211171561335f5761335e613308565b5b80604052505050565b6000613372613120565b905061337e8282613337565b919050565b600067ffffffffffffffff82111561339e5761339d613308565b5b6133a7826132f7565b9050602081019050919050565b82818337600083830152505050565b60006133d66133d184613383565b613368565b9050828152602081018484840111156133f2576133f16132f2565b5b6133fd8482856133b4565b509392505050565b600082601f83011261341a576134196132ed565b5b813561342a8482602086016133c3565b91505092915050565b6000602082840312156134495761344861312a565b5b600082013567ffffffffffffffff8111156134675761346661312f565b5b61347384828501613405565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156134b657808201518184015260208101905061349b565b838111156134c5576000848401525b50505050565b60006134d68261347c565b6134e08185613487565b93506134f0818560208601613498565b6134f9816132f7565b840191505092915050565b6000602082019050818103600083015261351e81846134cb565b905092915050565b600067ffffffffffffffff82111561354157613540613308565b5b61354a826132f7565b9050602081019050919050565b600061356a61356584613526565b613368565b905082815260208101848484011115613586576135856132f2565b5b6135918482856133b4565b509392505050565b600082601f8301126135ae576135ad6132ed565b5b81356135be848260208601613557565b91505092915050565b60008060008060008060c087890312156135e4576135e361312a565b5b60006135f289828a0161317d565b965050602061360389828a0161317d565b955050604061361489828a0161317d565b945050606061362589828a016131b3565b935050608061363689828a016131b3565b92505060a087013567ffffffffffffffff8111156136575761365661312f565b5b61366389828a01613599565b9150509295509295509295565b6000602082840312156136865761368561312a565b5b6000613694848285016131b3565b91505092915050565b600080604083850312156136b4576136b361312a565b5b60006136c2858286016131b3565b92505060206136d38582860161317d565b9150509250929050565b600080604083850312156136f4576136f361312a565b5b6000613702858286016131b3565b9250506020613713858286016131b3565b9150509250929050565b61372681613154565b82525050565b6000604082019050613741600083018561371d565b61374e6020830184613208565b9392505050565b600067ffffffffffffffff8211156137705761376f613308565b5b602082029050602081019050919050565b600080fd5b600061379961379484613755565b613368565b905080838252602082019050602084028301858111156137bc576137bb613781565b5b835b818110156137e557806137d188826131b3565b8452602084019350506020810190506137be565b5050509392505050565b600082601f830112613804576138036132ed565b5b8135613814848260208601613786565b91505092915050565b600080600080600060a086880312156138395761383861312a565b5b60006138478882890161317d565b95505060206138588882890161317d565b945050604086013567ffffffffffffffff8111156138795761387861312f565b5b613885888289016137ef565b935050606086013567ffffffffffffffff8111156138a6576138a561312f565b5b6138b2888289016137ef565b925050608086013567ffffffffffffffff8111156138d3576138d261312f565b5b6138df88828901613599565b9150509295509295909350565b600067ffffffffffffffff82111561390757613906613308565b5b602082029050602081019050919050565b600061392b613926846138ec565b613368565b9050808382526020820190506020840283018581111561394e5761394d613781565b5b835b8181101561399557803567ffffffffffffffff811115613973576139726132ed565b5b8086016139808982613405565b85526020850194505050602081019050613950565b5050509392505050565b600082601f8301126139b4576139b36132ed565b5b81356139c4848260208601613918565b91505092915050565b600080604083850312156139e4576139e361312a565b5b600083013567ffffffffffffffff811115613a0257613a0161312f565b5b613a0e858286016137ef565b925050602083013567ffffffffffffffff811115613a2f57613a2e61312f565b5b613a3b8582860161399f565b9150509250929050565b600060208284031215613a5b57613a5a61312a565b5b6000613a698482850161317d565b91505092915050565b6000819050919050565b6000613a97613a92613a8d84613134565b613a72565b613134565b9050919050565b6000613aa982613a7c565b9050919050565b6000613abb82613a9e565b9050919050565b613acb81613ab0565b82525050565b6000602082019050613ae66000830184613ac2565b92915050565b600067ffffffffffffffff821115613b0757613b06613308565b5b602082029050602081019050919050565b6000613b2b613b2684613aec565b613368565b90508083825260208201905060208402830185811115613b4e57613b4d613781565b5b835b81811015613b775780613b63888261317d565b845260208401935050602081019050613b50565b5050509392505050565b600082601f830112613b9657613b956132ed565b5b8135613ba6848260208601613b18565b91505092915050565b60008060408385031215613bc657613bc561312a565b5b600083013567ffffffffffffffff811115613be457613be361312f565b5b613bf085828601613b81565b925050602083013567ffffffffffffffff811115613c1157613c1061312f565b5b613c1d858286016137ef565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613c5c81613192565b82525050565b6000613c6e8383613c53565b60208301905092915050565b6000602082019050919050565b6000613c9282613c27565b613c9c8185613c32565b9350613ca783613c43565b8060005b83811015613cd8578151613cbf8882613c62565b9750613cca83613c7a565b925050600181019050613cab565b5085935050505092915050565b60006020820190508181036000830152613cff8184613c87565b905092915050565b6000602082019050613d1c600083018461371d565b92915050565b60008060008060008060c08789031215613d3f57613d3e61312a565b5b6000613d4d89828a0161317d565b965050602087013567ffffffffffffffff811115613d6e57613d6d61312f565b5b613d7a89828a016137ef565b955050604087013567ffffffffffffffff811115613d9b57613d9a61312f565b5b613da789828a016137ef565b945050606087013567ffffffffffffffff811115613dc857613dc761312f565b5b613dd489828a0161399f565b935050608087013567ffffffffffffffff811115613df557613df461312f565b5b613e0189828a01613b81565b92505060a087013567ffffffffffffffff811115613e2257613e2161312f565b5b613e2e89828a016137ef565b9150509295509295509295565b60008060408385031215613e5257613e5161312a565b5b6000613e60858286016131b3565b925050602083013567ffffffffffffffff811115613e8157613e8061312f565b5b613e8d85828601613405565b9150509250929050565b60008060008060008060c08789031215613eb457613eb361312a565b5b6000613ec289828a0161317d565b9650506020613ed389828a0161317d565b9550506040613ee489828a016131b3565b945050606087013567ffffffffffffffff811115613f0557613f0461312f565b5b613f1189828a01613405565b9350506080613f2289828a0161317d565b92505060a0613f3389828a016131b3565b9150509295509295509295565b60008060008060008060c08789031215613f5d57613f5c61312a565b5b6000613f6b89828a0161317d565b9650506020613f7c89828a016131b3565b9550506040613f8d89828a016131b3565b945050606087013567ffffffffffffffff811115613fae57613fad61312f565b5b613fba89828a01613405565b9350506080613fcb89828a0161317d565b92505060a0613fdc89828a016131b3565b9150509295509295509295565b613ff2816132b7565b8114613ffd57600080fd5b50565b60008135905061400f81613fe9565b92915050565b6000806040838503121561402c5761402b61312a565b5b600061403a8582860161317d565b925050602061404b85828601614000565b9150509250929050565b60008060008060008060c087890312156140725761407161312a565b5b600061408089828a0161317d565b965050602087013567ffffffffffffffff8111156140a1576140a061312f565b5b6140ad89828a01613b81565b955050604087013567ffffffffffffffff8111156140ce576140cd61312f565b5b6140da89828a016137ef565b945050606087013567ffffffffffffffff8111156140fb576140fa61312f565b5b61410789828a0161399f565b935050608087013567ffffffffffffffff8111156141285761412761312f565b5b61413489828a01613b81565b92505060a087013567ffffffffffffffff8111156141555761415461312f565b5b61416189828a016137ef565b9150509295509295509295565b6000806000606084860312156141875761418661312a565b5b6000614195868287016131b3565b93505060206141a68682870161317d565b92505060406141b7868287016131b3565b9150509250925092565b600080604083850312156141d8576141d761312a565b5b60006141e68582860161317d565b92505060206141f78582860161317d565b9150509250929050565b600080600080600060a0868803121561421d5761421c61312a565b5b600061422b8882890161317d565b955050602061423c8882890161317d565b945050604061424d888289016131b3565b935050606061425e888289016131b3565b925050608086013567ffffffffffffffff81111561427f5761427e61312f565b5b61428b88828901613599565b9150509295509295909350565b7f455243313135353a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b60006142f4602b83613487565b91506142ff82614298565b604082019050919050565b60006020820190508181036000830152614323816142e7565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006143518261432a565b61435b8185614335565b935061436b818560208601613498565b614374816132f7565b840191505092915050565b600060a082019050614394600083018861371d565b6143a1602083018761371d565b6143ae6040830186613208565b6143bb6060830185613208565b81810360808301526143cd8184614346565b90509695505050505050565b6000815190506143e88161325e565b92915050565b6000602082840312156144045761440361312a565b5b6000614412848285016143d9565b91505092915050565b60008160e01c9050919050565b600060033d11156144475760046000803e61444460005161441b565b90505b90565b600060443d106144d75761445c613120565b60043d036004823e80513d602482011167ffffffffffffffff821117156144845750506144d7565b808201805167ffffffffffffffff8111156144a257505050506144d7565b80602083010160043d0385018111156144bf5750505050506144d7565b6144ce82602001850186613337565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b6000614536603483613487565b9150614541826144da565b604082019050919050565b6000602082019050818103600083015261456581614529565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b60006145c8602883613487565b91506145d38261456c565b604082019050919050565b600060208201905081810360008301526145f7816145bb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061464557607f821691505b602082108103614658576146576145fe565b5b50919050565b600081905092915050565b60008190508160005260206000209050919050565b6000815461468b8161462d565b614695818661465e565b945060018216600081146146b057600181146146c1576146f4565b60ff198316865281860193506146f4565b6146ca85614669565b60005b838110156146ec578154818901526001820191506020810190506146cd565b838801955050505b50505092915050565b6000614709828561467e565b9150614715828461467e565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061475b82613192565b915061476683613192565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561479f5761479e614721565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006147e482613192565b91506147ef83613192565b9250826147ff576147fe6147aa565b5b828204905092915050565b7f455243313135353a20417272617973206c656e677468206d69736d6174636800600082015250565b6000614840601f83613487565b915061484b8261480a565b602082019050919050565b6000602082019050818103600083015261486f81614833565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006148b082613192565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036148e2576148e1614721565b5b600182019050919050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b6000614949602983613487565b9150614954826148ed565b604082019050919050565b600060208201905081810360008301526149788161493c565b9050919050565b600061498a82613192565b915061499583613192565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156149ca576149c9614721565b5b828201905092915050565b7f6d696e7420746f20746865207a65726f20616464726573730000000000000000600082015250565b6000614a0b601883613487565b9150614a16826149d5565b602082019050919050565b60006020820190508181036000830152614a3a816149fe565b9050919050565b6000819050919050565b6000614a66614a61614a5c84614a41565b613a72565b613192565b9050919050565b614a7681614a4b565b82525050565b6000604082019050614a916000830185613208565b614a9e6020830184614a6d565b9392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614b01602683613487565b9150614b0c82614aa5565b604082019050919050565b60006020820190508181036000830152614b3081614af4565b9050919050565b6000604082019050614b4c600083018561371d565b614b59602083018461371d565b9392505050565b600081519050614b6f81613fe9565b92915050565b600060208284031215614b8b57614b8a61312a565b5b6000614b9984828501614b60565b91505092915050565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b6000614bfe603283613487565b9150614c0982614ba2565b604082019050919050565b60006020820190508181036000830152614c2d81614bf1565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614c6a602083613487565b9150614c7582614c34565b602082019050919050565b60006020820190508181036000830152614c9981614c5d565b9050919050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000614cfc602183613487565b9150614d0782614ca0565b604082019050919050565b60006020820190508181036000830152614d2b81614cef565b9050919050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b6000614d8e602883613487565b9150614d9982614d32565b604082019050919050565b60006020820190508181036000830152614dbd81614d81565b9050919050565b6000604082019050614dd96000830185613208565b614de66020830184613208565b9392505050565b7f45524332393831526f79616c746965733a20546f6f2068696768000000000000600082015250565b6000614e23601a83613487565b9150614e2e82614ded565b602082019050919050565b60006020820190508181036000830152614e5281614e16565b9050919050565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b6000614eb5602983613487565b9150614ec082614e59565b604082019050919050565b60006020820190508181036000830152614ee481614ea8565b9050919050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614f47602583613487565b9150614f5282614eeb565b604082019050919050565b60006020820190508181036000830152614f7681614f3a565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b6000614fd9602a83613487565b9150614fe482614f7d565b604082019050919050565b6000602082019050818103600083015261500881614fcc565b9050919050565b600060408201905081810360008301526150298185613c87565b9050818103602083015261503d8184613c87565b90509392505050565b600060a08201905061505b600083018861371d565b615068602083018761371d565b818103604083015261507a8186613c87565b9050818103606083015261508e8185613c87565b905081810360808301526150a28184614346565b90509695505050505050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b600061510a602983613487565b9150615115826150ae565b604082019050919050565b60006020820190508181036000830152615139816150fd565b905091905056fea2646970667358221220084ff9b4b5a34813f16c5730e93ff260cc2a1c84d13f16b8cc25a87ff79867f664736f6c634300080d0033

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

0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000e445fb0297f7d1f507df708185946210eb6a9de60000000000000000000000001bfe7452477accc0188c34b3a4e8e3b15bf671b00000000000000000000000000000000000000000000000000000000000000007697066733a2f2f00000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : uri_ (string): ipfs://
Arg [1] : minter_ (address): 0xe445Fb0297F7D1f507dF708185946210eB6a9DE6
Arg [2] : gatewayManager_ (address): 0x1BFe7452477Accc0188c34B3a4e8E3B15bF671B0

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 000000000000000000000000e445fb0297f7d1f507df708185946210eb6a9de6
Arg [2] : 0000000000000000000000001bfe7452477accc0188c34b3a4e8e3b15bf671b0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [4] : 697066733a2f2f00000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

267:8983:13:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2339:305:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4167:217:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7772:96;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;588:50;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13969:870:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2008:189;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;645:26:13;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;693:63:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;836:329:6;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;1572:294:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8901:347;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8129:118;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;737:142:15;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2801:542:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;678:29:13;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3040:1054;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7943:102;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;808:38:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1824:101:16;;;:::i;:::-;;8674:134:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4744:664;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1194:85:16;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2331:408:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1060:21:3;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;994:202:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5939:1764;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;714:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8373:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3659:210:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1252:264:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2074:198:16;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2339:305:3;2465:7;2528:1;2509:21;;:7;:21;;;2488:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;2616:8;:12;2625:2;2616:12;;;;;;;;;;;:21;2629:7;2616:21;;;;;;;;;;;;;;;;2609:28;;2339:305;;;;:::o;4167:217:13:-;4314:4;4341:36;4365:11;4341:23;:36::i;:::-;4334:43;;4167:217;;;:::o;7772:96::-;905:14;;;;;;;;;;;891:28;;:10;:28;;;883:37;;;;;;7846:15:::1;7854:6;7846:7;:15::i;:::-;7772:96:::0;:::o;588:50::-;;;;;;;;;;;;;;;;;;;:::o;13969:870:3:-;14175:15;:2;:13;;;:15::i;:::-;14171:662;;;14243:2;14226:38;;;14286:8;14316:4;14342:2;14366:6;14394:4;14226:190;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;14206:617;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;14699:6;14692:14;;;;;;;;;;;:::i;:::-;;;;;;;;14206:617;;;14746:62;;;;;;;;;;:::i;:::-;;;;;;;;14206:617;14489:43;;;14477:55;;;:8;:55;;;;14473:152;;14556:50;;;;;;;;;;:::i;:::-;;;;;;;;14473:152;14429:210;14171:662;13969:870;;;;;;:::o;2008:189::-;2111:13;2171:7;2180:4;:8;2185:2;2180:8;;;;;;;;;;;2154:35;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2140:50;;2008:189;;;:::o;645:26:13:-;;;;:::o;693:63:3:-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;836:329:6:-;953:16;971:21;1008:28;1039:10;:19;1050:7;1039:19;;;;;;;;;;;1008:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1079:9;:19;;;1068:30;;1153:5;1133:9;:16;;;1125:24;;:5;:24;;;;:::i;:::-;1124:34;;;;:::i;:::-;1108:50;;998:167;836:329;;;;;:::o;1572:294:13:-;1786:4;2062:10:15;2054:18;;:4;:18;;;2050:81;;2088:32;2109:10;2088:20;:32::i;:::-;2050:81;1802:57:13::1;1830:4;1836:2;1840:3;1845:7;1854:4;1802:27;:57::i;:::-;1572:294:::0;;;;;;:::o;8901:347::-;905:14;;;;;;;;;;;891:28;;:10;:28;;;883:37;;;;;;9064:5:::1;:12;9045:8;:15;:31;9024:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;9148:9;9143:99;9167:8;:15;9163:1;:19;9143:99;;;9223:5;9229:1;9223:8;;;;;;;;:::i;:::-;;;;;;;;9203:4;:17;9208:8;9217:1;9208:11;;;;;;;;:::i;:::-;;;;;;;;9203:17;;;;;;;;;;;:28;;;;;;;;;;;;:::i;:::-;;9184:3;;;;;:::i;:::-;;;;9143:99;;;;8901:347:::0;;:::o;8129:118::-;1087:13:16;:11;:13::i;:::-;8225:15:13::1;8208:14;;:32;;;;;;;;;;;;;;;;;;8129:118:::0;:::o;737:142:15:-;836:42;737:142;:::o;2801:542:3:-;2952:16;3024:3;:10;3005:8;:15;:29;2984:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;3112:30;3159:8;:15;3145:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3112:63;;3191:9;3186:120;3210:8;:15;3206:1;:19;3186:120;;;3265:30;3275:8;3284:1;3275:11;;;;;;;;:::i;:::-;;;;;;;;3288:3;3292:1;3288:6;;;;;;;;:::i;:::-;;;;;;;;3265:9;:30::i;:::-;3246:13;3260:1;3246:16;;;;;;;;:::i;:::-;;;;;;;:49;;;;;3227:3;;;;:::i;:::-;;;3186:120;;;;3323:13;3316:20;;;2801:542;;;;:::o;678:29:13:-;;;;;;;;;;;;;:::o;3040:1054::-;804:14;;;;;;;;;;;790:28;;:10;:28;;;782:37;;;;;;3331:17:::1;:24;3317:3;:10;:38;:92;;;;;3389:13;:20;3375:3;:10;:34;3317:92;3296:170;;;;;;;;;;;;:::i;:::-;;;;;;;;;3476:32;3487:2;3491:3;3496:7;3476:32;;;;;;;;;;;::::0;:10:::1;:32::i;:::-;3524:9;3519:335;3539:3;:10;3535:1;:14;3519:335;;;3593:1;3574:13;3588:1;3574:16;;;;;;;;:::i;:::-;;;;;;;;:20;3570:201;;;3614:142;3652:3;3656:1;3652:6;;;;;;;;:::i;:::-;;;;;;;;3680:17;3698:1;3680:20;;;;;;;;:::i;:::-;;;;;;;;3722:13;3736:1;3722:16;;;;;;;;:::i;:::-;;;;;;;;3614;:142::i;:::-;3570:201;3831:9;3841:1;3831:12;;;;;;;;:::i;:::-;;;;;;;;3816:4;:12;3821:3;3825:1;3821:6;;;;;;;;:::i;:::-;;;;;;;;3816:12;;;;;;;;;;;:27;;;;;;;;;;;;:::i;:::-;;3551:3;;;;;:::i;:::-;;;;3519:335;;;;3864:13;3892:9:::0;3904:1:::1;3892:13;;3887:171;3911:3;:10;3907:1;:14;3887:171;;;3947:9;3942:106;3966:7;:14;3962:1;:18;3942:106;;;4023:7;4031:1;4023:10;;;;;;;;:::i;:::-;;;;;;;;4014:3;4018:1;4014:6;;;;;;;;:::i;:::-;;;;;;;;:19;;;;:::i;:::-;4005:28;;;;;:::i;:::-;;;3982:3;;;;;:::i;:::-;;;;3942:106;;;;3923:3;;;;;:::i;:::-;;;;3887:171;;;;4082:5;4067:11;;:20;;;;;;;:::i;:::-;;;;;;;;3286:808;3040:1054:::0;;;;;;:::o;7943:102::-;1087:13:16;:11;:13::i;:::-;8031:7:13::1;8014:14;;:24;;;;;;;;;;;;;;;;;;7943:102:::0;:::o;808:38:3:-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1824:101:16:-;1087:13;:11;:13::i;:::-;1888:30:::1;1915:1;1888:18;:30::i;:::-;1824:101::o:0;8674:134:13:-;905:14;;;;;;;;;;;891:28;;:10;:28;;;883:37;;;;;;8798:3:::1;8782:4;:13;8787:7;8782:13;;;;;;;;;;;:19;;;;;;;;;;;;:::i;:::-;;8674:134:::0;;:::o;4744:664::-;804:14;;;;;;;;;;;790:28;;:10;:28;;;782:37;;;;;;4986:1:::1;4972:16;;:2;:16;;::::0;4964:53:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;5053:1;5028:8;:17:::0;5037:7:::1;5028:17;;;;;;;;;;;:21;5046:2;5028:21;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;5079:1;5064:11;;:16;;;;;;;:::i;:::-;;;;;;;;5106:3;5090:4;:13;5095:7;5090:13;;;;;;;;;;;:19;;;;;;;;;;;;:::i;:::-;;5139:1;5124:12;:16;5120:104;;;5156:57;5173:7;5182:16;5200:12;5156:16;:57::i;:::-;5120:104;5234:16;5253:12;:10;:12::i;:::-;5234:31;;5317:7;5280:57;;5313:1;5280:57;;5295:8;5280:57;;;5326:7;5335:1;5280:57;;;;;;;:::i;:::-;;;;;;;;5386:2;5352:49;;5377:7;5352:49;;5367:8;5352:49;;;5390:7;5399:1;5352:49;;;;;;;:::i;:::-;;;;;;;;4954:454;4744:664:::0;;;;;;:::o;1194:85:16:-;1240:7;1266:6;;;;;;;;;;;1259:13;;1194:85;:::o;2331:408:13:-;804:14;;;;;;;;;;;790:28;;:10;:28;;;782:37;;;;;;2539:30:::1;2545:7;2554:2;2558:6;2539:30;;;;;;;;;;;::::0;:5:::1;:30::i;:::-;2598:1;2583:12;:16;2579:99;;;2615:52;2632:2;2636:16;2654:12;2615:16;:52::i;:::-;2579:99;2698:3;2687:4;:8;2692:2;2687:8;;;;;;;;;;;:14;;;;;;;;;;;;:::i;:::-;;2726:6;2711:11;;:21;;;;;;;:::i;:::-;;;;;;;;2331:408:::0;;;;;;:::o;1060:21:3:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;994:202:13:-;1122:8;2227:30:15;2248:8;2227:20;:30::i;:::-;1146:43:13::1;1170:8;1180;1146:23;:43::i;:::-;994:202:::0;;;:::o;5939:1764::-;804:14;;;;;;;;;;;790:28;;:10;:28;;;782:37;;;;;;6252:17:::1;:24;6233:8;:15;:43;:102;;;;;6315:13;:20;6296:8;:15;:39;6233:102;6212:180;;;;;;;;;;;;:::i;:::-;;;;;;;;;6403:16;6422:12;:10;:12::i;:::-;6403:31;;6450:9;6445:1180;6469:8;:15;6465:1;:19;6445:1180;;;6534:1;6505:8;:21:::0;6514:8:::1;6523:1;6514:11;;;;;;;;:::i;:::-;;;;;;;;6505:21;;;;;;;;;;;:25;6527:2;6505:25;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;6599:186;6647:8;6681:1;6701:2;6721:8;6730:1;6721:11;;;;;;;;:::i;:::-;;;;;;;;6750:1;6599:186;;;;;;;;;;;::::0;:30:::1;:186::i;:::-;6855:1;6836:13;6850:1;6836:16;;;;;;;;:::i;:::-;;;;;;;;:20;6832:206;;;6876:147;6914:8;6923:1;6914:11;;;;;;;;:::i;:::-;;;;;;;;6947:17;6965:1;6947:20;;;;;;;;:::i;:::-;;;;;;;;6989:13;7003:1;6989:16;;;;;;;;:::i;:::-;;;;;;;;6876;:147::i;:::-;6832:206;7103:9;7113:1;7103:12;;;;;;;;:::i;:::-;;;;;;;;7083:4;:17;7088:8;7097:1;7088:11;;;;;;;;:::i;:::-;;;;;;;;7083:17;;;;;;;;;;;:32;;;;;;;;;;;;:::i;:::-;;7210:1;7187:25;;:8;7196:1;7187:11;;;;;;;;:::i;:::-;;;;;;;;:25;;::::0;7183:432:::1;;7274:2;7237:56;;7270:1;7237:56;;7252:8;7237:56;;;7278:8;7287:1;7278:11;;;;;;;;:::i;:::-;;;;;;;;7291:1;7237:56;;;;;;;:::i;:::-;;;;;;;;7183:432;;;7435:8;7444:1;7435:11;;;;;;;;:::i;:::-;;;;;;;;7337:183;;7411:1;7337:183;;7373:8;7337:183;;;7468:8;7477:1;7468:11;;;;;;;;:::i;:::-;;;;;;;;7501:1;7337:183;;;;;;;:::i;:::-;;;;;;;;7581:2;7543:57;;7568:8;7577:1;7568:11;;;;;;;;:::i;:::-;;;;;;;;7543:57;;7558:8;7543:57;;;7585:8;7594:1;7585:11;;;;;;;;:::i;:::-;;;;;;;;7598:1;7543:57;;;;;;;:::i;:::-;;;;;;;;7183:432;6486:3;;;;;:::i;:::-;;;;6445:1180;;;;7681:8;:15;7666:11;;:30;;;;;;;:::i;:::-;;;;;;;;6202:1501;5939:1764:::0;;;;;;:::o;714:29::-;;;;;;;;;;;;;:::o;8373:208::-;1087:13:16;:11;:13::i;:::-;8517:57:13::1;8534:7;8543:16;8561:12;8517:16;:57::i;:::-;8373:208:::0;;;:::o;3659:210:3:-;3798:4;3825:18;:27;3844:7;3825:27;;;;;;;;;;;;;;;:37;3853:8;3825:37;;;;;;;;;;;;;;;;;;;;;;;;;3818:44;;3659:210;;;;:::o;1252:264:13:-;1438:4;2062:10:15;2054:18;;:4;:18;;;2050:81;;2088:32;2109:10;2088:20;:32::i;:::-;2050:81;1454:55:13::1;1477:4;1483:2;1487:7;1496:6;1504:4;1454:22;:55::i;:::-;1252:264:::0;;;;;;:::o;2074:198:16:-;1087:13;:11;:13::i;:::-;2182:1:::1;2162:22;;:8;:22;;::::0;2154:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2237:28;2256:8;2237:18;:28::i;:::-;2074:198:::0;:::o;365:273:5:-;490:4;544:35;529:50;;;:11;:50;;;;:102;;;;595:36;619:11;595:23;:36::i;:::-;529:102;510:121;;365:273;;;:::o;8698:89:3:-;8774:6;8764:7;:16;;;;;;;;;;;;:::i;:::-;;8698:89;:::o;1175:320:0:-;1235:4;1487:1;1465:7;:19;;;:23;1458:30;;1175:320;;;:::o;2285:412:15:-;2522:1;836:42;2474:45;;;:49;2470:221;;;836:42;2544;;;2595:4;2602:8;2544:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2539:142;;2657:8;2638:28;;;;;;;;;;;:::i;:::-;;;;;;;;2539:142;2470:221;2285:412;:::o;4397:430:3:-;4630:12;:10;:12::i;:::-;4622:20;;:4;:20;;;:60;;;;4646:36;4663:4;4669:12;:10;:12::i;:::-;4646:16;:36::i;:::-;4622:60;4601:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;4768:52;4791:4;4797:2;4801:3;4806:7;4815:4;4768:22;:52::i;:::-;4397:430;;;;;:::o;1352:130:16:-;1426:12;:10;:12::i;:::-;1415:23;;:7;:5;:7::i;:::-;:23;;;1407:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1352:130::o;10295:916:3:-;10481:1;10467:16;;:2;:16;;;10459:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;10566:7;:14;10552:3;:10;:28;10531:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;10657:16;10676:12;:10;:12::i;:::-;10657:31;;10699:66;10720:8;10738:1;10742:2;10746:3;10751:7;10760:4;10699:20;:66::i;:::-;10781:9;10776:179;10800:3;:10;10796:1;:14;10776:179;;;10855:7;10863:1;10855:10;;;;;;;;:::i;:::-;;;;;;;;10831:8;:16;10840:3;10844:1;10840:6;;;;;;;;:::i;:::-;;;;;;;;10831:16;;;;;;;;;;;:20;10848:2;10831:20;;;;;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;;;;;10921:2;10884:60;;10917:1;10884:60;;10899:8;10884:60;;;10925:3;10929:1;10925:6;;;;;;;;:::i;:::-;;;;;;;;10933:7;10941:1;10933:10;;;;;;;;:::i;:::-;;;;;;;;10884:60;;;;;;;:::i;:::-;;;;;;;;10812:3;;;;;:::i;:::-;;;;10776:179;;;;10965:65;10985:8;11003:1;11007:2;11011:3;11016:7;11025:4;10965:19;:65::i;:::-;11041:163;11090:8;11120:1;11136:2;11152:3;11169:7;11190:4;11041:35;:163::i;:::-;10449:762;10295:916;;;;:::o;537:255:6:-;680:5;671;:14;;663:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;748:37;;;;;;;;760:9;748:37;;;;;;778:5;748:37;;;;;726:10;:19;737:7;726:19;;;;;;;;;;;:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;537:255;;;:::o;2426:187:16:-;2499:16;2518:6;;;;;;;;;;;2499:25;;2543:8;2534:6;;:17;;;;;;;;;;;;;;;;;;2597:8;2566:40;;2587:8;2566:40;;;;;;;;;;;;2489:124;2426:187;:::o;640:96:1:-;693:7;719:10;712:17;;640:96;:::o;9160:790:3:-;9321:1;9307:16;;:2;:16;;;9299:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;9372:16;9391:12;:10;:12::i;:::-;9372:31;;9413:20;9436:21;9454:2;9436:17;:21::i;:::-;9413:44;;9467:24;9494:25;9512:6;9494:17;:25::i;:::-;9467:52;;9530:66;9551:8;9569:1;9573:2;9577:3;9582:7;9591:4;9530:20;:66::i;:::-;9627:6;9607:8;:12;9616:2;9607:12;;;;;;;;;;;:16;9620:2;9607:16;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;9685:2;9648:52;;9681:1;9648:52;;9663:8;9648:52;;;9689:2;9693:6;9648:52;;;;;;;:::i;:::-;;;;;;;;9711:65;9731:8;9749:1;9753:2;9757:3;9762:7;9771:4;9711:19;:65::i;:::-;9787:156;9831:8;9861:1;9877:2;9893;9909:6;9929:4;9787:30;:156::i;:::-;9289:661;;;9160:790;;;;:::o;3411:181::-;3533:52;3552:12;:10;:12::i;:::-;3566:8;3576;3533:18;:52::i;:::-;3411:181;;:::o;3936:389::-;4144:12;:10;:12::i;:::-;4136:20;;:4;:20;;;:60;;;;4160:36;4177:4;4183:12;:10;:12::i;:::-;4160:16;:36::i;:::-;4136:60;4115:148;;;;;;;;;;;;:::i;:::-;;;;;;;;;4273:45;4291:4;4297:2;4301;4305:6;4313:4;4273:17;:45::i;:::-;3936:389;;;;;:::o;1260:349::-;1402:4;1456:26;1441:41;;;:11;:41;;;;:109;;;;1513:37;1498:52;;;:11;:52;;;;1441:109;:161;;;;1566:36;1590:11;1566:23;:36::i;:::-;1441:161;1422:180;;1260:349;;;:::o;6601:1274::-;6834:7;:14;6820:3;:10;:28;6799:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;6946:1;6932:16;;:2;:16;;;6924:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;7001:16;7020:12;:10;:12::i;:::-;7001:31;;7043:60;7064:8;7074:4;7080:2;7084:3;7089:7;7098:4;7043:20;:60::i;:::-;7119:9;7114:454;7138:3;:10;7134:1;:14;7114:454;;;7169:10;7182:3;7186:1;7182:6;;;;;;;;:::i;:::-;;;;;;;;7169:19;;7202:14;7219:7;7227:1;7219:10;;;;;;;;:::i;:::-;;;;;;;;7202:27;;7244:19;7266:8;:12;7275:2;7266:12;;;;;;;;;;;:18;7279:4;7266:18;;;;;;;;;;;;;;;;7244:40;;7338:6;7323:11;:21;;7298:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;7497:6;7483:11;:20;7462:8;:12;7471:2;7462:12;;;;;;;;;;;:18;7475:4;7462:18;;;;;;;;;;;;;;;:41;;;;7551:6;7531:8;:12;7540:2;7531:12;;;;;;;;;;;:16;7544:2;7531:16;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;7155:413;;;7150:3;;;;:::i;:::-;;;7114:454;;;;7613:2;7583:47;;7607:4;7583:47;;7597:8;7583:47;;;7617:3;7622:7;7583:47;;;;;;;:::i;:::-;;;;;;;;7641:59;7661:8;7671:4;7677:2;7681:3;7686:7;7695:4;7641:19;:59::i;:::-;7711:157;7760:8;7782:4;7800:2;7816:3;7833:7;7854:4;7711:35;:157::i;:::-;6789:1086;6601:1274;;;;;:::o;12603:214::-;;;;;;;:::o;13750:213::-;;;;;;;:::o;14845:946::-;15077:15;:2;:13;;;:15::i;:::-;15073:712;;;15145:2;15128:43;;;15193:8;15223:4;15249:3;15274:7;15303:4;15128:197;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;15108:667;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;15651:6;15644:14;;;;;;;;;;;:::i;:::-;;;;;;;;15108:667;;;15698:62;;;;;;;;;;:::i;:::-;;;;;;;;15108:667;15419:48;;;15407:60;;;:8;:60;;;;15382:195;;15508:50;;;;;;;;;;:::i;:::-;;;;;;;;15382:195;15338:253;15073:712;14845:946;;;;;;:::o;15797:221::-;15887:16;15919:22;15958:1;15944:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15919:41;;15981:7;15970:5;15976:1;15970:8;;;;;;;;:::i;:::-;;;;;;;:18;;;;;16006:5;15999:12;;;15797:221;;;:::o;11346:323::-;11496:8;11487:17;;:5;:17;;;11479:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;11598:8;11560:18;:25;11579:5;11560:25;;;;;;;;;;;;;;;:35;11586:8;11560:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;11643:8;11621:41;;11636:5;11621:41;;;11653:8;11621:41;;;;;;:::i;:::-;;;;;;;;11346:323;;;:::o;5277:978::-;5472:1;5458:16;;:2;:16;;;5450:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;5527:16;5546:12;:10;:12::i;:::-;5527:31;;5568:20;5591:21;5609:2;5591:17;:21::i;:::-;5568:44;;5622:24;5649:25;5667:6;5649:17;:25::i;:::-;5622:52;;5685:60;5706:8;5716:4;5722:2;5726:3;5731:7;5740:4;5685:20;:60::i;:::-;5756:19;5778:8;:12;5787:2;5778:12;;;;;;;;;;;:18;5791:4;5778:18;;;;;;;;;;;;;;;;5756:40;;5842:6;5827:11;:21;;5806:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;5985:6;5971:11;:20;5950:8;:12;5959:2;5950:12;;;;;;;;;;;:18;5963:4;5950:18;;;;;;;;;;;;;;;:41;;;;6031:6;6011:8;:12;6020:2;6011:12;;;;;;;;;;;:16;6024:2;6011:16;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;6084:2;6053:46;;6078:4;6053:46;;6068:8;6053:46;;;6088:2;6092:6;6053:46;;;;;;;:::i;:::-;;;;;;;;6110:59;6130:8;6140:4;6146:2;6150:3;6155:7;6164:4;6110:19;:59::i;:::-;6180:68;6211:8;6221:4;6227:2;6231;6235:6;6243:4;6180:30;:68::i;:::-;5440:815;;;;5277:978;;;;;:::o;829:155:4:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:18:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:77::-;878:7;907:5;896:16;;841:77;;;:::o;924:122::-;997:24;1015:5;997:24;:::i;:::-;990:5;987:35;977:63;;1036:1;1033;1026:12;977:63;924:122;:::o;1052:139::-;1098:5;1136:6;1123:20;1114:29;;1152:33;1179:5;1152:33;:::i;:::-;1052:139;;;;:::o;1197:474::-;1265:6;1273;1322:2;1310:9;1301:7;1297:23;1293:32;1290:119;;;1328:79;;:::i;:::-;1290:119;1448:1;1473:53;1518:7;1509:6;1498:9;1494:22;1473:53;:::i;:::-;1463:63;;1419:117;1575:2;1601:53;1646:7;1637:6;1626:9;1622:22;1601:53;:::i;:::-;1591:63;;1546:118;1197:474;;;;;:::o;1677:118::-;1764:24;1782:5;1764:24;:::i;:::-;1759:3;1752:37;1677:118;;:::o;1801:222::-;1894:4;1932:2;1921:9;1917:18;1909:26;;1945:71;2013:1;2002:9;1998:17;1989:6;1945:71;:::i;:::-;1801:222;;;;:::o;2029:149::-;2065:7;2105:66;2098:5;2094:78;2083:89;;2029:149;;;:::o;2184:120::-;2256:23;2273:5;2256:23;:::i;:::-;2249:5;2246:34;2236:62;;2294:1;2291;2284:12;2236:62;2184:120;:::o;2310:137::-;2355:5;2393:6;2380:20;2371:29;;2409:32;2435:5;2409:32;:::i;:::-;2310:137;;;;:::o;2453:327::-;2511:6;2560:2;2548:9;2539:7;2535:23;2531:32;2528:119;;;2566:79;;:::i;:::-;2528:119;2686:1;2711:52;2755:7;2746:6;2735:9;2731:22;2711:52;:::i;:::-;2701:62;;2657:116;2453:327;;;;:::o;2786:90::-;2820:7;2863:5;2856:13;2849:21;2838:32;;2786:90;;;:::o;2882:109::-;2963:21;2978:5;2963:21;:::i;:::-;2958:3;2951:34;2882:109;;:::o;2997:210::-;3084:4;3122:2;3111:9;3107:18;3099:26;;3135:65;3197:1;3186:9;3182:17;3173:6;3135:65;:::i;:::-;2997:210;;;;:::o;3213:117::-;3322:1;3319;3312:12;3336:117;3445:1;3442;3435:12;3459:102;3500:6;3551:2;3547:7;3542:2;3535:5;3531:14;3527:28;3517:38;;3459:102;;;:::o;3567:180::-;3615:77;3612:1;3605:88;3712:4;3709:1;3702:15;3736:4;3733:1;3726:15;3753:281;3836:27;3858:4;3836:27;:::i;:::-;3828:6;3824:40;3966:6;3954:10;3951:22;3930:18;3918:10;3915:34;3912:62;3909:88;;;3977:18;;:::i;:::-;3909:88;4017:10;4013:2;4006:22;3796:238;3753:281;;:::o;4040:129::-;4074:6;4101:20;;:::i;:::-;4091:30;;4130:33;4158:4;4150:6;4130:33;:::i;:::-;4040:129;;;:::o;4175:308::-;4237:4;4327:18;4319:6;4316:30;4313:56;;;4349:18;;:::i;:::-;4313:56;4387:29;4409:6;4387:29;:::i;:::-;4379:37;;4471:4;4465;4461:15;4453:23;;4175:308;;;:::o;4489:154::-;4573:6;4568:3;4563;4550:30;4635:1;4626:6;4621:3;4617:16;4610:27;4489:154;;;:::o;4649:412::-;4727:5;4752:66;4768:49;4810:6;4768:49;:::i;:::-;4752:66;:::i;:::-;4743:75;;4841:6;4834:5;4827:21;4879:4;4872:5;4868:16;4917:3;4908:6;4903:3;4899:16;4896:25;4893:112;;;4924:79;;:::i;:::-;4893:112;5014:41;5048:6;5043:3;5038;5014:41;:::i;:::-;4733:328;4649:412;;;;;:::o;5081:340::-;5137:5;5186:3;5179:4;5171:6;5167:17;5163:27;5153:122;;5194:79;;:::i;:::-;5153:122;5311:6;5298:20;5336:79;5411:3;5403:6;5396:4;5388:6;5384:17;5336:79;:::i;:::-;5327:88;;5143:278;5081:340;;;;:::o;5427:509::-;5496:6;5545:2;5533:9;5524:7;5520:23;5516:32;5513:119;;;5551:79;;:::i;:::-;5513:119;5699:1;5688:9;5684:17;5671:31;5729:18;5721:6;5718:30;5715:117;;;5751:79;;:::i;:::-;5715:117;5856:63;5911:7;5902:6;5891:9;5887:22;5856:63;:::i;:::-;5846:73;;5642:287;5427:509;;;;:::o;5942:99::-;5994:6;6028:5;6022:12;6012:22;;5942:99;;;:::o;6047:169::-;6131:11;6165:6;6160:3;6153:19;6205:4;6200:3;6196:14;6181:29;;6047:169;;;;:::o;6222:307::-;6290:1;6300:113;6314:6;6311:1;6308:13;6300:113;;;6399:1;6394:3;6390:11;6384:18;6380:1;6375:3;6371:11;6364:39;6336:2;6333:1;6329:10;6324:15;;6300:113;;;6431:6;6428:1;6425:13;6422:101;;;6511:1;6502:6;6497:3;6493:16;6486:27;6422:101;6271:258;6222:307;;;:::o;6535:364::-;6623:3;6651:39;6684:5;6651:39;:::i;:::-;6706:71;6770:6;6765:3;6706:71;:::i;:::-;6699:78;;6786:52;6831:6;6826:3;6819:4;6812:5;6808:16;6786:52;:::i;:::-;6863:29;6885:6;6863:29;:::i;:::-;6858:3;6854:39;6847:46;;6627:272;6535:364;;;;:::o;6905:313::-;7018:4;7056:2;7045:9;7041:18;7033:26;;7105:9;7099:4;7095:20;7091:1;7080:9;7076:17;7069:47;7133:78;7206:4;7197:6;7133:78;:::i;:::-;7125:86;;6905:313;;;;:::o;7224:307::-;7285:4;7375:18;7367:6;7364:30;7361:56;;;7397:18;;:::i;:::-;7361:56;7435:29;7457:6;7435:29;:::i;:::-;7427:37;;7519:4;7513;7509:15;7501:23;;7224:307;;;:::o;7537:410::-;7614:5;7639:65;7655:48;7696:6;7655:48;:::i;:::-;7639:65;:::i;:::-;7630:74;;7727:6;7720:5;7713:21;7765:4;7758:5;7754:16;7803:3;7794:6;7789:3;7785:16;7782:25;7779:112;;;7810:79;;:::i;:::-;7779:112;7900:41;7934:6;7929:3;7924;7900:41;:::i;:::-;7620:327;7537:410;;;;;:::o;7966:338::-;8021:5;8070:3;8063:4;8055:6;8051:17;8047:27;8037:122;;8078:79;;:::i;:::-;8037:122;8195:6;8182:20;8220:78;8294:3;8286:6;8279:4;8271:6;8267:17;8220:78;:::i;:::-;8211:87;;8027:277;7966:338;;;;:::o;8310:1235::-;8423:6;8431;8439;8447;8455;8463;8512:3;8500:9;8491:7;8487:23;8483:33;8480:120;;;8519:79;;:::i;:::-;8480:120;8639:1;8664:53;8709:7;8700:6;8689:9;8685:22;8664:53;:::i;:::-;8654:63;;8610:117;8766:2;8792:53;8837:7;8828:6;8817:9;8813:22;8792:53;:::i;:::-;8782:63;;8737:118;8894:2;8920:53;8965:7;8956:6;8945:9;8941:22;8920:53;:::i;:::-;8910:63;;8865:118;9022:2;9048:53;9093:7;9084:6;9073:9;9069:22;9048:53;:::i;:::-;9038:63;;8993:118;9150:3;9177:53;9222:7;9213:6;9202:9;9198:22;9177:53;:::i;:::-;9167:63;;9121:119;9307:3;9296:9;9292:19;9279:33;9339:18;9331:6;9328:30;9325:117;;;9361:79;;:::i;:::-;9325:117;9466:62;9520:7;9511:6;9500:9;9496:22;9466:62;:::i;:::-;9456:72;;9250:288;8310:1235;;;;;;;;:::o;9551:329::-;9610:6;9659:2;9647:9;9638:7;9634:23;9630:32;9627:119;;;9665:79;;:::i;:::-;9627:119;9785:1;9810:53;9855:7;9846:6;9835:9;9831:22;9810:53;:::i;:::-;9800:63;;9756:117;9551:329;;;;:::o;9886:474::-;9954:6;9962;10011:2;9999:9;9990:7;9986:23;9982:32;9979:119;;;10017:79;;:::i;:::-;9979:119;10137:1;10162:53;10207:7;10198:6;10187:9;10183:22;10162:53;:::i;:::-;10152:63;;10108:117;10264:2;10290:53;10335:7;10326:6;10315:9;10311:22;10290:53;:::i;:::-;10280:63;;10235:118;9886:474;;;;;:::o;10366:::-;10434:6;10442;10491:2;10479:9;10470:7;10466:23;10462:32;10459:119;;;10497:79;;:::i;:::-;10459:119;10617:1;10642:53;10687:7;10678:6;10667:9;10663:22;10642:53;:::i;:::-;10632:63;;10588:117;10744:2;10770:53;10815:7;10806:6;10795:9;10791:22;10770:53;:::i;:::-;10760:63;;10715:118;10366:474;;;;;:::o;10846:118::-;10933:24;10951:5;10933:24;:::i;:::-;10928:3;10921:37;10846:118;;:::o;10970:332::-;11091:4;11129:2;11118:9;11114:18;11106:26;;11142:71;11210:1;11199:9;11195:17;11186:6;11142:71;:::i;:::-;11223:72;11291:2;11280:9;11276:18;11267:6;11223:72;:::i;:::-;10970:332;;;;;:::o;11308:311::-;11385:4;11475:18;11467:6;11464:30;11461:56;;;11497:18;;:::i;:::-;11461:56;11547:4;11539:6;11535:17;11527:25;;11607:4;11601;11597:15;11589:23;;11308:311;;;:::o;11625:117::-;11734:1;11731;11724:12;11765:710;11861:5;11886:81;11902:64;11959:6;11902:64;:::i;:::-;11886:81;:::i;:::-;11877:90;;11987:5;12016:6;12009:5;12002:21;12050:4;12043:5;12039:16;12032:23;;12103:4;12095:6;12091:17;12083:6;12079:30;12132:3;12124:6;12121:15;12118:122;;;12151:79;;:::i;:::-;12118:122;12266:6;12249:220;12283:6;12278:3;12275:15;12249:220;;;12358:3;12387:37;12420:3;12408:10;12387:37;:::i;:::-;12382:3;12375:50;12454:4;12449:3;12445:14;12438:21;;12325:144;12309:4;12304:3;12300:14;12293:21;;12249:220;;;12253:21;11867:608;;11765:710;;;;;:::o;12498:370::-;12569:5;12618:3;12611:4;12603:6;12599:17;12595:27;12585:122;;12626:79;;:::i;:::-;12585:122;12743:6;12730:20;12768:94;12858:3;12850:6;12843:4;12835:6;12831:17;12768:94;:::i;:::-;12759:103;;12575:293;12498:370;;;;:::o;12874:1509::-;13028:6;13036;13044;13052;13060;13109:3;13097:9;13088:7;13084:23;13080:33;13077:120;;;13116:79;;:::i;:::-;13077:120;13236:1;13261:53;13306:7;13297:6;13286:9;13282:22;13261:53;:::i;:::-;13251:63;;13207:117;13363:2;13389:53;13434:7;13425:6;13414:9;13410:22;13389:53;:::i;:::-;13379:63;;13334:118;13519:2;13508:9;13504:18;13491:32;13550:18;13542:6;13539:30;13536:117;;;13572:79;;:::i;:::-;13536:117;13677:78;13747:7;13738:6;13727:9;13723:22;13677:78;:::i;:::-;13667:88;;13462:303;13832:2;13821:9;13817:18;13804:32;13863:18;13855:6;13852:30;13849:117;;;13885:79;;:::i;:::-;13849:117;13990:78;14060:7;14051:6;14040:9;14036:22;13990:78;:::i;:::-;13980:88;;13775:303;14145:3;14134:9;14130:19;14117:33;14177:18;14169:6;14166:30;14163:117;;;14199:79;;:::i;:::-;14163:117;14304:62;14358:7;14349:6;14338:9;14334:22;14304:62;:::i;:::-;14294:72;;14088:288;12874:1509;;;;;;;;:::o;14389:321::-;14476:4;14566:18;14558:6;14555:30;14552:56;;;14588:18;;:::i;:::-;14552:56;14638:4;14630:6;14626:17;14618:25;;14698:4;14692;14688:15;14680:23;;14389:321;;;:::o;14732:945::-;14838:5;14863:91;14879:74;14946:6;14879:74;:::i;:::-;14863:91;:::i;:::-;14854:100;;14974:5;15003:6;14996:5;14989:21;15037:4;15030:5;15026:16;15019:23;;15090:4;15082:6;15078:17;15070:6;15066:30;15119:3;15111:6;15108:15;15105:122;;;15138:79;;:::i;:::-;15105:122;15253:6;15236:435;15270:6;15265:3;15262:15;15236:435;;;15359:3;15346:17;15395:18;15382:11;15379:35;15376:122;;;15417:79;;:::i;:::-;15376:122;15541:11;15533:6;15529:24;15579:47;15622:3;15610:10;15579:47;:::i;:::-;15574:3;15567:60;15656:4;15651:3;15647:14;15640:21;;15312:359;;15296:4;15291:3;15287:14;15280:21;;15236:435;;;15240:21;14844:833;;14732:945;;;;;:::o;15699:390::-;15780:5;15829:3;15822:4;15814:6;15810:17;15806:27;15796:122;;15837:79;;:::i;:::-;15796:122;15954:6;15941:20;15979:104;16079:3;16071:6;16064:4;16056:6;16052:17;15979:104;:::i;:::-;15970:113;;15786:303;15699:390;;;;:::o;16095:914::-;16223:6;16231;16280:2;16268:9;16259:7;16255:23;16251:32;16248:119;;;16286:79;;:::i;:::-;16248:119;16434:1;16423:9;16419:17;16406:31;16464:18;16456:6;16453:30;16450:117;;;16486:79;;:::i;:::-;16450:117;16591:78;16661:7;16652:6;16641:9;16637:22;16591:78;:::i;:::-;16581:88;;16377:302;16746:2;16735:9;16731:18;16718:32;16777:18;16769:6;16766:30;16763:117;;;16799:79;;:::i;:::-;16763:117;16904:88;16984:7;16975:6;16964:9;16960:22;16904:88;:::i;:::-;16894:98;;16689:313;16095:914;;;;;:::o;17015:329::-;17074:6;17123:2;17111:9;17102:7;17098:23;17094:32;17091:119;;;17129:79;;:::i;:::-;17091:119;17249:1;17274:53;17319:7;17310:6;17299:9;17295:22;17274:53;:::i;:::-;17264:63;;17220:117;17015:329;;;;:::o;17350:60::-;17378:3;17399:5;17392:12;;17350:60;;;:::o;17416:142::-;17466:9;17499:53;17517:34;17526:24;17544:5;17526:24;:::i;:::-;17517:34;:::i;:::-;17499:53;:::i;:::-;17486:66;;17416:142;;;:::o;17564:126::-;17614:9;17647:37;17678:5;17647:37;:::i;:::-;17634:50;;17564:126;;;:::o;17696:158::-;17778:9;17811:37;17842:5;17811:37;:::i;:::-;17798:50;;17696:158;;;:::o;17860:195::-;17979:69;18042:5;17979:69;:::i;:::-;17974:3;17967:82;17860:195;;:::o;18061:286::-;18186:4;18224:2;18213:9;18209:18;18201:26;;18237:103;18337:1;18326:9;18322:17;18313:6;18237:103;:::i;:::-;18061:286;;;;:::o;18353:311::-;18430:4;18520:18;18512:6;18509:30;18506:56;;;18542:18;;:::i;:::-;18506:56;18592:4;18584:6;18580:17;18572:25;;18652:4;18646;18642:15;18634:23;;18353:311;;;:::o;18687:710::-;18783:5;18808:81;18824:64;18881:6;18824:64;:::i;:::-;18808:81;:::i;:::-;18799:90;;18909:5;18938:6;18931:5;18924:21;18972:4;18965:5;18961:16;18954:23;;19025:4;19017:6;19013:17;19005:6;19001:30;19054:3;19046:6;19043:15;19040:122;;;19073:79;;:::i;:::-;19040:122;19188:6;19171:220;19205:6;19200:3;19197:15;19171:220;;;19280:3;19309:37;19342:3;19330:10;19309:37;:::i;:::-;19304:3;19297:50;19376:4;19371:3;19367:14;19360:21;;19247:144;19231:4;19226:3;19222:14;19215:21;;19171:220;;;19175:21;18789:608;;18687:710;;;;;:::o;19420:370::-;19491:5;19540:3;19533:4;19525:6;19521:17;19517:27;19507:122;;19548:79;;:::i;:::-;19507:122;19665:6;19652:20;19690:94;19780:3;19772:6;19765:4;19757:6;19753:17;19690:94;:::i;:::-;19681:103;;19497:293;19420:370;;;;:::o;19796:894::-;19914:6;19922;19971:2;19959:9;19950:7;19946:23;19942:32;19939:119;;;19977:79;;:::i;:::-;19939:119;20125:1;20114:9;20110:17;20097:31;20155:18;20147:6;20144:30;20141:117;;;20177:79;;:::i;:::-;20141:117;20282:78;20352:7;20343:6;20332:9;20328:22;20282:78;:::i;:::-;20272:88;;20068:302;20437:2;20426:9;20422:18;20409:32;20468:18;20460:6;20457:30;20454:117;;;20490:79;;:::i;:::-;20454:117;20595:78;20665:7;20656:6;20645:9;20641:22;20595:78;:::i;:::-;20585:88;;20380:303;19796:894;;;;;:::o;20696:114::-;20763:6;20797:5;20791:12;20781:22;;20696:114;;;:::o;20816:184::-;20915:11;20949:6;20944:3;20937:19;20989:4;20984:3;20980:14;20965:29;;20816:184;;;;:::o;21006:132::-;21073:4;21096:3;21088:11;;21126:4;21121:3;21117:14;21109:22;;21006:132;;;:::o;21144:108::-;21221:24;21239:5;21221:24;:::i;:::-;21216:3;21209:37;21144:108;;:::o;21258:179::-;21327:10;21348:46;21390:3;21382:6;21348:46;:::i;:::-;21426:4;21421:3;21417:14;21403:28;;21258:179;;;;:::o;21443:113::-;21513:4;21545;21540:3;21536:14;21528:22;;21443:113;;;:::o;21592:732::-;21711:3;21740:54;21788:5;21740:54;:::i;:::-;21810:86;21889:6;21884:3;21810:86;:::i;:::-;21803:93;;21920:56;21970:5;21920:56;:::i;:::-;21999:7;22030:1;22015:284;22040:6;22037:1;22034:13;22015:284;;;22116:6;22110:13;22143:63;22202:3;22187:13;22143:63;:::i;:::-;22136:70;;22229:60;22282:6;22229:60;:::i;:::-;22219:70;;22075:224;22062:1;22059;22055:9;22050:14;;22015:284;;;22019:14;22315:3;22308:10;;21716:608;;;21592:732;;;;:::o;22330:373::-;22473:4;22511:2;22500:9;22496:18;22488:26;;22560:9;22554:4;22550:20;22546:1;22535:9;22531:17;22524:47;22588:108;22691:4;22682:6;22588:108;:::i;:::-;22580:116;;22330:373;;;;:::o;22709:222::-;22802:4;22840:2;22829:9;22825:18;22817:26;;22853:71;22921:1;22910:9;22906:17;22897:6;22853:71;:::i;:::-;22709:222;;;;:::o;22937:2127::-;23176:6;23184;23192;23200;23208;23216;23265:3;23253:9;23244:7;23240:23;23236:33;23233:120;;;23272:79;;:::i;:::-;23233:120;23392:1;23417:53;23462:7;23453:6;23442:9;23438:22;23417:53;:::i;:::-;23407:63;;23363:117;23547:2;23536:9;23532:18;23519:32;23578:18;23570:6;23567:30;23564:117;;;23600:79;;:::i;:::-;23564:117;23705:78;23775:7;23766:6;23755:9;23751:22;23705:78;:::i;:::-;23695:88;;23490:303;23860:2;23849:9;23845:18;23832:32;23891:18;23883:6;23880:30;23877:117;;;23913:79;;:::i;:::-;23877:117;24018:78;24088:7;24079:6;24068:9;24064:22;24018:78;:::i;:::-;24008:88;;23803:303;24173:2;24162:9;24158:18;24145:32;24204:18;24196:6;24193:30;24190:117;;;24226:79;;:::i;:::-;24190:117;24331:88;24411:7;24402:6;24391:9;24387:22;24331:88;:::i;:::-;24321:98;;24116:313;24496:3;24485:9;24481:19;24468:33;24528:18;24520:6;24517:30;24514:117;;;24550:79;;:::i;:::-;24514:117;24655:78;24725:7;24716:6;24705:9;24701:22;24655:78;:::i;:::-;24645:88;;24439:304;24810:3;24799:9;24795:19;24782:33;24842:18;24834:6;24831:30;24828:117;;;24864:79;;:::i;:::-;24828:117;24969:78;25039:7;25030:6;25019:9;25015:22;24969:78;:::i;:::-;24959:88;;24753:304;22937:2127;;;;;;;;:::o;25070:654::-;25148:6;25156;25205:2;25193:9;25184:7;25180:23;25176:32;25173:119;;;25211:79;;:::i;:::-;25173:119;25331:1;25356:53;25401:7;25392:6;25381:9;25377:22;25356:53;:::i;:::-;25346:63;;25302:117;25486:2;25475:9;25471:18;25458:32;25517:18;25509:6;25506:30;25503:117;;;25539:79;;:::i;:::-;25503:117;25644:63;25699:7;25690:6;25679:9;25675:22;25644:63;:::i;:::-;25634:73;;25429:288;25070:654;;;;;:::o;25730:1237::-;25844:6;25852;25860;25868;25876;25884;25933:3;25921:9;25912:7;25908:23;25904:33;25901:120;;;25940:79;;:::i;:::-;25901:120;26060:1;26085:53;26130:7;26121:6;26110:9;26106:22;26085:53;:::i;:::-;26075:63;;26031:117;26187:2;26213:53;26258:7;26249:6;26238:9;26234:22;26213:53;:::i;:::-;26203:63;;26158:118;26315:2;26341:53;26386:7;26377:6;26366:9;26362:22;26341:53;:::i;:::-;26331:63;;26286:118;26471:2;26460:9;26456:18;26443:32;26502:18;26494:6;26491:30;26488:117;;;26524:79;;:::i;:::-;26488:117;26629:63;26684:7;26675:6;26664:9;26660:22;26629:63;:::i;:::-;26619:73;;26414:288;26741:3;26768:53;26813:7;26804:6;26793:9;26789:22;26768:53;:::i;:::-;26758:63;;26712:119;26870:3;26897:53;26942:7;26933:6;26922:9;26918:22;26897:53;:::i;:::-;26887:63;;26841:119;25730:1237;;;;;;;;:::o;26973:::-;27087:6;27095;27103;27111;27119;27127;27176:3;27164:9;27155:7;27151:23;27147:33;27144:120;;;27183:79;;:::i;:::-;27144:120;27303:1;27328:53;27373:7;27364:6;27353:9;27349:22;27328:53;:::i;:::-;27318:63;;27274:117;27430:2;27456:53;27501:7;27492:6;27481:9;27477:22;27456:53;:::i;:::-;27446:63;;27401:118;27558:2;27584:53;27629:7;27620:6;27609:9;27605:22;27584:53;:::i;:::-;27574:63;;27529:118;27714:2;27703:9;27699:18;27686:32;27745:18;27737:6;27734:30;27731:117;;;27767:79;;:::i;:::-;27731:117;27872:63;27927:7;27918:6;27907:9;27903:22;27872:63;:::i;:::-;27862:73;;27657:288;27984:3;28011:53;28056:7;28047:6;28036:9;28032:22;28011:53;:::i;:::-;28001:63;;27955:119;28113:3;28140:53;28185:7;28176:6;28165:9;28161:22;28140:53;:::i;:::-;28130:63;;28084:119;26973:1237;;;;;;;;:::o;28216:116::-;28286:21;28301:5;28286:21;:::i;:::-;28279:5;28276:32;28266:60;;28322:1;28319;28312:12;28266:60;28216:116;:::o;28338:133::-;28381:5;28419:6;28406:20;28397:29;;28435:30;28459:5;28435:30;:::i;:::-;28338:133;;;;:::o;28477:468::-;28542:6;28550;28599:2;28587:9;28578:7;28574:23;28570:32;28567:119;;;28605:79;;:::i;:::-;28567:119;28725:1;28750:53;28795:7;28786:6;28775:9;28771:22;28750:53;:::i;:::-;28740:63;;28696:117;28852:2;28878:50;28920:7;28911:6;28900:9;28896:22;28878:50;:::i;:::-;28868:60;;28823:115;28477:468;;;;;:::o;28951:2127::-;29190:6;29198;29206;29214;29222;29230;29279:3;29267:9;29258:7;29254:23;29250:33;29247:120;;;29286:79;;:::i;:::-;29247:120;29406:1;29431:53;29476:7;29467:6;29456:9;29452:22;29431:53;:::i;:::-;29421:63;;29377:117;29561:2;29550:9;29546:18;29533:32;29592:18;29584:6;29581:30;29578:117;;;29614:79;;:::i;:::-;29578:117;29719:78;29789:7;29780:6;29769:9;29765:22;29719:78;:::i;:::-;29709:88;;29504:303;29874:2;29863:9;29859:18;29846:32;29905:18;29897:6;29894:30;29891:117;;;29927:79;;:::i;:::-;29891:117;30032:78;30102:7;30093:6;30082:9;30078:22;30032:78;:::i;:::-;30022:88;;29817:303;30187:2;30176:9;30172:18;30159:32;30218:18;30210:6;30207:30;30204:117;;;30240:79;;:::i;:::-;30204:117;30345:88;30425:7;30416:6;30405:9;30401:22;30345:88;:::i;:::-;30335:98;;30130:313;30510:3;30499:9;30495:19;30482:33;30542:18;30534:6;30531:30;30528:117;;;30564:79;;:::i;:::-;30528:117;30669:78;30739:7;30730:6;30719:9;30715:22;30669:78;:::i;:::-;30659:88;;30453:304;30824:3;30813:9;30809:19;30796:33;30856:18;30848:6;30845:30;30842:117;;;30878:79;;:::i;:::-;30842:117;30983:78;31053:7;31044:6;31033:9;31029:22;30983:78;:::i;:::-;30973:88;;30767:304;28951:2127;;;;;;;;:::o;31084:619::-;31161:6;31169;31177;31226:2;31214:9;31205:7;31201:23;31197:32;31194:119;;;31232:79;;:::i;:::-;31194:119;31352:1;31377:53;31422:7;31413:6;31402:9;31398:22;31377:53;:::i;:::-;31367:63;;31323:117;31479:2;31505:53;31550:7;31541:6;31530:9;31526:22;31505:53;:::i;:::-;31495:63;;31450:118;31607:2;31633:53;31678:7;31669:6;31658:9;31654:22;31633:53;:::i;:::-;31623:63;;31578:118;31084:619;;;;;:::o;31709:474::-;31777:6;31785;31834:2;31822:9;31813:7;31809:23;31805:32;31802:119;;;31840:79;;:::i;:::-;31802:119;31960:1;31985:53;32030:7;32021:6;32010:9;32006:22;31985:53;:::i;:::-;31975:63;;31931:117;32087:2;32113:53;32158:7;32149:6;32138:9;32134:22;32113:53;:::i;:::-;32103:63;;32058:118;31709:474;;;;;:::o;32189:1089::-;32293:6;32301;32309;32317;32325;32374:3;32362:9;32353:7;32349:23;32345:33;32342:120;;;32381:79;;:::i;:::-;32342:120;32501:1;32526:53;32571:7;32562:6;32551:9;32547:22;32526:53;:::i;:::-;32516:63;;32472:117;32628:2;32654:53;32699:7;32690:6;32679:9;32675:22;32654:53;:::i;:::-;32644:63;;32599:118;32756:2;32782:53;32827:7;32818:6;32807:9;32803:22;32782:53;:::i;:::-;32772:63;;32727:118;32884:2;32910:53;32955:7;32946:6;32935:9;32931:22;32910:53;:::i;:::-;32900:63;;32855:118;33040:3;33029:9;33025:19;33012:33;33072:18;33064:6;33061:30;33058:117;;;33094:79;;:::i;:::-;33058:117;33199:62;33253:7;33244:6;33233:9;33229:22;33199:62;:::i;:::-;33189:72;;32983:288;32189:1089;;;;;;;;:::o;33284:230::-;33424:34;33420:1;33412:6;33408:14;33401:58;33493:13;33488:2;33480:6;33476:15;33469:38;33284:230;:::o;33520:366::-;33662:3;33683:67;33747:2;33742:3;33683:67;:::i;:::-;33676:74;;33759:93;33848:3;33759:93;:::i;:::-;33877:2;33872:3;33868:12;33861:19;;33520:366;;;:::o;33892:419::-;34058:4;34096:2;34085:9;34081:18;34073:26;;34145:9;34139:4;34135:20;34131:1;34120:9;34116:17;34109:47;34173:131;34299:4;34173:131;:::i;:::-;34165:139;;33892:419;;;:::o;34317:98::-;34368:6;34402:5;34396:12;34386:22;;34317:98;;;:::o;34421:168::-;34504:11;34538:6;34533:3;34526:19;34578:4;34573:3;34569:14;34554:29;;34421:168;;;;:::o;34595:360::-;34681:3;34709:38;34741:5;34709:38;:::i;:::-;34763:70;34826:6;34821:3;34763:70;:::i;:::-;34756:77;;34842:52;34887:6;34882:3;34875:4;34868:5;34864:16;34842:52;:::i;:::-;34919:29;34941:6;34919:29;:::i;:::-;34914:3;34910:39;34903:46;;34685:270;34595:360;;;;:::o;34961:751::-;35184:4;35222:3;35211:9;35207:19;35199:27;;35236:71;35304:1;35293:9;35289:17;35280:6;35236:71;:::i;:::-;35317:72;35385:2;35374:9;35370:18;35361:6;35317:72;:::i;:::-;35399;35467:2;35456:9;35452:18;35443:6;35399:72;:::i;:::-;35481;35549:2;35538:9;35534:18;35525:6;35481:72;:::i;:::-;35601:9;35595:4;35591:20;35585:3;35574:9;35570:19;35563:49;35629:76;35700:4;35691:6;35629:76;:::i;:::-;35621:84;;34961:751;;;;;;;;:::o;35718:141::-;35774:5;35805:6;35799:13;35790:22;;35821:32;35847:5;35821:32;:::i;:::-;35718:141;;;;:::o;35865:349::-;35934:6;35983:2;35971:9;35962:7;35958:23;35954:32;35951:119;;;35989:79;;:::i;:::-;35951:119;36109:1;36134:63;36189:7;36180:6;36169:9;36165:22;36134:63;:::i;:::-;36124:73;;36080:127;35865:349;;;;:::o;36220:106::-;36264:8;36313:5;36308:3;36304:15;36283:36;;36220:106;;;:::o;36332:183::-;36367:3;36405:1;36387:16;36384:23;36381:128;;;36443:1;36440;36437;36422:23;36465:34;36496:1;36490:8;36465:34;:::i;:::-;36458:41;;36381:128;36332:183;:::o;36521:711::-;36560:3;36598:4;36580:16;36577:26;36606:5;36574:39;36635:20;;:::i;:::-;36710:1;36692:16;36688:24;36685:1;36679:4;36664:49;36743:4;36737:11;36842:16;36835:4;36827:6;36823:17;36820:39;36787:18;36779:6;36776:30;36760:113;36757:146;;;36888:5;;;;36757:146;36934:6;36928:4;36924:17;36970:3;36964:10;36997:18;36989:6;36986:30;36983:43;;;37019:5;;;;;;36983:43;37067:6;37060:4;37055:3;37051:14;37047:27;37126:1;37108:16;37104:24;37098:4;37094:35;37089:3;37086:44;37083:57;;;37133:5;;;;;;;37083:57;37150;37198:6;37192:4;37188:17;37180:6;37176:30;37170:4;37150:57;:::i;:::-;37223:3;37216:10;;36564:668;;;;;36521:711;;:::o;37238:239::-;37378:34;37374:1;37366:6;37362:14;37355:58;37447:22;37442:2;37434:6;37430:15;37423:47;37238:239;:::o;37483:366::-;37625:3;37646:67;37710:2;37705:3;37646:67;:::i;:::-;37639:74;;37722:93;37811:3;37722:93;:::i;:::-;37840:2;37835:3;37831:12;37824:19;;37483:366;;;:::o;37855:419::-;38021:4;38059:2;38048:9;38044:18;38036:26;;38108:9;38102:4;38098:20;38094:1;38083:9;38079:17;38072:47;38136:131;38262:4;38136:131;:::i;:::-;38128:139;;37855:419;;;:::o;38280:227::-;38420:34;38416:1;38408:6;38404:14;38397:58;38489:10;38484:2;38476:6;38472:15;38465:35;38280:227;:::o;38513:366::-;38655:3;38676:67;38740:2;38735:3;38676:67;:::i;:::-;38669:74;;38752:93;38841:3;38752:93;:::i;:::-;38870:2;38865:3;38861:12;38854:19;;38513:366;;;:::o;38885:419::-;39051:4;39089:2;39078:9;39074:18;39066:26;;39138:9;39132:4;39128:20;39124:1;39113:9;39109:17;39102:47;39166:131;39292:4;39166:131;:::i;:::-;39158:139;;38885:419;;;:::o;39310:180::-;39358:77;39355:1;39348:88;39455:4;39452:1;39445:15;39479:4;39476:1;39469:15;39496:320;39540:6;39577:1;39571:4;39567:12;39557:22;;39624:1;39618:4;39614:12;39645:18;39635:81;;39701:4;39693:6;39689:17;39679:27;;39635:81;39763:2;39755:6;39752:14;39732:18;39729:38;39726:84;;39782:18;;:::i;:::-;39726:84;39547:269;39496:320;;;:::o;39822:148::-;39924:11;39961:3;39946:18;;39822:148;;;;:::o;39976:141::-;40025:4;40048:3;40040:11;;40071:3;40068:1;40061:14;40105:4;40102:1;40092:18;40084:26;;39976:141;;;:::o;40147:845::-;40250:3;40287:5;40281:12;40316:36;40342:9;40316:36;:::i;:::-;40368:89;40450:6;40445:3;40368:89;:::i;:::-;40361:96;;40488:1;40477:9;40473:17;40504:1;40499:137;;;;40650:1;40645:341;;;;40466:520;;40499:137;40583:4;40579:9;40568;40564:25;40559:3;40552:38;40619:6;40614:3;40610:16;40603:23;;40499:137;;40645:341;40712:38;40744:5;40712:38;:::i;:::-;40772:1;40786:154;40800:6;40797:1;40794:13;40786:154;;;40874:7;40868:14;40864:1;40859:3;40855:11;40848:35;40924:1;40915:7;40911:15;40900:26;;40822:4;40819:1;40815:12;40810:17;;40786:154;;;40969:6;40964:3;40960:16;40953:23;;40652:334;;40466:520;;40254:738;;40147:845;;;;:::o;40998:423::-;41172:3;41194:92;41282:3;41273:6;41194:92;:::i;:::-;41187:99;;41303:92;41391:3;41382:6;41303:92;:::i;:::-;41296:99;;41412:3;41405:10;;40998:423;;;;;:::o;41427:180::-;41475:77;41472:1;41465:88;41572:4;41569:1;41562:15;41596:4;41593:1;41586:15;41613:348;41653:7;41676:20;41694:1;41676:20;:::i;:::-;41671:25;;41710:20;41728:1;41710:20;:::i;:::-;41705:25;;41898:1;41830:66;41826:74;41823:1;41820:81;41815:1;41808:9;41801:17;41797:105;41794:131;;;41905:18;;:::i;:::-;41794:131;41953:1;41950;41946:9;41935:20;;41613:348;;;;:::o;41967:180::-;42015:77;42012:1;42005:88;42112:4;42109:1;42102:15;42136:4;42133:1;42126:15;42153:185;42193:1;42210:20;42228:1;42210:20;:::i;:::-;42205:25;;42244:20;42262:1;42244:20;:::i;:::-;42239:25;;42283:1;42273:35;;42288:18;;:::i;:::-;42273:35;42330:1;42327;42323:9;42318:14;;42153:185;;;;:::o;42344:181::-;42484:33;42480:1;42472:6;42468:14;42461:57;42344:181;:::o;42531:366::-;42673:3;42694:67;42758:2;42753:3;42694:67;:::i;:::-;42687:74;;42770:93;42859:3;42770:93;:::i;:::-;42888:2;42883:3;42879:12;42872:19;;42531:366;;;:::o;42903:419::-;43069:4;43107:2;43096:9;43092:18;43084:26;;43156:9;43150:4;43146:20;43142:1;43131:9;43127:17;43120:47;43184:131;43310:4;43184:131;:::i;:::-;43176:139;;42903:419;;;:::o;43328:180::-;43376:77;43373:1;43366:88;43473:4;43470:1;43463:15;43497:4;43494:1;43487:15;43514:233;43553:3;43576:24;43594:5;43576:24;:::i;:::-;43567:33;;43622:66;43615:5;43612:77;43609:103;;43692:18;;:::i;:::-;43609:103;43739:1;43732:5;43728:13;43721:20;;43514:233;;;:::o;43753:228::-;43893:34;43889:1;43881:6;43877:14;43870:58;43962:11;43957:2;43949:6;43945:15;43938:36;43753:228;:::o;43987:366::-;44129:3;44150:67;44214:2;44209:3;44150:67;:::i;:::-;44143:74;;44226:93;44315:3;44226:93;:::i;:::-;44344:2;44339:3;44335:12;44328:19;;43987:366;;;:::o;44359:419::-;44525:4;44563:2;44552:9;44548:18;44540:26;;44612:9;44606:4;44602:20;44598:1;44587:9;44583:17;44576:47;44640:131;44766:4;44640:131;:::i;:::-;44632:139;;44359:419;;;:::o;44784:305::-;44824:3;44843:20;44861:1;44843:20;:::i;:::-;44838:25;;44877:20;44895:1;44877:20;:::i;:::-;44872:25;;45031:1;44963:66;44959:74;44956:1;44953:81;44950:107;;;45037:18;;:::i;:::-;44950:107;45081:1;45078;45074:9;45067:16;;44784:305;;;;:::o;45095:174::-;45235:26;45231:1;45223:6;45219:14;45212:50;45095:174;:::o;45275:366::-;45417:3;45438:67;45502:2;45497:3;45438:67;:::i;:::-;45431:74;;45514:93;45603:3;45514:93;:::i;:::-;45632:2;45627:3;45623:12;45616:19;;45275:366;;;:::o;45647:419::-;45813:4;45851:2;45840:9;45836:18;45828:26;;45900:9;45894:4;45890:20;45886:1;45875:9;45871:17;45864:47;45928:131;46054:4;45928:131;:::i;:::-;45920:139;;45647:419;;;:::o;46072:85::-;46117:7;46146:5;46135:16;;46072:85;;;:::o;46163:158::-;46221:9;46254:61;46272:42;46281:32;46307:5;46281:32;:::i;:::-;46272:42;:::i;:::-;46254:61;:::i;:::-;46241:74;;46163:158;;;:::o;46327:147::-;46422:45;46461:5;46422:45;:::i;:::-;46417:3;46410:58;46327:147;;:::o;46480:348::-;46609:4;46647:2;46636:9;46632:18;46624:26;;46660:71;46728:1;46717:9;46713:17;46704:6;46660:71;:::i;:::-;46741:80;46817:2;46806:9;46802:18;46793:6;46741:80;:::i;:::-;46480:348;;;;;:::o;46834:225::-;46974:34;46970:1;46962:6;46958:14;46951:58;47043:8;47038:2;47030:6;47026:15;47019:33;46834:225;:::o;47065:366::-;47207:3;47228:67;47292:2;47287:3;47228:67;:::i;:::-;47221:74;;47304:93;47393:3;47304:93;:::i;:::-;47422:2;47417:3;47413:12;47406:19;;47065:366;;;:::o;47437:419::-;47603:4;47641:2;47630:9;47626:18;47618:26;;47690:9;47684:4;47680:20;47676:1;47665:9;47661:17;47654:47;47718:131;47844:4;47718:131;:::i;:::-;47710:139;;47437:419;;;:::o;47862:332::-;47983:4;48021:2;48010:9;48006:18;47998:26;;48034:71;48102:1;48091:9;48087:17;48078:6;48034:71;:::i;:::-;48115:72;48183:2;48172:9;48168:18;48159:6;48115:72;:::i;:::-;47862:332;;;;;:::o;48200:137::-;48254:5;48285:6;48279:13;48270:22;;48301:30;48325:5;48301:30;:::i;:::-;48200:137;;;;:::o;48343:345::-;48410:6;48459:2;48447:9;48438:7;48434:23;48430:32;48427:119;;;48465:79;;:::i;:::-;48427:119;48585:1;48610:61;48663:7;48654:6;48643:9;48639:22;48610:61;:::i;:::-;48600:71;;48556:125;48343:345;;;;:::o;48694:237::-;48834:34;48830:1;48822:6;48818:14;48811:58;48903:20;48898:2;48890:6;48886:15;48879:45;48694:237;:::o;48937:366::-;49079:3;49100:67;49164:2;49159:3;49100:67;:::i;:::-;49093:74;;49176:93;49265:3;49176:93;:::i;:::-;49294:2;49289:3;49285:12;49278:19;;48937:366;;;:::o;49309:419::-;49475:4;49513:2;49502:9;49498:18;49490:26;;49562:9;49556:4;49552:20;49548:1;49537:9;49533:17;49526:47;49590:131;49716:4;49590:131;:::i;:::-;49582:139;;49309:419;;;:::o;49734:182::-;49874:34;49870:1;49862:6;49858:14;49851:58;49734:182;:::o;49922:366::-;50064:3;50085:67;50149:2;50144:3;50085:67;:::i;:::-;50078:74;;50161:93;50250:3;50161:93;:::i;:::-;50279:2;50274:3;50270:12;50263:19;;49922:366;;;:::o;50294:419::-;50460:4;50498:2;50487:9;50483:18;50475:26;;50547:9;50541:4;50537:20;50533:1;50522:9;50518:17;50511:47;50575:131;50701:4;50575:131;:::i;:::-;50567:139;;50294:419;;;:::o;50719:220::-;50859:34;50855:1;50847:6;50843:14;50836:58;50928:3;50923:2;50915:6;50911:15;50904:28;50719:220;:::o;50945:366::-;51087:3;51108:67;51172:2;51167:3;51108:67;:::i;:::-;51101:74;;51184:93;51273:3;51184:93;:::i;:::-;51302:2;51297:3;51293:12;51286:19;;50945:366;;;:::o;51317:419::-;51483:4;51521:2;51510:9;51506:18;51498:26;;51570:9;51564:4;51560:20;51556:1;51545:9;51541:17;51534:47;51598:131;51724:4;51598:131;:::i;:::-;51590:139;;51317:419;;;:::o;51742:227::-;51882:34;51878:1;51870:6;51866:14;51859:58;51951:10;51946:2;51938:6;51934:15;51927:35;51742:227;:::o;51975:366::-;52117:3;52138:67;52202:2;52197:3;52138:67;:::i;:::-;52131:74;;52214:93;52303:3;52214:93;:::i;:::-;52332:2;52327:3;52323:12;52316:19;;51975:366;;;:::o;52347:419::-;52513:4;52551:2;52540:9;52536:18;52528:26;;52600:9;52594:4;52590:20;52586:1;52575:9;52571:17;52564:47;52628:131;52754:4;52628:131;:::i;:::-;52620:139;;52347:419;;;:::o;52772:332::-;52893:4;52931:2;52920:9;52916:18;52908:26;;52944:71;53012:1;53001:9;52997:17;52988:6;52944:71;:::i;:::-;53025:72;53093:2;53082:9;53078:18;53069:6;53025:72;:::i;:::-;52772:332;;;;;:::o;53110:176::-;53250:28;53246:1;53238:6;53234:14;53227:52;53110:176;:::o;53292:366::-;53434:3;53455:67;53519:2;53514:3;53455:67;:::i;:::-;53448:74;;53531:93;53620:3;53531:93;:::i;:::-;53649:2;53644:3;53640:12;53633:19;;53292:366;;;:::o;53664:419::-;53830:4;53868:2;53857:9;53853:18;53845:26;;53917:9;53911:4;53907:20;53903:1;53892:9;53888:17;53881:47;53945:131;54071:4;53945:131;:::i;:::-;53937:139;;53664:419;;;:::o;54089:228::-;54229:34;54225:1;54217:6;54213:14;54206:58;54298:11;54293:2;54285:6;54281:15;54274:36;54089:228;:::o;54323:366::-;54465:3;54486:67;54550:2;54545:3;54486:67;:::i;:::-;54479:74;;54562:93;54651:3;54562:93;:::i;:::-;54680:2;54675:3;54671:12;54664:19;;54323:366;;;:::o;54695:419::-;54861:4;54899:2;54888:9;54884:18;54876:26;;54948:9;54942:4;54938:20;54934:1;54923:9;54919:17;54912:47;54976:131;55102:4;54976:131;:::i;:::-;54968:139;;54695:419;;;:::o;55120:224::-;55260:34;55256:1;55248:6;55244:14;55237:58;55329:7;55324:2;55316:6;55312:15;55305:32;55120:224;:::o;55350:366::-;55492:3;55513:67;55577:2;55572:3;55513:67;:::i;:::-;55506:74;;55589:93;55678:3;55589:93;:::i;:::-;55707:2;55702:3;55698:12;55691:19;;55350:366;;;:::o;55722:419::-;55888:4;55926:2;55915:9;55911:18;55903:26;;55975:9;55969:4;55965:20;55961:1;55950:9;55946:17;55939:47;56003:131;56129:4;56003:131;:::i;:::-;55995:139;;55722:419;;;:::o;56147:229::-;56287:34;56283:1;56275:6;56271:14;56264:58;56356:12;56351:2;56343:6;56339:15;56332:37;56147:229;:::o;56382:366::-;56524:3;56545:67;56609:2;56604:3;56545:67;:::i;:::-;56538:74;;56621:93;56710:3;56621:93;:::i;:::-;56739:2;56734:3;56730:12;56723:19;;56382:366;;;:::o;56754:419::-;56920:4;56958:2;56947:9;56943:18;56935:26;;57007:9;57001:4;56997:20;56993:1;56982:9;56978:17;56971:47;57035:131;57161:4;57035:131;:::i;:::-;57027:139;;56754:419;;;:::o;57179:634::-;57400:4;57438:2;57427:9;57423:18;57415:26;;57487:9;57481:4;57477:20;57473:1;57462:9;57458:17;57451:47;57515:108;57618:4;57609:6;57515:108;:::i;:::-;57507:116;;57670:9;57664:4;57660:20;57655:2;57644:9;57640:18;57633:48;57698:108;57801:4;57792:6;57698:108;:::i;:::-;57690:116;;57179:634;;;;;:::o;57819:1053::-;58142:4;58180:3;58169:9;58165:19;58157:27;;58194:71;58262:1;58251:9;58247:17;58238:6;58194:71;:::i;:::-;58275:72;58343:2;58332:9;58328:18;58319:6;58275:72;:::i;:::-;58394:9;58388:4;58384:20;58379:2;58368:9;58364:18;58357:48;58422:108;58525:4;58516:6;58422:108;:::i;:::-;58414:116;;58577:9;58571:4;58567:20;58562:2;58551:9;58547:18;58540:48;58605:108;58708:4;58699:6;58605:108;:::i;:::-;58597:116;;58761:9;58755:4;58751:20;58745:3;58734:9;58730:19;58723:49;58789:76;58860:4;58851:6;58789:76;:::i;:::-;58781:84;;57819:1053;;;;;;;;:::o;58878:228::-;59018:34;59014:1;59006:6;59002:14;58995:58;59087:11;59082:2;59074:6;59070:15;59063:36;58878:228;:::o;59112:366::-;59254:3;59275:67;59339:2;59334:3;59275:67;:::i;:::-;59268:74;;59351:93;59440:3;59351:93;:::i;:::-;59469:2;59464:3;59460:12;59453:19;;59112:366;;;:::o;59484:419::-;59650:4;59688:2;59677:9;59673:18;59665:26;;59737:9;59731:4;59727:20;59723:1;59712:9;59708:17;59701:47;59765:131;59891:4;59765:131;:::i;:::-;59757:139;;59484:419;;;:::o

Swarm Source

ipfs://084ff9b4b5a34813f16c5730e93ff260cc2a1c84d13f16b8cc25a87ff79867f6
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.