ETH Price: $2,702.45 (-0.04%)

Token

BullaClaim721 (CLAIM)
 

Overview

Max Total Supply

0 CLAIM

Holders

23

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
3 CLAIM
0x6e7A8404353000fc93197791aE768E2CC38dA91F
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:
BullaClaimERC721

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, BSL 1.1 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-05-24
*/

//SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.7;

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

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

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

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

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

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

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

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

/**
 *  SourceUnit: /Users/colinnielsen/code/bulla-contracts/contracts/BullaClaimERC721.sol
 */

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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

/**
 *  SourceUnit: /Users/colinnielsen/code/bulla-contracts/contracts/BullaClaimERC721.sol
 */

pragma solidity ^0.8.3;

////import "@openzeppelin/contracts/token/ERC20/IERC20.sol";

struct FeeInfo {
    address collectionAddress;
    uint32 feeBasisPoints;
    uint32 bullaTokenThreshold; //# of BULLA tokens held to get fee reduction
    uint32 reducedFeeBasisPoints; //reduced fee for BULLA token holders
}

interface IBullaManager {
    event FeeChanged(address indexed bullaManager, uint256 prevFee, uint256 newFee, uint256 blocktime);
    event CollectorChanged(address indexed bullaManager, address prevCollector, address newCollector, uint256 blocktime);
    event OwnerChanged(address indexed bullaManager, address prevOwner, address newOwner, uint256 blocktime);
    event BullaTokenChanged(address indexed bullaManager, address prevBullaToken, address newBullaToken, uint256 blocktime);
    event FeeThresholdChanged(address indexed bullaManager, uint256 prevFeeThreshold, uint256 newFeeThreshold, uint256 blocktime);
    event ReducedFeeChanged(address indexed bullaManager, uint256 prevFee, uint256 newFee, uint256 blocktime);

    function setOwner(address _owner) external;

    function setFee(uint32 _feeBasisPoints) external;

    function setCollectionAddress(address _collectionAddress) external;

    function setbullaThreshold(uint32 _threshold) external;

    function setReducedFee(uint32 reducedFeeBasisPoints) external;

    function setBullaTokenAddress(address _bullaTokenAddress) external;

    function getBullaBalance(address _holder) external view returns (uint256);

    function getFeeInfo(address _holder) external view returns (uint32, address);

    function getTransactionFee(address _holder, uint256 paymentAmount) external view returns (address sendFeesTo, uint256 transactionFee);
}

/**
 *  SourceUnit: /Users/colinnielsen/code/bulla-contracts/contracts/BullaClaimERC721.sol
 */

// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.0;

////import "../IERC20.sol";
////import "../../../utils/Address.sol";

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require((value == 0) || (token.allowance(address(this), spender) == 0), 'SafeERC20: approve from non-zero to non-zero allowance');
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, 'SafeERC20: decreased allowance below zero');
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, 'SafeERC20: low-level call failed');
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), 'SafeERC20: ERC20 operation did not succeed');
        }
    }
}

/**
 *  SourceUnit: /Users/colinnielsen/code/bulla-contracts/contracts/BullaClaimERC721.sol
 */

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

pragma solidity ^0.8.0;

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

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

/**
 *  SourceUnit: /Users/colinnielsen/code/bulla-contracts/contracts/BullaClaimERC721.sol
 */

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

pragma solidity ^0.8.0;

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

/**
 *  SourceUnit: /Users/colinnielsen/code/bulla-contracts/contracts/BullaClaimERC721.sol
 */

// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

////import "../../utils/introspection/IERC165.sol";

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

/**
 *  SourceUnit: /Users/colinnielsen/code/bulla-contracts/contracts/BullaClaimERC721.sol
 */

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

/**
 *  SourceUnit: /Users/colinnielsen/code/bulla-contracts/contracts/BullaClaimERC721.sol
 */

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

pragma solidity ^0.8.0;

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

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

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

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

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

/**
 *  SourceUnit: /Users/colinnielsen/code/bulla-contracts/contracts/BullaClaimERC721.sol
 */

// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

////import "../IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

/**
 *  SourceUnit: /Users/colinnielsen/code/bulla-contracts/contracts/BullaClaimERC721.sol
 */

// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

/**
 *  SourceUnit: /Users/colinnielsen/code/bulla-contracts/contracts/BullaClaimERC721.sol
 */

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

pragma solidity ^0.8.0;

////import "./IERC721.sol";
////import "./IERC721Receiver.sol";
////import "./extensions/IERC721Metadata.sol";
////import "../../utils/Address.sol";
////import "../../utils/Context.sol";
////import "../../utils/Strings.sol";
////import "../../utils/introspection/ERC165.sol";

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

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

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), 'ERC721: balance query for the zero address');
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), 'ERC721: owner query for nonexistent token');
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), 'ERC721Metadata: URI query for nonexistent token');

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : '';
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, 'ERC721: approval to current owner');

        require(_msgSender() == owner || isApprovedForAll(owner, _msgSender()), 'ERC721: approve caller is not owner nor approved for all');

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), 'ERC721: approved query for nonexistent token');

        return _tokenApprovals[tokenId];
    }

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), 'ERC721: transfer caller is not owner nor approved');

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), 'ERC721: transfer caller is not owner nor approved');
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), 'ERC721: transfer to non ERC721Receiver implementer');
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), 'ERC721: operator query for nonexistent token');
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, '');
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(_checkOnERC721Received(address(0), to, tokenId, _data), 'ERC721: transfer to non ERC721Receiver implementer');
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), 'ERC721: mint to the zero address');
        require(!_exists(tokenId), 'ERC721: token already minted');

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);

        _afterTokenTransfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);

        _afterTokenTransfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, 'ERC721: transfer from incorrect owner');
        require(to != address(0), 'ERC721: transfer to the zero address');

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @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, 'ERC721: approve to caller');
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert('ERC721: transfer to non ERC721Receiver implementer');
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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

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

/**
 *  SourceUnit: /Users/colinnielsen/code/bulla-contracts/contracts/BullaClaimERC721.sol
 */

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

pragma solidity ^0.8.0;

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

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

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

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

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

/**
 *  SourceUnit: /Users/colinnielsen/code/bulla-contracts/contracts/BullaClaimERC721.sol
 */

pragma solidity ^0.8.7;

////import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
////import "./IBullaManager.sol";

struct Multihash {
    bytes32 hash;
    uint8 hashFunction;
    uint8 size;
}

enum Status {
    Pending,
    Repaying,
    Paid,
    Rejected,
    Rescinded
}

struct Claim {
    uint256 claimAmount;
    uint256 paidAmount;
    Status status;
    uint256 dueBy;
    address debtor;
    address claimToken;
    Multihash attachment;
}

interface IBullaClaim {
    event ClaimCreated(
        address bullaManager,
        uint256 indexed tokenId,
        address parent,
        address indexed creditor,
        address indexed debtor,
        address origin,
        string description,
        Claim claim,
        uint256 blocktime
    );

    event ClaimPayment(
        address indexed bullaManager,
        uint256 indexed tokenId,
        address indexed debtor,
        address paidBy,
        address paidByOrigin,
        uint256 paymentAmount,
        uint256 blocktime
    );

    event ClaimRejected(address indexed bullaManager, uint256 indexed tokenId, uint256 blocktime);

    event ClaimRescinded(address indexed bullaManager, uint256 indexed tokenId, uint256 blocktime);

    event FeePaid(
        address indexed bullaManager,
        uint256 indexed tokenId,
        address indexed collectionAddress,
        uint256 paymentAmount,
        uint256 transactionFee,
        uint256 blocktime
    );

    event BullaManagerSet(address indexed prevBullaManager, address indexed newBullaManager, uint256 blocktime);

    function createClaim(
        address creditor,
        address debtor,
        string memory description,
        uint256 claimAmount,
        uint256 dueBy,
        address claimToken,
        Multihash calldata attachment
    ) external returns (uint256 newTokenId);

    function createClaimWithURI(
        address creditor,
        address debtor,
        string memory description,
        uint256 claimAmount,
        uint256 dueBy,
        address claimToken,
        Multihash calldata attachment,
        string calldata _tokenUri
    ) external returns (uint256 newTokenId);

    function payClaim(uint256 tokenId, uint256 paymentAmount) external;

    function rejectClaim(uint256 tokenId) external;

    function rescindClaim(uint256 tokenId) external;

    function getClaim(uint256 tokenId) external view returns (Claim calldata);

    function bullaManager() external view returns (address);
}

/**
 *  SourceUnit: /Users/colinnielsen/code/bulla-contracts/contracts/BullaClaimERC721.sol
 */

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

pragma solidity ^0.8.0;

////import "../utils/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 Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

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

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

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

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

/**
 *  SourceUnit: /Users/colinnielsen/code/bulla-contracts/contracts/BullaClaimERC721.sol
 */

// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721URIStorage.sol)

pragma solidity ^0.8.0;

////import "../ERC721.sol";

/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), 'ERC721URIStorage: URI query for nonexistent token');

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), 'ERC721URIStorage: URI set of nonexistent token');
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual override {
        super._burn(tokenId);

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}

/**
 *  SourceUnit: /Users/colinnielsen/code/bulla-contracts/contracts/BullaClaimERC721.sol
 */

pragma solidity ^0.8.7;

////import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
////import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
////import "@openzeppelin/contracts/utils/Counters.sol";
////import "@openzeppelin/contracts/access/Ownable.sol";
////import "./interfaces/IBullaManager.sol";
////import "./interfaces/IBullaClaim.sol";
////import "@openzeppelin/contracts/utils/Counters.sol";
////import "@openzeppelin/contracts/utils/Address.sol";

error ZeroAddress();
error PastDueDate();
error TokenIdNoExist();
error ClaimTokenNotContract();
error NotCreditor(address sender);
error NotDebtor(address sender);
error NotTokenOwner(address sender);
error NotCreditorOrDebtor(address sender);
error OwnerNotCreditor(address sender);
error ClaimCompleted();
error ClaimNotPending();
error IncorrectValue(uint256 value, uint256 expectedValue);
error InsufficientBalance(uint256 senderBalance);
error InsufficientAllowance(uint256 senderAllowance);
error RepayingTooMuch(uint256 amount, uint256 expectedAmount);
error ValueMustBeGreaterThanZero();

abstract contract BullaClaimERC721URI is Ownable, ERC721URIStorage {
    string public baseURI;

    function setBaseURI(string memory baseURI_) public onlyOwner {
        baseURI = baseURI_;
    }

    function _baseURI() internal view override returns (string memory) {
        return baseURI;
    }
}

