ETH Price: $3,621.12 (+5.83%)

Token

BloodShedBearsGen1 (BSBG1)
 

Overview

Max Total Supply

20,080 BSBG1

Holders

609

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
0 BSBG1
0xec371e827ec993c3e810b8f9d4ae544c8a5ffb2c
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:
BloodShedBearsGen1

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-02-27
*/

// SPDX-License-Identifier: GPL-3.0

/*
 ______     __                            __           __                      __
|_   _ \   [  |                          |  ]         [  |                    |  ]
  | |_) |   | |    .--.     .--.     .--.| |   .--.    | |--.    .---.    .--.| |
  |  __'.   | |  / .'`\ \ / .'`\ \ / /'`\' |  ( (`\]   | .-. |  / /__\\ / /'`\' |
 _| |__) |  | |  | \__. | | \__. | | \__/  |   `'.'.   | | | |  | \__., | \__/  |
|_______/  [___]  '.__.'   '.__.'   '.__.;__] [\__) ) [___]|__]  '.__.'  '.__.;__]
                      ________
                      ___  __ )_____ ______ _________________
                      __  __  |_  _ \_  __ `/__  ___/__  ___/
                      _  /_/ / /  __// /_/ / _  /    _(__  )
                      /_____/  \___/ \__,_/  /_/     /____/
*/

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

pragma solidity ^0.8.0;

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

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

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

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

pragma solidity ^0.8.0;

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

pragma solidity ^0.8.0;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

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

pragma solidity ^0.8.0;

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

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

abstract contract ERC721P is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    string private _name;
    string private _symbol;
    address[] internal _owners;
    mapping(uint256 => address) private _tokenApprovals;
    mapping(address => mapping(address => bool)) private _operatorApprovals;
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
        interfaceId == type(IERC721).interfaceId ||
        interfaceId == type(IERC721Metadata).interfaceId ||
        super.supportsInterface(interfaceId);
    }
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        uint count = 0;
        uint length = _owners.length;
        for( uint i = 0; i < length; ++i ){
            if( owner == _owners[i] ){
                ++count;
            }
        }
        delete length;
        return count;
    }
    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;
    }
    function name() public view virtual override returns (string memory) {
        return _name;
    }
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721P.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);
    }
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }
    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);
    }
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }
    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);
    }
    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");
    }
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return tokenId < _owners.length && _owners[tokenId] != address(0);
    }
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721P.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }
    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"
        );
    }
    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);
        _owners.push(to);

        emit Transfer(address(0), to, tokenId);
    }
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721P.ownerOf(tokenId);

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

        // Clear approvals
        _approve(address(0), tokenId);
        _owners[tokenId] = address(0);

        emit Transfer(owner, address(0), tokenId);
    }
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721P.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721P.ownerOf(tokenId), to, tokenId);
    }
    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;
        }
    }
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

pragma solidity ^0.8.0;

/**
 * @title ERC721 Burnable Token
 * @dev ERC721 Token that can be irreversibly burned (destroyed).
 */
abstract contract ERC721Burnable is Context, ERC721P {
    /**
     * @dev Burns `tokenId`. See {ERC721-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved");
        _burn(tokenId);
    }
}

pragma solidity ^0.8.10;

abstract contract ERC721Enum is ERC721Burnable, IERC721Enumerable {
    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721P) returns (bool) {
        return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
    }
    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256 tokenId) {
        require(index < ERC721P.balanceOf(owner), "ERC721Enum: owner ioob");
        uint count;
        for( uint i; i < _owners.length; ++i ){
            if( owner == _owners[i] ){
                if( count == index )
                    return i;
                else
                    ++count;
            }
        }
        require(false, "ERC721Enum: owner ioob");
    }
    function tokensOfOwner(address owner) public view returns (uint256[] memory) {
        require(0 < ERC721P.balanceOf(owner), "ERC721Enum: owner ioob");
        uint256 tokenCount = balanceOf(owner);
        uint256[] memory tokenIds = new uint256[](tokenCount);
        for (uint256 i = 0; i < tokenCount; i++) {
            tokenIds[i] = tokenOfOwnerByIndex(owner, i);
        }
        return tokenIds;
    }
    function totalSupply() public view virtual override returns (uint256) {
        return _owners.length;
    }
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enum.totalSupply(), "ERC721Enum: global ioob");
        return index;
    }
}

pragma solidity ^0.8.0;

interface LinkTokenInterface {
    function allowance(address owner, address spender) external view returns (uint256 remaining);

    function approve(address spender, uint256 value) external returns (bool success);

    function balanceOf(address owner) external view returns (uint256 balance);

    function decimals() external view returns (uint8 decimalPlaces);

    function decreaseApproval(address spender, uint256 addedValue) external returns (bool success);

    function increaseApproval(address spender, uint256 subtractedValue) external;

    function name() external view returns (string memory tokenName);

    function symbol() external view returns (string memory tokenSymbol);

    function totalSupply() external view returns (uint256 totalTokensIssued);

    function transfer(address to, uint256 value) external returns (bool success);

    function transferAndCall(
        address to,
        uint256 value,
        bytes calldata data
    ) external returns (bool success);

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool success);
}

pragma solidity ^0.8.0;

contract VRFRequestIDBase {
    /**
     * @notice returns the seed which is actually input to the VRF coordinator
   *
   * @dev To prevent repetition of VRF output due to repetition of the
   * @dev user-supplied seed, that seed is combined in a hash with the
   * @dev user-specific nonce, and the address of the consuming contract. The
   * @dev risk of repetition is mostly mitigated by inclusion of a blockhash in
   * @dev the final seed, but the nonce does protect against repetition in
   * @dev requests which are included in a single block.
   *
   * @param _userSeed VRF seed input provided by user
   * @param _requester Address of the requesting contract
   * @param _nonce User-specific nonce at the time of the request
   */
    function makeVRFInputSeed(
        bytes32 _keyHash,
        uint256 _userSeed,
        address _requester,
        uint256 _nonce
    ) internal pure returns (uint256) {
        return uint256(keccak256(abi.encode(_keyHash, _userSeed, _requester, _nonce)));
    }

    /**
     * @notice Returns the id for this request
   * @param _keyHash The serviceAgreement ID to be used for this request
   * @param _vRFInputSeed The seed to be passed directly to the VRF
   * @return The id for this request
   *
   * @dev Note that _vRFInputSeed is not the seed passed by the consuming
   * @dev contract, but the one generated by makeVRFInputSeed
   */
    function makeRequestId(bytes32 _keyHash, uint256 _vRFInputSeed) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked(_keyHash, _vRFInputSeed));
    }
}

pragma solidity ^0.8.0;

/** ****************************************************************************
 * @notice Interface for contracts using VRF randomness
 * *****************************************************************************
 * @dev PURPOSE
 *
 * @dev Reggie the Random Oracle (not his real job) wants to provide randomness
 * @dev to Vera the verifier in such a way that Vera can be sure he's not
 * @dev making his output up to suit himself. Reggie provides Vera a public key
 * @dev to which he knows the secret key. Each time Vera provides a seed to
 * @dev Reggie, he gives back a value which is computed completely
 * @dev deterministically from the seed and the secret key.
 *
 * @dev Reggie provides a proof by which Vera can verify that the output was
 * @dev correctly computed once Reggie tells it to her, but without that proof,
 * @dev the output is indistinguishable to her from a uniform random sample
 * @dev from the output space.
 *
 * @dev The purpose of this contract is to make it easy for unrelated contracts
 * @dev to talk to Vera the verifier about the work Reggie is doing, to provide
 * @dev simple access to a verifiable source of randomness.
 * *****************************************************************************
 * @dev USAGE
 *
 * @dev Calling contracts must inherit from VRFConsumerBase, and can
 * @dev initialize VRFConsumerBase's attributes in their constructor as
 * @dev shown:
 *
 * @dev   contract VRFConsumer {
 * @dev     constructor(<other arguments>, address _vrfCoordinator, address _link)
 * @dev       VRFConsumerBase(_vrfCoordinator, _link) public {
 * @dev         <initialization with other arguments goes here>
 * @dev       }
 * @dev   }
 *
 * @dev The oracle will have given you an ID for the VRF keypair they have
 * @dev committed to (let's call it keyHash), and have told you the minimum LINK
 * @dev price for VRF service. Make sure your contract has sufficient LINK, and
 * @dev call requestRandomness(keyHash, fee, seed), where seed is the input you
 * @dev want to generate randomness from.
 *
 * @dev Once the VRFCoordinator has received and validated the oracle's response
 * @dev to your request, it will call your contract's fulfillRandomness method.
 *
 * @dev The randomness argument to fulfillRandomness is the actual random value
 * @dev generated from your seed.
 *
 * @dev The requestId argument is generated from the keyHash and the seed by
 * @dev makeRequestId(keyHash, seed). If your contract could have concurrent
 * @dev requests open, you can use the requestId to track which seed is
 * @dev associated with which randomness. See VRFRequestIDBase.sol for more
 * @dev details. (See "SECURITY CONSIDERATIONS" for principles to keep in mind,
 * @dev if your contract could have multiple requests in flight simultaneously.)
 *
 * @dev Colliding `requestId`s are cryptographically impossible as long as seeds
 * @dev differ. (Which is critical to making unpredictable randomness! See the
 * @dev next section.)
 *
 * *****************************************************************************
 * @dev SECURITY CONSIDERATIONS
 *
 * @dev A method with the ability to call your fulfillRandomness method directly
 * @dev could spoof a VRF response with any random value, so it's critical that
 * @dev it cannot be directly called by anything other than this base contract
 * @dev (specifically, by the VRFConsumerBase.rawFulfillRandomness method).
 *
 * @dev For your users to trust that your contract's random behavior is free
 * @dev from malicious interference, it's best if you can write it so that all
 * @dev behaviors implied by a VRF response are executed *during* your
 * @dev fulfillRandomness method. If your contract must store the response (or
 * @dev anything derived from it) and use it later, you must ensure that any
 * @dev user-significant behavior which depends on that stored value cannot be
 * @dev manipulated by a subsequent VRF request.
 *
 * @dev Similarly, both miners and the VRF oracle itself have some influence
 * @dev over the order in which VRF responses appear on the blockchain, so if
 * @dev your contract could have multiple VRF requests in flight simultaneously,
 * @dev you must ensure that the order in which the VRF responses arrive cannot
 * @dev be used to manipulate your contract's user-significant behavior.
 *
 * @dev Since the ultimate input to the VRF is mixed with the block hash of the
 * @dev block in which the request is made, user-provided seeds have no impact
 * @dev on its economic security properties. They are only included for API
 * @dev compatability with previous versions of this contract.
 *
 * @dev Since the block hash of the block which contains the requestRandomness
 * @dev call is mixed into the input to the VRF *last*, a sufficiently powerful
 * @dev miner could, in principle, fork the blockchain to evict the block
 * @dev containing the request, forcing the request to be included in a
 * @dev different block with a different hash, and therefore a different input
 * @dev to the VRF. However, such an attack would incur a substantial economic
 * @dev cost. This cost scales with the number of blocks the VRF oracle waits
 * @dev until it calls responds to a request.
 */
abstract contract VRFConsumerBase is VRFRequestIDBase {
    /**
     * @notice fulfillRandomness handles the VRF response. Your contract must
   * @notice implement it. See "SECURITY CONSIDERATIONS" above for important
   * @notice principles to keep in mind when implementing your fulfillRandomness
   * @notice method.
   *
   * @dev VRFConsumerBase expects its subcontracts to have a method with this
   * @dev signature, and will call it once it has verified the proof
   * @dev associated with the randomness. (It is triggered via a call to
   * @dev rawFulfillRandomness, below.)
   *
   * @param requestId The Id initially returned by requestRandomness
   * @param randomness the VRF output
   */
    function fulfillRandomness(bytes32 requestId, uint256 randomness) internal virtual;

    /**
     * @dev In order to keep backwards compatibility we have kept the user
   * seed field around. We remove the use of it because given that the blockhash
   * enters later, it overrides whatever randomness the used seed provides.
   * Given that it adds no security, and can easily lead to misunderstandings,
   * we have removed it from usage and can now provide a simpler API.
   */
    uint256 private constant USER_SEED_PLACEHOLDER = 0;

    /**
     * @notice requestRandomness initiates a request for VRF output given _seed
   *
   * @dev The fulfillRandomness method receives the output, once it's provided
   * @dev by the Oracle, and verified by the vrfCoordinator.
   *
   * @dev The _keyHash must already be registered with the VRFCoordinator, and
   * @dev the _fee must exceed the fee specified during registration of the
   * @dev _keyHash.
   *
   * @dev The _seed parameter is vestigial, and is kept only for API
   * @dev compatibility with older versions. It can't *hurt* to mix in some of
   * @dev your own randomness, here, but it's not necessary because the VRF
   * @dev oracle will mix the hash of the block containing your request into the
   * @dev VRF seed it ultimately uses.
   *
   * @param _keyHash ID of public key against which randomness is generated
   * @param _fee The amount of LINK to send with the request
   *
   * @return requestId unique ID for this request
   *
   * @dev The returned requestId can be used to distinguish responses to
   * @dev concurrent requests. It is passed as the first argument to
   * @dev fulfillRandomness.
   */
    function requestRandomness(bytes32 _keyHash, uint256 _fee) internal returns (bytes32 requestId) {
        LINK.transferAndCall(vrfCoordinator, _fee, abi.encode(_keyHash, USER_SEED_PLACEHOLDER));
        // This is the seed passed to VRFCoordinator. The oracle will mix this with
        // the hash of the block containing this request to obtain the seed/input
        // which is finally passed to the VRF cryptographic machinery.
        uint256 vRFSeed = makeVRFInputSeed(_keyHash, USER_SEED_PLACEHOLDER, address(this), nonces[_keyHash]);
        // nonces[_keyHash] must stay in sync with
        // VRFCoordinator.nonces[_keyHash][this], which was incremented by the above
        // successful LINK.transferAndCall (in VRFCoordinator.randomnessRequest).
        // This provides protection against the user repeating their input seed,
        // which would result in a predictable/duplicate output, if multiple such
        // requests appeared in the same block.
        nonces[_keyHash] = nonces[_keyHash] + 1;
        return makeRequestId(_keyHash, vRFSeed);
    }

    LinkTokenInterface internal immutable LINK;
    address private immutable vrfCoordinator;

    // Nonces for each VRF key from which randomness has been requested.
    //
    // Must stay in sync with VRFCoordinator[_keyHash][this]
    mapping(bytes32 => uint256) /* keyHash */ /* nonce */
    private nonces;

    /**
     * @param _vrfCoordinator address of VRFCoordinator contract
   * @param _link address of LINK token contract
   *
   * @dev https://docs.chain.link/docs/link-token-contracts
   */
    constructor(address _vrfCoordinator, address _link) {
        vrfCoordinator = _vrfCoordinator;
        LINK = LinkTokenInterface(_link);
    }

    // rawFulfillRandomness is called by VRFCoordinator when it receives a valid VRF
    // proof. rawFulfillRandomness then calls fulfillRandomness, after validating
    // the origin of the call
    function rawFulfillRandomness(bytes32 requestId, uint256 randomness) external {
        require(msg.sender == vrfCoordinator, "Only VRFCoordinator can fulfill");
        fulfillRandomness(requestId, randomness);
    }
}

pragma solidity ^0.8.0;

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

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

    bool private _paused;

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

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

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

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

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

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

pragma solidity ^0.8.10;

interface IBloodTokenContract {
    function walletsBalances(address wallet) external view returns (uint256);
    function spend(address owner, uint256 amount) external;
}

interface IGameStats {
    function pickWinnerFromElites(bool faction, uint256 tokenId) external returns (address);
}

contract BloodShedBearsGen1 is ERC721Enum, Ownable, VRFConsumerBase, Pausable {
    using Strings for uint256;

    //sale settings
    uint256 constant private maxSupply = 20000;
    uint256 private teamReserveAvailableMints = 200;
    uint256 private cost = 20000 ether;
    address public bloodTokenContract = 0x0000000000000000000000000000000000000000;
    address public gameStatsContract = 0x0000000000000000000000000000000000000000;

    mapping(uint256 => bool) public tokenFactions;

    string private baseURI;

    uint256 private vrfFee;
    bytes32 private vrfKeyHash;

    uint256 private riskSeed;
    uint256 private factionSeed;

    bytes32 private riskSeedReqId;
    bytes32 private factionSeedReqId;

    event SeedFulfilled(string seedType);

    constructor(
        string memory initBaseURI_,
        address vrfCoordinatorAddr_,
        address linkTokenAddr_,
        bytes32 vrfKeyHash_,
        uint256 fee_
    )
    VRFConsumerBase(vrfCoordinatorAddr_, linkTokenAddr_)
    ERC721P("BloodShedBearsGen1", "BSBG1") {
        setBaseURI(initBaseURI_);
        vrfKeyHash = vrfKeyHash_;
        vrfFee = fee_;
        //        pause();
    }

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

    function setBloodTokenContract(address contractAddress_) external onlyOwner {
        bloodTokenContract = contractAddress_;
    }

    function setGameStatsContract(address contractAddress_) external onlyOwner {
        gameStatsContract = contractAddress_;
    }

    function setCost(uint256 _newCost) external onlyOwner {
        cost = _newCost;
    }

    function mint(uint256 mintAmount_) external payable whenNotPaused returns (uint256) {

        require(riskSeed != 0, "Seed not set");
        require(factionSeed != 0, "Seed not set");

        require(IBloodTokenContract(bloodTokenContract).walletsBalances(msg.sender) >= mintAmount_ * cost, "NOT ENOUGH");
        IBloodTokenContract(bloodTokenContract).spend(msg.sender, mintAmount_ * cost);

        uint256 totalSupply = totalSupply();
        uint256 lostBears;
        for (uint256 i = 0; i < mintAmount_; i++) {

            tokenFactions[totalSupply + i] = _getFaction(totalSupply + i);

            address recipient = msg.sender;
            if(_isLost(totalSupply + i)) {
                address winner = IGameStats(gameStatsContract).pickWinnerFromElites(tokenFactions[totalSupply + i], totalSupply + i);
                if(winner != address(0)) {
                    ++lostBears;
                    recipient = winner;
                }
            }

            _safeMint(recipient, totalSupply + i);

            delete recipient;
        }

        delete totalSupply;

        return lostBears;
    }

    function tokenURI(uint256 _tokenId) external view virtual override returns (string memory) {
        require(_exists(_tokenId), "ERC721Metadata: Nonexistent token");
        string memory currentBaseURI = _baseURI();
        return bytes(currentBaseURI).length > 0	? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), ".json")) : "";
    }

    function reserve(address _to, uint256 _reserveAmount) external onlyOwner {
        uint256 supply = totalSupply();
        require(
            _reserveAmount > 0 && _reserveAmount <= teamReserveAvailableMints,
            "Not enough reserve left for team"
        );
        for (uint256 i = 0; i < _reserveAmount; i++) {

            tokenFactions[supply + i] = _getFaction(supply + i);
            _safeMint(_to, supply + i);
        }
        teamReserveAvailableMints -= _reserveAmount;
    }

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

    function isOwnerOfBatch(uint256[] calldata tokenIds_, address address_) external view returns (bool) {
        bool ownership = true;

        for (uint256 i = 0; i < tokenIds_.length; ++i) {
            ownership = ownership && (ownerOf(tokenIds_[i]) == address_);
        }

        return ownership;
    }

    function _isLost(uint256 tokenId) internal view returns (bool) {
        return uint256(
            keccak256(
                abi.encodePacked(
                    riskSeed,
                    tokenId,
                    tx.origin,
                    blockhash(block.number - 1),
                    block.timestamp
                )
            )
        ) % 5 == 0;
    }

    function _getFaction(uint256 tokenId) internal view returns (bool) {
        return uint256(
            keccak256(
                abi.encodePacked(
                    factionSeed,
                    tokenId,
                    tx.origin,
                    blockhash(block.number - 1),
                    block.timestamp
                )
            )
        ) & 1 == 1;
    }

    function initSeedGeneration(bool seedType) public onlyOwner returns (bytes32) {
        require(LINK.balanceOf(address(this)) >= vrfFee, "Not enough LINK");
        bytes32 requestId = requestRandomness(vrfKeyHash, vrfFee);
        if (seedType) {
            riskSeedReqId = requestId;
        } else {
            factionSeedReqId = requestId;
        }
        return requestId;
    }

    function fulfillRandomness(bytes32 requestId, uint256 randomness) internal override {
        if (requestId == riskSeedReqId) {
            riskSeed = randomness;
            emit SeedFulfilled("Risk");
        } else if (requestId == factionSeedReqId) {
            factionSeed = randomness;
            emit SeedFulfilled("Faction");
        }
    }

    function pause() public onlyOwner {
        _pause();
    }

    function unpause() public onlyOwner {
        _unpause();
    }

    function getFactions(uint256[] calldata tokenIds_) external view returns (bool[] memory) {
        bool[] memory factions = new bool[](tokenIds_.length);
        for (uint256 i = 0; i < tokenIds_.length; ++i) {
            require(_exists(tokenIds_[i]), "Token doesn't exist");
            factions[i] = tokenFactions[tokenIds_[i]];
        }

        return factions;
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"initBaseURI_","type":"string"},{"internalType":"address","name":"vrfCoordinatorAddr_","type":"address"},{"internalType":"address","name":"linkTokenAddr_","type":"address"},{"internalType":"bytes32","name":"vrfKeyHash_","type":"bytes32"},{"internalType":"uint256","name":"fee_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"seedType","type":"string"}],"name":"SeedFulfilled","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","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":"bloodTokenContract","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":[],"name":"gameStatsContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":"tokenIds_","type":"uint256[]"}],"name":"getFactions","outputs":[{"internalType":"bool[]","name":"","type":"bool[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"seedType","type":"bool"}],"name":"initSeedGeneration","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","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":[{"internalType":"uint256[]","name":"tokenIds_","type":"uint256[]"},{"internalType":"address","name":"address_","type":"address"}],"name":"isOwnerOfBatch","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintAmount_","type":"uint256"}],"name":"mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"},{"internalType":"uint256","name":"randomness","type":"uint256"}],"name":"rawFulfillRandomness","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_reserveAmount","type":"uint256"}],"name":"reserve","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":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress_","type":"address"}],"name":"setBloodTokenContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress_","type":"address"}],"name":"setGameStatsContract","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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenFactions","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"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":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c060405260c860085569043c33c19375648000006009556000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000a857600080fd5b5060405162005e3438038062005e348339818101604052810190620000ce91906200070a565b83836040518060400160405280601281526020017f426c6f6f6453686564426561727347656e3100000000000000000000000000008152506040518060400160405280600581526020017f4253424731000000000000000000000000000000000000000000000000000000815250816000908051906020019062000154929190620003e2565b5080600190805190602001906200016d929190620003e2565b50505062000190620001846200023f60201b60201c565b6200024760201b60201c565b8173ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505050506000600760006101000a81548160ff02191690831515021790555062000226856200030d60201b60201c565b81600f8190555080600e81905550505050505062000899565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200031d6200023f60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000343620003b860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200039c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003939062000812565b60405180910390fd5b80600d9080519060200190620003b4929190620003e2565b5050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620003f09062000863565b90600052602060002090601f01602090048101928262000414576000855562000460565b82601f106200042f57805160ff191683800117855562000460565b8280016001018555821562000460579182015b828111156200045f57825182559160200191906001019062000442565b5b5090506200046f919062000473565b5090565b5b808211156200048e57600081600090555060010162000474565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620004fb82620004b0565b810181811067ffffffffffffffff821117156200051d576200051c620004c1565b5b80604052505050565b60006200053262000492565b9050620005408282620004f0565b919050565b600067ffffffffffffffff821115620005635762000562620004c1565b5b6200056e82620004b0565b9050602081019050919050565b60005b838110156200059b5780820151818401526020810190506200057e565b83811115620005ab576000848401525b50505050565b6000620005c8620005c28462000545565b62000526565b905082815260208101848484011115620005e757620005e6620004ab565b5b620005f48482856200057b565b509392505050565b600082601f830112620006145762000613620004a6565b5b815162000626848260208601620005b1565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200065c826200062f565b9050919050565b6200066e816200064f565b81146200067a57600080fd5b50565b6000815190506200068e8162000663565b92915050565b6000819050919050565b620006a98162000694565b8114620006b557600080fd5b50565b600081519050620006c9816200069e565b92915050565b6000819050919050565b620006e481620006cf565b8114620006f057600080fd5b50565b6000815190506200070481620006d9565b92915050565b600080600080600060a086880312156200072957620007286200049c565b5b600086015167ffffffffffffffff8111156200074a5762000749620004a1565b5b6200075888828901620005fc565b95505060206200076b888289016200067d565b94505060406200077e888289016200067d565b93505060606200079188828901620006b8565b9250506080620007a488828901620006f3565b9150509295509295909350565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000620007fa602083620007b1565b91506200080782620007c2565b602082019050919050565b600060208201905081810360008301526200082d81620007eb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200087c57607f821691505b6020821081141562000893576200089262000834565b5b50919050565b60805160a051615567620008cd6000396000818161178a0152612926015260008181610c8801526128ea01526155676000f3fe60806040526004361061021a5760003560e01c806370a0823111610123578063a0712d68116100ab578063b88d4fde1161006f578063b88d4fde146107fa578063c87b56dd14610823578063cc47a40b14610860578063e985e9c514610889578063f2fde38b146108c65761021a565b8063a0712d68146106fc578063a09ac5571461072c578063a22cb46514610769578063a6dbf79114610792578063ada670e7146107cf5761021a565b80638462151c116100f25780638462151c146106155780638da5cb5b1461065257806394985ddd1461067d57806395d89b41146106a65780639b355c20146106d15761021a565b806370a0823114610581578063715018a6146105be5780637f9a62dc146105d55780638456cb59146105fe5761021a565b806342842e0e116101a657806355f804b31161017557806355f804b31461048a5780635c975abb146104b35780635e089142146104de5780636352211e146105075780636f9bdf65146105445761021a565b806342842e0e146103d257806342966c68146103fb57806344a0d68a146104245780634f6ccce71461044d5761021a565b806318160ddd116101ed57806318160ddd146102ed57806323b872dd1461031857806324d10317146103415780632f745c591461037e5780633f4ba83a146103bb5761021a565b806301ffc9a71461021f57806306fdde031461025c578063081812fc14610287578063095ea7b3146102c4575b600080fd5b34801561022b57600080fd5b506102466004803603810190610241919061363c565b6108ef565b6040516102539190613684565b60405180910390f35b34801561026857600080fd5b50610271610969565b60405161027e9190613738565b60405180910390f35b34801561029357600080fd5b506102ae60048036038101906102a99190613790565b6109fb565b6040516102bb91906137fe565b60405180910390f35b3480156102d057600080fd5b506102eb60048036038101906102e69190613845565b610a80565b005b3480156102f957600080fd5b50610302610b98565b60405161030f9190613894565b60405180910390f35b34801561032457600080fd5b5061033f600480360381019061033a91906138af565b610ba5565b005b34801561034d57600080fd5b506103686004803603810190610363919061392e565b610c05565b6040516103759190613974565b60405180910390f35b34801561038a57600080fd5b506103a560048036038101906103a09190613845565b610d96565b6040516103b29190613894565b60405180910390f35b3480156103c757600080fd5b506103d0610edf565b005b3480156103de57600080fd5b506103f960048036038101906103f491906138af565b610f65565b005b34801561040757600080fd5b50610422600480360381019061041d9190613790565b610f85565b005b34801561043057600080fd5b5061044b60048036038101906104469190613790565b610fe1565b005b34801561045957600080fd5b50610474600480360381019061046f9190613790565b611067565b6040516104819190613894565b60405180910390f35b34801561049657600080fd5b506104b160048036038101906104ac9190613ac4565b6110ba565b005b3480156104bf57600080fd5b506104c8611150565b6040516104d59190613684565b60405180910390f35b3480156104ea57600080fd5b5061050560048036038101906105009190613b0d565b611167565b005b34801561051357600080fd5b5061052e60048036038101906105299190613790565b611227565b60405161053b91906137fe565b60405180910390f35b34801561055057600080fd5b5061056b60048036038101906105669190613b9a565b6112e4565b6040516105789190613684565b60405180910390f35b34801561058d57600080fd5b506105a860048036038101906105a39190613b0d565b611371565b6040516105b59190613894565b60405180910390f35b3480156105ca57600080fd5b506105d3611497565b005b3480156105e157600080fd5b506105fc60048036038101906105f79190613b0d565b61151f565b005b34801561060a57600080fd5b506106136115df565b005b34801561062157600080fd5b5061063c60048036038101906106379190613b0d565b611665565b6040516106499190613cb8565b60405180910390f35b34801561065e57600080fd5b5061066761175e565b60405161067491906137fe565b60405180910390f35b34801561068957600080fd5b506106a4600480360381019061069f9190613d06565b611788565b005b3480156106b257600080fd5b506106bb611824565b6040516106c89190613738565b60405180910390f35b3480156106dd57600080fd5b506106e66118b6565b6040516106f391906137fe565b60405180910390f35b61071660048036038101906107119190613790565b6118dc565b6040516107239190613894565b60405180910390f35b34801561073857600080fd5b50610753600480360381019061074e9190613790565b611d18565b6040516107609190613684565b60405180910390f35b34801561077557600080fd5b50610790600480360381019061078b9190613d46565b611d38565b005b34801561079e57600080fd5b506107b960048036038101906107b49190613d86565b611eb9565b6040516107c69190613e91565b60405180910390f35b3480156107db57600080fd5b506107e4611ff5565b6040516107f191906137fe565b60405180910390f35b34801561080657600080fd5b50610821600480360381019061081c9190613f54565b61201b565b005b34801561082f57600080fd5b5061084a60048036038101906108459190613790565b61207d565b6040516108579190613738565b60405180910390f35b34801561086c57600080fd5b5061088760048036038101906108829190613845565b612124565b005b34801561089557600080fd5b506108b060048036038101906108ab9190613fd7565b612298565b6040516108bd9190613684565b60405180910390f35b3480156108d257600080fd5b506108ed60048036038101906108e89190613b0d565b61232c565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610962575061096182612424565b5b9050919050565b60606000805461097890614046565b80601f01602080910402602001604051908101604052809291908181526020018280546109a490614046565b80156109f15780601f106109c6576101008083540402835291602001916109f1565b820191906000526020600020905b8154815290600101906020018083116109d457829003601f168201915b5050505050905090565b6000610a0682612506565b610a45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3c906140ea565b60405180910390fd5b6003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a8b82611227565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610afc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af39061417c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b1b61258e565b73ffffffffffffffffffffffffffffffffffffffff161480610b4a5750610b4981610b4461258e565b612298565b5b610b89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b809061420e565b60405180910390fd5b610b938383612596565b505050565b6000600280549050905090565b610bb6610bb061258e565b8261264f565b610bf5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bec906142a0565b60405180910390fd5b610c0083838361272d565b505050565b6000610c0f61258e565b73ffffffffffffffffffffffffffffffffffffffff16610c2d61175e565b73ffffffffffffffffffffffffffffffffffffffff1614610c83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7a9061430c565b60405180910390fd5b600e547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610cdf91906137fe565b602060405180830381865afa158015610cfc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d209190614341565b1015610d61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d58906143ba565b60405180910390fd5b6000610d71600f54600e546128e6565b90508215610d855780601281905550610d8d565b806013819055505b80915050919050565b6000610da183611371565b8210610de2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd990614426565b60405180910390fd5b6000805b600280549050811015610e955760028181548110610e0757610e06614446565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610e845783821415610e77578092505050610ed9565b81610e81906144a4565b91505b80610e8e906144a4565b9050610de6565b506000610ed7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ece90614426565b60405180910390fd5b505b92915050565b610ee761258e565b73ffffffffffffffffffffffffffffffffffffffff16610f0561175e565b73ffffffffffffffffffffffffffffffffffffffff1614610f5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f529061430c565b60405180910390fd5b610f63612a39565b565b610f808383836040518060200160405280600081525061201b565b505050565b610f96610f9061258e565b8261264f565b610fd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fcc9061455f565b60405180910390fd5b610fde81612adb565b50565b610fe961258e565b73ffffffffffffffffffffffffffffffffffffffff1661100761175e565b73ffffffffffffffffffffffffffffffffffffffff161461105d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110549061430c565b60405180910390fd5b8060098190555050565b6000611071610b98565b82106110b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a9906145cb565b60405180910390fd5b819050919050565b6110c261258e565b73ffffffffffffffffffffffffffffffffffffffff166110e061175e565b73ffffffffffffffffffffffffffffffffffffffff1614611136576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112d9061430c565b60405180910390fd5b80600d908051906020019061114c92919061352d565b5050565b6000600760009054906101000a900460ff16905090565b61116f61258e565b73ffffffffffffffffffffffffffffffffffffffff1661118d61175e565b73ffffffffffffffffffffffffffffffffffffffff16146111e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111da9061430c565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806002838154811061123e5761123d614446565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d29061465d565b60405180910390fd5b80915050919050565b6000806001905060005b858590508110156113655781801561135257508373ffffffffffffffffffffffffffffffffffffffff1661133a87878481811061132e5761132d614446565b5b90506020020135611227565b73ffffffffffffffffffffffffffffffffffffffff16145b91508061135e906144a4565b90506112ee565b50809150509392505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d9906146ef565b60405180910390fd5b600080600280549050905060005b81811015611488576002818154811061140c5761140b614446565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156114775782611474906144a4565b92505b80611481906144a4565b90506113f0565b50600090508192505050919050565b61149f61258e565b73ffffffffffffffffffffffffffffffffffffffff166114bd61175e565b73ffffffffffffffffffffffffffffffffffffffff1614611513576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150a9061430c565b60405180910390fd5b61151d6000612bbd565b565b61152761258e565b73ffffffffffffffffffffffffffffffffffffffff1661154561175e565b73ffffffffffffffffffffffffffffffffffffffff161461159b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115929061430c565b60405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6115e761258e565b73ffffffffffffffffffffffffffffffffffffffff1661160561175e565b73ffffffffffffffffffffffffffffffffffffffff161461165b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116529061430c565b60405180910390fd5b611663612c83565b565b606061167082611371565b6000106116b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a990614426565b60405180910390fd5b60006116bd83611371565b905060008167ffffffffffffffff8111156116db576116da613999565b5b6040519080825280602002602001820160405280156117095781602001602082028036833780820191505090505b50905060005b82811015611753576117218582610d96565b82828151811061173457611733614446565b5b602002602001018181525050808061174b906144a4565b91505061170f565b508092505050919050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611816576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180d9061475b565b60405180910390fd5b6118208282612d26565b5050565b60606001805461183390614046565b80601f016020809104026020016040519081016040528092919081815260200182805461185f90614046565b80156118ac5780601f10611881576101008083540402835291602001916118ac565b820191906000526020600020905b81548152906001019060200180831161188f57829003601f168201915b5050505050905090565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006118e6611150565b15611926576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191d906147c7565b60405180910390fd5b6000601054141561196c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196390614833565b60405180910390fd5b600060115414156119b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a990614833565b60405180910390fd5b600954826119c09190614853565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663590a4d6a336040518263ffffffff1660e01b8152600401611a1b91906137fe565b602060405180830381865afa158015611a38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a5c9190614341565b1015611a9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a94906148f9565b60405180910390fd5b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663af7d6ca33360095485611aea9190614853565b6040518363ffffffff1660e01b8152600401611b07929190614919565b600060405180830381600087803b158015611b2157600080fd5b505af1158015611b35573d6000803e3d6000fd5b505050506000611b43610b98565b9050600080600090505b84811015611d0957611b698184611b649190614942565b612dbd565b600c60008386611b799190614942565b815260200190815260200160002060006101000a81548160ff0219169083151502179055506000339050611bb78285611bb29190614942565b612e0c565b15611cdc576000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166351c3d611600c60008689611c0c9190614942565b815260200190815260200160002060009054906101000a900460ff168588611c349190614942565b6040518363ffffffff1660e01b8152600401611c51929190614998565b6020604051808303816000875af1158015611c70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c9491906149d6565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611cda5783611cd4906144a4565b93508091505b505b611cf1818386611cec9190614942565b612e64565b60009050508080611d01906144a4565b915050611b4d565b50600091508092505050919050565b600c6020528060005260406000206000915054906101000a900460ff1681565b611d4061258e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611dae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da590614a4f565b60405180910390fd5b8060046000611dbb61258e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611e6861258e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ead9190613684565b60405180910390a35050565b606060008383905067ffffffffffffffff811115611eda57611ed9613999565b5b604051908082528060200260200182016040528015611f085781602001602082028036833780820191505090505b50905060005b84849050811015611fea57611f3b858583818110611f2f57611f2e614446565b5b90506020020135612506565b611f7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7190614abb565b60405180910390fd5b600c6000868684818110611f9157611f90614446565b5b90506020020135815260200190815260200160002060009054906101000a900460ff16828281518110611fc757611fc6614446565b5b60200260200101901515908115158152505080611fe3906144a4565b9050611f0e565b508091505092915050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61202c61202661258e565b8361264f565b61206b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612062906142a0565b60405180910390fd5b61207784848484612e82565b50505050565b606061208882612506565b6120c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120be90614b4d565b60405180910390fd5b60006120d1612ede565b905060008151116120f1576040518060200160405280600081525061211c565b806120fb84612f70565b60405160200161210c929190614bf5565b6040516020818303038152906040525b915050919050565b61212c61258e565b73ffffffffffffffffffffffffffffffffffffffff1661214a61175e565b73ffffffffffffffffffffffffffffffffffffffff16146121a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121979061430c565b60405180910390fd5b60006121aa610b98565b90506000821180156121be57506008548211155b6121fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f490614c70565b60405180910390fd5b60005b828110156122795761221c81836122179190614942565b612dbd565b600c6000838561222c9190614942565b815260200190815260200160002060006101000a81548160ff0219169083151502179055506122668482846122619190614942565b612e64565b8080612271906144a4565b915050612200565b50816008600082825461228c9190614c90565b92505081905550505050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61233461258e565b73ffffffffffffffffffffffffffffffffffffffff1661235261175e565b73ffffffffffffffffffffffffffffffffffffffff16146123a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239f9061430c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612418576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240f90614d36565b60405180910390fd5b61242181612bbd565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806124ef57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806124ff57506124fe826130d1565b5b9050919050565b6000600280549050821080156125875750600073ffffffffffffffffffffffffffffffffffffffff166002838154811061254357612542614446565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b600033905090565b816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661260983611227565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061265a82612506565b612699576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269090614dc8565b60405180910390fd5b60006126a483611227565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061271357508373ffffffffffffffffffffffffffffffffffffffff166126fb846109fb565b73ffffffffffffffffffffffffffffffffffffffff16145b8061272457506127238185612298565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661274d82611227565b73ffffffffffffffffffffffffffffffffffffffff16146127a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279a90614e5a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612813576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280a90614eec565b60405180910390fd5b61281e83838361313b565b612829600082612596565b816002828154811061283e5761283d614446565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16634000aea07f00000000000000000000000000000000000000000000000000000000000000008486600060405160200161295a929190614f0c565b6040516020818303038152906040526040518463ffffffff1660e01b815260040161298793929190614f8a565b6020604051808303816000875af11580156129a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129ca9190614fdd565b5060006129ed846000306006600089815260200190815260200160002054613140565b905060016006600086815260200190815260200160002054612a0f9190614942565b6006600086815260200190815260200160002081905550612a30848261317c565b91505092915050565b612a41611150565b612a80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7790615056565b60405180910390fd5b6000600760006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612ac461258e565b604051612ad191906137fe565b60405180910390a1565b6000612ae682611227565b9050612af48160008461313b565b612aff600083612596565b600060028381548110612b1557612b14614446565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612c8b611150565b15612ccb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cc2906147c7565b60405180910390fd5b6001600760006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612d0f61258e565b604051612d1c91906137fe565b60405180910390a1565b601254821415612d7157806010819055507f8285849ac2f8c43fa9e5558aff7636443132b0b98389868b53f89b3983c79545604051612d64906150c2565b60405180910390a1612db9565b601354821415612db857806011819055507f8285849ac2f8c43fa9e5558aff7636443132b0b98389868b53f89b3983c79545604051612daf9061512e565b60405180910390a15b5b5050565b60006001806011548432600143612dd49190614c90565b4042604051602001612dea9594939291906151d8565b6040516020818303038152906040528051906020012060001c16149050919050565b60008060056010548432600143612e239190614c90565b4042604051602001612e399594939291906151d8565b6040516020818303038152906040528051906020012060001c612e5c9190615266565b149050919050565b612e7e8282604051806020016040528060008152506131af565b5050565b612e8d84848461272d565b612e998484848461320a565b612ed8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ecf90615309565b60405180910390fd5b50505050565b6060600d8054612eed90614046565b80601f0160208091040260200160405190810160405280929190818152602001828054612f1990614046565b8015612f665780601f10612f3b57610100808354040283529160200191612f66565b820191906000526020600020905b815481529060010190602001808311612f4957829003601f168201915b5050505050905090565b60606000821415612fb8576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506130cc565b600082905060005b60008214612fea578080612fd3906144a4565b915050600a82612fe39190615329565b9150612fc0565b60008167ffffffffffffffff81111561300657613005613999565b5b6040519080825280601f01601f1916602001820160405280156130385781602001600182028036833780820191505090505b5090505b600085146130c5576001826130519190614c90565b9150600a856130609190615266565b603061306c9190614942565b60f81b81838151811061308257613081614446565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856130be9190615329565b945061303c565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b600084848484604051602001613159949392919061535a565b6040516020818303038152906040528051906020012060001c9050949350505050565b6000828260405160200161319192919061539f565b60405160208183030381529060405280519060200120905092915050565b6131b98383613392565b6131c6600084848461320a565b613205576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131fc90615309565b60405180910390fd5b505050565b600061322b8473ffffffffffffffffffffffffffffffffffffffff1661351a565b15613385578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261325461258e565b8786866040518563ffffffff1660e01b815260040161327694939291906153cb565b6020604051808303816000875af19250505080156132b257506040513d601f19601f820116820180604052508101906132af919061542c565b60015b613335573d80600081146132e2576040519150601f19603f3d011682016040523d82523d6000602084013e6132e7565b606091505b5060008151141561332d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161332490615309565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061338a565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613402576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133f9906154a5565b60405180910390fd5b61340b81612506565b1561344b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161344290615511565b60405180910390fd5b6134576000838361313b565b6002829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b82805461353990614046565b90600052602060002090601f01602090048101928261355b57600085556135a2565b82601f1061357457805160ff19168380011785556135a2565b828001600101855582156135a2579182015b828111156135a1578251825591602001919060010190613586565b5b5090506135af91906135b3565b5090565b5b808211156135cc5760008160009055506001016135b4565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613619816135e4565b811461362457600080fd5b50565b60008135905061363681613610565b92915050565b600060208284031215613652576136516135da565b5b600061366084828501613627565b91505092915050565b60008115159050919050565b61367e81613669565b82525050565b60006020820190506136996000830184613675565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156136d95780820151818401526020810190506136be565b838111156136e8576000848401525b50505050565b6000601f19601f8301169050919050565b600061370a8261369f565b61371481856136aa565b93506137248185602086016136bb565b61372d816136ee565b840191505092915050565b6000602082019050818103600083015261375281846136ff565b905092915050565b6000819050919050565b61376d8161375a565b811461377857600080fd5b50565b60008135905061378a81613764565b92915050565b6000602082840312156137a6576137a56135da565b5b60006137b48482850161377b565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006137e8826137bd565b9050919050565b6137f8816137dd565b82525050565b600060208201905061381360008301846137ef565b92915050565b613822816137dd565b811461382d57600080fd5b50565b60008135905061383f81613819565b92915050565b6000806040838503121561385c5761385b6135da565b5b600061386a85828601613830565b925050602061387b8582860161377b565b9150509250929050565b61388e8161375a565b82525050565b60006020820190506138a96000830184613885565b92915050565b6000806000606084860312156138c8576138c76135da565b5b60006138d686828701613830565b93505060206138e786828701613830565b92505060406138f88682870161377b565b9150509250925092565b61390b81613669565b811461391657600080fd5b50565b60008135905061392881613902565b92915050565b600060208284031215613944576139436135da565b5b600061395284828501613919565b91505092915050565b6000819050919050565b61396e8161395b565b82525050565b60006020820190506139896000830184613965565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6139d1826136ee565b810181811067ffffffffffffffff821117156139f0576139ef613999565b5b80604052505050565b6000613a036135d0565b9050613a0f82826139c8565b919050565b600067ffffffffffffffff821115613a2f57613a2e613999565b5b613a38826136ee565b9050602081019050919050565b82818337600083830152505050565b6000613a67613a6284613a14565b6139f9565b905082815260208101848484011115613a8357613a82613994565b5b613a8e848285613a45565b509392505050565b600082601f830112613aab57613aaa61398f565b5b8135613abb848260208601613a54565b91505092915050565b600060208284031215613ada57613ad96135da565b5b600082013567ffffffffffffffff811115613af857613af76135df565b5b613b0484828501613a96565b91505092915050565b600060208284031215613b2357613b226135da565b5b6000613b3184828501613830565b91505092915050565b600080fd5b600080fd5b60008083601f840112613b5a57613b5961398f565b5b8235905067ffffffffffffffff811115613b7757613b76613b3a565b5b602083019150836020820283011115613b9357613b92613b3f565b5b9250929050565b600080600060408486031215613bb357613bb26135da565b5b600084013567ffffffffffffffff811115613bd157613bd06135df565b5b613bdd86828701613b44565b93509350506020613bf086828701613830565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613c2f8161375a565b82525050565b6000613c418383613c26565b60208301905092915050565b6000602082019050919050565b6000613c6582613bfa565b613c6f8185613c05565b9350613c7a83613c16565b8060005b83811015613cab578151613c928882613c35565b9750613c9d83613c4d565b925050600181019050613c7e565b5085935050505092915050565b60006020820190508181036000830152613cd28184613c5a565b905092915050565b613ce38161395b565b8114613cee57600080fd5b50565b600081359050613d0081613cda565b92915050565b60008060408385031215613d1d57613d1c6135da565b5b6000613d2b85828601613cf1565b9250506020613d3c8582860161377b565b9150509250929050565b60008060408385031215613d5d57613d5c6135da565b5b6000613d6b85828601613830565b9250506020613d7c85828601613919565b9150509250929050565b60008060208385031215613d9d57613d9c6135da565b5b600083013567ffffffffffffffff811115613dbb57613dba6135df565b5b613dc785828601613b44565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613e0881613669565b82525050565b6000613e1a8383613dff565b60208301905092915050565b6000602082019050919050565b6000613e3e82613dd3565b613e488185613dde565b9350613e5383613def565b8060005b83811015613e84578151613e6b8882613e0e565b9750613e7683613e26565b925050600181019050613e57565b5085935050505092915050565b60006020820190508181036000830152613eab8184613e33565b905092915050565b600067ffffffffffffffff821115613ece57613ecd613999565b5b613ed7826136ee565b9050602081019050919050565b6000613ef7613ef284613eb3565b6139f9565b905082815260208101848484011115613f1357613f12613994565b5b613f1e848285613a45565b509392505050565b600082601f830112613f3b57613f3a61398f565b5b8135613f4b848260208601613ee4565b91505092915050565b60008060008060808587031215613f6e57613f6d6135da565b5b6000613f7c87828801613830565b9450506020613f8d87828801613830565b9350506040613f9e8782880161377b565b925050606085013567ffffffffffffffff811115613fbf57613fbe6135df565b5b613fcb87828801613f26565b91505092959194509250565b60008060408385031215613fee57613fed6135da565b5b6000613ffc85828601613830565b925050602061400d85828601613830565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061405e57607f821691505b6020821081141561407257614071614017565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006140d4602c836136aa565b91506140df82614078565b604082019050919050565b60006020820190508181036000830152614103816140c7565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006141666021836136aa565b91506141718261410a565b604082019050919050565b6000602082019050818103600083015261419581614159565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b60006141f86038836136aa565b91506142038261419c565b604082019050919050565b60006020820190508181036000830152614227816141eb565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b600061428a6031836136aa565b91506142958261422e565b604082019050919050565b600060208201905081810360008301526142b98161427d565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006142f66020836136aa565b9150614301826142c0565b602082019050919050565b60006020820190508181036000830152614325816142e9565b9050919050565b60008151905061433b81613764565b92915050565b600060208284031215614357576143566135da565b5b60006143658482850161432c565b91505092915050565b7f4e6f7420656e6f756768204c494e4b0000000000000000000000000000000000600082015250565b60006143a4600f836136aa565b91506143af8261436e565b602082019050919050565b600060208201905081810360008301526143d381614397565b9050919050565b7f455243373231456e756d3a206f776e657220696f6f6200000000000000000000600082015250565b60006144106016836136aa565b915061441b826143da565b602082019050919050565b6000602082019050818103600083015261443f81614403565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006144af8261375a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156144e2576144e1614475565b5b600182019050919050565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b60006145496030836136aa565b9150614554826144ed565b604082019050919050565b600060208201905081810360008301526145788161453c565b9050919050565b7f455243373231456e756d3a20676c6f62616c20696f6f62000000000000000000600082015250565b60006145b56017836136aa565b91506145c08261457f565b602082019050919050565b600060208201905081810360008301526145e4816145a8565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006146476029836136aa565b9150614652826145eb565b604082019050919050565b600060208201905081810360008301526146768161463a565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b60006146d9602a836136aa565b91506146e48261467d565b604082019050919050565b60006020820190508181036000830152614708816146cc565b9050919050565b7f4f6e6c7920565246436f6f7264696e61746f722063616e2066756c66696c6c00600082015250565b6000614745601f836136aa565b91506147508261470f565b602082019050919050565b6000602082019050818103600083015261477481614738565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b60006147b16010836136aa565b91506147bc8261477b565b602082019050919050565b600060208201905081810360008301526147e0816147a4565b9050919050565b7f53656564206e6f74207365740000000000000000000000000000000000000000600082015250565b600061481d600c836136aa565b9150614828826147e7565b602082019050919050565b6000602082019050818103600083015261484c81614810565b9050919050565b600061485e8261375a565b91506148698361375a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156148a2576148a1614475565b5b828202905092915050565b7f4e4f5420454e4f55474800000000000000000000000000000000000000000000600082015250565b60006148e3600a836136aa565b91506148ee826148ad565b602082019050919050565b60006020820190508181036000830152614912816148d6565b9050919050565b600060408201905061492e60008301856137ef565b61493b6020830184613885565b9392505050565b600061494d8261375a565b91506149588361375a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561498d5761498c614475565b5b828201905092915050565b60006040820190506149ad6000830185613675565b6149ba6020830184613885565b9392505050565b6000815190506149d081613819565b92915050565b6000602082840312156149ec576149eb6135da565b5b60006149fa848285016149c1565b91505092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614a396019836136aa565b9150614a4482614a03565b602082019050919050565b60006020820190508181036000830152614a6881614a2c565b9050919050565b7f546f6b656e20646f65736e277420657869737400000000000000000000000000600082015250565b6000614aa56013836136aa565b9150614ab082614a6f565b602082019050919050565b60006020820190508181036000830152614ad481614a98565b9050919050565b7f4552433732314d657461646174613a204e6f6e6578697374656e7420746f6b6560008201527f6e00000000000000000000000000000000000000000000000000000000000000602082015250565b6000614b376021836136aa565b9150614b4282614adb565b604082019050919050565b60006020820190508181036000830152614b6681614b2a565b9050919050565b600081905092915050565b6000614b838261369f565b614b8d8185614b6d565b9350614b9d8185602086016136bb565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000614bdf600583614b6d565b9150614bea82614ba9565b600582019050919050565b6000614c018285614b78565b9150614c0d8284614b78565b9150614c1882614bd2565b91508190509392505050565b7f4e6f7420656e6f7567682072657365727665206c65667420666f72207465616d600082015250565b6000614c5a6020836136aa565b9150614c6582614c24565b602082019050919050565b60006020820190508181036000830152614c8981614c4d565b9050919050565b6000614c9b8261375a565b9150614ca68361375a565b925082821015614cb957614cb8614475565b5b828203905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614d206026836136aa565b9150614d2b82614cc4565b604082019050919050565b60006020820190508181036000830152614d4f81614d13565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614db2602c836136aa565b9150614dbd82614d56565b604082019050919050565b60006020820190508181036000830152614de181614da5565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b6000614e446029836136aa565b9150614e4f82614de8565b604082019050919050565b60006020820190508181036000830152614e7381614e37565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614ed66024836136aa565b9150614ee182614e7a565b604082019050919050565b60006020820190508181036000830152614f0581614ec9565b9050919050565b6000604082019050614f216000830185613965565b614f2e6020830184613885565b9392505050565b600081519050919050565b600082825260208201905092915050565b6000614f5c82614f35565b614f668185614f40565b9350614f768185602086016136bb565b614f7f816136ee565b840191505092915050565b6000606082019050614f9f60008301866137ef565b614fac6020830185613885565b8181036040830152614fbe8184614f51565b9050949350505050565b600081519050614fd781613902565b92915050565b600060208284031215614ff357614ff26135da565b5b600061500184828501614fc8565b91505092915050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b60006150406014836136aa565b915061504b8261500a565b602082019050919050565b6000602082019050818103600083015261506f81615033565b9050919050565b7f5269736b00000000000000000000000000000000000000000000000000000000600082015250565b60006150ac6004836136aa565b91506150b782615076565b602082019050919050565b600060208201905081810360008301526150db8161509f565b9050919050565b7f46616374696f6e00000000000000000000000000000000000000000000000000600082015250565b60006151186007836136aa565b9150615123826150e2565b602082019050919050565b600060208201905081810360008301526151478161510b565b9050919050565b6000819050919050565b6151696151648261375a565b61514e565b82525050565b60008160601b9050919050565b60006151878261516f565b9050919050565b60006151998261517c565b9050919050565b6151b16151ac826137dd565b61518e565b82525050565b6000819050919050565b6151d26151cd8261395b565b6151b7565b82525050565b60006151e48288615158565b6020820191506151f48287615158565b60208201915061520482866151a0565b60148201915061521482856151c1565b6020820191506152248284615158565b6020820191508190509695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006152718261375a565b915061527c8361375a565b92508261528c5761528b615237565b5b828206905092915050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006152f36032836136aa565b91506152fe82615297565b604082019050919050565b60006020820190508181036000830152615322816152e6565b9050919050565b60006153348261375a565b915061533f8361375a565b92508261534f5761534e615237565b5b828204905092915050565b600060808201905061536f6000830187613965565b61537c6020830186613885565b61538960408301856137ef565b6153966060830184613885565b95945050505050565b60006153ab82856151c1565b6020820191506153bb8284615158565b6020820191508190509392505050565b60006080820190506153e060008301876137ef565b6153ed60208301866137ef565b6153fa6040830185613885565b818103606083015261540c8184614f51565b905095945050505050565b60008151905061542681613610565b92915050565b600060208284031215615442576154416135da565b5b600061545084828501615417565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061548f6020836136aa565b915061549a82615459565b602082019050919050565b600060208201905081810360008301526154be81615482565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006154fb601c836136aa565b9150615506826154c5565b602082019050919050565b6000602082019050818103600083015261552a816154ee565b905091905056fea2646970667358221220dc7e657a2a4c2f44290abc7151b4458ce1e787d05a3101b9f3a9263aa5a6e55164736f6c634300080a003300000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000f0d54349addcf704f77ae15b96510dea15cb7952000000000000000000000000514910771af9ca656af840dff83e8264ecf986caaa77729d3466ca35ae8d28b3bbac7cc36a5031efdc430821c02bc31a238af4450000000000000000000000000000000000000000000000001bc16d674ec80000000000000000000000000000000000000000000000000000000000000000003e68747470733a2f2f73746f726167652e676f6f676c65617069732e636f6d2f626c6f6f642d736865642d62656172732f6d657461646174612d67656e312f0000