contract BullaClaimERC721 is IBullaClaim, BullaClaimERC721URI {
    using SafeERC20 for IERC20;
    using Counters for Counters.Counter;
    using Address for address;

    Counters.Counter private tokenIds;

    address public override bullaManager;
    mapping(uint256 => Claim) private claimTokens;

    modifier onlyTokenOwner(uint256 tokenId) {
        if (ownerOf(tokenId) != msg.sender) revert NotCreditor(msg.sender);
        _;
    }

    modifier onlyDebtor(uint256 tokenId) {
        if (claimTokens[tokenId].debtor != msg.sender) revert NotDebtor(msg.sender);
        _;
    }

    modifier onlyIncompleteClaim(uint256 tokenId) {
        if (claimTokens[tokenId].status != Status.Pending && claimTokens[tokenId].status != Status.Repaying) revert ClaimCompleted();
        _;
    }

    modifier onlyPendingClaim(uint256 tokenId) {
        if (claimTokens[tokenId].status != Status.Pending) revert ClaimNotPending();
        _;
    }

    constructor(address bullaManager_, string memory baseURI_) ERC721('BullaClaim721', 'CLAIM') {
        setBullaManager(bullaManager_);
        setBaseURI(baseURI_);
    }

    function setBullaManager(address _bullaManager) public onlyOwner {
        address prevBullaManager = bullaManager;
        bullaManager = _bullaManager;
        emit BullaManagerSet(prevBullaManager, bullaManager, block.timestamp);
    }

    function _createClaim(
        address creditor,
        address debtor,
        string memory description,
        uint256 claimAmount,
        uint256 dueBy,
        address claimToken,
        Multihash calldata attachment
    ) internal returns (uint256) {
        if (creditor == address(0) || debtor == address(0)) {
            revert ZeroAddress();
        }
        if (claimAmount == 0) {
            revert ValueMustBeGreaterThanZero();
        }
        if (dueBy < block.timestamp) {
            revert PastDueDate();
        }
        if (!claimToken.isContract()) {
            revert ClaimTokenNotContract();
        }

        tokenIds.increment();
        uint256 newTokenId = tokenIds.current();
        _safeMint(creditor, newTokenId);

        Claim memory newClaim;
        newClaim.debtor = debtor;
        newClaim.claimAmount = claimAmount;
        newClaim.dueBy = dueBy;
        newClaim.status = Status.Pending;
        newClaim.claimToken = claimToken;
        newClaim.attachment = attachment;
        claimTokens[newTokenId] = newClaim;

        emit ClaimCreated(bullaManager, newTokenId, msg.sender, creditor, debtor, tx.origin, description, newClaim, block.timestamp);
        return newTokenId;
    }

    function createClaim(
        address creditor,
        address debtor,
        string memory description,
        uint256 claimAmount,
        uint256 dueBy,
        address claimToken,
        Multihash calldata attachment
    ) external override returns (uint256) {
        uint256 _tokenId = _createClaim(creditor, debtor, description, claimAmount, dueBy, claimToken, attachment);
        return _tokenId;
    }

    function createClaimWithURI(
        address creditor,
        address debtor,
        string memory description,
        uint256 claimAmount,
        uint256 dueBy,
        address claimToken,
        Multihash calldata attachment,
        string calldata _tokenUri
    ) external override returns (uint256) {
        uint256 _tokenId = _createClaim(creditor, debtor, description, claimAmount, dueBy, claimToken, attachment);
        _setTokenURI(_tokenId, _tokenUri);
        return _tokenId;
    }

    function payClaim(uint256 tokenId, uint256 paymentAmount) external override onlyIncompleteClaim(tokenId) {
        if (paymentAmount == 0) revert ValueMustBeGreaterThanZero();
        if (!_exists(tokenId)) revert TokenIdNoExist();

        Claim memory claim = getClaim(tokenId);
        address creditor = ownerOf(tokenId);

        uint256 amountToRepay = claim.claimAmount - claim.paidAmount;
        uint256 totalPayment = paymentAmount >= amountToRepay ? amountToRepay : paymentAmount;
        claim.paidAmount + totalPayment == claim.claimAmount ? claim.status = Status.Paid : claim.status = Status.Repaying;
        claimTokens[tokenId].paidAmount += totalPayment;
        claimTokens[tokenId].status = claim.status;

        (address collectionAddress, uint256 transactionFee) = IBullaManager(bullaManager).getTransactionFee(msg.sender, totalPayment);

        IERC20(claim.claimToken).safeTransferFrom(msg.sender, creditor, totalPayment - transactionFee);

        if (transactionFee > 0) {
            IERC20(claim.claimToken).safeTransferFrom(msg.sender, collectionAddress, transactionFee);
        }

        emit ClaimPayment(bullaManager, tokenId, claim.debtor, msg.sender, tx.origin, paymentAmount, block.timestamp);
        emit FeePaid(bullaManager, tokenId, collectionAddress, paymentAmount, transactionFee, block.timestamp);
    }

    function rejectClaim(uint256 tokenId) external override onlyDebtor(tokenId) onlyPendingClaim(tokenId) {
        claimTokens[tokenId].status = Status.Rejected;
        emit ClaimRejected(bullaManager, tokenId, block.timestamp);
    }

    function rescindClaim(uint256 tokenId) external override onlyTokenOwner(tokenId) onlyPendingClaim(tokenId) {
        claimTokens[tokenId].status = Status.Rescinded;
        emit ClaimRescinded(bullaManager, tokenId, block.timestamp);
    }

    function burn(uint256 tokenId) external onlyTokenOwner(tokenId) {
        _burn(tokenId);
    }

    function nextClaimId() external view returns (uint256) {
        return tokenIds.current() + 1;
    }

    function getClaim(uint256 tokenId) public view override returns (Claim memory) {
        return claimTokens[tokenId];
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"bullaManager_","type":"address"},{"internalType":"string","name":"baseURI_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ClaimCompleted","type":"error"},{"inputs":[],"name":"ClaimNotPending","type":"error"},{"inputs":[],"name":"ClaimTokenNotContract","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"NotCreditor","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"NotDebtor","type":"error"},{"inputs":[],"name":"PastDueDate","type":"error"},{"inputs":[],"name":"TokenIdNoExist","type":"error"},{"inputs":[],"name":"ValueMustBeGreaterThanZero","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","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":"prevBullaManager","type":"address"},{"indexed":true,"internalType":"address","name":"newBullaManager","type":"address"},{"indexed":false,"internalType":"uint256","name":"blocktime","type":"uint256"}],"name":"BullaManagerSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"bullaManager","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"parent","type":"address"},{"indexed":true,"internalType":"address","name":"creditor","type":"address"},{"indexed":true,"internalType":"address","name":"debtor","type":"address"},{"indexed":false,"internalType":"address","name":"origin","type":"address"},{"indexed":false,"internalType":"string","name":"description","type":"string"},{"components":[{"internalType":"uint256","name":"claimAmount","type":"uint256"},{"internalType":"uint256","name":"paidAmount","type":"uint256"},{"internalType":"enum Status","name":"status","type":"uint8"},{"internalType":"uint256","name":"dueBy","type":"uint256"},{"internalType":"address","name":"debtor","type":"address"},{"internalType":"address","name":"claimToken","type":"address"},{"components":[{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"uint8","name":"hashFunction","type":"uint8"},{"internalType":"uint8","name":"size","type":"uint8"}],"internalType":"struct Multihash","name":"attachment","type":"tuple"}],"indexed":false,"internalType":"struct Claim","name":"claim","type":"tuple"},{"indexed":false,"internalType":"uint256","name":"blocktime","type":"uint256"}],"name":"ClaimCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"bullaManager","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"debtor","type":"address"},{"indexed":false,"internalType":"address","name":"paidBy","type":"address"},{"indexed":false,"internalType":"address","name":"paidByOrigin","type":"address"},{"indexed":false,"internalType":"uint256","name":"paymentAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"blocktime","type":"uint256"}],"name":"ClaimPayment","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"bullaManager","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"blocktime","type":"uint256"}],"name":"ClaimRejected","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"bullaManager","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"blocktime","type":"uint256"}],"name":"ClaimRescinded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"bullaManager","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"collectionAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"paymentAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"transactionFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"blocktime","type":"uint256"}],"name":"FeePaid","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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bullaManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"creditor","type":"address"},{"internalType":"address","name":"debtor","type":"address"},{"internalType":"string","name":"description","type":"string"},{"internalType":"uint256","name":"claimAmount","type":"uint256"},{"internalType":"uint256","name":"dueBy","type":"uint256"},{"internalType":"address","name":"claimToken","type":"address"},{"components":[{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"uint8","name":"hashFunction","type":"uint8"},{"internalType":"uint8","name":"size","type":"uint8"}],"internalType":"struct Multihash","name":"attachment","type":"tuple"}],"name":"createClaim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"creditor","type":"address"},{"internalType":"address","name":"debtor","type":"address"},{"internalType":"string","name":"description","type":"string"},{"internalType":"uint256","name":"claimAmount","type":"uint256"},{"internalType":"uint256","name":"dueBy","type":"uint256"},{"internalType":"address","name":"claimToken","type":"address"},{"components":[{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"uint8","name":"hashFunction","type":"uint8"},{"internalType":"uint8","name":"size","type":"uint8"}],"internalType":"struct Multihash","name":"attachment","type":"tuple"},{"internalType":"string","name":"_tokenUri","type":"string"}],"name":"createClaimWithURI","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getClaim","outputs":[{"components":[{"internalType":"uint256","name":"claimAmount","type":"uint256"},{"internalType":"uint256","name":"paidAmount","type":"uint256"},{"internalType":"enum Status","name":"status","type":"uint8"},{"internalType":"uint256","name":"dueBy","type":"uint256"},{"internalType":"address","name":"debtor","type":"address"},{"internalType":"address","name":"claimToken","type":"address"},{"components":[{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"uint8","name":"hashFunction","type":"uint8"},{"internalType":"uint8","name":"size","type":"uint8"}],"internalType":"struct Multihash","name":"attachment","type":"tuple"}],"internalType":"struct Claim","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextClaimId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"paymentAmount","type":"uint256"}],"name":"payClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"rejectClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"rescindClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","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":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_bullaManager","type":"address"}],"name":"setBullaManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060405162005b5238038062005b5283398181016040528101906200003791906200058a565b6040518060400160405280600d81526020017f42756c6c61436c61696d373231000000000000000000000000000000000000008152506040518060400160405280600581526020017f434c41494d000000000000000000000000000000000000000000000000000000815250620000c3620000b76200012160201b60201c565b6200012960201b60201c565b8160019080519060200190620000db92919062000445565b508060029080519060200190620000f492919062000445565b5050506200010882620001ed60201b60201c565b62000119816200037160201b60201c565b50506200087d565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620001fd6200012160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002236200041c60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200027c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002739062000628565b60405180910390fd5b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f68756449c91230029864f3a385c98edecfd7f9d6824b6fbff849e07500f96bd9426040516200036591906200064a565b60405180910390a35050565b620003816200012160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003a76200041c60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000400576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003f79062000628565b60405180910390fd5b80600890805190602001906200041892919062000445565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b82805462000453906200074b565b90600052602060002090601f016020900481019282620004775760008555620004c3565b82601f106200049257805160ff1916838001178555620004c3565b82800160010185558215620004c3579182015b82811115620004c2578251825591602001919060010190620004a5565b5b509050620004d29190620004d6565b5090565b5b80821115620004f1576000816000905550600101620004d7565b5090565b60006200050c620005068462000690565b62000667565b9050828152602081018484840111156200052b576200052a6200081a565b5b6200053884828562000715565b509392505050565b600081519050620005518162000863565b92915050565b600082601f8301126200056f576200056e62000815565b5b815162000581848260208601620004f5565b91505092915050565b60008060408385031215620005a457620005a362000824565b5b6000620005b48582860162000540565b925050602083015167ffffffffffffffff811115620005d857620005d76200081f565b5b620005e68582860162000557565b9150509250929050565b6000620005ff602083620006c6565b91506200060c826200083a565b602082019050919050565b62000622816200070b565b82525050565b600060208201905081810360008301526200064381620005f0565b9050919050565b600060208201905062000661600083018462000617565b92915050565b60006200067362000686565b905062000681828262000781565b919050565b6000604051905090565b600067ffffffffffffffff821115620006ae57620006ad620007e6565b5b620006b98262000829565b9050602081019050919050565b600082825260208201905092915050565b6000620006e482620006eb565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b838110156200073557808201518184015260208101905062000718565b8381111562000745576000848401525b50505050565b600060028204905060018216806200076457607f821691505b602082108114156200077b576200077a620007b7565b5b50919050565b6200078c8262000829565b810181811067ffffffffffffffff82111715620007ae57620007ad620007e6565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6200086e81620006d7565b81146200087a57600080fd5b50565b6152c5806200088d6000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c8063715018a6116100f9578063b88d4fde11610097578063c99c444811610071578063c99c444814610503578063e8042ce51461051f578063e985e9c51461053b578063f2fde38b1461056b576101c4565b8063b88d4fde14610487578063c87b56dd146104a3578063c92aeec1146104d3576101c4565b8063987b22be116100d3578063987b22be14610401578063a0021cf114610431578063a22cb4651461044f578063af9486bd1461046b576101c4565b8063715018a6146103bb5780638da5cb5b146103c557806395d89b41146103e3576101c4565b806342966c68116101665780635e39986f116101405780635e39986f1461031f5780636352211e1461033d5780636c0360eb1461036d57806370a082311461038b576101c4565b806342966c68146102b757806355f804b3146102d35780635aef2447146102ef576101c4565b8063095ea7b3116101a2578063095ea7b314610247578063203411011461026357806323b872dd1461027f57806342842e0e1461029b576101c4565b806301ffc9a7146101c957806306fdde03146101f9578063081812fc14610217575b600080fd5b6101e360048036038101906101de9190613c4d565b610587565b6040516101f09190614437565b60405180910390f35b610201610669565b60405161020e9190614452565b60405180910390f35b610231600480360381019061022c9190613d1d565b6106fb565b60405161023e91906142c1565b60405180910390f35b610261600480360381019061025c9190613ba0565b610780565b005b61027d60048036038101906102789190613d1d565b610898565b005b61029960048036038101906102949190613a8a565b610a76565b005b6102b560048036038101906102b09190613a8a565b610ad6565b005b6102d160048036038101906102cc9190613d1d565b610af6565b005b6102ed60048036038101906102e89190613ca7565b610b7c565b005b61030960048036038101906103049190613d1d565b610c12565b6040516103169190614714565b60405180910390f35b610327610d9c565b60405161033491906142c1565b60405180910390f35b61035760048036038101906103529190613d1d565b610dc2565b60405161036491906142c1565b60405180910390f35b610375610e74565b6040516103829190614452565b60405180910390f35b6103a560048036038101906103a0919061386b565b610f02565b6040516103b29190614730565b60405180910390f35b6103c3610fba565b005b6103cd611042565b6040516103da91906142c1565b60405180910390f35b6103eb61106b565b6040516103f89190614452565b60405180910390f35b61041b600480360381019061041691906138d8565b6110fd565b6040516104289190614730565b60405180910390f35b610439611120565b6040516104469190614730565b60405180910390f35b61046960048036038101906104649190613b60565b61113d565b005b6104856004803603810190610480919061386b565b611153565b005b6104a1600480360381019061049c9190613add565b6112c2565b005b6104bd60048036038101906104b89190613d1d565b611324565b6040516104ca9190614452565b60405180910390f35b6104ed60048036038101906104e89190613997565b611476565b6040516104fa9190614730565b60405180910390f35b61051d60048036038101906105189190613d4a565b6114e9565b005b61053960048036038101906105349190613d1d565b6119c4565b005b61055560048036038101906105509190613898565b611b74565b6040516105629190614437565b60405180910390f35b6105856004803603810190610580919061386b565b611c08565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061065257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610662575061066182611d00565b5b9050919050565b60606001805461067890614a04565b80601f01602080910402602001604051908101604052809291908181526020018280546106a490614a04565b80156106f15780601f106106c6576101008083540402835291602001916106f1565b820191906000526020600020905b8154815290600101906020018083116106d457829003601f168201915b5050505050905090565b600061070682611d6a565b610745576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073c90614634565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061078b82610dc2565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f390614694565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661081b611dd6565b73ffffffffffffffffffffffffffffffffffffffff16148061084a575061084981610844611dd6565b611b74565b5b610889576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088090614574565b60405180910390fd5b6108938383611dde565b505050565b803373ffffffffffffffffffffffffffffffffffffffff16600b600083815260200190815260200160002060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461093f57336040517f21b03b8d00000000000000000000000000000000000000000000000000000000815260040161093691906142c1565b60405180910390fd5b816000600481111561095457610953614b3f565b5b600b600083815260200190815260200160002060020160009054906101000a900460ff16600481111561098a57610989614b3f565b5b146109c1576040517f48f8d3b100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6003600b600085815260200190815260200160002060020160006101000a81548160ff021916908360048111156109fb576109fa614b3f565b5b021790555082600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f6dac2c2cd2246c509966cc98ed16a65cab4a224ed77453b2c1014a58eafa8aeb42604051610a699190614730565b60405180910390a3505050565b610a87610a81611dd6565b82611e97565b610ac6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abd906146b4565b60405180910390fd5b610ad1838383611f75565b505050565b610af1838383604051806020016040528060008152506112c2565b505050565b803373ffffffffffffffffffffffffffffffffffffffff16610b1782610dc2565b73ffffffffffffffffffffffffffffffffffffffff1614610b6f57336040517fb56aedb3000000000000000000000000000000000000000000000000000000008152600401610b6691906142c1565b60405180910390fd5b610b78826121dc565b5050565b610b84611dd6565b73ffffffffffffffffffffffffffffffffffffffff16610ba2611042565b73ffffffffffffffffffffffffffffffffffffffff1614610bf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bef90614654565b60405180910390fd5b8060089080519060200190610c0e929190613452565b5050565b610c1a6134d8565b600b60008381526020019081526020016000206040518060e001604052908160008201548152602001600182015481526020016002820160009054906101000a900460ff166004811115610c7157610c70614b3f565b5b6004811115610c8357610c82614b3f565b5b8152602001600382015481526020016004820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016005820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160068201604051806060016040529081600082015481526020016001820160009054906101000a900460ff1660ff1660ff1681526020016001820160019054906101000a900460ff1660ff1660ff1681525050815250509050919050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e62906145b4565b60405180910390fd5b80915050919050565b60088054610e8190614a04565b80601f0160208091040260200160405190810160405280929190818152602001828054610ead90614a04565b8015610efa5780601f10610ecf57610100808354040283529160200191610efa565b820191906000526020600020905b815481529060010190602001808311610edd57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6a90614594565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610fc2611dd6565b73ffffffffffffffffffffffffffffffffffffffff16610fe0611042565b73ffffffffffffffffffffffffffffffffffffffff1614611036576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102d90614654565b60405180910390fd5b611040600061222f565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606002805461107a90614a04565b80601f01602080910402602001604051908101604052809291908181526020018280546110a690614a04565b80156110f35780601f106110c8576101008083540402835291602001916110f3565b820191906000526020600020905b8154815290600101906020018083116110d657829003601f168201915b5050505050905090565b60008061110f898989898989896122f3565b905080915050979650505050505050565b6000600161112e6009612740565b6111389190614857565b905090565b61114f611148611dd6565b838361274e565b5050565b61115b611dd6565b73ffffffffffffffffffffffffffffffffffffffff16611179611042565b73ffffffffffffffffffffffffffffffffffffffff16146111cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c690614654565b60405180910390fd5b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f68756449c91230029864f3a385c98edecfd7f9d6824b6fbff849e07500f96bd9426040516112b69190614730565b60405180910390a35050565b6112d36112cd611dd6565b83611e97565b611312576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611309906146b4565b60405180910390fd5b61131e848484846128bb565b50505050565b606061132f82611d6a565b61136e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136590614614565b60405180910390fd5b600060076000848152602001908152602001600020805461138e90614a04565b80601f01602080910402602001604051908101604052809291908181526020018280546113ba90614a04565b80156114075780601f106113dc57610100808354040283529160200191611407565b820191906000526020600020905b8154815290600101906020018083116113ea57829003601f168201915b505050505090506000611418612917565b905060008151141561142e578192505050611471565b60008251111561146357808260405160200161144b92919061429d565b60405160208183030381529060405292505050611471565b61146c846129a9565b925050505b919050565b6000806114888b8b8b8b8b8b8b6122f3565b90506114d88185858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612a50565b809150509998505050505050505050565b81600060048111156114fe576114fd614b3f565b5b600b600083815260200190815260200160002060020160009054906101000a900460ff16600481111561153457611533614b3f565b5b1415801561158a57506001600481111561155157611550614b3f565b5b600b600083815260200190815260200160002060020160009054906101000a900460ff16600481111561158757611586614b3f565b5b14155b156115c1576040517f9d7505b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008214156115fc576040517f8565fcfe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61160583611d6a565b61163b576040517fc4ee946700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061164684610c12565b9050600061165385610dc2565b905060008260200151836000015161166b91906148de565b905060008186101561167d578561167f565b815b905083600001518185602001516116969190614857565b146116d0576001846040019060048111156116b4576116b3614b3f565b5b908160048111156116c8576116c7614b3f565b5b815250611701565b6002846040019060048111156116e9576116e8614b3f565b5b908160048111156116fd576116fc614b3f565b5b8152505b5080600b600089815260200190815260200160002060010160008282546117289190614857565b925050819055508360400151600b600089815260200190815260200160002060020160006101000a81548160ff0219169083600481111561176c5761176b614b3f565b5b0217905550600080600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636bb9945233856040518363ffffffff1660e01b81526004016117d192919061440e565b604080518083038186803b1580156117e857600080fd5b505afa1580156117fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118209190613be0565b915091506118603386838661183591906148de565b8960a0015173ffffffffffffffffffffffffffffffffffffffff16612ac4909392919063ffffffff16565b600081111561189b5761189a3383838960a0015173ffffffffffffffffffffffffffffffffffffffff16612ac4909392919063ffffffff16565b5b856080015173ffffffffffffffffffffffffffffffffffffffff1689600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f6b70980886b3f210dff54c3f272d310c29fdf8bb69228630ecda21ac0be9fa5a33328d4260405161192594939291906143c9565b60405180910390a48173ffffffffffffffffffffffffffffffffffffffff1689600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fc408e942eca1f64c9012c5fb6383258c0137b350771f4fa85ff5e818cd5e9c6e8b85426040516119b19392919061474b565b60405180910390a4505050505050505050565b803373ffffffffffffffffffffffffffffffffffffffff166119e582610dc2565b73ffffffffffffffffffffffffffffffffffffffff1614611a3d57336040517fb56aedb3000000000000000000000000000000000000000000000000000000008152600401611a3491906142c1565b60405180910390fd5b8160006004811115611a5257611a51614b3f565b5b600b600083815260200190815260200160002060020160009054906101000a900460ff166004811115611a8857611a87614b3f565b5b14611abf576040517f48f8d3b100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004600b600085815260200190815260200160002060020160006101000a81548160ff02191690836004811115611af957611af8614b3f565b5b021790555082600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fe9b9c96d65a95df345b53f3f8bbc04f69190dae380948945886692e71a1ffa7942604051611b679190614730565b60405180910390a3505050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c10611dd6565b73ffffffffffffffffffffffffffffffffffffffff16611c2e611042565b73ffffffffffffffffffffffffffffffffffffffff1614611c84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7b90614654565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611cf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ceb90614494565b60405180910390fd5b611cfd8161222f565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611e5183610dc2565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611ea282611d6a565b611ee1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed890614554565b60405180910390fd5b6000611eec83610dc2565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611f5b57508373ffffffffffffffffffffffffffffffffffffffff16611f43846106fb565b73ffffffffffffffffffffffffffffffffffffffff16145b80611f6c5750611f6b8185611b74565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611f9582610dc2565b73ffffffffffffffffffffffffffffffffffffffff1614611feb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe2906144b4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561205b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612052906144f4565b60405180910390fd5b612066838383612b4d565b612071600082611dde565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120c191906148de565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121189190614857565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46121d7838383612b52565b505050565b6121e581612b57565b600060076000838152602001908152602001600020805461220590614a04565b90501461222c5760076000828152602001908152602001600020600061222b9190613559565b5b50565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16148061235b5750600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16145b15612392576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008514156123cd576040517f8565fcfe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b42841015612407576040517fd3f6d9da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6124268373ffffffffffffffffffffffffffffffffffffffff16612c74565b61245c576040517fb491a3d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6124666009612c97565b60006124726009612740565b905061247e8982612cad565b6124866134d8565b88816080019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505086816000018181525050858160600181815250506000816040019060048111156124eb576124ea614b3f565b5b908160048111156124ff576124fe614b3f565b5b81525050848160a0019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508380360381019061254c9190613cf0565b8160c0018190525080600b6000848152602001908152602001600020600082015181600001556020820151816001015560408201518160020160006101000a81548160ff021916908360048111156125a7576125a6614b3f565b5b02179055506060820151816003015560808201518160040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060a08201518160050160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060c0820151816006016000820151816000015560208201518160010160006101000a81548160ff021916908360ff16021790555060408201518160010160016101000a81548160ff021916908360ff16021790555050509050508873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff16837f2c26753faf099ab143b808c53a33347c87ef5c63458fd8ed4e2437add36f4f0a600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1633328e8842604051612728969594939291906142dc565b60405180910390a48192505050979650505050505050565b600081600001549050919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156127bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b490614514565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516128ae9190614437565b60405180910390a3505050565b6128c6848484611f75565b6128d284848484612ccb565b612911576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290890614474565b60405180910390fd5b50505050565b60606008805461292690614a04565b80601f016020809104026020016040519081016040528092919081815260200182805461295290614a04565b801561299f5780601f106129745761010080835404028352916020019161299f565b820191906000526020600020905b81548152906001019060200180831161298257829003601f168201915b5050505050905090565b60606129b482611d6a565b6129f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129ea90614674565b60405180910390fd5b60006129fd612917565b90506000815111612a1d5760405180602001604052806000815250612a48565b80612a2784612e62565b604051602001612a3892919061429d565b6040516020818303038152906040525b915050919050565b612a5982611d6a565b612a98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8f906145d4565b60405180910390fd5b80600760008481526020019081526020016000209080519060200190612abf929190613452565b505050565b612b47846323b872dd60e01b858585604051602401612ae593929190614346565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612fc3565b50505050565b505050565b505050565b6000612b6282610dc2565b9050612b7081600084612b4d565b612b7b600083611dde565b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612bcb91906148de565b925050819055506003600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c7081600084612b52565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6001816000016000828254019250508190555050565b612cc782826040518060200160405280600081525061308a565b5050565b6000612cec8473ffffffffffffffffffffffffffffffffffffffff16612c74565b15612e55578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d15611dd6565b8786866040518563ffffffff1660e01b8152600401612d37949392919061437d565b602060405180830381600087803b158015612d5157600080fd5b505af1925050508015612d8257506040513d601f19601f82011682018060405250810190612d7f9190613c7a565b60015b612e05573d8060008114612db2576040519150601f19603f3d011682016040523d82523d6000602084013e612db7565b606091505b50600081511415612dfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612df490614474565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612e5a565b600190505b949350505050565b60606000821415612eaa576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612fbe565b600082905060005b60008214612edc578080612ec590614a67565b915050600a82612ed591906148ad565b9150612eb2565b60008167ffffffffffffffff811115612ef857612ef7614bcc565b5b6040519080825280601f01601f191660200182016040528015612f2a5781602001600182028036833780820191505090505b5090505b60008514612fb757600182612f4391906148de565b9150600a85612f529190614ab0565b6030612f5e9190614857565b60f81b818381518110612f7457612f73614b9d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612fb091906148ad565b9450612f2e565b8093505050505b919050565b6000613025826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166130e59092919063ffffffff16565b905060008151111561308557808060200190518101906130459190613c20565b613084576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161307b906146f4565b60405180910390fd5b5b505050565b61309483836130fd565b6130a16000848484612ccb565b6130e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130d790614474565b60405180910390fd5b505050565b60606130f484846000856132d7565b90509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561316d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613164906145f4565b60405180910390fd5b61317681611d6a565b156131b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131ad906144d4565b60405180910390fd5b6131c260008383612b4d565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546132129190614857565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46132d360008383612b52565b5050565b60608247101561331c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161331390614534565b60405180910390fd5b61332585612c74565b613364576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161335b906146d4565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161338d9190614286565b60006040518083038185875af1925050503d80600081146133ca576040519150601f19603f3d011682016040523d82523d6000602084013e6133cf565b606091505b50915091506133df8282866133eb565b92505050949350505050565b606083156133fb5782905061344b565b60008351111561340e5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134429190614452565b60405180910390fd5b9392505050565b82805461345e90614a04565b90600052602060002090601f01602090048101928261348057600085556134c7565b82601f1061349957805160ff19168380011785556134c7565b828001600101855582156134c7579182015b828111156134c65782518255916020019190600101906134ab565b5b5090506134d49190613599565b5090565b6040518060e0016040528060008152602001600081526020016000600481111561350557613504614b3f565b5b815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016135536135b6565b81525090565b50805461356590614a04565b6000825580601f106135775750613596565b601f0160209004906000526020600020908101906135959190613599565b5b50565b5b808211156135b257600081600090555060010161359a565b5090565b604051806060016040528060008019168152602001600060ff168152602001600060ff1681525090565b60006135f36135ee846147a7565b614782565b90508281526020810184848401111561360f5761360e614c14565b5b61361a8482856149c2565b509392505050565b6000613635613630846147d8565b614782565b90508281526020810184848401111561365157613650614c14565b5b61365c8482856149c2565b509392505050565b60008135905061367381615205565b92915050565b60008151905061368881615205565b92915050565b60008135905061369d8161521c565b92915050565b6000815190506136b28161521c565b92915050565b6000813590506136c781615233565b92915050565b6000813590506136dc8161524a565b92915050565b6000815190506136f18161524a565b92915050565b600082601f83011261370c5761370b614c00565b5b813561371c8482602086016135e0565b91505092915050565b60008083601f84011261373b5761373a614c00565b5b8235905067ffffffffffffffff81111561375857613757614bfb565b5b60208301915083600182028301111561377457613773614c0f565b5b9250929050565b600082601f8301126137905761378f614c00565b5b81356137a0848260208601613622565b91505092915050565b6000606082840312156137bf576137be614c05565b5b81905092915050565b6000606082840312156137de576137dd614c0a565b5b6137e86060614782565b905060006137f8848285016136b8565b600083015250602061380c84828501613856565b602083015250604061382084828501613856565b60408301525092915050565b60008135905061383b81615261565b92915050565b60008151905061385081615261565b92915050565b60008135905061386581615278565b92915050565b60006020828403121561388157613880614c1e565b5b600061388f84828501613664565b91505092915050565b600080604083850312156138af576138ae614c1e565b5b60006138bd85828601613664565b92505060206138ce85828601613664565b9150509250929050565b6000806000806000806000610120888a0312156138f8576138f7614c1e565b5b60006139068a828b01613664565b97505060206139178a828b01613664565b965050604088013567ffffffffffffffff81111561393857613937614c19565b5b6139448a828b0161377b565b95505060606139558a828b0161382c565b94505060806139668a828b0161382c565b93505060a06139778a828b01613664565b92505060c06139888a828b016137a9565b91505092959891949750929550565b60008060008060008060008060006101408a8c0312156139ba576139b9614c1e565b5b60006139c88c828d01613664565b99505060206139d98c828d01613664565b98505060408a013567ffffffffffffffff8111156139fa576139f9614c19565b5b613a068c828d0161377b565b9750506060613a178c828d0161382c565b9650506080613a288c828d0161382c565b95505060a0613a398c828d01613664565b94505060c0613a4a8c828d016137a9565b9350506101208a013567ffffffffffffffff811115613a6c57613a6b614c19565b5b613a788c828d01613725565b92509250509295985092959850929598565b600080600060608486031215613aa357613aa2614c1e565b5b6000613ab186828701613664565b9350506020613ac286828701613664565b9250506040613ad38682870161382c565b9150509250925092565b60008060008060808587031215613af757613af6614c1e565b5b6000613b0587828801613664565b9450506020613b1687828801613664565b9350506040613b278782880161382c565b925050606085013567ffffffffffffffff811115613b4857613b47614c19565b5b613b54878288016136f7565b91505092959194509250565b60008060408385031215613b7757613b76614c1e565b5b6000613b8585828601613664565b9250506020613b968582860161368e565b9150509250929050565b60008060408385031215613bb757613bb6614c1e565b5b6000613bc585828601613664565b9250506020613bd68582860161382c565b9150509250929050565b60008060408385031215613bf757613bf6614c1e565b5b6000613c0585828601613679565b9250506020613c1685828601613841565b9150509250929050565b600060208284031215613c3657613c35614c1e565b5b6000613c44848285016136a3565b91505092915050565b600060208284031215613c6357613c62614c1e565b5b6000613c71848285016136cd565b91505092915050565b600060208284031215613c9057613c8f614c1e565b5b6000613c9e848285016136e2565b91505092915050565b600060208284031215613cbd57613cbc614c1e565b5b600082013567ffffffffffffffff811115613cdb57613cda614c19565b5b613ce78482850161377b565b91505092915050565b600060608284031215613d0657613d05614c1e565b5b6000613d14848285016137c8565b91505092915050565b600060208284031215613d3357613d32614c1e565b5b6000613d418482850161382c565b91505092915050565b60008060408385031215613d6157613d60614c1e565b5b6000613d6f8582860161382c565b9250506020613d808582860161382c565b9150509250929050565b613d9381614912565b82525050565b613da281614912565b82525050565b613db181614924565b82525050565b613dc081614930565b82525050565b6000613dd182614809565b613ddb818561481f565b9350613deb8185602086016149d1565b613df481614c23565b840191505092915050565b6000613e0a82614809565b613e148185614830565b9350613e248185602086016149d1565b80840191505092915050565b613e39816149b0565b82525050565b6000613e4a82614814565b613e54818561483b565b9350613e648185602086016149d1565b613e6d81614c23565b840191505092915050565b6000613e8382614814565b613e8d818561484c565b9350613e9d8185602086016149d1565b80840191505092915050565b6000613eb660328361483b565b9150613ec182614c34565b604082019050919050565b6000613ed960268361483b565b9150613ee482614c83565b604082019050919050565b6000613efc60258361483b565b9150613f0782614cd2565b604082019050919050565b6000613f1f601c8361483b565b9150613f2a82614d21565b602082019050919050565b6000613f4260248361483b565b9150613f4d82614d4a565b604082019050919050565b6000613f6560198361483b565b9150613f7082614d99565b602082019050919050565b6000613f8860268361483b565b9150613f9382614dc2565b604082019050919050565b6000613fab602c8361483b565b9150613fb682614e11565b604082019050919050565b6000613fce60388361483b565b9150613fd982614e60565b604082019050919050565b6000613ff1602a8361483b565b9150613ffc82614eaf565b604082019050919050565b600061401460298361483b565b915061401f82614efe565b604082019050919050565b6000614037602e8361483b565b915061404282614f4d565b604082019050919050565b600061405a60208361483b565b915061406582614f9c565b602082019050919050565b600061407d60318361483b565b915061408882614fc5565b604082019050919050565b60006140a0602c8361483b565b91506140ab82615014565b604082019050919050565b60006140c360208361483b565b91506140ce82615063565b602082019050919050565b60006140e6602f8361483b565b91506140f18261508c565b604082019050919050565b600061410960218361483b565b9150614114826150db565b604082019050919050565b600061412c60318361483b565b91506141378261512a565b604082019050919050565b600061414f601d8361483b565b915061415a82615179565b602082019050919050565b6000614172602a8361483b565b915061417d826151a2565b604082019050919050565b6101208201600082015161419f6000850182614259565b5060208201516141b26020850182614259565b5060408201516141c56040850182613e30565b5060608201516141d86060850182614259565b5060808201516141eb6080850182613d8a565b5060a08201516141fe60a0850182613d8a565b5060c082015161421160c0850182614217565b50505050565b60608201600082015161422d6000850182613db7565b5060208201516142406020850182614277565b5060408201516142536040850182614277565b50505050565b61426281614999565b82525050565b61427181614999565b82525050565b614280816149a3565b82525050565b60006142928284613dff565b915081905092915050565b60006142a98285613e78565b91506142b58284613e78565b91508190509392505050565b60006020820190506142d66000830184613d99565b92915050565b60006101c0820190506142f26000830189613d99565b6142ff6020830188613d99565b61430c6040830187613d99565b818103606083015261431e8186613e3f565b905061432d6080830185614188565b61433b6101a0830184614268565b979650505050505050565b600060608201905061435b6000830186613d99565b6143686020830185613d99565b6143756040830184614268565b949350505050565b60006080820190506143926000830187613d99565b61439f6020830186613d99565b6143ac6040830185614268565b81810360608301526143be8184613dc6565b905095945050505050565b60006080820190506143de6000830187613d99565b6143eb6020830186613d99565b6143f86040830185614268565b6144056060830184614268565b95945050505050565b60006040820190506144236000830185613d99565b6144306020830184614268565b9392505050565b600060208201905061444c6000830184613da8565b92915050565b6000602082019050818103600083015261446c8184613e3f565b905092915050565b6000602082019050818103600083015261448d81613ea9565b9050919050565b600060208201905081810360008301526144ad81613ecc565b9050919050565b600060208201905081810360008301526144cd81613eef565b9050919050565b600060208201905081810360008301526144ed81613f12565b9050919050565b6000602082019050818103600083015261450d81613f35565b9050919050565b6000602082019050818103600083015261452d81613f58565b9050919050565b6000602082019050818103600083015261454d81613f7b565b9050919050565b6000602082019050818103600083015261456d81613f9e565b9050919050565b6000602082019050818103600083015261458d81613fc1565b9050919050565b600060208201905081810360008301526145ad81613fe4565b9050919050565b600060208201905081810360008301526145cd81614007565b9050919050565b600060208201905081810360008301526145ed8161402a565b9050919050565b6000602082019050818103600083015261460d8161404d565b9050919050565b6000602082019050818103600083015261462d81614070565b9050919050565b6000602082019050818103600083015261464d81614093565b9050919050565b6000602082019050818103600083015261466d816140b6565b9050919050565b6000602082019050818103600083015261468d816140d9565b9050919050565b600060208201905081810360008301526146ad816140fc565b9050919050565b600060208201905081810360008301526146cd8161411f565b9050919050565b600060208201905081810360008301526146ed81614142565b9050919050565b6000602082019050818103600083015261470d81614165565b9050919050565b60006101208201905061472a6000830184614188565b92915050565b60006020820190506147456000830184614268565b92915050565b60006060820190506147606000830186614268565b61476d6020830185614268565b61477a6040830184614268565b949350505050565b600061478c61479d565b90506147988282614a36565b919050565b6000604051905090565b600067ffffffffffffffff8211156147c2576147c1614bcc565b5b6147cb82614c23565b9050602081019050919050565b600067ffffffffffffffff8211156147f3576147f2614bcc565b5b6147fc82614c23565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061486282614999565b915061486d83614999565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156148a2576148a1614ae1565b5b828201905092915050565b60006148b882614999565b91506148c383614999565b9250826148d3576148d2614b10565b5b828204905092915050565b60006148e982614999565b91506148f483614999565b92508282101561490757614906614ae1565b5b828203905092915050565b600061491d82614979565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000819050614974826151f1565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006149bb82614966565b9050919050565b82818337600083830152505050565b60005b838110156149ef5780820151818401526020810190506149d4565b838111156149fe576000848401525b50505050565b60006002820490506001821680614a1c57607f821691505b60208210811415614a3057614a2f614b6e565b5b50919050565b614a3f82614c23565b810181811067ffffffffffffffff82111715614a5e57614a5d614bcc565b5b80604052505050565b6000614a7282614999565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614aa557614aa4614ae1565b5b600182019050919050565b6000614abb82614999565b9150614ac683614999565b925082614ad657614ad5614b10565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6005811061520257615201614b3f565b5b50565b61520e81614912565b811461521957600080fd5b50565b61522581614924565b811461523057600080fd5b50565b61523c81614930565b811461524757600080fd5b50565b6152538161493a565b811461525e57600080fd5b50565b61526a81614999565b811461527557600080fd5b50565b615281816149a3565b811461528c57600080fd5b5056fea2646970667358221220884bdbd1eafa98964e241c20fc185311627bbff70533c66560a63a6159fc1a8b64736f6c634300080700330000000000000000000000001b4db52fd952f70d3d28bfbd406db71940ed8ca90000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000001568747470733a2f2f697066732e696f2f697066732f0000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101c45760003560e01c8063715018a6116100f9578063b88d4fde11610097578063c99c444811610071578063c99c444814610503578063e8042ce51461051f578063e985e9c51461053b578063f2fde38b1461056b576101c4565b8063b88d4fde14610487578063c87b56dd146104a3578063c92aeec1146104d3576101c4565b8063987b22be116100d3578063987b22be14610401578063a0021cf114610431578063a22cb4651461044f578063af9486bd1461046b576101c4565b8063715018a6146103bb5780638da5cb5b146103c557806395d89b41146103e3576101c4565b806342966c68116101665780635e39986f116101405780635e39986f1461031f5780636352211e1461033d5780636c0360eb1461036d57806370a082311461038b576101c4565b806342966c68146102b757806355f804b3146102d35780635aef2447146102ef576101c4565b8063095ea7b3116101a2578063095ea7b314610247578063203411011461026357806323b872dd1461027f57806342842e0e1461029b576101c4565b806301ffc9a7146101c957806306fdde03146101f9578063081812fc14610217575b600080fd5b6101e360048036038101906101de9190613c4d565b610587565b6040516101f09190614437565b60405180910390f35b610201610669565b60405161020e9190614452565b60405180910390f35b610231600480360381019061022c9190613d1d565b6106fb565b60405161023e91906142c1565b60405180910390f35b610261600480360381019061025c9190613ba0565b610780565b005b61027d60048036038101906102789190613d1d565b610898565b005b61029960048036038101906102949190613a8a565b610a76565b005b6102b560048036038101906102b09190613a8a565b610ad6565b005b6102d160048036038101906102cc9190613d1d565b610af6565b005b6102ed60048036038101906102e89190613ca7565b610b7c565b005b61030960048036038101906103049190613d1d565b610c12565b6040516103169190614714565b60405180910390f35b610327610d9c565b60405161033491906142c1565b60405180910390f35b61035760048036038101906103529190613d1d565b610dc2565b60405161036491906142c1565b60405180910390f35b610375610e74565b6040516103829190614452565b60405180910390f35b6103a560048036038101906103a0919061386b565b610f02565b6040516103b29190614730565b60405180910390f35b6103c3610fba565b005b6103cd611042565b6040516103da91906142c1565b60405180910390f35b6103eb61106b565b6040516103f89190614452565b60405180910390f35b61041b600480360381019061041691906138d8565b6110fd565b6040516104289190614730565b60405180910390f35b610439611120565b6040516104469190614730565b60405180910390f35b61046960048036038101906104649190613b60565b61113d565b005b6104856004803603810190610480919061386b565b611153565b005b6104a1600480360381019061049c9190613add565b6112c2565b005b6104bd60048036038101906104b89190613d1d565b611324565b6040516104ca9190614452565b60405180910390f35b6104ed60048036038101906104e89190613997565b611476565b6040516104fa9190614730565b60405180910390f35b61051d60048036038101906105189190613d4a565b6114e9565b005b61053960048036038101906105349190613d1d565b6119c4565b005b61055560048036038101906105509190613898565b611b74565b6040516105629190614437565b60405180910390f35b6105856004803603810190610580919061386b565b611c08565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061065257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610662575061066182611d00565b5b9050919050565b60606001805461067890614a04565b80601f01602080910402602001604051908101604052809291908181526020018280546106a490614a04565b80156106f15780601f106106c6576101008083540402835291602001916106f1565b820191906000526020600020905b8154815290600101906020018083116106d457829003601f168201915b5050505050905090565b600061070682611d6a565b610745576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073c90614634565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061078b82610dc2565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f390614694565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661081b611dd6565b73ffffffffffffffffffffffffffffffffffffffff16148061084a575061084981610844611dd6565b611b74565b5b610889576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088090614574565b60405180910390fd5b6108938383611dde565b505050565b803373ffffffffffffffffffffffffffffffffffffffff16600b600083815260200190815260200160002060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461093f57336040517f21b03b8d00000000000000000000000000000000000000000000000000000000815260040161093691906142c1565b60405180910390fd5b816000600481111561095457610953614b3f565b5b600b600083815260200190815260200160002060020160009054906101000a900460ff16600481111561098a57610989614b3f565b5b146109c1576040517f48f8d3b100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6003600b600085815260200190815260200160002060020160006101000a81548160ff021916908360048111156109fb576109fa614b3f565b5b021790555082600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f6dac2c2cd2246c509966cc98ed16a65cab4a224ed77453b2c1014a58eafa8aeb42604051610a699190614730565b60405180910390a3505050565b610a87610a81611dd6565b82611e97565b610ac6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abd906146b4565b60405180910390fd5b610ad1838383611f75565b505050565b610af1838383604051806020016040528060008152506112c2565b505050565b803373ffffffffffffffffffffffffffffffffffffffff16610b1782610dc2565b73ffffffffffffffffffffffffffffffffffffffff1614610b6f57336040517fb56aedb3000000000000000000000000000000000000000000000000000000008152600401610b6691906142c1565b60405180910390fd5b610b78826121dc565b5050565b610b84611dd6565b73ffffffffffffffffffffffffffffffffffffffff16610ba2611042565b73ffffffffffffffffffffffffffffffffffffffff1614610bf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bef90614654565b60405180910390fd5b8060089080519060200190610c0e929190613452565b5050565b610c1a6134d8565b600b60008381526020019081526020016000206040518060e001604052908160008201548152602001600182015481526020016002820160009054906101000a900460ff166004811115610c7157610c70614b3f565b5b6004811115610c8357610c82614b3f565b5b8152602001600382015481526020016004820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016005820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160068201604051806060016040529081600082015481526020016001820160009054906101000a900460ff1660ff1660ff1681526020016001820160019054906101000a900460ff1660ff1660ff1681525050815250509050919050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e62906145b4565b60405180910390fd5b80915050919050565b60088054610e8190614a04565b80601f0160208091040260200160405190810160405280929190818152602001828054610ead90614a04565b8015610efa5780601f10610ecf57610100808354040283529160200191610efa565b820191906000526020600020905b815481529060010190602001808311610edd57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6a90614594565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610fc2611dd6565b73ffffffffffffffffffffffffffffffffffffffff16610fe0611042565b73ffffffffffffffffffffffffffffffffffffffff1614611036576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102d90614654565b60405180910390fd5b611040600061222f565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606002805461107a90614a04565b80601f01602080910402602001604051908101604052809291908181526020018280546110a690614a04565b80156110f35780601f106110c8576101008083540402835291602001916110f3565b820191906000526020600020905b8154815290600101906020018083116110d657829003601f168201915b5050505050905090565b60008061110f898989898989896122f3565b905080915050979650505050505050565b6000600161112e6009612740565b6111389190614857565b905090565b61114f611148611dd6565b838361274e565b5050565b61115b611dd6565b73ffffffffffffffffffffffffffffffffffffffff16611179611042565b73ffffffffffffffffffffffffffffffffffffffff16146111cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c690614654565b60405180910390fd5b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f68756449c91230029864f3a385c98edecfd7f9d6824b6fbff849e07500f96bd9426040516112b69190614730565b60405180910390a35050565b6112d36112cd611dd6565b83611e97565b611312576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611309906146b4565b60405180910390fd5b61131e848484846128bb565b50505050565b606061132f82611d6a565b61136e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136590614614565b60405180910390fd5b600060076000848152602001908152602001600020805461138e90614a04565b80601f01602080910402602001604051908101604052809291908181526020018280546113ba90614a04565b80156114075780601f106113dc57610100808354040283529160200191611407565b820191906000526020600020905b8154815290600101906020018083116113ea57829003601f168201915b505050505090506000611418612917565b905060008151141561142e578192505050611471565b60008251111561146357808260405160200161144b92919061429d565b60405160208183030381529060405292505050611471565b61146c846129a9565b925050505b919050565b6000806114888b8b8b8b8b8b8b6122f3565b90506114d88185858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612a50565b809150509998505050505050505050565b81600060048111156114fe576114fd614b3f565b5b600b600083815260200190815260200160002060020160009054906101000a900460ff16600481111561153457611533614b3f565b5b1415801561158a57506001600481111561155157611550614b3f565b5b600b600083815260200190815260200160002060020160009054906101000a900460ff16600481111561158757611586614b3f565b5b14155b156115c1576040517f9d7505b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008214156115fc576040517f8565fcfe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61160583611d6a565b61163b576040517fc4ee946700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061164684610c12565b9050600061165385610dc2565b905060008260200151836000015161166b91906148de565b905060008186101561167d578561167f565b815b905083600001518185602001516116969190614857565b146116d0576001846040019060048111156116b4576116b3614b3f565b5b908160048111156116c8576116c7614b3f565b5b815250611701565b6002846040019060048111156116e9576116e8614b3f565b5b908160048111156116fd576116fc614b3f565b5b8152505b5080600b600089815260200190815260200160002060010160008282546117289190614857565b925050819055508360400151600b600089815260200190815260200160002060020160006101000a81548160ff0219169083600481111561176c5761176b614b3f565b5b0217905550600080600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636bb9945233856040518363ffffffff1660e01b81526004016117d192919061440e565b604080518083038186803b1580156117e857600080fd5b505afa1580156117fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118209190613be0565b915091506118603386838661183591906148de565b8960a0015173ffffffffffffffffffffffffffffffffffffffff16612ac4909392919063ffffffff16565b600081111561189b5761189a3383838960a0015173ffffffffffffffffffffffffffffffffffffffff16612ac4909392919063ffffffff16565b5b856080015173ffffffffffffffffffffffffffffffffffffffff1689600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f6b70980886b3f210dff54c3f272d310c29fdf8bb69228630ecda21ac0be9fa5a33328d4260405161192594939291906143c9565b60405180910390a48173ffffffffffffffffffffffffffffffffffffffff1689600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fc408e942eca1f64c9012c5fb6383258c0137b350771f4fa85ff5e818cd5e9c6e8b85426040516119b19392919061474b565b60405180910390a4505050505050505050565b803373ffffffffffffffffffffffffffffffffffffffff166119e582610dc2565b73ffffffffffffffffffffffffffffffffffffffff1614611a3d57336040517fb56aedb3000000000000000000000000000000000000000000000000000000008152600401611a3491906142c1565b60405180910390fd5b8160006004811115611a5257611a51614b3f565b5b600b600083815260200190815260200160002060020160009054906101000a900460ff166004811115611a8857611a87614b3f565b5b14611abf576040517f48f8d3b100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004600b600085815260200190815260200160002060020160006101000a81548160ff02191690836004811115611af957611af8614b3f565b5b021790555082600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fe9b9c96d65a95df345b53f3f8bbc04f69190dae380948945886692e71a1ffa7942604051611b679190614730565b60405180910390a3505050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c10611dd6565b73ffffffffffffffffffffffffffffffffffffffff16611c2e611042565b73ffffffffffffffffffffffffffffffffffffffff1614611c84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7b90614654565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611cf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ceb90614494565b60405180910390fd5b611cfd8161222f565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611e5183610dc2565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611ea282611d6a565b611ee1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed890614554565b60405180910390fd5b6000611eec83610dc2565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611f5b57508373ffffffffffffffffffffffffffffffffffffffff16611f43846106fb565b73ffffffffffffffffffffffffffffffffffffffff16145b80611f6c5750611f6b8185611b74565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611f9582610dc2565b73ffffffffffffffffffffffffffffffffffffffff1614611feb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe2906144b4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561205b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612052906144f4565b60405180910390fd5b612066838383612b4d565b612071600082611dde565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120c191906148de565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121189190614857565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46121d7838383612b52565b505050565b6121e581612b57565b600060076000838152602001908152602001600020805461220590614a04565b90501461222c5760076000828152602001908152602001600020600061222b9190613559565b5b50565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16148061235b5750600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16145b15612392576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008514156123cd576040517f8565fcfe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b42841015612407576040517fd3f6d9da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6124268373ffffffffffffffffffffffffffffffffffffffff16612c74565b61245c576040517fb491a3d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6124666009612c97565b60006124726009612740565b905061247e8982612cad565b6124866134d8565b88816080019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505086816000018181525050858160600181815250506000816040019060048111156124eb576124ea614b3f565b5b908160048111156124ff576124fe614b3f565b5b81525050848160a0019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508380360381019061254c9190613cf0565b8160c0018190525080600b6000848152602001908152602001600020600082015181600001556020820151816001015560408201518160020160006101000a81548160ff021916908360048111156125a7576125a6614b3f565b5b02179055506060820151816003015560808201518160040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060a08201518160050160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060c0820151816006016000820151816000015560208201518160010160006101000a81548160ff021916908360ff16021790555060408201518160010160016101000a81548160ff021916908360ff16021790555050509050508873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff16837f2c26753faf099ab143b808c53a33347c87ef5c63458fd8ed4e2437add36f4f0a600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1633328e8842604051612728969594939291906142dc565b60405180910390a48192505050979650505050505050565b600081600001549050919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156127bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b490614514565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516128ae9190614437565b60405180910390a3505050565b6128c6848484611f75565b6128d284848484612ccb565b612911576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290890614474565b60405180910390fd5b50505050565b60606008805461292690614a04565b80601f016020809104026020016040519081016040528092919081815260200182805461295290614a04565b801561299f5780601f106129745761010080835404028352916020019161299f565b820191906000526020600020905b81548152906001019060200180831161298257829003601f168201915b5050505050905090565b60606129b482611d6a565b6129f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129ea90614674565b60405180910390fd5b60006129fd612917565b90506000815111612a1d5760405180602001604052806000815250612a48565b80612a2784612e62565b604051602001612a3892919061429d565b6040516020818303038152906040525b915050919050565b612a5982611d6a565b612a98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8f906145d4565b60405180910390fd5b80600760008481526020019081526020016000209080519060200190612abf929190613452565b505050565b612b47846323b872dd60e01b858585604051602401612ae593929190614346565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612fc3565b50505050565b505050565b505050565b6000612b6282610dc2565b9050612b7081600084612b4d565b612b7b600083611dde565b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612bcb91906148de565b925050819055506003600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c7081600084612b52565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6001816000016000828254019250508190555050565b612cc782826040518060200160405280600081525061308a565b5050565b6000612cec8473ffffffffffffffffffffffffffffffffffffffff16612c74565b15612e55578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d15611dd6565b8786866040518563ffffffff1660e01b8152600401612d37949392919061437d565b602060405180830381600087803b158015612d5157600080fd5b505af1925050508015612d8257506040513d601f19601f82011682018060405250810190612d7f9190613c7a565b60015b612e05573d8060008114612db2576040519150601f19603f3d011682016040523d82523d6000602084013e612db7565b606091505b50600081511415612dfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612df490614474565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612e5a565b600190505b949350505050565b60606000821415612eaa576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612fbe565b600082905060005b60008214612edc578080612ec590614a67565b915050600a82612ed591906148ad565b9150612eb2565b60008167ffffffffffffffff811115612ef857612ef7614bcc565b5b6040519080825280601f01601f191660200182016040528015612f2a5781602001600182028036833780820191505090505b5090505b60008514612fb757600182612f4391906148de565b9150600a85612f529190614ab0565b6030612f5e9190614857565b60f81b818381518110612f7457612f73614b9d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612fb091906148ad565b9450612f2e565b8093505050505b919050565b6000613025826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166130e59092919063ffffffff16565b905060008151111561308557808060200190518101906130459190613c20565b613084576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161307b906146f4565b60405180910390fd5b5b505050565b61309483836130fd565b6130a16000848484612ccb565b6130e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130d790614474565b60405180910390fd5b505050565b60606130f484846000856132d7565b90509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561316d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613164906145f4565b60405180910390fd5b61317681611d6a565b156131b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131ad906144d4565b60405180910390fd5b6131c260008383612b4d565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546132129190614857565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46132d360008383612b52565b5050565b60608247101561331c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161331390614534565b60405180910390fd5b61332585612c74565b613364576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161335b906146d4565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161338d9190614286565b60006040518083038185875af1925050503d80600081146133ca576040519150601f19603f3d011682016040523d82523d6000602084013e6133cf565b606091505b50915091506133df8282866133eb565b92505050949350505050565b606083156133fb5782905061344b565b60008351111561340e5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134429190614452565b60405180910390fd5b9392505050565b82805461345e90614a04565b90600052602060002090601f01602090048101928261348057600085556134c7565b82601f1061349957805160ff19168380011785556134c7565b828001600101855582156134c7579182015b828111156134c65782518255916020019190600101906134ab565b5b5090506134d49190613599565b5090565b6040518060e0016040528060008152602001600081526020016000600481111561350557613504614b3f565b5b815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016135536135b6565b81525090565b50805461356590614a04565b6000825580601f106135775750613596565b601f0160209004906000526020600020908101906135959190613599565b5b50565b5b808211156135b257600081600090555060010161359a565b5090565b604051806060016040528060008019168152602001600060ff168152602001600060ff1681525090565b60006135f36135ee846147a7565b614782565b90508281526020810184848401111561360f5761360e614c14565b5b61361a8482856149c2565b509392505050565b6000613635613630846147d8565b614782565b90508281526020810184848401111561365157613650614c14565b5b61365c8482856149c2565b509392505050565b60008135905061367381615205565b92915050565b60008151905061368881615205565b92915050565b60008135905061369d8161521c565b92915050565b6000815190506136b28161521c565b92915050565b6000813590506136c781615233565b92915050565b6000813590506136dc8161524a565b92915050565b6000815190506136f18161524a565b92915050565b600082601f83011261370c5761370b614c00565b5b813561371c8482602086016135e0565b91505092915050565b60008083601f84011261373b5761373a614c00565b5b8235905067ffffffffffffffff81111561375857613757614bfb565b5b60208301915083600182028301111561377457613773614c0f565b5b9250929050565b600082601f8301126137905761378f614c00565b5b81356137a0848260208601613622565b91505092915050565b6000606082840312156137bf576137be614c05565b5b81905092915050565b6000606082840312156137de576137dd614c0a565b5b6137e86060614782565b905060006137f8848285016136b8565b600083015250602061380c84828501613856565b602083015250604061382084828501613856565b60408301525092915050565b60008135905061383b81615261565b92915050565b60008151905061385081615261565b92915050565b60008135905061386581615278565b92915050565b60006020828403121561388157613880614c1e565b5b600061388f84828501613664565b91505092915050565b600080604083850312156138af576138ae614c1e565b5b60006138bd85828601613664565b92505060206138ce85828601613664565b9150509250929050565b6000806000806000806000610120888a0312156138f8576138f7614c1e565b5b60006139068a828b01613664565b97505060206139178a828b01613664565b965050604088013567ffffffffffffffff81111561393857613937614c19565b5b6139448a828b0161377b565b95505060606139558a828b0161382c565b94505060806139668a828b0161382c565b93505060a06139778a828b01613664565b92505060c06139888a828b016137a9565b91505092959891949750929550565b60008060008060008060008060006101408a8c0312156139ba576139b9614c1e565b5b60006139c88c828d01613664565b99505060206139d98c828d01613664565b98505060408a013567ffffffffffffffff8111156139fa576139f9614c19565b5b613a068c828d0161377b565b9750506060613a178c828d0161382c565b9650506080613a288c828d0161382c565b95505060a0613a398c828d01613664565b94505060c0613a4a8c828d016137a9565b9350506101208a013567ffffffffffffffff811115613a6c57613a6b614c19565b5b613a788c828d01613725565b92509250509295985092959850929598565b600080600060608486031215613aa357613aa2614c1e565b5b6000613ab186828701613664565b9350506020613ac286828701613664565b9250506040613ad38682870161382c565b9150509250925092565b60008060008060808587031215613af757613af6614c1e565b5b6000613b0587828801613664565b9450506020613b1687828801613664565b9350506040613b278782880161382c565b925050606085013567ffffffffffffffff811115613b4857613b47614c19565b5b613b54878288016136f7565b91505092959194509250565b60008060408385031215613b7757613b76614c1e565b5b6000613b8585828601613664565b9250506020613b968582860161368e565b9150509250929050565b60008060408385031215613bb757613bb6614c1e565b5b6000613bc585828601613664565b9250506020613bd68582860161382c565b9150509250929050565b60008060408385031215613bf757613bf6614c1e565b5b6000613c0585828601613679565b9250506020613c1685828601613841565b9150509250929050565b600060208284031215613c3657613c35614c1e565b5b6000613c44848285016136a3565b91505092915050565b600060208284031215613c6357613c62614c1e565b5b6000613c71848285016136cd565b91505092915050565b600060208284031215613c9057613c8f614c1e565b5b6000613c9e848285016136e2565b91505092915050565b600060208284031215613cbd57613cbc614c1e565b5b600082013567ffffffffffffffff811115613cdb57613cda614c19565b5b613ce78482850161377b565b91505092915050565b600060608284031215613d0657613d05614c1e565b5b6000613d14848285016137c8565b91505092915050565b600060208284031215613d3357613d32614c1e565b5b6000613d418482850161382c565b91505092915050565b60008060408385031215613d6157613d60614c1e565b5b6000613d6f8582860161382c565b9250506020613d808582860161382c565b9150509250929050565b613d9381614912565b82525050565b613da281614912565b82525050565b613db181614924565b82525050565b613dc081614930565b82525050565b6000613dd182614809565b613ddb818561481f565b9350613deb8185602086016149d1565b613df481614c23565b840191505092915050565b6000613e0a82614809565b613e148185614830565b9350613e248185602086016149d1565b80840191505092915050565b613e39816149b0565b82525050565b6000613e4a82614814565b613e54818561483b565b9350613e648185602086016149d1565b613e6d81614c23565b840191505092915050565b6000613e8382614814565b613e8d818561484c565b9350613e9d8185602086016149d1565b80840191505092915050565b6000613eb660328361483b565b9150613ec182614c34565b604082019050919050565b6000613ed960268361483b565b9150613ee482614c83565b604082019050919050565b6000613efc60258361483b565b9150613f0782614cd2565b604082019050919050565b6000613f1f601c8361483b565b9150613f2a82614d21565b602082019050919050565b6000613f4260248361483b565b9150613f4d82614d4a565b604082019050919050565b6000613f6560198361483b565b9150613f7082614d99565b602082019050919050565b6000613f8860268361483b565b9150613f9382614dc2565b604082019050919050565b6000613fab602c8361483b565b9150613fb682614e11565b604082019050919050565b6000613fce60388361483b565b9150613fd982614e60565b604082019050919050565b6000613ff1602a8361483b565b9150613ffc82614eaf565b604082019050919050565b600061401460298361483b565b915061401f82614efe565b604082019050919050565b6000614037602e8361483b565b915061404282614f4d565b604082019050919050565b600061405a60208361483b565b915061406582614f9c565b602082019050919050565b600061407d60318361483b565b915061408882614fc5565b604082019050919050565b60006140a0602c8361483b565b91506140ab82615014565b604082019050919050565b60006140c360208361483b565b91506140ce82615063565b602082019050919050565b60006140e6602f8361483b565b91506140f18261508c565b604082019050919050565b600061410960218361483b565b9150614114826150db565b604082019050919050565b600061412c60318361483b565b91506141378261512a565b604082019050919050565b600061414f601d8361483b565b915061415a82615179565b602082019050919050565b6000614172602a8361483b565b915061417d826151a2565b604082019050919050565b6101208201600082015161419f6000850182614259565b5060208201516141b26020850182614259565b5060408201516141c56040850182613e30565b5060608201516141d86060850182614259565b5060808201516141eb6080850182613d8a565b5060a08201516141fe60a0850182613d8a565b5060c082015161421160c0850182614217565b50505050565b60608201600082015161422d6000850182613db7565b5060208201516142406020850182614277565b5060408201516142536040850182614277565b50505050565b61426281614999565b82525050565b61427181614999565b82525050565b614280816149a3565b82525050565b60006142928284613dff565b915081905092915050565b60006142a98285613e78565b91506142b58284613e78565b91508190509392505050565b60006020820190506142d66000830184613d99565b92915050565b60006101c0820190506142f26000830189613d99565b6142ff6020830188613d99565b61430c6040830187613d99565b818103606083015261431e8186613e3f565b905061432d6080830185614188565b61433b6101a0830184614268565b979650505050505050565b600060608201905061435b6000830186613d99565b6143686020830185613d99565b6143756040830184614268565b949350505050565b60006080820190506143926000830187613d99565b61439f6020830186613d99565b6143ac6040830185614268565b81810360608301526143be8184613dc6565b905095945050505050565b60006080820190506143de6000830187613d99565b6143eb6020830186613d99565b6143f86040830185614268565b6144056060830184614268565b95945050505050565b60006040820190506144236000830185613d99565b6144306020830184614268565b9392505050565b600060208201905061444c6000830184613da8565b92915050565b6000602082019050818103600083015261446c8184613e3f565b905092915050565b6000602082019050818103600083015261448d81613ea9565b9050919050565b600060208201905081810360008301526144ad81613ecc565b9050919050565b600060208201905081810360008301526144cd81613eef565b9050919050565b600060208201905081810360008301526144ed81613f12565b9050919050565b6000602082019050818103600083015261450d81613f35565b9050919050565b6000602082019050818103600083015261452d81613f58565b9050919050565b6000602082019050818103600083015261454d81613f7b565b9050919050565b6000602082019050818103600083015261456d81613f9e565b9050919050565b6000602082019050818103600083015261458d81613fc1565b9050919050565b600060208201905081810360008301526145ad81613fe4565b9050919050565b600060208201905081810360008301526145cd81614007565b9050919050565b600060208201905081810360008301526145ed8161402a565b9050919050565b6000602082019050818103600083015261460d8161404d565b9050919050565b6000602082019050818103600083015261462d81614070565b9050919050565b6000602082019050818103600083015261464d81614093565b9050919050565b6000602082019050818103600083015261466d816140b6565b9050919050565b6000602082019050818103600083015261468d816140d9565b9050919050565b600060208201905081810360008301526146ad816140fc565b9050919050565b600060208201905081810360008301526146cd8161411f565b9050919050565b600060208201905081810360008301526146ed81614142565b9050919050565b6000602082019050818103600083015261470d81614165565b9050919050565b60006101208201905061472a6000830184614188565b92915050565b60006020820190506147456000830184614268565b92915050565b60006060820190506147606000830186614268565b61476d6020830185614268565b61477a6040830184614268565b949350505050565b600061478c61479d565b90506147988282614a36565b919050565b6000604051905090565b600067ffffffffffffffff8211156147c2576147c1614bcc565b5b6147cb82614c23565b9050602081019050919050565b600067ffffffffffffffff8211156147f3576147f2614bcc565b5b6147fc82614c23565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061486282614999565b915061486d83614999565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156148a2576148a1614ae1565b5b828201905092915050565b60006148b882614999565b91506148c383614999565b9250826148d3576148d2614b10565b5b828204905092915050565b60006148e982614999565b91506148f483614999565b92508282101561490757614906614ae1565b5b828203905092915050565b600061491d82614979565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000819050614974826151f1565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006149bb82614966565b9050919050565b82818337600083830152505050565b60005b838110156149ef5780820151818401526020810190506149d4565b838111156149fe576000848401525b50505050565b60006002820490506001821680614a1c57607f821691505b60208210811415614a3057614a2f614b6e565b5b50919050565b614a3f82614c23565b810181811067ffffffffffffffff82111715614a5e57614a5d614bcc565b5b80604052505050565b6000614a7282614999565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614aa557614aa4614ae1565b5b600182019050919050565b6000614abb82614999565b9150614ac683614999565b925082614ad657614ad5614b10565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6005811061520257615201614b3f565b5b50565b61520e81614912565b811461521957600080fd5b50565b61522581614924565b811461523057600080fd5b50565b61523c81614930565b811461524757600080fd5b50565b6152538161493a565b811461525e57600080fd5b50565b61526a81614999565b811461527557600080fd5b50565b615281816149a3565b811461528c57600080fd5b5056fea2646970667358221220884bdbd1eafa98964e241c20fc185311627bbff70533c66560a63a6159fc1a8b64736f6c63430008070033

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