Deployed Bytecode

0x60806040526004361061021a5760003560e01c806370a0823111610123578063a0712d68116100ab578063b88d4fde1161006f578063b88d4fde146107fa578063c87b56dd14610823578063cc47a40b14610860578063e985e9c514610889578063f2fde38b146108c65761021a565b8063a0712d68146106fc578063a09ac5571461072c578063a22cb46514610769578063a6dbf79114610792578063ada670e7146107cf5761021a565b80638462151c116100f25780638462151c146106155780638da5cb5b1461065257806394985ddd1461067d57806395d89b41146106a65780639b355c20146106d15761021a565b806370a0823114610581578063715018a6146105be5780637f9a62dc146105d55780638456cb59146105fe5761021a565b806342842e0e116101a657806355f804b31161017557806355f804b31461048a5780635c975abb146104b35780635e089142146104de5780636352211e146105075780636f9bdf65146105445761021a565b806342842e0e146103d257806342966c68146103fb57806344a0d68a146104245780634f6ccce71461044d5761021a565b806318160ddd116101ed57806318160ddd146102ed57806323b872dd1461031857806324d10317146103415780632f745c591461037e5780633f4ba83a146103bb5761021a565b806301ffc9a71461021f57806306fdde031461025c578063081812fc14610287578063095ea7b3146102c4575b600080fd5b34801561022b57600080fd5b506102466004803603810190610241919061363c565b6108ef565b6040516102539190613684565b60405180910390f35b34801561026857600080fd5b50610271610969565b60405161027e9190613738565b60405180910390f35b34801561029357600080fd5b506102ae60048036038101906102a99190613790565b6109fb565b6040516102bb91906137fe565b60405180910390f35b3480156102d057600080fd5b506102eb60048036038101906102e69190613845565b610a80565b005b3480156102f957600080fd5b50610302610b98565b60405161030f9190613894565b60405180910390f35b34801561032457600080fd5b5061033f600480360381019061033a91906138af565b610ba5565b005b34801561034d57600080fd5b506103686004803603810190610363919061392e565b610c05565b6040516103759190613974565b60405180910390f35b34801561038a57600080fd5b506103a560048036038101906103a09190613845565b610d96565b6040516103b29190613894565b60405180910390f35b3480156103c757600080fd5b506103d0610edf565b005b3480156103de57600080fd5b506103f960048036038101906103f491906138af565b610f65565b005b34801561040757600080fd5b50610422600480360381019061041d9190613790565b610f85565b005b34801561043057600080fd5b5061044b60048036038101906104469190613790565b610fe1565b005b34801561045957600080fd5b50610474600480360381019061046f9190613790565b611067565b6040516104819190613894565b60405180910390f35b34801561049657600080fd5b506104b160048036038101906104ac9190613ac4565b6110ba565b005b3480156104bf57600080fd5b506104c8611150565b6040516104d59190613684565b60405180910390f35b3480156104ea57600080fd5b5061050560048036038101906105009190613b0d565b611167565b005b34801561051357600080fd5b5061052e60048036038101906105299190613790565b611227565b60405161053b91906137fe565b60405180910390f35b34801561055057600080fd5b5061056b60048036038101906105669190613b9a565b6112e4565b6040516105789190613684565b60405180910390f35b34801561058d57600080fd5b506105a860048036038101906105a39190613b0d565b611371565b6040516105b59190613894565b60405180910390f35b3480156105ca57600080fd5b506105d3611497565b005b3480156105e157600080fd5b506105fc60048036038101906105f79190613b0d565b61151f565b005b34801561060a57600080fd5b506106136115df565b005b34801561062157600080fd5b5061063c60048036038101906106379190613b0d565b611665565b6040516106499190613cb8565b60405180910390f35b34801561065e57600080fd5b5061066761175e565b60405161067491906137fe565b60405180910390f35b34801561068957600080fd5b506106a4600480360381019061069f9190613d06565b611788565b005b3480156106b257600080fd5b506106bb611824565b6040516106c89190613738565b60405180910390f35b3480156106dd57600080fd5b506106e66118b6565b6040516106f391906137fe565b60405180910390f35b61071660048036038101906107119190613790565b6118dc565b6040516107239190613894565b60405180910390f35b34801561073857600080fd5b50610753600480360381019061074e9190613790565b611d18565b6040516107609190613684565b60405180910390f35b34801561077557600080fd5b50610790600480360381019061078b9190613d46565b611d38565b005b34801561079e57600080fd5b506107b960048036038101906107b49190613d86565b611eb9565b6040516107c69190613e91565b60405180910390f35b3480156107db57600080fd5b506107e4611ff5565b6040516107f191906137fe565b60405180910390f35b34801561080657600080fd5b50610821600480360381019061081c9190613f54565b61201b565b005b34801561082f57600080fd5b5061084a60048036038101906108459190613790565b61207d565b6040516108579190613738565b60405180910390f35b34801561086c57600080fd5b5061088760048036038101906108829190613845565b612124565b005b34801561089557600080fd5b506108b060048036038101906108ab9190613fd7565b612298565b6040516108bd9190613684565b60405180910390f35b3480156108d257600080fd5b506108ed60048036038101906108e89190613b0d565b61232c565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610962575061096182612424565b5b9050919050565b60606000805461097890614046565b80601f01602080910402602001604051908101604052809291908181526020018280546109a490614046565b80156109f15780601f106109c6576101008083540402835291602001916109f1565b820191906000526020600020905b8154815290600101906020018083116109d457829003601f168201915b5050505050905090565b6000610a0682612506565b610a45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3c906140ea565b60405180910390fd5b6003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a8b82611227565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610afc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af39061417c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b1b61258e565b73ffffffffffffffffffffffffffffffffffffffff161480610b4a5750610b4981610b4461258e565b612298565b5b610b89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b809061420e565b60405180910390fd5b610b938383612596565b505050565b6000600280549050905090565b610bb6610bb061258e565b8261264f565b610bf5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bec906142a0565b60405180910390fd5b610c0083838361272d565b505050565b6000610c0f61258e565b73ffffffffffffffffffffffffffffffffffffffff16610c2d61175e565b73ffffffffffffffffffffffffffffffffffffffff1614610c83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7a9061430c565b60405180910390fd5b600e547f000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610cdf91906137fe565b602060405180830381865afa158015610cfc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d209190614341565b1015610d61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d58906143ba565b60405180910390fd5b6000610d71600f54600e546128e6565b90508215610d855780601281905550610d8d565b806013819055505b80915050919050565b6000610da183611371565b8210610de2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd990614426565b60405180910390fd5b6000805b600280549050811015610e955760028181548110610e0757610e06614446565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610e845783821415610e77578092505050610ed9565b81610e81906144a4565b91505b80610e8e906144a4565b9050610de6565b506000610ed7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ece90614426565b60405180910390fd5b505b92915050565b610ee761258e565b73ffffffffffffffffffffffffffffffffffffffff16610f0561175e565b73ffffffffffffffffffffffffffffffffffffffff1614610f5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f529061430c565b60405180910390fd5b610f63612a39565b565b610f808383836040518060200160405280600081525061201b565b505050565b610f96610f9061258e565b8261264f565b610fd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fcc9061455f565b60405180910390fd5b610fde81612adb565b50565b610fe961258e565b73ffffffffffffffffffffffffffffffffffffffff1661100761175e565b73ffffffffffffffffffffffffffffffffffffffff161461105d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110549061430c565b60405180910390fd5b8060098190555050565b6000611071610b98565b82106110b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a9906145cb565b60405180910390fd5b819050919050565b6110c261258e565b73ffffffffffffffffffffffffffffffffffffffff166110e061175e565b73ffffffffffffffffffffffffffffffffffffffff1614611136576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112d9061430c565b60405180910390fd5b80600d908051906020019061114c92919061352d565b5050565b6000600760009054906101000a900460ff16905090565b61116f61258e565b73ffffffffffffffffffffffffffffffffffffffff1661118d61175e565b73ffffffffffffffffffffffffffffffffffffffff16146111e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111da9061430c565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806002838154811061123e5761123d614446565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d29061465d565b60405180910390fd5b80915050919050565b6000806001905060005b858590508110156113655781801561135257508373ffffffffffffffffffffffffffffffffffffffff1661133a87878481811061132e5761132d614446565b5b90506020020135611227565b73ffffffffffffffffffffffffffffffffffffffff16145b91508061135e906144a4565b90506112ee565b50809150509392505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d9906146ef565b60405180910390fd5b600080600280549050905060005b81811015611488576002818154811061140c5761140b614446565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156114775782611474906144a4565b92505b80611481906144a4565b90506113f0565b50600090508192505050919050565b61149f61258e565b73ffffffffffffffffffffffffffffffffffffffff166114bd61175e565b73ffffffffffffffffffffffffffffffffffffffff1614611513576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150a9061430c565b60405180910390fd5b61151d6000612bbd565b565b61152761258e565b73ffffffffffffffffffffffffffffffffffffffff1661154561175e565b73ffffffffffffffffffffffffffffffffffffffff161461159b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115929061430c565b60405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6115e761258e565b73ffffffffffffffffffffffffffffffffffffffff1661160561175e565b73ffffffffffffffffffffffffffffffffffffffff161461165b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116529061430c565b60405180910390fd5b611663612c83565b565b606061167082611371565b6000106116b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a990614426565b60405180910390fd5b60006116bd83611371565b905060008167ffffffffffffffff8111156116db576116da613999565b5b6040519080825280602002602001820160405280156117095781602001602082028036833780820191505090505b50905060005b82811015611753576117218582610d96565b82828151811061173457611733614446565b5b602002602001018181525050808061174b906144a4565b91505061170f565b508092505050919050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b7f000000000000000000000000f0d54349addcf704f77ae15b96510dea15cb795273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611816576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180d9061475b565b60405180910390fd5b6118208282612d26565b5050565b60606001805461183390614046565b80601f016020809104026020016040519081016040528092919081815260200182805461185f90614046565b80156118ac5780601f10611881576101008083540402835291602001916118ac565b820191906000526020600020905b81548152906001019060200180831161188f57829003601f168201915b5050505050905090565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006118e6611150565b15611926576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191d906147c7565b60405180910390fd5b6000601054141561196c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196390614833565b60405180910390fd5b600060115414156119b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a990614833565b60405180910390fd5b600954826119c09190614853565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663590a4d6a336040518263ffffffff1660e01b8152600401611a1b91906137fe565b602060405180830381865afa158015611a38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a5c9190614341565b1015611a9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a94906148f9565b60405180910390fd5b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663af7d6ca33360095485611aea9190614853565b6040518363ffffffff1660e01b8152600401611b07929190614919565b600060405180830381600087803b158015611b2157600080fd5b505af1158015611b35573d6000803e3d6000fd5b505050506000611b43610b98565b9050600080600090505b84811015611d0957611b698184611b649190614942565b612dbd565b600c60008386611b799190614942565b815260200190815260200160002060006101000a81548160ff0219169083151502179055506000339050611bb78285611bb29190614942565b612e0c565b15611cdc576000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166351c3d611600c60008689611c0c9190614942565b815260200190815260200160002060009054906101000a900460ff168588611c349190614942565b6040518363ffffffff1660e01b8152600401611c51929190614998565b6020604051808303816000875af1158015611c70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c9491906149d6565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611cda5783611cd4906144a4565b93508091505b505b611cf1818386611cec9190614942565b612e64565b60009050508080611d01906144a4565b915050611b4d565b50600091508092505050919050565b600c6020528060005260406000206000915054906101000a900460ff1681565b611d4061258e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611dae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da590614a4f565b60405180910390fd5b8060046000611dbb61258e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611e6861258e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ead9190613684565b60405180910390a35050565b606060008383905067ffffffffffffffff811115611eda57611ed9613999565b5b604051908082528060200260200182016040528015611f085781602001602082028036833780820191505090505b50905060005b84849050811015611fea57611f3b858583818110611f2f57611f2e614446565b5b90506020020135612506565b611f7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7190614abb565b60405180910390fd5b600c6000868684818110611f9157611f90614446565b5b90506020020135815260200190815260200160002060009054906101000a900460ff16828281518110611fc757611fc6614446565b5b60200260200101901515908115158152505080611fe3906144a4565b9050611f0e565b508091505092915050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61202c61202661258e565b8361264f565b61206b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612062906142a0565b60405180910390fd5b61207784848484612e82565b50505050565b606061208882612506565b6120c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120be90614b4d565b60405180910390fd5b60006120d1612ede565b905060008151116120f1576040518060200160405280600081525061211c565b806120fb84612f70565b60405160200161210c929190614bf5565b6040516020818303038152906040525b915050919050565b61212c61258e565b73ffffffffffffffffffffffffffffffffffffffff1661214a61175e565b73ffffffffffffffffffffffffffffffffffffffff16146121a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121979061430c565b60405180910390fd5b60006121aa610b98565b90506000821180156121be57506008548211155b6121fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f490614c70565b60405180910390fd5b60005b828110156122795761221c81836122179190614942565b612dbd565b600c6000838561222c9190614942565b815260200190815260200160002060006101000a81548160ff0219169083151502179055506122668482846122619190614942565b612e64565b8080612271906144a4565b915050612200565b50816008600082825461228c9190614c90565b92505081905550505050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61233461258e565b73ffffffffffffffffffffffffffffffffffffffff1661235261175e565b73ffffffffffffffffffffffffffffffffffffffff16146123a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239f9061430c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612418576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240f90614d36565b60405180910390fd5b61242181612bbd565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806124ef57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806124ff57506124fe826130d1565b5b9050919050565b6000600280549050821080156125875750600073ffffffffffffffffffffffffffffffffffffffff166002838154811061254357612542614446565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b600033905090565b816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661260983611227565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061265a82612506565b612699576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269090614dc8565b60405180910390fd5b60006126a483611227565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061271357508373ffffffffffffffffffffffffffffffffffffffff166126fb846109fb565b73ffffffffffffffffffffffffffffffffffffffff16145b8061272457506127238185612298565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661274d82611227565b73ffffffffffffffffffffffffffffffffffffffff16146127a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279a90614e5a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612813576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280a90614eec565b60405180910390fd5b61281e83838361313b565b612829600082612596565b816002828154811061283e5761283d614446565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60007f000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca73ffffffffffffffffffffffffffffffffffffffff16634000aea07f000000000000000000000000f0d54349addcf704f77ae15b96510dea15cb79528486600060405160200161295a929190614f0c565b6040516020818303038152906040526040518463ffffffff1660e01b815260040161298793929190614f8a565b6020604051808303816000875af11580156129a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129ca9190614fdd565b5060006129ed846000306006600089815260200190815260200160002054613140565b905060016006600086815260200190815260200160002054612a0f9190614942565b6006600086815260200190815260200160002081905550612a30848261317c565b91505092915050565b612a41611150565b612a80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7790615056565b60405180910390fd5b6000600760006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612ac461258e565b604051612ad191906137fe565b60405180910390a1565b6000612ae682611227565b9050612af48160008461313b565b612aff600083612596565b600060028381548110612b1557612b14614446565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612c8b611150565b15612ccb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cc2906147c7565b60405180910390fd5b6001600760006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612d0f61258e565b604051612d1c91906137fe565b60405180910390a1565b601254821415612d7157806010819055507f8285849ac2f8c43fa9e5558aff7636443132b0b98389868b53f89b3983c79545604051612d64906150c2565b60405180910390a1612db9565b601354821415612db857806011819055507f8285849ac2f8c43fa9e5558aff7636443132b0b98389868b53f89b3983c79545604051612daf9061512e565b60405180910390a15b5b5050565b60006001806011548432600143612dd49190614c90565b4042604051602001612dea9594939291906151d8565b6040516020818303038152906040528051906020012060001c16149050919050565b60008060056010548432600143612e239190614c90565b4042604051602001612e399594939291906151d8565b6040516020818303038152906040528051906020012060001c612e5c9190615266565b149050919050565b612e7e8282604051806020016040528060008152506131af565b5050565b612e8d84848461272d565b612e998484848461320a565b612ed8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ecf90615309565b60405180910390fd5b50505050565b6060600d8054612eed90614046565b80601f0160208091040260200160405190810160405280929190818152602001828054612f1990614046565b8015612f665780601f10612f3b57610100808354040283529160200191612f66565b820191906000526020600020905b815481529060010190602001808311612f4957829003601f168201915b5050505050905090565b60606000821415612fb8576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506130cc565b600082905060005b60008214612fea578080612fd3906144a4565b915050600a82612fe39190615329565b9150612fc0565b60008167ffffffffffffffff81111561300657613005613999565b5b6040519080825280601f01601f1916602001820160405280156130385781602001600182028036833780820191505090505b5090505b600085146130c5576001826130519190614c90565b9150600a856130609190615266565b603061306c9190614942565b60f81b81838151811061308257613081614446565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856130be9190615329565b945061303c565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b600084848484604051602001613159949392919061535a565b6040516020818303038152906040528051906020012060001c9050949350505050565b6000828260405160200161319192919061539f565b60405160208183030381529060405280519060200120905092915050565b6131b98383613392565b6131c6600084848461320a565b613205576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131fc90615309565b60405180910390fd5b505050565b600061322b8473ffffffffffffffffffffffffffffffffffffffff1661351a565b15613385578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261325461258e565b8786866040518563ffffffff1660e01b815260040161327694939291906153cb565b6020604051808303816000875af19250505080156132b257506040513d601f19601f820116820180604052508101906132af919061542c565b60015b613335573d80600081146132e2576040519150601f19603f3d011682016040523d82523d6000602084013e6132e7565b606091505b5060008151141561332d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161332490615309565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061338a565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613402576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133f9906154a5565b60405180910390fd5b61340b81612506565b1561344b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161344290615511565b60405180910390fd5b6134576000838361313b565b6002829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b82805461353990614046565b90600052602060002090601f01602090048101928261355b57600085556135a2565b82601f1061357457805160ff19168380011785556135a2565b828001600101855582156135a2579182015b828111156135a1578251825591602001919060010190613586565b5b5090506135af91906135b3565b5090565b5b808211156135cc5760008160009055506001016135b4565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613619816135e4565b811461362457600080fd5b50565b60008135905061363681613610565b92915050565b600060208284031215613652576136516135da565b5b600061366084828501613627565b91505092915050565b60008115159050919050565b61367e81613669565b82525050565b60006020820190506136996000830184613675565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156136d95780820151818401526020810190506136be565b838111156136e8576000848401525b50505050565b6000601f19601f8301169050919050565b600061370a8261369f565b61371481856136aa565b93506137248185602086016136bb565b61372d816136ee565b840191505092915050565b6000602082019050818103600083015261375281846136ff565b905092915050565b6000819050919050565b61376d8161375a565b811461377857600080fd5b50565b60008135905061378a81613764565b92915050565b6000602082840312156137a6576137a56135da565b5b60006137b48482850161377b565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006137e8826137bd565b9050919050565b6137f8816137dd565b82525050565b600060208201905061381360008301846137ef565b92915050565b613822816137dd565b811461382d57600080fd5b50565b60008135905061383f81613819565b92915050565b6000806040838503121561385c5761385b6135da565b5b600061386a85828601613830565b925050602061387b8582860161377b565b9150509250929050565b61388e8161375a565b82525050565b60006020820190506138a96000830184613885565b92915050565b6000806000606084860312156138c8576138c76135da565b5b60006138d686828701613830565b93505060206138e786828701613830565b92505060406138f88682870161377b565b9150509250925092565b61390b81613669565b811461391657600080fd5b50565b60008135905061392881613902565b92915050565b600060208284031215613944576139436135da565b5b600061395284828501613919565b91505092915050565b6000819050919050565b61396e8161395b565b82525050565b60006020820190506139896000830184613965565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6139d1826136ee565b810181811067ffffffffffffffff821117156139f0576139ef613999565b5b80604052505050565b6000613a036135d0565b9050613a0f82826139c8565b919050565b600067ffffffffffffffff821115613a2f57613a2e613999565b5b613a38826136ee565b9050602081019050919050565b82818337600083830152505050565b6000613a67613a6284613a14565b6139f9565b905082815260208101848484011115613a8357613a82613994565b5b613a8e848285613a45565b509392505050565b600082601f830112613aab57613aaa61398f565b5b8135613abb848260208601613a54565b91505092915050565b600060208284031215613ada57613ad96135da565b5b600082013567ffffffffffffffff811115613af857613af76135df565b5b613b0484828501613a96565b91505092915050565b600060208284031215613b2357613b226135da565b5b6000613b3184828501613830565b91505092915050565b600080fd5b600080fd5b60008083601f840112613b5a57613b5961398f565b5b8235905067ffffffffffffffff811115613b7757613b76613b3a565b5b602083019150836020820283011115613b9357613b92613b3f565b5b9250929050565b600080600060408486031215613bb357613bb26135da565b5b600084013567ffffffffffffffff811115613bd157613bd06135df565b5b613bdd86828701613b44565b93509350506020613bf086828701613830565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613c2f8161375a565b82525050565b6000613c418383613c26565b60208301905092915050565b6000602082019050919050565b6000613c6582613bfa565b613c6f8185613c05565b9350613c7a83613c16565b8060005b83811015613cab578151613c928882613c35565b9750613c9d83613c4d565b925050600181019050613c7e565b5085935050505092915050565b60006020820190508181036000830152613cd28184613c5a565b905092915050565b613ce38161395b565b8114613cee57600080fd5b50565b600081359050613d0081613cda565b92915050565b60008060408385031215613d1d57613d1c6135da565b5b6000613d2b85828601613cf1565b9250506020613d3c8582860161377b565b9150509250929050565b60008060408385031215613d5d57613d5c6135da565b5b6000613d6b85828601613830565b9250506020613d7c85828601613919565b9150509250929050565b60008060208385031215613d9d57613d9c6135da565b5b600083013567ffffffffffffffff811115613dbb57613dba6135df565b5b613dc785828601613b44565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613e0881613669565b82525050565b6000613e1a8383613dff565b60208301905092915050565b6000602082019050919050565b6000613e3e82613dd3565b613e488185613dde565b9350613e5383613def565b8060005b83811015613e84578151613e6b8882613e0e565b9750613e7683613e26565b925050600181019050613e57565b5085935050505092915050565b60006020820190508181036000830152613eab8184613e33565b905092915050565b600067ffffffffffffffff821115613ece57613ecd613999565b5b613ed7826136ee565b9050602081019050919050565b6000613ef7613ef284613eb3565b6139f9565b905082815260208101848484011115613f1357613f12613994565b5b613f1e848285613a45565b509392505050565b600082601f830112613f3b57613f3a61398f565b5b8135613f4b848260208601613ee4565b91505092915050565b60008060008060808587031215613f6e57613f6d6135da565b5b6000613f7c87828801613830565b9450506020613f8d87828801613830565b9350506040613f9e8782880161377b565b925050606085013567ffffffffffffffff811115613fbf57613fbe6135df565b5b613fcb87828801613f26565b91505092959194509250565b60008060408385031215613fee57613fed6135da565b5b6000613ffc85828601613830565b925050602061400d85828601613830565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061405e57607f821691505b6020821081141561407257614071614017565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006140d4602c836136aa565b91506140df82614078565b604082019050919050565b60006020820190508181036000830152614103816140c7565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006141666021836136aa565b91506141718261410a565b604082019050919050565b6000602082019050818103600083015261419581614159565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b60006141f86038836136aa565b91506142038261419c565b604082019050919050565b60006020820190508181036000830152614227816141eb565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b600061428a6031836136aa565b91506142958261422e565b604082019050919050565b600060208201905081810360008301526142b98161427d565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006142f66020836136aa565b9150614301826142c0565b602082019050919050565b60006020820190508181036000830152614325816142e9565b9050919050565b60008151905061433b81613764565b92915050565b600060208284031215614357576143566135da565b5b60006143658482850161432c565b91505092915050565b7f4e6f7420656e6f756768204c494e4b0000000000000000000000000000000000600082015250565b60006143a4600f836136aa565b91506143af8261436e565b602082019050919050565b600060208201905081810360008301526143d381614397565b9050919050565b7f455243373231456e756d3a206f776e657220696f6f6200000000000000000000600082015250565b60006144106016836136aa565b915061441b826143da565b602082019050919050565b6000602082019050818103600083015261443f81614403565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006144af8261375a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156144e2576144e1614475565b5b600182019050919050565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b60006145496030836136aa565b9150614554826144ed565b604082019050919050565b600060208201905081810360008301526145788161453c565b9050919050565b7f455243373231456e756d3a20676c6f62616c20696f6f62000000000000000000600082015250565b60006145b56017836136aa565b91506145c08261457f565b602082019050919050565b600060208201905081810360008301526145e4816145a8565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006146476029836136aa565b9150614652826145eb565b604082019050919050565b600060208201905081810360008301526146768161463a565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b60006146d9602a836136aa565b91506146e48261467d565b604082019050919050565b60006020820190508181036000830152614708816146cc565b9050919050565b7f4f6e6c7920565246436f6f7264696e61746f722063616e2066756c66696c6c00600082015250565b6000614745601f836136aa565b91506147508261470f565b602082019050919050565b6000602082019050818103600083015261477481614738565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b60006147b16010836136aa565b91506147bc8261477b565b602082019050919050565b600060208201905081810360008301526147e0816147a4565b9050919050565b7f53656564206e6f74207365740000000000000000000000000000000000000000600082015250565b600061481d600c836136aa565b9150614828826147e7565b602082019050919050565b6000602082019050818103600083015261484c81614810565b9050919050565b600061485e8261375a565b91506148698361375a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156148a2576148a1614475565b5b828202905092915050565b7f4e4f5420454e4f55474800000000000000000000000000000000000000000000600082015250565b60006148e3600a836136aa565b91506148ee826148ad565b602082019050919050565b60006020820190508181036000830152614912816148d6565b9050919050565b600060408201905061492e60008301856137ef565b61493b6020830184613885565b9392505050565b600061494d8261375a565b91506149588361375a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561498d5761498c614475565b5b828201905092915050565b60006040820190506149ad6000830185613675565b6149ba6020830184613885565b9392505050565b6000815190506149d081613819565b92915050565b6000602082840312156149ec576149eb6135da565b5b60006149fa848285016149c1565b91505092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614a396019836136aa565b9150614a4482614a03565b602082019050919050565b60006020820190508181036000830152614a6881614a2c565b9050919050565b7f546f6b656e20646f65736e277420657869737400000000000000000000000000600082015250565b6000614aa56013836136aa565b9150614ab082614a6f565b602082019050919050565b60006020820190508181036000830152614ad481614a98565b9050919050565b7f4552433732314d657461646174613a204e6f6e6578697374656e7420746f6b6560008201527f6e00000000000000000000000000000000000000000000000000000000000000602082015250565b6000614b376021836136aa565b9150614b4282614adb565b604082019050919050565b60006020820190508181036000830152614b6681614b2a565b9050919050565b600081905092915050565b6000614b838261369f565b614b8d8185614b6d565b9350614b9d8185602086016136bb565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000614bdf600583614b6d565b9150614bea82614ba9565b600582019050919050565b6000614c018285614b78565b9150614c0d8284614b78565b9150614c1882614bd2565b91508190509392505050565b7f4e6f7420656e6f7567682072657365727665206c65667420666f72207465616d600082015250565b6000614c5a6020836136aa565b9150614c6582614c24565b602082019050919050565b60006020820190508181036000830152614c8981614c4d565b9050919050565b6000614c9b8261375a565b9150614ca68361375a565b925082821015614cb957614cb8614475565b5b828203905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614d206026836136aa565b9150614d2b82614cc4565b604082019050919050565b60006020820190508181036000830152614d4f81614d13565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614db2602c836136aa565b9150614dbd82614d56565b604082019050919050565b60006020820190508181036000830152614de181614da5565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b6000614e446029836136aa565b9150614e4f82614de8565b604082019050919050565b60006020820190508181036000830152614e7381614e37565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614ed66024836136aa565b9150614ee182614e7a565b604082019050919050565b60006020820190508181036000830152614f0581614ec9565b9050919050565b6000604082019050614f216000830185613965565b614f2e6020830184613885565b9392505050565b600081519050919050565b600082825260208201905092915050565b6000614f5c82614f35565b614f668185614f40565b9350614f768185602086016136bb565b614f7f816136ee565b840191505092915050565b6000606082019050614f9f60008301866137ef565b614fac6020830185613885565b8181036040830152614fbe8184614f51565b9050949350505050565b600081519050614fd781613902565b92915050565b600060208284031215614ff357614ff26135da565b5b600061500184828501614fc8565b91505092915050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b60006150406014836136aa565b915061504b8261500a565b602082019050919050565b6000602082019050818103600083015261506f81615033565b9050919050565b7f5269736b00000000000000000000000000000000000000000000000000000000600082015250565b60006150ac6004836136aa565b91506150b782615076565b602082019050919050565b600060208201905081810360008301526150db8161509f565b9050919050565b7f46616374696f6e00000000000000000000000000000000000000000000000000600082015250565b60006151186007836136aa565b9150615123826150e2565b602082019050919050565b600060208201905081810360008301526151478161510b565b9050919050565b6000819050919050565b6151696151648261375a565b61514e565b82525050565b60008160601b9050919050565b60006151878261516f565b9050919050565b60006151998261517c565b9050919050565b6151b16151ac826137dd565b61518e565b82525050565b6000819050919050565b6151d26151cd8261395b565b6151b7565b82525050565b60006151e48288615158565b6020820191506151f48287615158565b60208201915061520482866151a0565b60148201915061521482856151c1565b6020820191506152248284615158565b6020820191508190509695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006152718261375a565b915061527c8361375a565b92508261528c5761528b615237565b5b828206905092915050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006152f36032836136aa565b91506152fe82615297565b604082019050919050565b60006020820190508181036000830152615322816152e6565b9050919050565b60006153348261375a565b915061533f8361375a565b92508261534f5761534e615237565b5b828204905092915050565b600060808201905061536f6000830187613965565b61537c6020830186613885565b61538960408301856137ef565b6153966060830184613885565b95945050505050565b60006153ab82856151c1565b6020820191506153bb8284615158565b6020820191508190509392505050565b60006080820190506153e060008301876137ef565b6153ed60208301866137ef565b6153fa6040830185613885565b818103606083015261540c8184614f51565b905095945050505050565b60008151905061542681613610565b92915050565b600060208284031215615442576154416135da565b5b600061545084828501615417565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061548f6020836136aa565b915061549a82615459565b602082019050919050565b600060208201905081810360008301526154be81615482565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006154fb601c836136aa565b9150615506826154c5565b602082019050919050565b6000602082019050818103600083015261552a816154ee565b905091905056fea2646970667358221220dc7e657a2a4c2f44290abc7151b4458ce1e787d05a3101b9f3a9263aa5a6e55164736f6c634300080a0033

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