0000000000000000000000001b4db52fd952f70d3d28bfbd406db71940ed8ca90000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000001568747470733a2f2f697066732e696f2f697066732f0000000000000000000000

-----Decoded View---------------
Arg [0] : bullaManager_ (address): 0x1b4DB52FD952F70d3D28bfbd406dB71940eD8cA9
Arg [1] : baseURI_ (string): https://ipfs.io/ipfs/

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000001b4db52fd952f70d3d28bfbd406db71940ed8ca9
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000015
Arg [3] : 68747470733a2f2f697066732e696f2f697066732f0000000000000000000000


Deployed Bytecode Sourcemap

54436:5863:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31005:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31950:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33472:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33032:374;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59462:235;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34222:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34632:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59955:97;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54223:98;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60171:125;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54656:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31644:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54193:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31374:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50029:103;;;:::i;:::-;;49378:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32119:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57126:426;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60060:103;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33765:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55596:242;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34888:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51404:679;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57560:513;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58081:1373;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59705:242;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33991:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50287:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31005:305;31107:4;31159:25;31144:40;;;:11;:40;;;;:105;;;;31216:33;31201:48;;;:11;:48;;;;31144:105;:158;;;;31266:36;31290:11;31266:23;:36::i;:::-;31144:158;31124:178;;31005:305;;;:::o;31950:100::-;32004:13;32037:5;32030:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31950:100;:::o;33472:221::-;33548:7;33576:16;33584:7;33576;:16::i;:::-;33568:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;33661:15;:24;33677:7;33661:24;;;;;;;;;;;;;;;;;;;;;33654:31;;33472:221;;;:::o;33032:374::-;33113:13;33129:23;33144:7;33129:14;:23::i;:::-;33113:39;;33177:5;33171:11;;:2;:11;;;;33163:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;33257:5;33241:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;33266:37;33283:5;33290:12;:10;:12::i;:::-;33266:16;:37::i;:::-;33241:62;33233:131;;;;;;;;;;;;:::i;:::-;;;;;;;;;33377:21;33386:2;33390:7;33377:8;:21::i;:::-;33102:304;33032:374;;:::o;59462:235::-;59529:7;54982:10;54951:41;;:11;:20;54963:7;54951:20;;;;;;;;;;;:27;;;;;;;;;;;;:41;;;54947:75;;55011:10;55001:21;;;;;;;;;;;:::i;:::-;;;;;;;;54947:75;59555:7:::1;55348:14;55317:45;;;;;;;;:::i;:::-;;:11;:20;55329:7;55317:20;;;;;;;;;;;:27;;;;;;;;;;;;:45;;;;;;;;:::i;:::-;;;55313:75;;55371:17;;;;;;;;;;;;;;55313:75;59605:15:::2;59575:11;:20;59587:7;59575:20;;;;;;;;;;;:27;;;:45;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;59664:7;59650:12;;;;;;;;;;;59636:53;;;59673:15;59636:53;;;;;;:::i;:::-;;;;;;;;55033:1:::1;59462:235:::0;;:::o;34222:339::-;34417:41;34436:12;:10;:12::i;:::-;34450:7;34417:18;:41::i;:::-;34409:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;34525:28;34535:4;34541:2;34545:7;34525:9;:28::i;:::-;34222:339;;;:::o;34632:185::-;34770:39;34787:4;34793:2;34797:7;34770:39;;;;;;;;;;;;:16;:39::i;:::-;34632:185;;;:::o;59955:97::-;60010:7;54829:10;54809:30;;:16;54817:7;54809;:16::i;:::-;:30;;;54805:66;;54860:10;54848:23;;;;;;;;;;;:::i;:::-;;;;;;;;54805:66;60030:14:::1;60036:7;60030:5;:14::i;:::-;59955:97:::0;;:::o;54223:98::-;49609:12;:10;:12::i;:::-;49598:23;;:7;:5;:7::i;:::-;:23;;;49590:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54305:8:::1;54295:7;:18;;;;;;;;;;;;:::i;:::-;;54223:98:::0;:::o;60171:125::-;60236:12;;:::i;:::-;60268:11;:20;60280:7;60268:20;;;;;;;;;;;60261:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60171:125;;;:::o;54656:36::-;;;;;;;;;;;;;:::o;31644:239::-;31716:7;31736:13;31752:7;:16;31760:7;31752:16;;;;;;;;;;;;;;;;;;;;;31736:32;;31804:1;31787:19;;:5;:19;;;;31779:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31870:5;31863:12;;;31644:239;;;:::o;54193:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31374:208::-;31446:7;31491:1;31474:19;;:5;:19;;;;31466:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;31558:9;:16;31568:5;31558:16;;;;;;;;;;;;;;;;31551:23;;31374:208;;;:::o;50029:103::-;49609:12;:10;:12::i;:::-;49598:23;;:7;:5;:7::i;:::-;:23;;;49590:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50094:30:::1;50121:1;50094:18;:30::i;:::-;50029:103::o:0;49378:87::-;49424:7;49451:6;;;;;;;;;;;49444:13;;49378:87;:::o;32119:104::-;32175:13;32208:7;32201:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32119:104;:::o;57126:426::-;57392:7;57412:16;57431:87;57444:8;57454:6;57462:11;57475;57488:5;57495:10;57507;57431:12;:87::i;:::-;57412:106;;57536:8;57529:15;;;57126:426;;;;;;;;;:::o;60060:103::-;60106:7;60154:1;60133:18;:8;:16;:18::i;:::-;:22;;;;:::i;:::-;60126:29;;60060:103;:::o;33765:155::-;33860:52;33879:12;:10;:12::i;:::-;33893:8;33903;33860:18;:52::i;:::-;33765:155;;:::o;55596:242::-;49609:12;:10;:12::i;:::-;49598:23;;:7;:5;:7::i;:::-;:23;;;49590:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55672:24:::1;55699:12;;;;;;;;;;;55672:39;;55737:13;55722:12;;:28;;;;;;;;;;;;;;;;;;55800:12;;;;;;;;;;;55766:64;;55782:16;55766:64;;;55814:15;55766:64;;;;;;:::i;:::-;;;;;;;;55661:177;55596:242:::0;:::o;34888:328::-;35063:41;35082:12;:10;:12::i;:::-;35096:7;35063:18;:41::i;:::-;35055:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;35169:39;35183:4;35189:2;35193:7;35202:5;35169:13;:39::i;:::-;34888:328;;;;:::o;51404:679::-;51477:13;51511:16;51519:7;51511;:16::i;:::-;51503:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;51594:23;51620:10;:19;51631:7;51620:19;;;;;;;;;;;51594:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51650:18;51671:10;:8;:10::i;:::-;51650:31;;51779:1;51763:4;51757:18;:23;51753:72;;;51804:9;51797:16;;;;;;51753:72;51955:1;51935:9;51929:23;:27;51925:108;;;52004:4;52010:9;51987:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51973:48;;;;;;51925:108;52052:23;52067:7;52052:14;:23::i;:::-;52045:30;;;;51404:679;;;;:::o;57560:513::-;57869:7;57889:16;57908:87;57921:8;57931:6;57939:11;57952;57965:5;57972:10;57984;57908:12;:87::i;:::-;57889:106;;58006:33;58019:8;58029:9;;58006:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:12;:33::i;:::-;58057:8;58050:15;;;57560:513;;;;;;;;;;;:::o;58081:1373::-;58177:7;55142:14;55111:45;;;;;;;;:::i;:::-;;:11;:20;55123:7;55111:20;;;;;;;;;;;:27;;;;;;;;;;;;:45;;;;;;;;:::i;:::-;;;;:95;;;;;55191:15;55160:46;;;;;;;;:::i;:::-;;:11;:20;55172:7;55160:20;;;;;;;;;;;:27;;;;;;;;;;;;:46;;;;;;;;:::i;:::-;;;;55111:95;55107:124;;;55215:16;;;;;;;;;;;;;;55107:124;58218:1:::1;58201:13;:18;58197:59;;;58228:28;;;;;;;;;;;;;;58197:59;58272:16;58280:7;58272;:16::i;:::-;58267:46;;58297:16;;;;;;;;;;;;;;58267:46;58326:18;58347:17;58356:7;58347:8;:17::i;:::-;58326:38;;58375:16;58394;58402:7;58394;:16::i;:::-;58375:35;;58423:21;58467:5;:16;;;58447:5;:17;;;:36;;;;:::i;:::-;58423:60;;58494:20;58534:13;58517;:30;;:62;;58566:13;58517:62;;;58550:13;58517:62;58494:85;;58625:5;:17;;;58609:12;58590:5;:16;;;:31;;;;:::i;:::-;:52;:114;;58689:15;58674:5;:12;;:30;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;::::0;58590:114:::1;;;58660:11;58645:5;:12;;:26;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;::::0;58590:114:::1;;58750:12;58715:11;:20;58727:7;58715:20;;;;;;;;;;;:31;;;:47;;;;;;;:::i;:::-;;;;;;;;58803:5;:12;;;58773:11;:20;58785:7;58773:20;;;;;;;;;;;:27;;;:42;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;58829:25;58856:22:::0;58896:12:::1;;;;;;;;;;;58882:45;;;58928:10;58940:12;58882:71;;;;;;;;;;;;;;;;:::i;:::-;;::::0;::::1;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58828:125;;;;58966:94;59008:10;59020:8;59045:14;59030:12;:29;;;;:::i;:::-;58973:5;:16;;;58966:41;;;;:94;;;;;;:::i;:::-;59094:1;59077:14;:18;59073:139;;;59112:88;59154:10;59166:17;59185:14;59119:5;:16;;;59112:41;;;;:88;;;;;;:::i;:::-;59073:139;59265:5;:12;;;59229:104;;59256:7;59242:12;;;;;;;;;;;59229:104;;;59279:10;59291:9;59302:13;59317:15;59229:104;;;;;;;;;:::i;:::-;;;;;;;;59380:17;59349:97;;59371:7;59357:12;;;;;;;;;;;59349:97;;;59399:13;59414:14;59430:15;59349:97;;;;;;;;:::i;:::-;;;;;;;;58186:1268;;;;;;58081:1373:::0;;;:::o;59705:242::-;59777:7;54829:10;54809:30;;:16;54817:7;54809;:16::i;:::-;:30;;;54805:66;;54860:10;54848:23;;;;;;;;;;;:::i;:::-;;;;;;;;54805:66;59803:7:::1;55348:14;55317:45;;;;;;;;:::i;:::-;;:11;:20;55329:7;55317:20;;;;;;;;;;;:27;;;;;;;;;;;;:45;;;;;;;;:::i;:::-;;;55313:75;;55371:17;;;;;;;;;;;;;;55313:75;59853:16:::2;59823:11;:20;59835:7;59823:20;;;;;;;;;;;:27;;;:46;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;59914:7;59900:12;;;;;;;;;;;59885:54;;;59923:15;59885:54;;;;;;:::i;:::-;;;;;;;;54882:1:::1;59705:242:::0;;:::o;33991:164::-;34088:4;34112:18;:25;34131:5;34112:25;;;;;;;;;;;;;;;:35;34138:8;34112:35;;;;;;;;;;;;;;;;;;;;;;;;;34105:42;;33991:164;;;;:::o;50287:201::-;49609:12;:10;:12::i;:::-;49598:23;;:7;:5;:7::i;:::-;:23;;;49590:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50396:1:::1;50376:22;;:8;:22;;;;50368:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;50452:28;50471:8;50452:18;:28::i;:::-;50287:201:::0;:::o;25032:157::-;25117:4;25156:25;25141:40;;;:11;:40;;;;25134:47;;25032:157;;;:::o;36726:127::-;36791:4;36843:1;36815:30;;:7;:16;36823:7;36815:16;;;;;;;;;;;;;;;;;;;;;:30;;;;36808:37;;36726:127;;;:::o;17991:98::-;18044:7;18071:10;18064:17;;17991:98;:::o;40835:174::-;40937:2;40910:15;:24;40926:7;40910:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;40993:7;40989:2;40955:46;;40964:23;40979:7;40964:14;:23::i;:::-;40955:46;;;;;;;;;;;;40835:174;;:::o;37020:348::-;37113:4;37138:16;37146:7;37138;:16::i;:::-;37130:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;37214:13;37230:23;37245:7;37230:14;:23::i;:::-;37214:39;;37283:5;37272:16;;:7;:16;;;:51;;;;37316:7;37292:31;;:20;37304:7;37292:11;:20::i;:::-;:31;;;37272:51;:87;;;;37327:32;37344:5;37351:7;37327:16;:32::i;:::-;37272:87;37264:96;;;37020:348;;;;:::o;40092:625::-;40251:4;40224:31;;:23;40239:7;40224:14;:23::i;:::-;:31;;;40216:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;40330:1;40316:16;;:2;:16;;;;40308:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;40386:39;40407:4;40413:2;40417:7;40386:20;:39::i;:::-;40490:29;40507:1;40511:7;40490:8;:29::i;:::-;40551:1;40532:9;:15;40542:4;40532:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;40580:1;40563:9;:13;40573:2;40563:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;40611:2;40592:7;:16;40600:7;40592:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;40650:7;40646:2;40631:27;;40640:4;40631:27;;;;;;;;;;;;40671:38;40691:4;40697:2;40701:7;40671:19;:38::i;:::-;40092:625;;;:::o;52685:206::-;52754:20;52766:7;52754:11;:20::i;:::-;52828:1;52797:10;:19;52808:7;52797:19;;;;;;;;;;;52791:33;;;;;:::i;:::-;;;:38;52787:97;;52853:10;:19;52864:7;52853:19;;;;;;;;;;;;52846:26;;;;:::i;:::-;52787:97;52685:206;:::o;50648:191::-;50722:16;50741:6;;;;;;;;;;;50722:25;;50767:8;50758:6;;:17;;;;;;;;;;;;;;;;;;50822:8;50791:40;;50812:8;50791:40;;;;;;;;;;;;50711:128;50648:191;:::o;55846:1272::-;56104:7;56148:1;56128:22;;:8;:22;;;:46;;;;56172:1;56154:20;;:6;:20;;;56128:46;56124:99;;;56198:13;;;;;;;;;;;;;;56124:99;56252:1;56237:11;:16;56233:84;;;56277:28;;;;;;;;;;;;;;56233:84;56339:15;56331:5;:23;56327:76;;;56378:13;;;;;;;;;;;;;;56327:76;56418:23;:10;:21;;;:23::i;:::-;56413:87;;56465:23;;;;;;;;;;;;;;56413:87;56512:20;:8;:18;:20::i;:::-;56543:18;56564;:8;:16;:18::i;:::-;56543:39;;56593:31;56603:8;56613:10;56593:9;:31::i;:::-;56637:21;;:::i;:::-;56687:6;56669:8;:15;;:24;;;;;;;;;;;56727:11;56704:8;:20;;:34;;;;;56766:5;56749:8;:14;;:22;;;;;56800:14;56782:8;:15;;:32;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;56847:10;56825:8;:19;;:32;;;;;;;;;;;56890:10;56868:32;;;;;;;;;;:::i;:::-;:8;:19;;:32;;;;56937:8;56911:11;:23;56923:10;56911:23;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57024:6;56963:119;;57014:8;56963:119;;56990:10;56963:119;56976:12;;;;;;;;;;;57002:10;57032:9;57043:11;57056:8;57066:15;56963:119;;;;;;;;;;;:::i;:::-;;;;;;;;57100:10;57093:17;;;;55846:1272;;;;;;;;;:::o;44961:114::-;45026:7;45053;:14;;;45046:21;;44961:114;;;:::o;41151:315::-;41306:8;41297:17;;:5;:17;;;;41289:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;41393:8;41355:18;:25;41374:5;41355:25;;;;;;;;;;;;;;;:35;41381:8;41355:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;41439:8;41417:41;;41432:5;41417:41;;;41449:8;41417:41;;;;;;:::i;:::-;;;;;;;;41151:315;;;:::o;36098:::-;36255:28;36265:4;36271:2;36275:7;36255:9;:28::i;:::-;36302:48;36325:4;36331:2;36335:7;36344:5;36302:22;:48::i;:::-;36294:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;36098:315;;;;:::o;54329:100::-;54381:13;54414:7;54407:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54329:100;:::o;32294:334::-;32367:13;32401:16;32409:7;32401;:16::i;:::-;32393:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;32482:21;32506:10;:8;:10::i;:::-;32482:34;;32558:1;32540:7;32534:21;:25;:86;;;;;;;;;;;;;;;;;32586:7;32595:18;:7;:16;:18::i;:::-;32569:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;32534:86;32527:93;;;32294:334;;;:::o;52239:217::-;52339:16;52347:7;52339;:16::i;:::-;52331:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;52439:9;52417:10;:19;52428:7;52417:19;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;52239:217;;:::o;14227:248::-;14371:96;14391:5;14421:27;;;14450:4;14456:2;14460:5;14398:68;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14371:19;:96::i;:::-;14227:248;;;;:::o;43402:126::-;;;;:::o;43913:125::-;;;;:::o;39335:420::-;39395:13;39411:23;39426:7;39411:14;:23::i;:::-;39395:39;;39447:48;39468:5;39483:1;39487:7;39447:20;:48::i;:::-;39536:29;39553:1;39557:7;39536:8;:29::i;:::-;39598:1;39578:9;:16;39588:5;39578:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;39617:7;:16;39625:7;39617:16;;;;;;;;;;;;39610:23;;;;;;;;;;;39679:7;39675:1;39651:36;;39660:5;39651:36;;;;;;;;;;;;39700:47;39720:5;39735:1;39739:7;39700:19;:47::i;:::-;39384:371;39335:420;:::o;4065:326::-;4125:4;4382:1;4360:7;:19;;;:23;4353:30;;4065:326;;;:::o;45083:127::-;45190:1;45172:7;:14;;;:19;;;;;;;;;;;45083:127;:::o;37710:110::-;37786:26;37796:2;37800:7;37786:26;;;;;;;;;;;;:9;:26::i;:::-;37710:110;;:::o;42031:799::-;42186:4;42207:15;:2;:13;;;:15::i;:::-;42203:620;;;42259:2;42243:36;;;42280:12;:10;:12::i;:::-;42294:4;42300:7;42309:5;42243:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;42239:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42502:1;42485:6;:13;:18;42481:272;;;42528:60;;;;;;;;;;:::i;:::-;;;;;;;;42481:272;42703:6;42697:13;42688:6;42684:2;42680:15;42673:38;42239:529;42376:41;;;42366:51;;;:6;:51;;;;42359:58;;;;;42203:620;42807:4;42800:11;;42031:799;;;;;;;:::o;25606:723::-;25662:13;25892:1;25883:5;:10;25879:53;;;25910:10;;;;;;;;;;;;;;;;;;;;;25879:53;25942:12;25957:5;25942:20;;25973:14;25998:78;26013:1;26005:4;:9;25998:78;;26031:8;;;;;:::i;:::-;;;;26062:2;26054:10;;;;;:::i;:::-;;;25998:78;;;26086:19;26118:6;26108:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26086:39;;26136:154;26152:1;26143:5;:10;26136:154;;26180:1;26170:11;;;;;:::i;:::-;;;26247:2;26239:5;:10;;;;:::i;:::-;26226:2;:24;;;;:::i;:::-;26213:39;;26196:6;26203;26196:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;26276:2;26267:11;;;;;:::i;:::-;;;26136:154;;;26314:6;26300:21;;;;;25606:723;;;;:::o;16544:716::-;16968:23;16994:69;17022:4;16994:69;;;;;;;;;;;;;;;;;17002:5;16994:27;;;;:69;;;;;:::i;:::-;16968:95;;17098:1;17078:10;:17;:21;17074:179;;;17175:10;17164:30;;;;;;;;;;;;:::i;:::-;17156:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;17074:179;16614:646;16544:716;;:::o;38047:284::-;38177:18;38183:2;38187:7;38177:5;:18::i;:::-;38214:54;38245:1;38249:2;38253:7;38262:5;38214:22;:54::i;:::-;38206:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;38047:284;;;:::o;6816:229::-;6953:12;6985:52;7007:6;7015:4;7021:1;7024:12;6985:21;:52::i;:::-;6978:59;;6816:229;;;;;:::o;38667:439::-;38761:1;38747:16;;:2;:16;;;;38739:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;38820:16;38828:7;38820;:16::i;:::-;38819:17;38811:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;38882:45;38911:1;38915:2;38919:7;38882:20;:45::i;:::-;38957:1;38940:9;:13;38950:2;38940:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;38988:2;38969:7;:16;38977:7;38969:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;39033:7;39029:2;39008:33;;39025:1;39008:33;;;;;;;;;;;;39054:44;39082:1;39086:2;39090:7;39054:19;:44::i;:::-;38667:439;;:::o;7936:512::-;8106:12;8164:5;8139:21;:30;;8131:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;8231:18;8242:6;8231:10;:18::i;:::-;8223:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;8297:12;8311:23;8338:6;:11;;8358:5;8366:4;8338:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8296:75;;;;8389:51;8406:7;8415:10;8427:12;8389:16;:51::i;:::-;8382:58;;;;7936:512;;;;;;:::o;10624:712::-;10774:12;10803:7;10799:530;;;10834:10;10827:17;;;;10799:530;10968:1;10948:10;:17;:21;10944:374;;;11146:10;11140:17;11207:15;11194:10;11190:2;11186:19;11179:44;10944:374;11289:12;11282:20;;;;;;;;;;;:::i;:::-;;;;;;;;10624:712;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:143::-;1043:5;1074:6;1068:13;1059:22;;1090:33;1117:5;1090:33;:::i;:::-;986:143;;;;:::o;1135:133::-;1178:5;1216:6;1203:20;1194:29;;1232:30;1256:5;1232:30;:::i;:::-;1135:133;;;;:::o;1274:137::-;1328:5;1359:6;1353:13;1344:22;;1375:30;1399:5;1375:30;:::i;:::-;1274:137;;;;:::o;1417:139::-;1463:5;1501:6;1488:20;1479:29;;1517:33;1544:5;1517:33;:::i;:::-;1417:139;;;;:::o;1562:137::-;1607:5;1645:6;1632:20;1623:29;;1661:32;1687:5;1661:32;:::i;:::-;1562:137;;;;:::o;1705:141::-;1761:5;1792:6;1786:13;1777:22;;1808:32;1834:5;1808:32;:::i;:::-;1705:141;;;;:::o;1865:338::-;1920:5;1969:3;1962:4;1954:6;1950:17;1946:27;1936:122;;1977:79;;:::i;:::-;1936:122;2094:6;2081:20;2119:78;2193:3;2185:6;2178:4;2170:6;2166:17;2119:78;:::i;:::-;2110:87;;1926:277;1865:338;;;;:::o;2223:553::-;2281:8;2291:6;2341:3;2334:4;2326:6;2322:17;2318:27;2308:122;;2349:79;;:::i;:::-;2308:122;2462:6;2449:20;2439:30;;2492:18;2484:6;2481:30;2478:117;;;2514:79;;:::i;:::-;2478:117;2628:4;2620:6;2616:17;2604:29;;2682:3;2674:4;2666:6;2662:17;2652:8;2648:32;2645:41;2642:128;;;2689:79;;:::i;:::-;2642:128;2223:553;;;;;:::o;2796:340::-;2852:5;2901:3;2894:4;2886:6;2882:17;2878:27;2868:122;;2909:79;;:::i;:::-;2868:122;3026:6;3013:20;3051:79;3126:3;3118:6;3111:4;3103:6;3099:17;3051:79;:::i;:::-;3042:88;;2858:278;2796:340;;;;:::o;3166:233::-;3241:5;3282:2;3273:6;3268:3;3264:16;3260:25;3257:112;;;3288:79;;:::i;:::-;3257:112;3387:6;3378:15;;3166:233;;;;:::o;3429:741::-;3505:5;3549:4;3537:9;3532:3;3528:19;3524:30;3521:117;;;3557:79;;:::i;:::-;3521:117;3656:21;3672:4;3656:21;:::i;:::-;3647:30;;3736:1;3776:49;3821:3;3812:6;3801:9;3797:22;3776:49;:::i;:::-;3769:4;3762:5;3758:16;3751:75;3687:150;3904:2;3945:47;3988:3;3979:6;3968:9;3964:22;3945:47;:::i;:::-;3938:4;3931:5;3927:16;3920:73;3847:157;4063:2;4104:47;4147:3;4138:6;4127:9;4123:22;4104:47;:::i;:::-;4097:4;4090:5;4086:16;4079:73;4014:149;3429:741;;;;:::o;4176:139::-;4222:5;4260:6;4247:20;4238:29;;4276:33;4303:5;4276:33;:::i;:::-;4176:139;;;;:::o;4321:143::-;4378:5;4409:6;4403:13;4394:22;;4425:33;4452:5;4425:33;:::i;:::-;4321:143;;;;:::o;4470:135::-;4514:5;4552:6;4539:20;4530:29;;4568:31;4593:5;4568:31;:::i;:::-;4470:135;;;;:::o;4611:329::-;4670:6;4719:2;4707:9;4698:7;4694:23;4690:32;4687:119;;;4725:79;;:::i;:::-;4687:119;4845:1;4870:53;4915:7;4906:6;4895:9;4891:22;4870:53;:::i;:::-;4860:63;;4816:117;4611:329;;;;:::o;4946:474::-;5014:6;5022;5071:2;5059:9;5050:7;5046:23;5042:32;5039:119;;;5077:79;;:::i;:::-;5039:119;5197:1;5222:53;5267:7;5258:6;5247:9;5243:22;5222:53;:::i;:::-;5212:63;;5168:117;5324:2;5350:53;5395:7;5386:6;5375:9;5371:22;5350:53;:::i;:::-;5340:63;;5295:118;4946:474;;;;;:::o;5426:1441::-;5578:6;5586;5594;5602;5610;5618;5626;5675:3;5663:9;5654:7;5650:23;5646:33;5643:120;;;5682:79;;:::i;:::-;5643:120;5802:1;5827:53;5872:7;5863:6;5852:9;5848:22;5827:53;:::i;:::-;5817:63;;5773:117;5929:2;5955:53;6000:7;5991:6;5980:9;5976:22;5955:53;:::i;:::-;5945:63;;5900:118;6085:2;6074:9;6070:18;6057:32;6116:18;6108:6;6105:30;6102:117;;;6138:79;;:::i;:::-;6102:117;6243:63;6298:7;6289:6;6278:9;6274:22;6243:63;:::i;:::-;6233:73;;6028:288;6355:2;6381:53;6426:7;6417:6;6406:9;6402:22;6381:53;:::i;:::-;6371:63;;6326:118;6483:3;6510:53;6555:7;6546:6;6535:9;6531:22;6510:53;:::i;:::-;6500:63;;6454:119;6612:3;6639:53;6684:7;6675:6;6664:9;6660:22;6639:53;:::i;:::-;6629:63;;6583:119;6741:3;6768:82;6842:7;6833:6;6822:9;6818:22;6768:82;:::i;:::-;6758:92;;6712:148;5426:1441;;;;;;;;;;:::o;6873:1787::-;7046:6;7054;7062;7070;7078;7086;7094;7102;7110;7159:3;7147:9;7138:7;7134:23;7130:33;7127:120;;;7166:79;;:::i;:::-;7127:120;7286:1;7311:53;7356:7;7347:6;7336:9;7332:22;7311:53;:::i;:::-;7301:63;;7257:117;7413:2;7439:53;7484:7;7475:6;7464:9;7460:22;7439:53;:::i;:::-;7429:63;;7384:118;7569:2;7558:9;7554:18;7541:32;7600:18;7592:6;7589:30;7586:117;;;7622:79;;:::i;:::-;7586:117;7727:63;7782:7;7773:6;7762:9;7758:22;7727:63;:::i;:::-;7717:73;;7512:288;7839:2;7865:53;7910:7;7901:6;7890:9;7886:22;7865:53;:::i;:::-;7855:63;;7810:118;7967:3;7994:53;8039:7;8030:6;8019:9;8015:22;7994:53;:::i;:::-;7984:63;;7938:119;8096:3;8123:53;8168:7;8159:6;8148:9;8144:22;8123:53;:::i;:::-;8113:63;;8067:119;8225:3;8252:82;8326:7;8317:6;8306:9;8302:22;8252:82;:::i;:::-;8242:92;;8196:148;8411:3;8400:9;8396:19;8383:33;8443:18;8435:6;8432:30;8429:117;;;8465:79;;:::i;:::-;8429:117;8578:65;8635:7;8626:6;8615:9;8611:22;8578:65;:::i;:::-;8560:83;;;;8354:299;6873:1787;;;;;;;;;;;:::o;8666:619::-;8743:6;8751;8759;8808:2;8796:9;8787:7;8783:23;8779:32;8776:119;;;8814:79;;:::i;:::-;8776:119;8934:1;8959:53;9004:7;8995:6;8984:9;8980:22;8959:53;:::i;:::-;8949:63;;8905:117;9061:2;9087:53;9132:7;9123:6;9112:9;9108:22;9087:53;:::i;:::-;9077:63;;9032:118;9189:2;9215:53;9260:7;9251:6;9240:9;9236:22;9215:53;:::i;:::-;9205:63;;9160:118;8666:619;;;;;:::o;9291:943::-;9386:6;9394;9402;9410;9459:3;9447:9;9438:7;9434:23;9430:33;9427:120;;;9466:79;;:::i;:::-;9427:120;9586:1;9611:53;9656:7;9647:6;9636:9;9632:22;9611:53;:::i;:::-;9601:63;;9557:117;9713:2;9739:53;9784:7;9775:6;9764:9;9760:22;9739:53;:::i;:::-;9729:63;;9684:118;9841:2;9867:53;9912:7;9903:6;9892:9;9888:22;9867:53;:::i;:::-;9857:63;;9812:118;9997:2;9986:9;9982:18;9969:32;10028:18;10020:6;10017:30;10014:117;;;10050:79;;:::i;:::-;10014:117;10155:62;10209:7;10200:6;10189:9;10185:22;10155:62;:::i;:::-;10145:72;;9940:287;9291:943;;;;;;;:::o;10240:468::-;10305:6;10313;10362:2;10350:9;10341:7;10337:23;10333:32;10330:119;;;10368:79;;:::i;:::-;10330:119;10488:1;10513:53;10558:7;10549:6;10538:9;10534:22;10513:53;:::i;:::-;10503:63;;10459:117;10615:2;10641:50;10683:7;10674:6;10663:9;10659:22;10641:50;:::i;:::-;10631:60;;10586:115;10240:468;;;;;:::o;10714:474::-;10782:6;10790;10839:2;10827:9;10818:7;10814:23;10810:32;10807:119;;;10845:79;;:::i;:::-;10807:119;10965:1;10990:53;11035:7;11026:6;11015:9;11011:22;10990:53;:::i;:::-;10980:63;;10936:117;11092:2;11118:53;11163:7;11154:6;11143:9;11139:22;11118:53;:::i;:::-;11108:63;;11063:118;10714:474;;;;;:::o;11194:507::-;11273:6;11281;11330:2;11318:9;11309:7;11305:23;11301:32;11298:119;;;11336:79;;:::i;:::-;11298:119;11456:1;11481:64;11537:7;11528:6;11517:9;11513:22;11481:64;:::i;:::-;11471:74;;11427:128;11594:2;11620:64;11676:7;11667:6;11656:9;11652:22;11620:64;:::i;:::-;11610:74;;11565:129;11194:507;;;;;:::o;11707:345::-;11774:6;11823:2;11811:9;11802:7;11798:23;11794:32;11791:119;;;11829:79;;:::i;:::-;11791:119;11949:1;11974:61;12027:7;12018:6;12007:9;12003:22;11974:61;:::i;:::-;11964:71;;11920:125;11707:345;;;;:::o;12058:327::-;12116:6;12165:2;12153:9;12144:7;12140:23;12136:32;12133:119;;;12171:79;;:::i;:::-;12133:119;12291:1;12316:52;12360:7;12351:6;12340:9;12336:22;12316:52;:::i;:::-;12306:62;;12262:116;12058:327;;;;:::o;12391:349::-;12460:6;12509:2;12497:9;12488:7;12484:23;12480:32;12477:119;;;12515:79;;:::i;:::-;12477:119;12635:1;12660:63;12715:7;12706:6;12695:9;12691:22;12660:63;:::i;:::-;12650:73;;12606:127;12391:349;;;;:::o;12746:509::-;12815:6;12864:2;12852:9;12843:7;12839:23;12835:32;12832:119;;;12870:79;;:::i;:::-;12832:119;13018:1;13007:9;13003:17;12990:31;13048:18;13040:6;13037:30;13034:117;;;13070:79;;:::i;:::-;13034:117;13175:63;13230:7;13221:6;13210:9;13206:22;13175:63;:::i;:::-;13165:73;;12961:287;12746:509;;;;:::o;13261:383::-;13347:6;13396:2;13384:9;13375:7;13371:23;13367:32;13364:119;;;13402:79;;:::i;:::-;13364:119;13522:1;13547:80;13619:7;13610:6;13599:9;13595:22;13547:80;:::i;:::-;13537:90;;13493:144;13261:383;;;;:::o;13650:329::-;13709:6;13758:2;13746:9;13737:7;13733:23;13729:32;13726:119;;;13764:79;;:::i;:::-;13726:119;13884:1;13909:53;13954:7;13945:6;13934:9;13930:22;13909:53;:::i;:::-;13899:63;;13855:117;13650:329;;;;:::o;13985:474::-;14053:6;14061;14110:2;14098:9;14089:7;14085:23;14081:32;14078:119;;;14116:79;;:::i;:::-;14078:119;14236:1;14261:53;14306:7;14297:6;14286:9;14282:22;14261:53;:::i;:::-;14251:63;;14207:117;14363:2;14389:53;14434:7;14425:6;14414:9;14410:22;14389:53;:::i;:::-;14379:63;;14334:118;13985:474;;;;;:::o;14465:108::-;14542:24;14560:5;14542:24;:::i;:::-;14537:3;14530:37;14465:108;;:::o;14579:118::-;14666:24;14684:5;14666:24;:::i;:::-;14661:3;14654:37;14579:118;;:::o;14703:109::-;14784:21;14799:5;14784:21;:::i;:::-;14779:3;14772:34;14703:109;;:::o;14818:108::-;14895:24;14913:5;14895:24;:::i;:::-;14890:3;14883:37;14818:108;;:::o;14932:360::-;15018:3;15046:38;15078:5;15046:38;:::i;:::-;15100:70;15163:6;15158:3;15100:70;:::i;:::-;15093:77;;15179:52;15224:6;15219:3;15212:4;15205:5;15201:16;15179:52;:::i;:::-;15256:29;15278:6;15256:29;:::i;:::-;15251:3;15247:39;15240:46;;15022:270;14932:360;;;;:::o;15298:373::-;15402:3;15430:38;15462:5;15430:38;:::i;:::-;15484:88;15565:6;15560:3;15484:88;:::i;:::-;15477:95;;15581:52;15626:6;15621:3;15614:4;15607:5;15603:16;15581:52;:::i;:::-;15658:6;15653:3;15649:16;15642:23;;15406:265;15298:373;;;;:::o;15677:139::-;15763:46;15803:5;15763:46;:::i;:::-;15758:3;15751:59;15677:139;;:::o;15822:364::-;15910:3;15938:39;15971:5;15938:39;:::i;:::-;15993:71;16057:6;16052:3;15993:71;:::i;:::-;15986:78;;16073:52;16118:6;16113:3;16106:4;16099:5;16095:16;16073:52;:::i;:::-;16150:29;16172:6;16150:29;:::i;:::-;16145:3;16141:39;16134:46;;15914:272;15822:364;;;;:::o;16192:377::-;16298:3;16326:39;16359:5;16326:39;:::i;:::-;16381:89;16463:6;16458:3;16381:89;:::i;:::-;16374:96;;16479:52;16524:6;16519:3;16512:4;16505:5;16501:16;16479:52;:::i;:::-;16556:6;16551:3;16547:16;16540:23;;16302:267;16192:377;;;;:::o;16575:366::-;16717:3;16738:67;16802:2;16797:3;16738:67;:::i;:::-;16731:74;;16814:93;16903:3;16814:93;:::i;:::-;16932:2;16927:3;16923:12;16916:19;;16575:366;;;:::o;16947:::-;17089:3;17110:67;17174:2;17169:3;17110:67;:::i;:::-;17103:74;;17186:93;17275:3;17186:93;:::i;:::-;17304:2;17299:3;17295:12;17288:19;;16947:366;;;:::o;17319:::-;17461:3;17482:67;17546:2;17541:3;17482:67;:::i;:::-;17475:74;;17558:93;17647:3;17558:93;:::i;:::-;17676:2;17671:3;17667:12;17660:19;;17319:366;;;:::o;17691:::-;17833:3;17854:67;17918:2;17913:3;17854:67;:::i;:::-;17847:74;;17930:93;18019:3;17930:93;:::i;:::-;18048:2;18043:3;18039:12;18032:19;;17691:366;;;:::o;18063:::-;18205:3;18226:67;18290:2;18285:3;18226:67;:::i;:::-;18219:74;;18302:93;18391:3;18302:93;:::i;:::-;18420:2;18415:3;18411:12;18404:19;;18063:366;;;:::o;18435:::-;18577:3;18598:67;18662:2;18657:3;18598:67;:::i;:::-;18591:74;;18674:93;18763:3;18674:93;:::i;:::-;18792:2;18787:3;18783:12;18776:19;;18435:366;;;:::o;18807:::-;18949:3;18970:67;19034:2;19029:3;18970:67;:::i;:::-;18963:74;;19046:93;19135:3;19046:93;:::i;:::-;19164:2;19159:3;19155:12;19148:19;;18807:366;;;:::o;19179:::-;19321:3;19342:67;19406:2;19401:3;19342:67;:::i;:::-;19335:74;;19418:93;19507:3;19418:93;:::i;:::-;19536:2;19531:3;19527:12;19520:19;;19179:366;;;:::o;19551:::-;19693:3;19714:67;19778:2;19773:3;19714:67;:::i;:::-;19707:74;;19790:93;19879:3;19790:93;:::i;:::-;19908:2;19903:3;19899:12;19892:19;;19551:366;;;:::o;19923:::-;20065:3;20086:67;20150:2;20145:3;20086:67;:::i;:::-;20079:74;;20162:93;20251:3;20162:93;:::i;:::-;20280:2;20275:3;20271:12;20264:19;;19923:366;;;:::o;20295:::-;20437:3;20458:67;20522:2;20517:3;20458:67;:::i;:::-;20451:74;;20534:93;20623:3;20534:93;:::i;:::-;20652:2;20647:3;20643:12;20636:19;;20295:366;;;:::o;20667:::-;20809:3;20830:67;20894:2;20889:3;20830:67;:::i;:::-;20823:74;;20906:93;20995:3;20906:93;:::i;:::-;21024:2;21019:3;21015:12;21008:19;;20667:366;;;:::o;21039:::-;21181:3;21202:67;21266:2;21261:3;21202:67;:::i;:::-;21195:74;;21278:93;21367:3;21278:93;:::i;:::-;21396:2;21391:3;21387:12;21380:19;;21039:366;;;:::o;21411:::-;21553:3;21574:67;21638:2;21633:3;21574:67;:::i;:::-;21567:74;;21650:93;21739:3;21650:93;:::i;:::-;21768:2;21763:3;21759:12;21752:19;;21411:366;;;:::o;21783:::-;21925:3;21946:67;22010:2;22005:3;21946:67;:::i;:::-;21939:74;;22022:93;22111:3;22022:93;:::i;:::-;22140:2;22135:3;22131:12;22124:19;;21783:366;;;:::o;22155:::-;22297:3;22318:67;22382:2;22377:3;22318:67;:::i;:::-;22311:74;;22394:93;22483:3;22394:93;:::i;:::-;22512:2;22507:3;22503:12;22496:19;;22155:366;;;:::o;22527:::-;22669:3;22690:67;22754:2;22749:3;22690:67;:::i;:::-;22683:74;;22766:93;22855:3;22766:93;:::i;:::-;22884:2;22879:3;22875:12;22868:19;;22527:366;;;:::o;22899:::-;23041:3;23062:67;23126:2;23121:3;23062:67;:::i;:::-;23055:74;;23138:93;23227:3;23138:93;:::i;:::-;23256:2;23251:3;23247:12;23240:19;;22899:366;;;:::o;23271:::-;23413:3;23434:67;23498:2;23493:3;23434:67;:::i;:::-;23427:74;;23510:93;23599:3;23510:93;:::i;:::-;23628:2;23623:3;23619:12;23612:19;;23271:366;;;:::o;23643:::-;23785:3;23806:67;23870:2;23865:3;23806:67;:::i;:::-;23799:74;;23882:93;23971:3;23882:93;:::i;:::-;24000:2;23995:3;23991:12;23984:19;;23643:366;;;:::o;24015:::-;24157:3;24178:67;24242:2;24237:3;24178:67;:::i;:::-;24171:74;;24254:93;24343:3;24254:93;:::i;:::-;24372:2;24367:3;24363:12;24356:19;;24015:366;;;:::o;24423:1468::-;24566:6;24561:3;24557:16;24662:4;24655:5;24651:16;24645:23;24681:63;24738:4;24733:3;24729:14;24715:12;24681:63;:::i;:::-;24583:171;24842:4;24835:5;24831:16;24825:23;24861:63;24918:4;24913:3;24909:14;24895:12;24861:63;:::i;:::-;24764:170;25018:4;25011:5;25007:16;25001:23;25037:72;25103:4;25098:3;25094:14;25080:12;25037:72;:::i;:::-;24944:175;25202:4;25195:5;25191:16;25185:23;25221:63;25278:4;25273:3;25269:14;25255:12;25221:63;:::i;:::-;25129:165;25378:4;25371:5;25367:16;25361:23;25397:63;25454:4;25449:3;25445:14;25431:12;25397:63;:::i;:::-;25304:166;25558:4;25551:5;25547:16;25541:23;25577:63;25634:4;25629:3;25625:14;25611:12;25577:63;:::i;:::-;25480:170;25738:4;25731:5;25727:16;25721:23;25757:117;25868:4;25863:3;25859:14;25845:12;25757:117;:::i;:::-;25660:224;24535:1356;24423:1468;;:::o;25941:675::-;26082:4;26077:3;26073:14;26169:4;26162:5;26158:16;26152:23;26188:63;26245:4;26240:3;26236:14;26222:12;26188:63;:::i;:::-;26097:164;26351:4;26344:5;26340:16;26334:23;26370:59;26423:4;26418:3;26414:14;26400:12;26370:59;:::i;:::-;26271:168;26521:4;26514:5;26510:16;26504:23;26540:59;26593:4;26588:3;26584:14;26570:12;26540:59;:::i;:::-;26449:160;26051:565;25941:675;;:::o;26622:108::-;26699:24;26717:5;26699:24;:::i;:::-;26694:3;26687:37;26622:108;;:::o;26736:118::-;26823:24;26841:5;26823:24;:::i;:::-;26818:3;26811:37;26736:118;;:::o;26860:102::-;26933:22;26949:5;26933:22;:::i;:::-;26928:3;26921:35;26860:102;;:::o;26968:271::-;27098:3;27120:93;27209:3;27200:6;27120:93;:::i;:::-;27113:100;;27230:3;27223:10;;26968:271;;;;:::o;27245:435::-;27425:3;27447:95;27538:3;27529:6;27447:95;:::i;:::-;27440:102;;27559:95;27650:3;27641:6;27559:95;:::i;:::-;27552:102;;27671:3;27664:10;;27245:435;;;;;:::o;27686:222::-;27779:4;27817:2;27806:9;27802:18;27794:26;;27830:71;27898:1;27887:9;27883:17;27874:6;27830:71;:::i;:::-;27686:222;;;;:::o;27914:958::-;28213:4;28251:3;28240:9;28236:19;28228:27;;28265:71;28333:1;28322:9;28318:17;28309:6;28265:71;:::i;:::-;28346:72;28414:2;28403:9;28399:18;28390:6;28346:72;:::i;:::-;28428;28496:2;28485:9;28481:18;28472:6;28428:72;:::i;:::-;28547:9;28541:4;28537:20;28532:2;28521:9;28517:18;28510:48;28575:78;28648:4;28639:6;28575:78;:::i;:::-;28567:86;;28663:119;28777:3;28766:9;28762:19;28753:6;28663:119;:::i;:::-;28792:73;28860:3;28849:9;28845:19;28836:6;28792:73;:::i;:::-;27914:958;;;;;;;;;:::o;28878:442::-;29027:4;29065:2;29054:9;29050:18;29042:26;;29078:71;29146:1;29135:9;29131:17;29122:6;29078:71;:::i;:::-;29159:72;29227:2;29216:9;29212:18;29203:6;29159:72;:::i;:::-;29241;29309:2;29298:9;29294:18;29285:6;29241:72;:::i;:::-;28878:442;;;;;;:::o;29326:640::-;29521:4;29559:3;29548:9;29544:19;29536:27;;29573:71;29641:1;29630:9;29626:17;29617:6;29573:71;:::i;:::-;29654:72;29722:2;29711:9;29707:18;29698:6;29654:72;:::i;:::-;29736;29804:2;29793:9;29789:18;29780:6;29736:72;:::i;:::-;29855:9;29849:4;29845:20;29840:2;29829:9;29825:18;29818:48;29883:76;29954:4;29945:6;29883:76;:::i;:::-;29875:84;;29326:640;;;;;;;:::o;29972:553::-;30149:4;30187:3;30176:9;30172:19;30164:27;;30201:71;30269:1;30258:9;30254:17;30245:6;30201:71;:::i;:::-;30282:72;30350:2;30339:9;30335:18;30326:6;30282:72;:::i;:::-;30364;30432:2;30421:9;30417:18;30408:6;30364:72;:::i;:::-;30446;30514:2;30503:9;30499:18;30490:6;30446:72;:::i;:::-;29972:553;;;;;;;:::o;30531:332::-;30652:4;30690:2;30679:9;30675:18;30667:26;;30703:71;30771:1;30760:9;30756:17;30747:6;30703:71;:::i;:::-;30784:72;30852:2;30841:9;30837:18;30828:6;30784:72;:::i;:::-;30531:332;;;;;:::o;30869:210::-;30956:4;30994:2;30983:9;30979:18;30971:26;;31007:65;31069:1;31058:9;31054:17;31045:6;31007:65;:::i;:::-;30869:210;;;;:::o;31085:313::-;31198:4;31236:2;31225:9;31221:18;31213:26;;31285:9;31279:4;31275:20;31271:1;31260:9;31256:17;31249:47;31313:78;31386:4;31377:6;31313:78;:::i;:::-;31305:86;;31085:313;;;;:::o;31404:419::-;31570:4;31608:2;31597:9;31593:18;31585:26;;31657:9;31651:4;31647:20;31643:1;31632:9;31628:17;31621:47;31685:131;31811:4;31685:131;:::i;:::-;31677:139;;31404:419;;;:::o;31829:::-;31995:4;32033:2;32022:9;32018:18;32010:26;;32082:9;32076:4;32072:20;32068:1;32057:9;32053:17;32046:47;32110:131;32236:4;32110:131;:::i;:::-;32102:139;;31829:419;;;:::o;32254:::-;32420:4;32458:2;32447:9;32443:18;32435:26;;32507:9;32501:4;32497:20;32493:1;32482:9;32478:17;32471:47;32535:131;32661:4;32535:131;:::i;:::-;32527:139;;32254:419;;;:::o;32679:::-;32845:4;32883:2;32872:9;32868:18;32860:26;;32932:9;32926:4;32922:20;32918:1;32907:9;32903:17;32896:47;32960:131;33086:4;32960:131;:::i;:::-;32952:139;;32679:419;;;:::o;33104:::-;33270:4;33308:2;33297:9;33293:18;33285:26;;33357:9;33351:4;33347:20;33343:1;33332:9;33328:17;33321:47;33385:131;33511:4;33385:131;:::i;:::-;33377:139;;33104:419;;;:::o;33529:::-;33695:4;33733:2;33722:9;33718:18;33710:26;;33782:9;33776:4;33772:20;33768:1;33757:9;33753:17;33746:47;33810:131;33936:4;33810:131;:::i;:::-;33802:139;;33529:419;;;:::o;33954:::-;34120:4;34158:2;34147:9;34143:18;34135:26;;34207:9;34201:4;34197:20;34193:1;34182:9;34178:17;34171:47;34235:131;34361:4;34235:131;:::i;:::-;34227:139;;33954:419;;;:::o;34379:::-;34545:4;34583:2;34572:9;34568:18;34560:26;;34632:9;34626:4;34622:20;34618:1;34607:9;34603:17;34596:47;34660:131;34786:4;34660:131;:::i;:::-;34652:139;;34379:419;;;:::o;34804:::-;34970:4;35008:2;34997:9;34993:18;34985:26;;35057:9;35051:4;35047:20;35043:1;35032:9;35028:17;35021:47;35085:131;35211:4;35085:131;:::i;:::-;35077:139;;34804:419;;;:::o;35229:::-;35395:4;35433:2;35422:9;35418:18;35410:26;;35482:9;35476:4;35472:20;35468:1;35457:9;35453:17;35446:47;35510:131;35636:4;35510:131;:::i;:::-;35502:139;;35229:419;;;:::o;35654:::-;35820:4;35858:2;35847:9;35843:18;35835:26;;35907:9;35901:4;35897:20;35893:1;35882:9;35878:17;35871:47;35935:131;36061:4;35935:131;:::i;:::-;35927:139;;35654:419;;;:::o;36079:::-;36245:4;36283:2;36272:9;36268:18;36260:26;;36332:9;36326:4;36322:20;36318:1;36307:9;36303:17;36296:47;36360:131;36486:4;36360:131;:::i;:::-;36352:139;;36079:419;;;:::o;36504:::-;36670:4;36708:2;36697:9;36693:18;36685:26;;36757:9;36751:4;36747:20;36743:1;36732:9;36728:17;36721:47;36785:131;36911:4;36785:131;:::i;:::-;36777:139;;36504:419;;;:::o;36929:::-;37095:4;37133:2;37122:9;37118:18;37110:26;;37182:9;37176:4;37172:20;37168:1;37157:9;37153:17;37146:47;37210:131;37336:4;37210:131;:::i;:::-;37202:139;;36929:419;;;:::o;37354:::-;37520:4;37558:2;37547:9;37543:18;37535:26;;37607:9;37601:4;37597:20;37593:1;37582:9;37578:17;37571:47;37635:131;37761:4;37635:131;:::i;:::-;37627:139;;37354:419;;;:::o;37779:::-;37945:4;37983:2;37972:9;37968:18;37960:26;;38032:9;38026:4;38022:20;38018:1;38007:9;38003:17;37996:47;38060:131;38186:4;38060:131;:::i;:::-;38052:139;;37779:419;;;:::o;38204:::-;38370:4;38408:2;38397:9;38393:18;38385:26;;38457:9;38451:4;38447:20;38443:1;38432:9;38428:17;38421:47;38485:131;38611:4;38485:131;:::i;:::-;38477:139;;38204:419;;;:::o;38629:::-;38795:4;38833:2;38822:9;38818:18;38810:26;;38882:9;38876:4;38872:20;38868:1;38857:9;38853:17;38846:47;38910:131;39036:4;38910:131;:::i;:::-;38902:139;;38629:419;;;:::o;39054:::-;39220:4;39258:2;39247:9;39243:18;39235:26;;39307:9;39301:4;39297:20;39293:1;39282:9;39278:17;39271:47;39335:131;39461:4;39335:131;:::i;:::-;39327:139;;39054:419;;;:::o;39479:::-;39645:4;39683:2;39672:9;39668:18;39660:26;;39732:9;39726:4;39722:20;39718:1;39707:9;39703:17;39696:47;39760:131;39886:4;39760:131;:::i;:::-;39752:139;;39479:419;;;:::o;39904:::-;40070:4;40108:2;40097:9;40093:18;40085:26;;40157:9;40151:4;40147:20;40143:1;40132:9;40128:17;40121:47;40185:131;40311:4;40185:131;:::i;:::-;40177:139;;39904:419;;;:::o;40329:315::-;40468:4;40506:3;40495:9;40491:19;40483:27;;40520:117;40634:1;40623:9;40619:17;40610:6;40520:117;:::i;:::-;40329:315;;;;:::o;40650:222::-;40743:4;40781:2;40770:9;40766:18;40758:26;;40794:71;40862:1;40851:9;40847:17;40838:6;40794:71;:::i;:::-;40650:222;;;;:::o;40878:442::-;41027:4;41065:2;41054:9;41050:18;41042:26;;41078:71;41146:1;41135:9;41131:17;41122:6;41078:71;:::i;:::-;41159:72;41227:2;41216:9;41212:18;41203:6;41159:72;:::i;:::-;41241;41309:2;41298:9;41294:18;41285:6;41241:72;:::i;:::-;40878:442;;;;;;:::o;41326:129::-;41360:6;41387:20;;:::i;:::-;41377:30;;41416:33;41444:4;41436:6;41416:33;:::i;:::-;41326:129;;;:::o;41461:75::-;41494:6;41527:2;41521:9;41511:19;;41461:75;:::o;41542:307::-;41603:4;41693:18;41685:6;41682:30;41679:56;;;41715:18;;:::i;:::-;41679:56;41753:29;41775:6;41753:29;:::i;:::-;41745:37;;41837:4;41831;41827:15;41819:23;;41542:307;;;:::o;41855:308::-;41917:4;42007:18;41999:6;41996:30;41993:56;;;42029:18;;:::i;:::-;41993:56;42067:29;42089:6;42067:29;:::i;:::-;42059:37;;42151:4;42145;42141:15;42133:23;;41855:308;;;:::o;42169:98::-;42220:6;42254:5;42248:12;42238:22;;42169:98;;;:::o;42273:99::-;42325:6;42359:5;42353:12;42343:22;;42273:99;;;:::o;42378:168::-;42461:11;42495:6;42490:3;42483:19;42535:4;42530:3;42526:14;42511:29;;42378:168;;;;:::o;42552:147::-;42653:11;42690:3;42675:18;;42552:147;;;;:::o;42705:169::-;42789:11;42823:6;42818:3;42811:19;42863:4;42858:3;42854:14;42839:29;;42705:169;;;;:::o;42880:148::-;42982:11;43019:3;43004:18;;42880:148;;;;:::o;43034:305::-;43074:3;43093:20;43111:1;43093:20;:::i;:::-;43088:25;;43127:20;43145:1;43127:20;:::i;:::-;43122:25;;43281:1;43213:66;43209:74;43206:1;43203:81;43200:107;;;43287:18;;:::i;:::-;43200:107;43331:1;43328;43324:9;43317:16;;43034:305;;;;:::o;43345:185::-;43385:1;43402:20;43420:1;43402:20;:::i;:::-;43397:25;;43436:20;43454:1;43436:20;:::i;:::-;43431:25;;43475:1;43465:35;;43480:18;;:::i;:::-;43465:35;43522:1;43519;43515:9;43510:14;;43345:185;;;;:::o;43536:191::-;43576:4;43596:20;43614:1;43596:20;:::i;:::-;43591:25;;43630:20;43648:1;43630:20;:::i;:::-;43625:25;;43669:1;43666;43663:8;43660:34;;;43674:18;;:::i;:::-;43660:34;43719:1;43716;43712:9;43704:17;;43536:191;;;;:::o;43733:96::-;43770:7;43799:24;43817:5;43799:24;:::i;:::-;43788:35;;43733:96;;;:::o;43835:90::-;43869:7;43912:5;43905:13;43898:21;43887:32;;43835:90;;;:::o;43931:77::-;43968:7;43997:5;43986:16;;43931:77;;;:::o;44014:149::-;44050:7;44090:66;44083:5;44079:78;44068:89;;44014:149;;;:::o;44169:133::-;44217:7;44246:5;44235:16;;44252:44;44290:5;44252:44;:::i;:::-;44169:133;;;:::o;44308:126::-;44345:7;44385:42;44378:5;44374:54;44363:65;;44308:126;;;:::o;44440:77::-;44477:7;44506:5;44495:16;;44440:77;;;:::o;44523:86::-;44558:7;44598:4;44591:5;44587:16;44576:27;;44523:86;;;:::o;44615:133::-;44674:9;44707:35;44736:5;44707:35;:::i;:::-;44694:48;;44615:133;;;:::o;44754:154::-;44838:6;44833:3;44828;44815:30;44900:1;44891:6;44886:3;44882:16;44875:27;44754:154;;;:::o;44914:307::-;44982:1;44992:113;45006:6;45003:1;45000:13;44992:113;;;45091:1;45086:3;45082:11;45076:18;45072:1;45067:3;45063:11;45056:39;45028:2;45025:1;45021:10;45016:15;;44992:113;;;45123:6;45120:1;45117:13;45114:101;;;45203:1;45194:6;45189:3;45185:16;45178:27;45114:101;44963:258;44914:307;;;:::o;45227:320::-;45271:6;45308:1;45302:4;45298:12;45288:22;;45355:1;45349:4;45345:12;45376:18;45366:81;;45432:4;45424:6;45420:17;45410:27;;45366:81;45494:2;45486:6;45483:14;45463:18;45460:38;45457:84;;;45513:18;;:::i;:::-;45457:84;45278:269;45227:320;;;:::o;45553:281::-;45636:27;45658:4;45636:27;:::i;:::-;45628:6;45624:40;45766:6;45754:10;45751:22;45730:18;45718:10;45715:34;45712:62;45709:88;;;45777:18;;:::i;:::-;45709:88;45817:10;45813:2;45806:22;45596:238;45553:281;;:::o;45840:233::-;45879:3;45902:24;45920:5;45902:24;:::i;:::-;45893:33;;45948:66;45941:5;45938:77;45935:103;;;46018:18;;:::i;:::-;45935:103;46065:1;46058:5;46054:13;46047:20;;45840:233;;;:::o;46079:176::-;46111:1;46128:20;46146:1;46128:20;:::i;:::-;46123:25;;46162:20;46180:1;46162:20;:::i;:::-;46157:25;;46201:1;46191:35;;46206:18;;:::i;:::-;46191:35;46247:1;46244;46240:9;46235:14;;46079:176;;;;:::o;46261:180::-;46309:77;46306:1;46299:88;46406:4;46403:1;46396:15;46430:4;46427:1;46420:15;46447:180;46495:77;46492:1;46485:88;46592:4;46589:1;46582:15;46616:4;46613:1;46606:15;46633:180;46681:77;46678:1;46671:88;46778:4;46775:1;46768:15;46802:4;46799:1;46792:15;46819:180;46867:77;46864:1;46857:88;46964:4;46961:1;46954:15;46988:4;46985:1;46978:15;47005:180;47053:77;47050:1;47043:88;47150:4;47147:1;47140:15;47174:4;47171:1;47164:15;47191:180;47239:77;47236:1;47229:88;47336:4;47333:1;47326:15;47360:4;47357:1;47350:15;47377:117;47486:1;47483;47476:12;47500:117;47609:1;47606;47599:12;47623:117;47732:1;47729;47722:12;47746:117;47855:1;47852;47845:12;47992:117;48101:1;48098;48091:12;48115:117;48224:1;48221;48214:12;48238:117;48347:1;48344;48337:12;48361:117;48470:1;48467;48460:12;48484:102;48525:6;48576:2;48572:7;48567:2;48560:5;48556:14;48552:28;48542:38;;48484:102;;;:::o;48592:237::-;48732:34;48728:1;48720:6;48716:14;48709:58;48801:20;48796:2;48788:6;48784:15;48777:45;48592:237;:::o;48835:225::-;48975:34;48971:1;48963:6;48959:14;48952:58;49044:8;49039:2;49031:6;49027:15;49020:33;48835:225;:::o;49066:224::-;49206:34;49202:1;49194:6;49190:14;49183:58;49275:7;49270:2;49262:6;49258:15;49251:32;49066:224;:::o;49296:178::-;49436:30;49432:1;49424:6;49420:14;49413:54;49296:178;:::o;49480:223::-;49620:34;49616:1;49608:6;49604:14;49597:58;49689:6;49684:2;49676:6;49672:15;49665:31;49480:223;:::o;49709:175::-;49849:27;49845:1;49837:6;49833:14;49826:51;49709:175;:::o;49890:225::-;50030:34;50026:1;50018:6;50014:14;50007:58;50099:8;50094:2;50086:6;50082:15;50075:33;49890:225;:::o;50121:231::-;50261:34;50257:1;50249:6;50245:14;50238:58;50330:14;50325:2;50317:6;50313:15;50306:39;50121:231;:::o;50358:243::-;50498:34;50494:1;50486:6;50482:14;50475:58;50567:26;50562:2;50554:6;50550:15;50543:51;50358:243;:::o;50607:229::-;50747:34;50743:1;50735:6;50731:14;50724:58;50816:12;50811:2;50803:6;50799:15;50792:37;50607:229;:::o;50842:228::-;50982:34;50978:1;50970:6;50966:14;50959:58;51051:11;51046:2;51038:6;51034:15;51027:36;50842:228;:::o;51076:233::-;51216:34;51212:1;51204:6;51200:14;51193:58;51285:16;51280:2;51272:6;51268:15;51261:41;51076:233;:::o;51315:182::-;51455:34;51451:1;51443:6;51439:14;51432:58;51315:182;:::o;51503:236::-;51643:34;51639:1;51631:6;51627:14;51620:58;51712:19;51707:2;51699:6;51695:15;51688:44;51503:236;:::o;51745:231::-;51885:34;51881:1;51873:6;51869:14;51862:58;51954:14;51949:2;51941:6;51937:15;51930:39;51745:231;:::o;51982:182::-;52122:34;52118:1;52110:6;52106:14;52099:58;51982:182;:::o;52170:234::-;52310:34;52306:1;52298:6;52294:14;52287:58;52379:17;52374:2;52366:6;52362:15;52355:42;52170:234;:::o;52410:220::-;52550:34;52546:1;52538:6;52534:14;52527:58;52619:3;52614:2;52606:6;52602:15;52595:28;52410:220;:::o;52636:236::-;52776:34;52772:1;52764:6;52760:14;52753:58;52845:19;52840:2;52832:6;52828:15;52821:44;52636:236;:::o;52878:179::-;53018:31;53014:1;53006:6;53002:14;52995:55;52878:179;:::o;53063:229::-;53203:34;53199:1;53191:6;53187:14;53180:58;53272:12;53267:2;53259:6;53255:15;53248:37;53063:229;:::o;53298:116::-;53382:1;53375:5;53372:12;53362:46;;53388:18;;:::i;:::-;53362:46;53298:116;:::o;53420:122::-;53493:24;53511:5;53493:24;:::i;:::-;53486:5;53483:35;53473:63;;53532:1;53529;53522:12;53473:63;53420:122;:::o;53548:116::-;53618:21;53633:5;53618:21;:::i;:::-;53611:5;53608:32;53598:60;;53654:1;53651;53644:12;53598:60;53548:116;:::o;53670:122::-;53743:24;53761:5;53743:24;:::i;:::-;53736:5;53733:35;53723:63;;53782:1;53779;53772:12;53723:63;53670:122;:::o;53798:120::-;53870:23;53887:5;53870:23;:::i;:::-;53863:5;53860:34;53850:62;;53908:1;53905;53898:12;53850:62;53798:120;:::o;53924:122::-;53997:24;54015:5;53997:24;:::i;:::-;53990:5;53987:35;53977:63;;54036:1;54033;54026:12;53977:63;53924:122;:::o;54052:118::-;54123:22;54139:5;54123:22;:::i;:::-;54116:5;54113:33;54103:61;;54160:1;54157;54150:12;54103:61;54052:118;:::o

Swarm Source

ipfs://884bdbd1eafa98964e241c20fc185311627bbff70533c66560a63a6159fc1a8b
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.