00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000f0d54349addcf704f77ae15b96510dea15cb7952000000000000000000000000514910771af9ca656af840dff83e8264ecf986caaa77729d3466ca35ae8d28b3bbac7cc36a5031efdc430821c02bc31a238af4450000000000000000000000000000000000000000000000001bc16d674ec80000000000000000000000000000000000000000000000000000000000000000003e68747470733a2f2f73746f726167652e676f6f676c65617069732e636f6d2f626c6f6f642d736865642d62656172732f6d657461646174612d67656e312f0000

-----Decoded View---------------
Arg [0] : initBaseURI_ (string): https://storage.googleapis.com/blood-shed-bears/metadata-gen1/
Arg [1] : vrfCoordinatorAddr_ (address): 0xf0d54349aDdcf704F77AE15b96510dEA15cb7952
Arg [2] : linkTokenAddr_ (address): 0x514910771AF9Ca656af840dff83E8264EcF986CA
Arg [3] : vrfKeyHash_ (bytes32): 0xaa77729d3466ca35ae8d28b3bbac7cc36a5031efdc430821c02bc31a238af445
Arg [4] : fee_ (uint256): 2000000000000000000

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 000000000000000000000000f0d54349addcf704f77ae15b96510dea15cb7952
Arg [2] : 000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca
Arg [3] : aa77729d3466ca35ae8d28b3bbac7cc36a5031efdc430821c02bc31a238af445
Arg [4] : 0000000000000000000000000000000000000000000000001bc16d674ec80000
Arg [5] : 000000000000000000000000000000000000000000000000000000000000003e
Arg [6] : 68747470733a2f2f73746f726167652e676f6f676c65617069732e636f6d2f62
Arg [7] : 6c6f6f642d736865642d62656172732f6d657461646174612d67656e312f0000


Deployed Bytecode Sourcemap

50149:6272:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33335:225;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26796:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27430:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27012:412;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34496:110;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28128:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55121:396;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33566:500;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55961:65;;;;;;;;;;;;;:::i;:::-;;28473:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32982:245;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51747:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34612:194;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53882:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48634:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51609:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26551:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53994:316;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26123:422;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3199:94;;;;;;;;;;;;;:::i;:::-;;51469:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55892:61;;;;;;;;;;;;;:::i;:::-;;34072:418;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2548:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47397:220;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26902:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50433:78;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51843:1152;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50604:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27657:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56034:382;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50518:77;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28664:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53003:353;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53364:510;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27958:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3448:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33335:225;33438:4;33477:35;33462:50;;;:11;:50;;;;:90;;;;33516:36;33540:11;33516:23;:36::i;:::-;33462:90;33455:97;;33335:225;;;:::o;26796:100::-;26850:13;26883:5;26876:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26796:100;:::o;27430:221::-;27506:7;27534:16;27542:7;27534;:16::i;:::-;27526:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27619:15;:24;27635:7;27619:24;;;;;;;;;;;;;;;;;;;;;27612:31;;27430:221;;;:::o;27012:412::-;27093:13;27109:24;27125:7;27109:15;:24::i;:::-;27093:40;;27158:5;27152:11;;:2;:11;;;;27144:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;27252:5;27236:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;27261:37;27278:5;27285:12;:10;:12::i;:::-;27261:16;:37::i;:::-;27236:62;27214:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;27395:21;27404:2;27408:7;27395:8;:21::i;:::-;27082:342;27012:412;;:::o;34496:110::-;34557:7;34584;:14;;;;34577:21;;34496:110;:::o;28128:339::-;28323:41;28342:12;:10;:12::i;:::-;28356:7;28323:18;:41::i;:::-;28315:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28431:28;28441:4;28447:2;28451:7;28431:9;:28::i;:::-;28128:339;;;:::o;55121:396::-;55190:7;2779:12;:10;:12::i;:::-;2768:23;;:7;:5;:7::i;:::-;:23;;;2760:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55251:6:::1;;55218:4;:14;;;55241:4;55218:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:39;;55210:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;55288:17;55308:37;55326:10;;55338:6;;55308:17;:37::i;:::-;55288:57;;55360:8;55356:127;;;55401:9;55385:13;:25;;;;55356:127;;;55462:9;55443:16;:28;;;;55356:127;55500:9;55493:16;;;55121:396:::0;;;:::o;33566:500::-;33655:15;33699:24;33717:5;33699:17;:24::i;:::-;33691:5;:32;33683:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;33761:10;33787:6;33782:226;33799:7;:14;;;;33795:1;:18;33782:226;;;33848:7;33856:1;33848:10;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;33839:19;;:5;:19;;;33835:162;;;33892:5;33883;:14;33879:102;;;33928:1;33921:8;;;;;;33879:102;33974:7;;;;:::i;:::-;;;33835:162;33815:3;;;;:::i;:::-;;;33782:226;;;;34026:5;34018:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;33672:394;33566:500;;;;;:::o;55961:65::-;2779:12;:10;:12::i;:::-;2768:23;;:7;:5;:7::i;:::-;:23;;;2760:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56008:10:::1;:8;:10::i;:::-;55961:65::o:0;28473:185::-;28611:39;28628:4;28634:2;28638:7;28611:39;;;;;;;;;;;;:16;:39::i;:::-;28473:185;;;:::o;32982:245::-;33100:41;33119:12;:10;:12::i;:::-;33133:7;33100:18;:41::i;:::-;33092:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;33205:14;33211:7;33205:5;:14::i;:::-;32982:245;:::o;51747:88::-;2779:12;:10;:12::i;:::-;2768:23;;:7;:5;:7::i;:::-;:23;;;2760:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51819:8:::1;51812:4;:15;;;;51747:88:::0;:::o;34612:194::-;34687:7;34723:24;:22;:24::i;:::-;34715:5;:32;34707:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34793:5;34786:12;;34612:194;;;:::o;53882:104::-;2779:12;:10;:12::i;:::-;2768:23;;:7;:5;:7::i;:::-;:23;;;2760:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53967:11:::1;53957:7;:21;;;;;;;;;;;;:::i;:::-;;53882:104:::0;:::o;48634:86::-;48681:4;48705:7;;;;;;;;;;;48698:14;;48634:86;:::o;51609:130::-;2779:12;:10;:12::i;:::-;2768:23;;:7;:5;:7::i;:::-;:23;;;2760:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51715:16:::1;51695:17;;:36;;;;;;;;;;;;;;;;;;51609:130:::0;:::o;26551:239::-;26623:7;26643:13;26659:7;26667;26659:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;26643:32;;26711:1;26694:19;;:5;:19;;;;26686:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26777:5;26770:12;;;26551:239;;;:::o;53994:316::-;54089:4;54106:14;54123:4;54106:21;;54145:9;54140:134;54164:9;;:16;;54160:1;:20;54140:134;;;54214:9;:48;;;;;54253:8;54228:33;;:21;54236:9;;54246:1;54236:12;;;;;;;:::i;:::-;;;;;;;;54228:7;:21::i;:::-;:33;;;54214:48;54202:60;;54182:3;;;;:::i;:::-;;;54140:134;;;;54293:9;54286:16;;;53994:316;;;;;:::o;26123:422::-;26195:7;26240:1;26223:19;;:5;:19;;;;26215:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;26300:10;26325:11;26339:7;:14;;;;26325:28;;26369:6;26364:127;26385:6;26381:1;:10;26364:127;;;26426:7;26434:1;26426:10;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;26417:19;;:5;:19;;;26413:67;;;26457:7;;;;:::i;:::-;;;26413:67;26393:3;;;;:::i;:::-;;;26364:127;;;;26501:13;;;26532:5;26525:12;;;;26123:422;;;:::o;3199:94::-;2779:12;:10;:12::i;:::-;2768:23;;:7;:5;:7::i;:::-;:23;;;2760:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3264:21:::1;3282:1;3264:9;:21::i;:::-;3199:94::o:0;51469:132::-;2779:12;:10;:12::i;:::-;2768:23;;:7;:5;:7::i;:::-;:23;;;2760:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51577:16:::1;51556:18;;:37;;;;;;;;;;;;;;;;;;51469:132:::0;:::o;55892:61::-;2779:12;:10;:12::i;:::-;2768:23;;:7;:5;:7::i;:::-;:23;;;2760:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55937:8:::1;:6;:8::i;:::-;55892:61::o:0;34072:418::-;34131:16;34172:24;34190:5;34172:17;:24::i;:::-;34168:1;:28;34160:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;34234:18;34255:16;34265:5;34255:9;:16::i;:::-;34234:37;;34282:25;34324:10;34310:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34282:53;;34351:9;34346:111;34370:10;34366:1;:14;34346:111;;;34416:29;34436:5;34443:1;34416:19;:29::i;:::-;34402:8;34411:1;34402:11;;;;;;;;:::i;:::-;;;;;;;:43;;;;;34382:3;;;;;:::i;:::-;;;;34346:111;;;;34474:8;34467:15;;;;34072:418;;;:::o;2548:87::-;2594:7;2621:6;;;;;;;;;;;2614:13;;2548:87;:::o;47397:220::-;47508:14;47494:28;;:10;:28;;;47486:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;47569:40;47587:9;47598:10;47569:17;:40::i;:::-;47397:220;;:::o;26902:104::-;26958:13;26991:7;26984:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26902:104;:::o;50433:78::-;;;;;;;;;;;;;:::o;51843:1152::-;51918:7;48960:8;:6;:8::i;:::-;48959:9;48951:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;51960:1:::1;51948:8;;:13;;51940:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;52012:1;51997:11;;:16;;51989:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;52136:4;;52122:11;:18;;;;:::i;:::-;52071;;;;;;;;;;;52051:55;;;52107:10;52051:67;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:89;;52043:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;52186:18;;;;;;;;;;;52166:45;;;52212:10;52238:4;;52224:11;:18;;;;:::i;:::-;52166:77;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;52256:19;52278:13;:11;:13::i;:::-;52256:35;;52302:17;52335:9:::0;52347:1:::1;52335:13;;52330:598;52354:11;52350:1;:15;52330:598;;;52422:28;52448:1;52434:11;:15;;;;:::i;:::-;52422:11;:28::i;:::-;52389:13;:30;52417:1;52403:11;:15;;;;:::i;:::-;52389:30;;;;;;;;;;;;:61;;;;;;;;;;;;;;;;;;52467:17;52487:10;52467:30;;52515:24;52537:1;52523:11;:15;;;;:::i;:::-;52515:7;:24::i;:::-;52512:318;;;52560:14;52588:17;;;;;;;;;;;52577:50;;;52628:13;:30;52656:1;52642:11;:15;;;;:::i;:::-;52628:30;;;;;;;;;;;;;;;;;;;;;52674:1;52660:11;:15;;;;:::i;:::-;52577:99;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52560:116;;52716:1;52698:20;;:6;:20;;;52695:120;;52743:11;;;;:::i;:::-;;;52789:6;52777:18;;52695:120;52541:289;52512:318;52846:37;52856:9;52881:1;52867:11;:15;;;;:::i;:::-;52846:9;:37::i;:::-;52900:16;;;52372:556;52367:3;;;;;:::i;:::-;;;;52330:598;;;;52940:18;;;52978:9;52971:16;;;;51843:1152:::0;;;:::o;50604:45::-;;;;;;;;;;;;;;;;;;;;;;:::o;27657:295::-;27772:12;:10;:12::i;:::-;27760:24;;:8;:24;;;;27752:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;27872:8;27827:18;:32;27846:12;:10;:12::i;:::-;27827:32;;;;;;;;;;;;;;;:42;27860:8;27827:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;27925:8;27896:48;;27911:12;:10;:12::i;:::-;27896:48;;;27935:8;27896:48;;;;;;:::i;:::-;;;;;;;;27657:295;;:::o;56034:382::-;56108:13;56134:22;56170:9;;:16;;56159:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56134:53;;56203:9;56198:183;56222:9;;:16;;56218:1;:20;56198:183;;;56268:21;56276:9;;56286:1;56276:12;;;;;;;:::i;:::-;;;;;;;;56268:7;:21::i;:::-;56260:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;56342:13;:27;56356:9;;56366:1;56356:12;;;;;;;:::i;:::-;;;;;;;;56342:27;;;;;;;;;;;;;;;;;;;;;56328:8;56337:1;56328:11;;;;;;;;:::i;:::-;;;;;;;:41;;;;;;;;;;;56240:3;;;;:::i;:::-;;;56198:183;;;;56400:8;56393:15;;;56034:382;;;;:::o;50518:77::-;;;;;;;;;;;;;:::o;28664:328::-;28839:41;28858:12;:10;:12::i;:::-;28872:7;28839:18;:41::i;:::-;28831:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28945:39;28959:4;28965:2;28969:7;28978:5;28945:13;:39::i;:::-;28664:328;;;;:::o;53003:353::-;53079:13;53113:17;53121:8;53113:7;:17::i;:::-;53105:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;53179:28;53210:10;:8;:10::i;:::-;53179:41;;53269:1;53244:14;53238:28;:32;:110;;;;;;;;;;;;;;;;;53297:14;53313:19;:8;:17;:19::i;:::-;53280:62;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53238:110;53231:117;;;53003:353;;;:::o;53364:510::-;2779:12;:10;:12::i;:::-;2768:23;;:7;:5;:7::i;:::-;:23;;;2760:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53448:14:::1;53465:13;:11;:13::i;:::-;53448:30;;53528:1;53511:14;:18;:65;;;;;53551:25;;53533:14;:43;;53511:65;53489:147;;;;;;;;;;;;:::i;:::-;;;;;;;;;53652:9;53647:166;53671:14;53667:1;:18;53647:166;;;53737:23;53758:1;53749:6;:10;;;;:::i;:::-;53737:11;:23::i;:::-;53709:13;:25;53732:1;53723:6;:10;;;;:::i;:::-;53709:25;;;;;;;;;;;;:51;;;;;;;;;;;;;;;;;;53775:26;53785:3;53799:1;53790:6;:10;;;;:::i;:::-;53775:9;:26::i;:::-;53687:3;;;;;:::i;:::-;;;;53647:166;;;;53852:14;53823:25;;:43;;;;;;;:::i;:::-;;;;;;;;53437:437;53364:510:::0;;:::o;27958:164::-;28055:4;28079:18;:25;28098:5;28079:25;;;;;;;;;;;;;;;:35;28105:8;28079:35;;;;;;;;;;;;;;;;;;;;;;;;;28072:42;;27958:164;;;;:::o;3448:192::-;2779:12;:10;:12::i;:::-;2768:23;;:7;:5;:7::i;:::-;:23;;;2760:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3557:1:::1;3537:22;;:8;:22;;;;3529:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;3613:19;3623:8;3613:9;:19::i;:::-;3448:192:::0;:::o;25824:293::-;25926:4;25974:25;25959:40;;;:11;:40;;;;:101;;;;26027:33;26012:48;;;:11;:48;;;;25959:101;:150;;;;26073:36;26097:11;26073:23;:36::i;:::-;25959:150;25943:166;;25824:293;;;:::o;29319:155::-;29384:4;29418:7;:14;;;;29408:7;:24;:58;;;;;29464:1;29436:30;;:7;29444;29436:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:30;;;;29408:58;29401:65;;29319:155;;;:::o;1397:98::-;1450:7;1477:10;1470:17;;1397:98;:::o;31492:175::-;31594:2;31567:15;:24;31583:7;31567:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;31651:7;31647:2;31612:47;;31621:24;31637:7;31621:15;:24::i;:::-;31612:47;;;;;;;;;;;;31492:175;;:::o;29480:349::-;29573:4;29598:16;29606:7;29598;:16::i;:::-;29590:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29674:13;29690:24;29706:7;29690:15;:24::i;:::-;29674:40;;29744:5;29733:16;;:7;:16;;;:51;;;;29777:7;29753:31;;:20;29765:7;29753:11;:20::i;:::-;:31;;;29733:51;:87;;;;29788:32;29805:5;29812:7;29788:16;:32::i;:::-;29733:87;29725:96;;;29480:349;;;;:::o;30969:517::-;31129:4;31101:32;;:24;31117:7;31101:15;:24::i;:::-;:32;;;31093:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;31212:1;31198:16;;:2;:16;;;;31190:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;31268:39;31289:4;31295:2;31299:7;31268:20;:39::i;:::-;31372:29;31389:1;31393:7;31372:8;:29::i;:::-;31431:2;31412:7;31420;31412:16;;;;;;;;:::i;:::-;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31470:7;31466:2;31451:27;;31460:4;31451:27;;;;;;;;;;;;30969:517;;;:::o;45424:1088::-;45501:17;45531:4;:20;;;45552:14;45568:4;45585:8;44248:1;45574:43;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45531:87;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;45869:15;45887:82;45904:8;44248:1;45945:4;45952:6;:16;45959:8;45952:16;;;;;;;;;;;;45887;:82::i;:::-;45869:100;;46453:1;46434:6;:16;46441:8;46434:16;;;;;;;;;;;;:20;;;;:::i;:::-;46415:6;:16;46422:8;46415:16;;;;;;;;;;;:39;;;;46472:32;46486:8;46496:7;46472:13;:32::i;:::-;46465:39;;;45424:1088;;;;:::o;49693:120::-;49237:8;:6;:8::i;:::-;49229:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;49762:5:::1;49752:7;;:15;;;;;;;;;;;;;;;;;;49783:22;49792:12;:10;:12::i;:::-;49783:22;;;;;;:::i;:::-;;;;;;;;49693:120::o:0;30630:333::-;30690:13;30706:24;30722:7;30706:15;:24::i;:::-;30690:40;;30743:48;30764:5;30779:1;30783:7;30743:20;:48::i;:::-;30832:29;30849:1;30853:7;30832:8;:29::i;:::-;30899:1;30872:7;30880;30872:16;;;;;;;;:::i;:::-;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30947:7;30943:1;30919:36;;30928:5;30919:36;;;;;;;;;;;;30679:284;30630:333;:::o;3648:173::-;3704:16;3723:6;;;;;;;;;;;3704:25;;3749:8;3740:6;;:17;;;;;;;;;;;;;;;;;;3804:8;3773:40;;3794:8;3773:40;;;;;;;;;;;;3693:128;3648:173;:::o;49434:118::-;48960:8;:6;:8::i;:::-;48959:9;48951:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;49504:4:::1;49494:7;;:14;;;;;;;;;;;;;;;;;;49524:20;49531:12;:10;:12::i;:::-;49524:20;;;;;;:::i;:::-;;;;;;;;49434:118::o:0;55525:359::-;55637:13;;55624:9;:26;55620:257;;;55678:10;55667:8;:21;;;;55708;;;;;;:::i;:::-;;;;;;;;55620:257;;;55764:16;;55751:9;:29;55747:130;;;55811:10;55797:11;:24;;;;55841;;;;;;:::i;:::-;;;;;;;;55747:130;55620:257;55525:359;;:::o;54716:397::-;54777:4;55104:1;55099;54890:11;;54924:7;54954:9;55011:1;54996:12;:16;;;;:::i;:::-;54986:27;55036:15;54851:219;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54823:262;;;;;;54801:295;;:299;:304;54794:311;;54716:397;;;:::o;54318:390::-;54375:4;54699:1;54694;54488:8;;54519:7;54549:9;54606:1;54591:12;:16;;;;:::i;:::-;54581:27;54631:15;54449:216;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54421:259;;;;;;54399:292;;:296;;;;:::i;:::-;:301;54392:308;;54318:390;;;:::o;29835:110::-;29911:26;29921:2;29925:7;29911:26;;;;;;;;;;;;:9;:26::i;:::-;29835:110;;:::o;28998:315::-;29155:28;29165:4;29171:2;29175:7;29155:9;:28::i;:::-;29202:48;29225:4;29231:2;29235:7;29244:5;29202:22;:48::i;:::-;29194:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;28998:315;;;;:::o;51362:99::-;51413:13;51446:7;51439:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51362:99;:::o;4081:723::-;4137:13;4367:1;4358:5;:10;4354:53;;;4385:10;;;;;;;;;;;;;;;;;;;;;4354:53;4417:12;4432:5;4417:20;;4448:14;4473:78;4488:1;4480:4;:9;4473:78;;4506:8;;;;;:::i;:::-;;;;4537:2;4529:10;;;;;:::i;:::-;;;4473:78;;;4561:19;4593:6;4583:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4561:39;;4611:154;4627:1;4618:5;:10;4611:154;;4655:1;4645:11;;;;;:::i;:::-;;;4722:2;4714:5;:10;;;;:::i;:::-;4701:2;:24;;;;:::i;:::-;4688:39;;4671:6;4678;4671:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;4751:2;4742:11;;;;;:::i;:::-;;;4611:154;;;4789:6;4775:21;;;;;4081:723;;;;:::o;25177:157::-;25262:4;25301:25;25286:40;;;:11;:40;;;;25279:47;;25177:157;;;:::o;32478:126::-;;;;:::o;36792:271::-;36957:7;37013:8;37023:9;37034:10;37046:6;37002:51;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;36992:62;;;;;;36984:71;;36977:78;;36792:271;;;;;;:::o;37460:174::-;37547:7;37601:8;37611:13;37584:41;;;;;;;;;:::i;:::-;;;;;;;;;;;;;37574:52;;;;;;37567:59;;37460:174;;;;:::o;29951:321::-;30081:18;30087:2;30091:7;30081:5;:18::i;:::-;30132:54;30163:1;30167:2;30171:7;30180:5;30132:22;:54::i;:::-;30110:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;29951:321;;;:::o;31673:799::-;31828:4;31849:15;:2;:13;;;:15::i;:::-;31845:620;;;31901:2;31885:36;;;31922:12;:10;:12::i;:::-;31936:4;31942:7;31951:5;31885:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31881:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32144:1;32127:6;:13;:18;32123:272;;;32170:60;;;;;;;;;;:::i;:::-;;;;;;;;32123:272;32345:6;32339:13;32330:6;32326:2;32322:15;32315:38;31881:529;32018:41;;;32008:51;;;:6;:51;;;;32001:58;;;;;31845:620;32449:4;32442:11;;31673:799;;;;;;;:::o;30278:346::-;30372:1;30358:16;;:2;:16;;;;30350:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;30431:16;30439:7;30431;:16::i;:::-;30430:17;30422:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;30493:45;30522:1;30526:2;30530:7;30493:20;:45::i;:::-;30549:7;30562:2;30549:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30608:7;30604:2;30583:33;;30600:1;30583:33;;;;;;;;;;;;30278:346;;:::o;17121:387::-;17181:4;17389:12;17456:7;17444:20;17436:28;;17499:1;17492:4;:8;17485:15;;;17121:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:116::-;5985:21;6000:5;5985:21;:::i;:::-;5978:5;5975:32;5965:60;;6021:1;6018;6011:12;5965:60;5915:116;:::o;6037:133::-;6080:5;6118:6;6105:20;6096:29;;6134:30;6158:5;6134:30;:::i;:::-;6037:133;;;;:::o;6176:323::-;6232:6;6281:2;6269:9;6260:7;6256:23;6252:32;6249:119;;;6287:79;;:::i;:::-;6249:119;6407:1;6432:50;6474:7;6465:6;6454:9;6450:22;6432:50;:::i;:::-;6422:60;;6378:114;6176:323;;;;:::o;6505:77::-;6542:7;6571:5;6560:16;;6505:77;;;:::o;6588:118::-;6675:24;6693:5;6675:24;:::i;:::-;6670:3;6663:37;6588:118;;:::o;6712:222::-;6805:4;6843:2;6832:9;6828:18;6820:26;;6856:71;6924:1;6913:9;6909:17;6900:6;6856:71;:::i;:::-;6712:222;;;;:::o;6940:117::-;7049:1;7046;7039:12;7063:117;7172:1;7169;7162:12;7186:180;7234:77;7231:1;7224:88;7331:4;7328:1;7321:15;7355:4;7352:1;7345:15;7372:281;7455:27;7477:4;7455:27;:::i;:::-;7447:6;7443:40;7585:6;7573:10;7570:22;7549:18;7537:10;7534:34;7531:62;7528:88;;;7596:18;;:::i;:::-;7528:88;7636:10;7632:2;7625:22;7415:238;7372:281;;:::o;7659:129::-;7693:6;7720:20;;:::i;:::-;7710:30;;7749:33;7777:4;7769:6;7749:33;:::i;:::-;7659:129;;;:::o;7794:308::-;7856:4;7946:18;7938:6;7935:30;7932:56;;;7968:18;;:::i;:::-;7932:56;8006:29;8028:6;8006:29;:::i;:::-;7998:37;;8090:4;8084;8080:15;8072:23;;7794:308;;;:::o;8108:154::-;8192:6;8187:3;8182;8169:30;8254:1;8245:6;8240:3;8236:16;8229:27;8108:154;;;:::o;8268:412::-;8346:5;8371:66;8387:49;8429:6;8387:49;:::i;:::-;8371:66;:::i;:::-;8362:75;;8460:6;8453:5;8446:21;8498:4;8491:5;8487:16;8536:3;8527:6;8522:3;8518:16;8515:25;8512:112;;;8543:79;;:::i;:::-;8512:112;8633:41;8667:6;8662:3;8657;8633:41;:::i;:::-;8352:328;8268:412;;;;;:::o;8700:340::-;8756:5;8805:3;8798:4;8790:6;8786:17;8782:27;8772:122;;8813:79;;:::i;:::-;8772:122;8930:6;8917:20;8955:79;9030:3;9022:6;9015:4;9007:6;9003:17;8955:79;:::i;:::-;8946:88;;8762:278;8700:340;;;;:::o;9046:509::-;9115:6;9164:2;9152:9;9143:7;9139:23;9135:32;9132:119;;;9170:79;;:::i;:::-;9132:119;9318:1;9307:9;9303:17;9290:31;9348:18;9340:6;9337:30;9334:117;;;9370:79;;:::i;:::-;9334:117;9475:63;9530:7;9521:6;9510:9;9506:22;9475:63;:::i;:::-;9465:73;;9261:287;9046:509;;;;:::o;9561:329::-;9620:6;9669:2;9657:9;9648:7;9644:23;9640:32;9637:119;;;9675:79;;:::i;:::-;9637:119;9795:1;9820:53;9865:7;9856:6;9845:9;9841:22;9820:53;:::i;:::-;9810:63;;9766:117;9561:329;;;;:::o;9896:117::-;10005:1;10002;9995:12;10019:117;10128:1;10125;10118:12;10159:568;10232:8;10242:6;10292:3;10285:4;10277:6;10273:17;10269:27;10259:122;;10300:79;;:::i;:::-;10259:122;10413:6;10400:20;10390:30;;10443:18;10435:6;10432:30;10429:117;;;10465:79;;:::i;:::-;10429:117;10579:4;10571:6;10567:17;10555:29;;10633:3;10625:4;10617:6;10613:17;10603:8;10599:32;10596:41;10593:128;;;10640:79;;:::i;:::-;10593:128;10159:568;;;;;:::o;10733:704::-;10828:6;10836;10844;10893:2;10881:9;10872:7;10868:23;10864:32;10861:119;;;10899:79;;:::i;:::-;10861:119;11047:1;11036:9;11032:17;11019:31;11077:18;11069:6;11066:30;11063:117;;;11099:79;;:::i;:::-;11063:117;11212:80;11284:7;11275:6;11264:9;11260:22;11212:80;:::i;:::-;11194:98;;;;10990:312;11341:2;11367:53;11412:7;11403:6;11392:9;11388:22;11367:53;:::i;:::-;11357:63;;11312:118;10733:704;;;;;:::o;11443:114::-;11510:6;11544:5;11538:12;11528:22;;11443:114;;;:::o;11563:184::-;11662:11;11696:6;11691:3;11684:19;11736:4;11731:3;11727:14;11712:29;;11563:184;;;;:::o;11753:132::-;11820:4;11843:3;11835:11;;11873:4;11868:3;11864:14;11856:22;;11753:132;;;:::o;11891:108::-;11968:24;11986:5;11968:24;:::i;:::-;11963:3;11956:37;11891:108;;:::o;12005:179::-;12074:10;12095:46;12137:3;12129:6;12095:46;:::i;:::-;12173:4;12168:3;12164:14;12150:28;;12005:179;;;;:::o;12190:113::-;12260:4;12292;12287:3;12283:14;12275:22;;12190:113;;;:::o;12339:732::-;12458:3;12487:54;12535:5;12487:54;:::i;:::-;12557:86;12636:6;12631:3;12557:86;:::i;:::-;12550:93;;12667:56;12717:5;12667:56;:::i;:::-;12746:7;12777:1;12762:284;12787:6;12784:1;12781:13;12762:284;;;12863:6;12857:13;12890:63;12949:3;12934:13;12890:63;:::i;:::-;12883:70;;12976:60;13029:6;12976:60;:::i;:::-;12966:70;;12822:224;12809:1;12806;12802:9;12797:14;;12762:284;;;12766:14;13062:3;13055:10;;12463:608;;;12339:732;;;;:::o;13077:373::-;13220:4;13258:2;13247:9;13243:18;13235:26;;13307:9;13301:4;13297:20;13293:1;13282:9;13278:17;13271:47;13335:108;13438:4;13429:6;13335:108;:::i;:::-;13327:116;;13077:373;;;;:::o;13456:122::-;13529:24;13547:5;13529:24;:::i;:::-;13522:5;13519:35;13509:63;;13568:1;13565;13558:12;13509:63;13456:122;:::o;13584:139::-;13630:5;13668:6;13655:20;13646:29;;13684:33;13711:5;13684:33;:::i;:::-;13584:139;;;;:::o;13729:474::-;13797:6;13805;13854:2;13842:9;13833:7;13829:23;13825:32;13822:119;;;13860:79;;:::i;:::-;13822:119;13980:1;14005:53;14050:7;14041:6;14030:9;14026:22;14005:53;:::i;:::-;13995:63;;13951:117;14107:2;14133:53;14178:7;14169:6;14158:9;14154:22;14133:53;:::i;:::-;14123:63;;14078:118;13729:474;;;;;:::o;14209:468::-;14274:6;14282;14331:2;14319:9;14310:7;14306:23;14302:32;14299:119;;;14337:79;;:::i;:::-;14299:119;14457:1;14482:53;14527:7;14518:6;14507:9;14503:22;14482:53;:::i;:::-;14472:63;;14428:117;14584:2;14610:50;14652:7;14643:6;14632:9;14628:22;14610:50;:::i;:::-;14600:60;;14555:115;14209:468;;;;;:::o;14683:559::-;14769:6;14777;14826:2;14814:9;14805:7;14801:23;14797:32;14794:119;;;14832:79;;:::i;:::-;14794:119;14980:1;14969:9;14965:17;14952:31;15010:18;15002:6;14999:30;14996:117;;;15032:79;;:::i;:::-;14996:117;15145:80;15217:7;15208:6;15197:9;15193:22;15145:80;:::i;:::-;15127:98;;;;14923:312;14683:559;;;;;:::o;15248:111::-;15312:6;15346:5;15340:12;15330:22;;15248:111;;;:::o;15365:181::-;15461:11;15495:6;15490:3;15483:19;15535:4;15530:3;15526:14;15511:29;;15365:181;;;;:::o;15552:129::-;15616:4;15639:3;15631:11;;15669:4;15664:3;15660:14;15652:22;;15552:129;;;:::o;15687:99::-;15758:21;15773:5;15758:21;:::i;:::-;15753:3;15746:34;15687:99;;:::o;15792:167::-;15855:10;15876:40;15912:3;15904:6;15876:40;:::i;:::-;15948:4;15943:3;15939:14;15925:28;;15792:167;;;;:::o;15965:110::-;16032:4;16064;16059:3;16055:14;16047:22;;15965:110;;;:::o;16105:708::-;16218:3;16247:51;16292:5;16247:51;:::i;:::-;16314:83;16390:6;16385:3;16314:83;:::i;:::-;16307:90;;16421:53;16468:5;16421:53;:::i;:::-;16497:7;16528:1;16513:275;16538:6;16535:1;16532:13;16513:275;;;16614:6;16608:13;16641:57;16694:3;16679:13;16641:57;:::i;:::-;16634:64;;16721:57;16771:6;16721:57;:::i;:::-;16711:67;;16573:215;16560:1;16557;16553:9;16548:14;;16513:275;;;16517:14;16804:3;16797:10;;16223:590;;;16105:708;;;;:::o;16819:361::-;16956:4;16994:2;16983:9;16979:18;16971:26;;17043:9;17037:4;17033:20;17029:1;17018:9;17014:17;17007:47;17071:102;17168:4;17159:6;17071:102;:::i;:::-;17063:110;;16819:361;;;;:::o;17186:307::-;17247:4;17337:18;17329:6;17326:30;17323:56;;;17359:18;;:::i;:::-;17323:56;17397:29;17419:6;17397:29;:::i;:::-;17389:37;;17481:4;17475;17471:15;17463:23;;17186:307;;;:::o;17499:410::-;17576:5;17601:65;17617:48;17658:6;17617:48;:::i;:::-;17601:65;:::i;:::-;17592:74;;17689:6;17682:5;17675:21;17727:4;17720:5;17716:16;17765:3;17756:6;17751:3;17747:16;17744:25;17741:112;;;17772:79;;:::i;:::-;17741:112;17862:41;17896:6;17891:3;17886;17862:41;:::i;:::-;17582:327;17499:410;;;;;:::o;17928:338::-;17983:5;18032:3;18025:4;18017:6;18013:17;18009:27;17999:122;;18040:79;;:::i;:::-;17999:122;18157:6;18144:20;18182:78;18256:3;18248:6;18241:4;18233:6;18229:17;18182:78;:::i;:::-;18173:87;;17989:277;17928:338;;;;:::o;18272:943::-;18367:6;18375;18383;18391;18440:3;18428:9;18419:7;18415:23;18411:33;18408:120;;;18447:79;;:::i;:::-;18408:120;18567:1;18592:53;18637:7;18628:6;18617:9;18613:22;18592:53;:::i;:::-;18582:63;;18538:117;18694:2;18720:53;18765:7;18756:6;18745:9;18741:22;18720:53;:::i;:::-;18710:63;;18665:118;18822:2;18848:53;18893:7;18884:6;18873:9;18869:22;18848:53;:::i;:::-;18838:63;;18793:118;18978:2;18967:9;18963:18;18950:32;19009:18;19001:6;18998:30;18995:117;;;19031:79;;:::i;:::-;18995:117;19136:62;19190:7;19181:6;19170:9;19166:22;19136:62;:::i;:::-;19126:72;;18921:287;18272:943;;;;;;;:::o;19221:474::-;19289:6;19297;19346:2;19334:9;19325:7;19321:23;19317:32;19314:119;;;19352:79;;:::i;:::-;19314:119;19472:1;19497:53;19542:7;19533:6;19522:9;19518:22;19497:53;:::i;:::-;19487:63;;19443:117;19599:2;19625:53;19670:7;19661:6;19650:9;19646:22;19625:53;:::i;:::-;19615:63;;19570:118;19221:474;;;;;:::o;19701:180::-;19749:77;19746:1;19739:88;19846:4;19843:1;19836:15;19870:4;19867:1;19860:15;19887:320;19931:6;19968:1;19962:4;19958:12;19948:22;;20015:1;20009:4;20005:12;20036:18;20026:81;;20092:4;20084:6;20080:17;20070:27;;20026:81;20154:2;20146:6;20143:14;20123:18;20120:38;20117:84;;;20173:18;;:::i;:::-;20117:84;19938:269;19887:320;;;:::o;20213:231::-;20353:34;20349:1;20341:6;20337:14;20330:58;20422:14;20417:2;20409:6;20405:15;20398:39;20213:231;:::o;20450:366::-;20592:3;20613:67;20677:2;20672:3;20613:67;:::i;:::-;20606:74;;20689:93;20778:3;20689:93;:::i;:::-;20807:2;20802:3;20798:12;20791:19;;20450:366;;;:::o;20822:419::-;20988:4;21026:2;21015:9;21011:18;21003:26;;21075:9;21069:4;21065:20;21061:1;21050:9;21046:17;21039:47;21103:131;21229:4;21103:131;:::i;:::-;21095:139;;20822:419;;;:::o;21247:220::-;21387:34;21383:1;21375:6;21371:14;21364:58;21456:3;21451:2;21443:6;21439:15;21432:28;21247:220;:::o;21473:366::-;21615:3;21636:67;21700:2;21695:3;21636:67;:::i;:::-;21629:74;;21712:93;21801:3;21712:93;:::i;:::-;21830:2;21825:3;21821:12;21814:19;;21473:366;;;:::o;21845:419::-;22011:4;22049:2;22038:9;22034:18;22026:26;;22098:9;22092:4;22088:20;22084:1;22073:9;22069:17;22062:47;22126:131;22252:4;22126:131;:::i;:::-;22118:139;;21845:419;;;:::o;22270:243::-;22410:34;22406:1;22398:6;22394:14;22387:58;22479:26;22474:2;22466:6;22462:15;22455:51;22270:243;:::o;22519:366::-;22661:3;22682:67;22746:2;22741:3;22682:67;:::i;:::-;22675:74;;22758:93;22847:3;22758:93;:::i;:::-;22876:2;22871:3;22867:12;22860:19;;22519:366;;;:::o;22891:419::-;23057:4;23095:2;23084:9;23080:18;23072:26;;23144:9;23138:4;23134:20;23130:1;23119:9;23115:17;23108:47;23172:131;23298:4;23172:131;:::i;:::-;23164:139;;22891:419;;;:::o;23316:236::-;23456:34;23452:1;23444:6;23440:14;23433:58;23525:19;23520:2;23512:6;23508:15;23501:44;23316:236;:::o;23558:366::-;23700:3;23721:67;23785:2;23780:3;23721:67;:::i;:::-;23714:74;;23797:93;23886:3;23797:93;:::i;:::-;23915:2;23910:3;23906:12;23899:19;;23558:366;;;:::o;23930:419::-;24096:4;24134:2;24123:9;24119:18;24111:26;;24183:9;24177:4;24173:20;24169:1;24158:9;24154:17;24147:47;24211:131;24337:4;24211:131;:::i;:::-;24203:139;;23930:419;;;:::o;24355:182::-;24495:34;24491:1;24483:6;24479:14;24472:58;24355:182;:::o;24543:366::-;24685:3;24706:67;24770:2;24765:3;24706:67;:::i;:::-;24699:74;;24782:93;24871:3;24782:93;:::i;:::-;24900:2;24895:3;24891:12;24884:19;;24543:366;;;:::o;24915:419::-;25081:4;25119:2;25108:9;25104:18;25096:26;;25168:9;25162:4;25158:20;25154:1;25143:9;25139:17;25132:47;25196:131;25322:4;25196:131;:::i;:::-;25188:139;;24915:419;;;:::o;25340:143::-;25397:5;25428:6;25422:13;25413:22;;25444:33;25471:5;25444:33;:::i;:::-;25340:143;;;;:::o;25489:351::-;25559:6;25608:2;25596:9;25587:7;25583:23;25579:32;25576:119;;;25614:79;;:::i;:::-;25576:119;25734:1;25759:64;25815:7;25806:6;25795:9;25791:22;25759:64;:::i;:::-;25749:74;;25705:128;25489:351;;;;:::o;25846:165::-;25986:17;25982:1;25974:6;25970:14;25963:41;25846:165;:::o;26017:366::-;26159:3;26180:67;26244:2;26239:3;26180:67;:::i;:::-;26173:74;;26256:93;26345:3;26256:93;:::i;:::-;26374:2;26369:3;26365:12;26358:19;;26017:366;;;:::o;26389:419::-;26555:4;26593:2;26582:9;26578:18;26570:26;;26642:9;26636:4;26632:20;26628:1;26617:9;26613:17;26606:47;26670:131;26796:4;26670:131;:::i;:::-;26662:139;;26389:419;;;:::o;26814:172::-;26954:24;26950:1;26942:6;26938:14;26931:48;26814:172;:::o;26992:366::-;27134:3;27155:67;27219:2;27214:3;27155:67;:::i;:::-;27148:74;;27231:93;27320:3;27231:93;:::i;:::-;27349:2;27344:3;27340:12;27333:19;;26992:366;;;:::o;27364:419::-;27530:4;27568:2;27557:9;27553:18;27545:26;;27617:9;27611:4;27607:20;27603:1;27592:9;27588:17;27581:47;27645:131;27771:4;27645:131;:::i;:::-;27637:139;;27364:419;;;:::o;27789:180::-;27837:77;27834:1;27827:88;27934:4;27931:1;27924:15;27958:4;27955:1;27948:15;27975:180;28023:77;28020:1;28013:88;28120:4;28117:1;28110:15;28144:4;28141:1;28134:15;28161:233;28200:3;28223:24;28241:5;28223:24;:::i;:::-;28214:33;;28269:66;28262:5;28259:77;28256:103;;;28339:18;;:::i;:::-;28256:103;28386:1;28379:5;28375:13;28368:20;;28161:233;;;:::o;28400:235::-;28540:34;28536:1;28528:6;28524:14;28517:58;28609:18;28604:2;28596:6;28592:15;28585:43;28400:235;:::o;28641:366::-;28783:3;28804:67;28868:2;28863:3;28804:67;:::i;:::-;28797:74;;28880:93;28969:3;28880:93;:::i;:::-;28998:2;28993:3;28989:12;28982:19;;28641:366;;;:::o;29013:419::-;29179:4;29217:2;29206:9;29202:18;29194:26;;29266:9;29260:4;29256:20;29252:1;29241:9;29237:17;29230:47;29294:131;29420:4;29294:131;:::i;:::-;29286:139;;29013:419;;;:::o;29438:173::-;29578:25;29574:1;29566:6;29562:14;29555:49;29438:173;:::o;29617:366::-;29759:3;29780:67;29844:2;29839:3;29780:67;:::i;:::-;29773:74;;29856:93;29945:3;29856:93;:::i;:::-;29974:2;29969:3;29965:12;29958:19;;29617:366;;;:::o;29989:419::-;30155:4;30193:2;30182:9;30178:18;30170:26;;30242:9;30236:4;30232:20;30228:1;30217:9;30213:17;30206:47;30270:131;30396:4;30270:131;:::i;:::-;30262:139;;29989:419;;;:::o;30414:228::-;30554:34;30550:1;30542:6;30538:14;30531:58;30623:11;30618:2;30610:6;30606:15;30599:36;30414:228;:::o;30648:366::-;30790:3;30811:67;30875:2;30870:3;30811:67;:::i;:::-;30804:74;;30887:93;30976:3;30887:93;:::i;:::-;31005:2;31000:3;30996:12;30989:19;;30648:366;;;:::o;31020:419::-;31186:4;31224:2;31213:9;31209:18;31201:26;;31273:9;31267:4;31263:20;31259:1;31248:9;31244:17;31237:47;31301:131;31427:4;31301:131;:::i;:::-;31293:139;;31020:419;;;:::o;31445:229::-;31585:34;31581:1;31573:6;31569:14;31562:58;31654:12;31649:2;31641:6;31637:15;31630:37;31445:229;:::o;31680:366::-;31822:3;31843:67;31907:2;31902:3;31843:67;:::i;:::-;31836:74;;31919:93;32008:3;31919:93;:::i;:::-;32037:2;32032:3;32028:12;32021:19;;31680:366;;;:::o;32052:419::-;32218:4;32256:2;32245:9;32241:18;32233:26;;32305:9;32299:4;32295:20;32291:1;32280:9;32276:17;32269:47;32333:131;32459:4;32333:131;:::i;:::-;32325:139;;32052:419;;;:::o;32477:181::-;32617:33;32613:1;32605:6;32601:14;32594:57;32477:181;:::o;32664:366::-;32806:3;32827:67;32891:2;32886:3;32827:67;:::i;:::-;32820:74;;32903:93;32992:3;32903:93;:::i;:::-;33021:2;33016:3;33012:12;33005:19;;32664:366;;;:::o;33036:419::-;33202:4;33240:2;33229:9;33225:18;33217:26;;33289:9;33283:4;33279:20;33275:1;33264:9;33260:17;33253:47;33317:131;33443:4;33317:131;:::i;:::-;33309:139;;33036:419;;;:::o;33461:166::-;33601:18;33597:1;33589:6;33585:14;33578:42;33461:166;:::o;33633:366::-;33775:3;33796:67;33860:2;33855:3;33796:67;:::i;:::-;33789:74;;33872:93;33961:3;33872:93;:::i;:::-;33990:2;33985:3;33981:12;33974:19;;33633:366;;;:::o;34005:419::-;34171:4;34209:2;34198:9;34194:18;34186:26;;34258:9;34252:4;34248:20;34244:1;34233:9;34229:17;34222:47;34286:131;34412:4;34286:131;:::i;:::-;34278:139;;34005:419;;;:::o;34430:162::-;34570:14;34566:1;34558:6;34554:14;34547:38;34430:162;:::o;34598:366::-;34740:3;34761:67;34825:2;34820:3;34761:67;:::i;:::-;34754:74;;34837:93;34926:3;34837:93;:::i;:::-;34955:2;34950:3;34946:12;34939:19;;34598:366;;;:::o;34970:419::-;35136:4;35174:2;35163:9;35159:18;35151:26;;35223:9;35217:4;35213:20;35209:1;35198:9;35194:17;35187:47;35251:131;35377:4;35251:131;:::i;:::-;35243:139;;34970:419;;;:::o;35395:348::-;35435:7;35458:20;35476:1;35458:20;:::i;:::-;35453:25;;35492:20;35510:1;35492:20;:::i;:::-;35487:25;;35680:1;35612:66;35608:74;35605:1;35602:81;35597:1;35590:9;35583:17;35579:105;35576:131;;;35687:18;;:::i;:::-;35576:131;35735:1;35732;35728:9;35717:20;;35395:348;;;;:::o;35749:160::-;35889:12;35885:1;35877:6;35873:14;35866:36;35749:160;:::o;35915:366::-;36057:3;36078:67;36142:2;36137:3;36078:67;:::i;:::-;36071:74;;36154:93;36243:3;36154:93;:::i;:::-;36272:2;36267:3;36263:12;36256:19;;35915:366;;;:::o;36287:419::-;36453:4;36491:2;36480:9;36476:18;36468:26;;36540:9;36534:4;36530:20;36526:1;36515:9;36511:17;36504:47;36568:131;36694:4;36568:131;:::i;:::-;36560:139;;36287:419;;;:::o;36712:332::-;36833:4;36871:2;36860:9;36856:18;36848:26;;36884:71;36952:1;36941:9;36937:17;36928:6;36884:71;:::i;:::-;36965:72;37033:2;37022:9;37018:18;37009:6;36965:72;:::i;:::-;36712:332;;;;;:::o;37050:305::-;37090:3;37109:20;37127:1;37109:20;:::i;:::-;37104:25;;37143:20;37161:1;37143:20;:::i;:::-;37138:25;;37297:1;37229:66;37225:74;37222:1;37219:81;37216:107;;;37303:18;;:::i;:::-;37216:107;37347:1;37344;37340:9;37333:16;;37050:305;;;;:::o;37361:320::-;37476:4;37514:2;37503:9;37499:18;37491:26;;37527:65;37589:1;37578:9;37574:17;37565:6;37527:65;:::i;:::-;37602:72;37670:2;37659:9;37655:18;37646:6;37602:72;:::i;:::-;37361:320;;;;;:::o;37687:143::-;37744:5;37775:6;37769:13;37760:22;;37791:33;37818:5;37791:33;:::i;:::-;37687:143;;;;:::o;37836:351::-;37906:6;37955:2;37943:9;37934:7;37930:23;37926:32;37923:119;;;37961:79;;:::i;:::-;37923:119;38081:1;38106:64;38162:7;38153:6;38142:9;38138:22;38106:64;:::i;:::-;38096:74;;38052:128;37836:351;;;;:::o;38193:175::-;38333:27;38329:1;38321:6;38317:14;38310:51;38193:175;:::o;38374:366::-;38516:3;38537:67;38601:2;38596:3;38537:67;:::i;:::-;38530:74;;38613:93;38702:3;38613:93;:::i;:::-;38731:2;38726:3;38722:12;38715:19;;38374:366;;;:::o;38746:419::-;38912:4;38950:2;38939:9;38935:18;38927:26;;38999:9;38993:4;38989:20;38985:1;38974:9;38970:17;38963:47;39027:131;39153:4;39027:131;:::i;:::-;39019:139;;38746:419;;;:::o;39171:169::-;39311:21;39307:1;39299:6;39295:14;39288:45;39171:169;:::o;39346:366::-;39488:3;39509:67;39573:2;39568:3;39509:67;:::i;:::-;39502:74;;39585:93;39674:3;39585:93;:::i;:::-;39703:2;39698:3;39694:12;39687:19;;39346:366;;;:::o;39718:419::-;39884:4;39922:2;39911:9;39907:18;39899:26;;39971:9;39965:4;39961:20;39957:1;39946:9;39942:17;39935:47;39999:131;40125:4;39999:131;:::i;:::-;39991:139;;39718:419;;;:::o;40143:220::-;40283:34;40279:1;40271:6;40267:14;40260:58;40352:3;40347:2;40339:6;40335:15;40328:28;40143:220;:::o;40369:366::-;40511:3;40532:67;40596:2;40591:3;40532:67;:::i;:::-;40525:74;;40608:93;40697:3;40608:93;:::i;:::-;40726:2;40721:3;40717:12;40710:19;;40369:366;;;:::o;40741:419::-;40907:4;40945:2;40934:9;40930:18;40922:26;;40994:9;40988:4;40984:20;40980:1;40969:9;40965:17;40958:47;41022:131;41148:4;41022:131;:::i;:::-;41014:139;;40741:419;;;:::o;41166:148::-;41268:11;41305:3;41290:18;;41166:148;;;;:::o;41320:377::-;41426:3;41454:39;41487:5;41454:39;:::i;:::-;41509:89;41591:6;41586:3;41509:89;:::i;:::-;41502:96;;41607:52;41652:6;41647:3;41640:4;41633:5;41629:16;41607:52;:::i;:::-;41684:6;41679:3;41675:16;41668:23;;41430:267;41320:377;;;;:::o;41703:155::-;41843:7;41839:1;41831:6;41827:14;41820:31;41703:155;:::o;41864:400::-;42024:3;42045:84;42127:1;42122:3;42045:84;:::i;:::-;42038:91;;42138:93;42227:3;42138:93;:::i;:::-;42256:1;42251:3;42247:11;42240:18;;41864:400;;;:::o;42270:701::-;42551:3;42573:95;42664:3;42655:6;42573:95;:::i;:::-;42566:102;;42685:95;42776:3;42767:6;42685:95;:::i;:::-;42678:102;;42797:148;42941:3;42797:148;:::i;:::-;42790:155;;42962:3;42955:10;;42270:701;;;;;:::o;42977:182::-;43117:34;43113:1;43105:6;43101:14;43094:58;42977:182;:::o;43165:366::-;43307:3;43328:67;43392:2;43387:3;43328:67;:::i;:::-;43321:74;;43404:93;43493:3;43404:93;:::i;:::-;43522:2;43517:3;43513:12;43506:19;;43165:366;;;:::o;43537:419::-;43703:4;43741:2;43730:9;43726:18;43718:26;;43790:9;43784:4;43780:20;43776:1;43765:9;43761:17;43754:47;43818:131;43944:4;43818:131;:::i;:::-;43810:139;;43537:419;;;:::o;43962:191::-;44002:4;44022:20;44040:1;44022:20;:::i;:::-;44017:25;;44056:20;44074:1;44056:20;:::i;:::-;44051:25;;44095:1;44092;44089:8;44086:34;;;44100:18;;:::i;:::-;44086:34;44145:1;44142;44138:9;44130:17;;43962:191;;;;:::o;44159:225::-;44299:34;44295:1;44287:6;44283:14;44276:58;44368:8;44363:2;44355:6;44351:15;44344:33;44159:225;:::o;44390:366::-;44532:3;44553:67;44617:2;44612:3;44553:67;:::i;:::-;44546:74;;44629:93;44718:3;44629:93;:::i;:::-;44747:2;44742:3;44738:12;44731:19;;44390:366;;;:::o;44762:419::-;44928:4;44966:2;44955:9;44951:18;44943:26;;45015:9;45009:4;45005:20;45001:1;44990:9;44986:17;44979:47;45043:131;45169:4;45043:131;:::i;:::-;45035:139;;44762:419;;;:::o;45187:231::-;45327:34;45323:1;45315:6;45311:14;45304:58;45396:14;45391:2;45383:6;45379:15;45372:39;45187:231;:::o;45424:366::-;45566:3;45587:67;45651:2;45646:3;45587:67;:::i;:::-;45580:74;;45663:93;45752:3;45663:93;:::i;:::-;45781:2;45776:3;45772:12;45765:19;;45424:366;;;:::o;45796:419::-;45962:4;46000:2;45989:9;45985:18;45977:26;;46049:9;46043:4;46039:20;46035:1;46024:9;46020:17;46013:47;46077:131;46203:4;46077:131;:::i;:::-;46069:139;;45796:419;;;:::o;46221:228::-;46361:34;46357:1;46349:6;46345:14;46338:58;46430:11;46425:2;46417:6;46413:15;46406:36;46221:228;:::o;46455:366::-;46597:3;46618:67;46682:2;46677:3;46618:67;:::i;:::-;46611:74;;46694:93;46783:3;46694:93;:::i;:::-;46812:2;46807:3;46803:12;46796:19;;46455:366;;;:::o;46827:419::-;46993:4;47031:2;47020:9;47016:18;47008:26;;47080:9;47074:4;47070:20;47066:1;47055:9;47051:17;47044:47;47108:131;47234:4;47108:131;:::i;:::-;47100:139;;46827:419;;;:::o;47252:223::-;47392:34;47388:1;47380:6;47376:14;47369:58;47461:6;47456:2;47448:6;47444:15;47437:31;47252:223;:::o;47481:366::-;47623:3;47644:67;47708:2;47703:3;47644:67;:::i;:::-;47637:74;;47720:93;47809:3;47720:93;:::i;:::-;47838:2;47833:3;47829:12;47822:19;;47481:366;;;:::o;47853:419::-;48019:4;48057:2;48046:9;48042:18;48034:26;;48106:9;48100:4;48096:20;48092:1;48081:9;48077:17;48070:47;48134:131;48260:4;48134:131;:::i;:::-;48126:139;;47853:419;;;:::o;48278:332::-;48399:4;48437:2;48426:9;48422:18;48414:26;;48450:71;48518:1;48507:9;48503:17;48494:6;48450:71;:::i;:::-;48531:72;48599:2;48588:9;48584:18;48575:6;48531:72;:::i;:::-;48278:332;;;;;:::o;48616:98::-;48667:6;48701:5;48695:12;48685:22;;48616:98;;;:::o;48720:168::-;48803:11;48837:6;48832:3;48825:19;48877:4;48872:3;48868:14;48853:29;;48720:168;;;;:::o;48894:360::-;48980:3;49008:38;49040:5;49008:38;:::i;:::-;49062:70;49125:6;49120:3;49062:70;:::i;:::-;49055:77;;49141:52;49186:6;49181:3;49174:4;49167:5;49163:16;49141:52;:::i;:::-;49218:29;49240:6;49218:29;:::i;:::-;49213:3;49209:39;49202:46;;48984:270;48894:360;;;;:::o;49260:529::-;49427:4;49465:2;49454:9;49450:18;49442:26;;49478:71;49546:1;49535:9;49531:17;49522:6;49478:71;:::i;:::-;49559:72;49627:2;49616:9;49612:18;49603:6;49559:72;:::i;:::-;49678:9;49672:4;49668:20;49663:2;49652:9;49648:18;49641:48;49706:76;49777:4;49768:6;49706:76;:::i;:::-;49698:84;;49260:529;;;;;;:::o;49795:137::-;49849:5;49880:6;49874:13;49865:22;;49896:30;49920:5;49896:30;:::i;:::-;49795:137;;;;:::o;49938:345::-;50005:6;50054:2;50042:9;50033:7;50029:23;50025:32;50022:119;;;50060:79;;:::i;:::-;50022:119;50180:1;50205:61;50258:7;50249:6;50238:9;50234:22;50205:61;:::i;:::-;50195:71;;50151:125;49938:345;;;;:::o;50289:170::-;50429:22;50425:1;50417:6;50413:14;50406:46;50289:170;:::o;50465:366::-;50607:3;50628:67;50692:2;50687:3;50628:67;:::i;:::-;50621:74;;50704:93;50793:3;50704:93;:::i;:::-;50822:2;50817:3;50813:12;50806:19;;50465:366;;;:::o;50837:419::-;51003:4;51041:2;51030:9;51026:18;51018:26;;51090:9;51084:4;51080:20;51076:1;51065:9;51061:17;51054:47;51118:131;51244:4;51118:131;:::i;:::-;51110:139;;50837:419;;;:::o;51262:154::-;51402:6;51398:1;51390:6;51386:14;51379:30;51262:154;:::o;51422:365::-;51564:3;51585:66;51649:1;51644:3;51585:66;:::i;:::-;51578:73;;51660:93;51749:3;51660:93;:::i;:::-;51778:2;51773:3;51769:12;51762:19;;51422:365;;;:::o;51793:419::-;51959:4;51997:2;51986:9;51982:18;51974:26;;52046:9;52040:4;52036:20;52032:1;52021:9;52017:17;52010:47;52074:131;52200:4;52074:131;:::i;:::-;52066:139;;51793:419;;;:::o;52218:157::-;52358:9;52354:1;52346:6;52342:14;52335:33;52218:157;:::o;52381:365::-;52523:3;52544:66;52608:1;52603:3;52544:66;:::i;:::-;52537:73;;52619:93;52708:3;52619:93;:::i;:::-;52737:2;52732:3;52728:12;52721:19;;52381:365;;;:::o;52752:419::-;52918:4;52956:2;52945:9;52941:18;52933:26;;53005:9;52999:4;52995:20;52991:1;52980:9;52976:17;52969:47;53033:131;53159:4;53033:131;:::i;:::-;53025:139;;52752:419;;;:::o;53177:79::-;53216:7;53245:5;53234:16;;53177:79;;;:::o;53262:157::-;53367:45;53387:24;53405:5;53387:24;:::i;:::-;53367:45;:::i;:::-;53362:3;53355:58;53262:157;;:::o;53425:94::-;53458:8;53506:5;53502:2;53498:14;53477:35;;53425:94;;;:::o;53525:::-;53564:7;53593:20;53607:5;53593:20;:::i;:::-;53582:31;;53525:94;;;:::o;53625:100::-;53664:7;53693:26;53713:5;53693:26;:::i;:::-;53682:37;;53625:100;;;:::o;53731:157::-;53836:45;53856:24;53874:5;53856:24;:::i;:::-;53836:45;:::i;:::-;53831:3;53824:58;53731:157;;:::o;53894:79::-;53933:7;53962:5;53951:16;;53894:79;;;:::o;53979:157::-;54084:45;54104:24;54122:5;54104:24;:::i;:::-;54084:45;:::i;:::-;54079:3;54072:58;53979:157;;:::o;54142:820::-;54366:3;54381:75;54452:3;54443:6;54381:75;:::i;:::-;54481:2;54476:3;54472:12;54465:19;;54494:75;54565:3;54556:6;54494:75;:::i;:::-;54594:2;54589:3;54585:12;54578:19;;54607:75;54678:3;54669:6;54607:75;:::i;:::-;54707:2;54702:3;54698:12;54691:19;;54720:75;54791:3;54782:6;54720:75;:::i;:::-;54820:2;54815:3;54811:12;54804:19;;54833:75;54904:3;54895:6;54833:75;:::i;:::-;54933:2;54928:3;54924:12;54917:19;;54953:3;54946:10;;54142:820;;;;;;;;:::o;54968:180::-;55016:77;55013:1;55006:88;55113:4;55110:1;55103:15;55137:4;55134:1;55127:15;55154:176;55186:1;55203:20;55221:1;55203:20;:::i;:::-;55198:25;;55237:20;55255:1;55237:20;:::i;:::-;55232:25;;55276:1;55266:35;;55281:18;;:::i;:::-;55266:35;55322:1;55319;55315:9;55310:14;;55154:176;;;;:::o;55336:237::-;55476:34;55472:1;55464:6;55460:14;55453:58;55545:20;55540:2;55532:6;55528:15;55521:45;55336:237;:::o;55579:366::-;55721:3;55742:67;55806:2;55801:3;55742:67;:::i;:::-;55735:74;;55818:93;55907:3;55818:93;:::i;:::-;55936:2;55931:3;55927:12;55920:19;;55579:366;;;:::o;55951:419::-;56117:4;56155:2;56144:9;56140:18;56132:26;;56204:9;56198:4;56194:20;56190:1;56179:9;56175:17;56168:47;56232:131;56358:4;56232:131;:::i;:::-;56224:139;;55951:419;;;:::o;56376:185::-;56416:1;56433:20;56451:1;56433:20;:::i;:::-;56428:25;;56467:20;56485:1;56467:20;:::i;:::-;56462:25;;56506:1;56496:35;;56511:18;;:::i;:::-;56496:35;56553:1;56550;56546:9;56541:14;;56376:185;;;;:::o;56567:553::-;56744:4;56782:3;56771:9;56767:19;56759:27;;56796:71;56864:1;56853:9;56849:17;56840:6;56796:71;:::i;:::-;56877:72;56945:2;56934:9;56930:18;56921:6;56877:72;:::i;:::-;56959;57027:2;57016:9;57012:18;57003:6;56959:72;:::i;:::-;57041;57109:2;57098:9;57094:18;57085:6;57041:72;:::i;:::-;56567:553;;;;;;;:::o;57126:397::-;57266:3;57281:75;57352:3;57343:6;57281:75;:::i;:::-;57381:2;57376:3;57372:12;57365:19;;57394:75;57465:3;57456:6;57394:75;:::i;:::-;57494:2;57489:3;57485:12;57478:19;;57514:3;57507:10;;57126:397;;;;;:::o;57529:640::-;57724:4;57762:3;57751:9;57747:19;57739:27;;57776:71;57844:1;57833:9;57829:17;57820:6;57776:71;:::i;:::-;57857:72;57925:2;57914:9;57910:18;57901:6;57857:72;:::i;:::-;57939;58007:2;57996:9;57992:18;57983:6;57939:72;:::i;:::-;58058:9;58052:4;58048:20;58043:2;58032:9;58028:18;58021:48;58086:76;58157:4;58148:6;58086:76;:::i;:::-;58078:84;;57529:640;;;;;;;:::o;58175:141::-;58231:5;58262:6;58256:13;58247:22;;58278:32;58304:5;58278:32;:::i;:::-;58175:141;;;;:::o;58322:349::-;58391:6;58440:2;58428:9;58419:7;58415:23;58411:32;58408:119;;;58446:79;;:::i;:::-;58408:119;58566:1;58591:63;58646:7;58637:6;58626:9;58622:22;58591:63;:::i;:::-;58581:73;;58537:127;58322:349;;;;:::o;58677:182::-;58817:34;58813:1;58805:6;58801:14;58794:58;58677:182;:::o;58865:366::-;59007:3;59028:67;59092:2;59087:3;59028:67;:::i;:::-;59021:74;;59104:93;59193:3;59104:93;:::i;:::-;59222:2;59217:3;59213:12;59206:19;;58865:366;;;:::o;59237:419::-;59403:4;59441:2;59430:9;59426:18;59418:26;;59490:9;59484:4;59480:20;59476:1;59465:9;59461:17;59454:47;59518:131;59644:4;59518:131;:::i;:::-;59510:139;;59237:419;;;:::o;59662:178::-;59802:30;59798:1;59790:6;59786:14;59779:54;59662:178;:::o;59846:366::-;59988:3;60009:67;60073:2;60068:3;60009:67;:::i;:::-;60002:74;;60085:93;60174:3;60085:93;:::i;:::-;60203:2;60198:3;60194:12;60187:19;;59846:366;;;:::o;60218:419::-;60384:4;60422:2;60411:9;60407:18;60399:26;;60471:9;60465:4;60461:20;60457:1;60446:9;60442:17;60435:47;60499:131;60625:4;60499:131;:::i;:::-;60491:139;;60218:419;;;:::o

Swarm Source

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