ETH Price: $3,887.21 (-1.12%)

Token

Cudl Weapon (CWEAPON)
 

Overview

Max Total Supply

849 CWEAPON

Holders

207

Total Transfers

-

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
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:
CudlWeapons

Compiler Version
v0.8.2+commit.661d1103

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

// Sources flattened with hardhat v2.6.0 https://hardhat.org

// File @openzeppelin/contracts/utils/introspection/[email protected]

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/[email protected]



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


// File @openzeppelin/contracts/token/ERC721/[email protected]



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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]



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


// File @openzeppelin/contracts/utils/[email protected]



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

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

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


// File @openzeppelin/contracts/utils/[email protected]



pragma solidity ^0.8.0;

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

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


// File @openzeppelin/contracts/utils/[email protected]



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


// File @openzeppelin/contracts/utils/introspection/[email protected]



pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/[email protected]



pragma solidity ^0.8.0;







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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]



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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]



pragma solidity ^0.8.0;


/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

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

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}


// File @openzeppelin/contracts/security/[email protected]



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


// File @openzeppelin/contracts/access/[email protected]



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


// File @openzeppelin/contracts/token/ERC20/[email protected]



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/token/ERC20/utils/[email protected]



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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


// File base64-sol/[email protected]



/// @title Base64
/// @author Brecht Devos - <[email protected]>
/// @notice Provides a function for encoding some bytes in base64
library Base64 {
    string internal constant TABLE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';

    function encode(bytes memory data) internal pure returns (string memory) {
        if (data.length == 0) return '';
        
        // load the table into memory
        string memory table = TABLE;

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((data.length + 2) / 3);

        // add some extra buffer at the end required for the writing
        string memory result = new string(encodedLen + 32);

        assembly {
            // set the actual output length
            mstore(result, encodedLen)
            
            // prepare the lookup table
            let tablePtr := add(table, 1)
            
            // input ptr
            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))
            
            // result ptr, jump over length
            let resultPtr := add(result, 32)
            
            // run over the input, 3 bytes at a time
            for {} lt(dataPtr, endPtr) {}
            {
               dataPtr := add(dataPtr, 3)
               
               // read 3 bytes
               let input := mload(dataPtr)
               
               // write 4 characters
               mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr(18, input), 0x3F)))))
               resultPtr := add(resultPtr, 1)
               mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr(12, input), 0x3F)))))
               resultPtr := add(resultPtr, 1)
               mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr( 6, input), 0x3F)))))
               resultPtr := add(resultPtr, 1)
               mstore(resultPtr, shl(248, mload(add(tablePtr, and(        input,  0x3F)))))
               resultPtr := add(resultPtr, 1)
            }
            
            // padding with '='
            switch mod(mload(data), 3)
            case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) }
            case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) }
        }
        
        return result;
    }
}


// File contracts/CudlWeapons.sol

pragma solidity ^0.8.0;






contract CudlWeapons is ERC721Enumerable, ReentrancyGuard, Ownable {
    using SafeERC20 for IERC20;
    // OG mooncat contract
    IERC721 mooncat = IERC721(0xc3f733ca98E0daD0386979Eb96fb1722A1A05E69);

    // Token used as the trade in for the weaponSmith
    IERC20 public token;
    // Mapping containing the weaponSmith's records on upgraded weapons
    mapping(uint256 => uint256) public boosts;
    // Mapping containing the base stats on all weapon classes
    mapping(uint8 => uint16[5]) public bases;
    // coefficient applied to weaponSmith
    uint256 boostCoefficient;
    // weapon smith opening
    bool weaponSmithOpen;

    event TokenUpdated(address oldToken, address newToken);
    event Upgrade(uint256 tokenId, uint256 upgradeAmount);
    event BoostCoefficientUpdated(
        uint256 oldBoostCoefficient,
        uint256 newBoostCoefficient
    );
    event WeaponSmithOpen(bool open);

    string[] private weapons = [
        "Warhammer",
        "Quarterstaff",
        "Maul",
        "Mace",
        "Club",
        "Katana",
        "Falchion",
        "Scimitar",
        "Long Sword",
        "Short Sword",
        "Ghost Wand",
        "Grave Wand",
        "Bone Wand",
        "Wand",
        "Grimoire",
        "Chronicle",
        "Tome",
        "Book"
    ];
    string[] private namePrefixes = [
        "Agony",
        "Apocalypse",
        "Armageddon",
        "Beast",
        "Behemoth",
        "Blight",
        "Blood",
        "Bramble",
        "Brimstone",
        "Brood",
        "Carrion",
        "Cataclysm",
        "Chimeric",
        "Corpse",
        "Corruption",
        "Damnation",
        "Death",
        "Demon",
        "Dire",
        "Dragon",
        "Dread",
        "Doom",
        "Dusk",
        "Eagle",
        "Empyrean",
        "Fate",
        "Foe",
        "Gale",
        "Ghoul",
        "Gloom",
        "Glyph",
        "Golem",
        "Grim",
        "Hate",
        "Havoc",
        "Honour",
        "Horror",
        "Hypnotic",
        "Kraken",
        "Loath",
        "Maelstrom",
        "Mind",
        "Miracle",
        "Morbid",
        "Oblivion",
        "Onslaught",
        "Pain",
        "Pandemonium",
        "Phoenix",
        "Plague",
        "Rage",
        "Rapture",
        "Rune",
        "Skull",
        "Sol",
        "Soul",
        "Sorrow",
        "Spirit",
        "Storm",
        "Tempest",
        "Torment",
        "Vengeance",
        "Victory",
        "Viper",
        "Vortex",
        "Woe",
        "Wrath",
        "Light's",
        "Shimmering"
    ];
    string[] private nameSuffixes = [
        "Bane",
        "Root",
        "Bite",
        "Song",
        "Roar",
        "Grasp",
        "Instrument",
        "Glow",
        "Bender",
        "Shadow",
        "Whisper",
        "Shout",
        "Growl",
        "Tear",
        "Peak",
        "Form",
        "Sun",
        "Moon"
    ];
    string[] private suffixes = [
        "of Power",
        "of Giants",
        "of Titans",
        "of Skill",
        "of Perfection",
        "of Brilliance",
        "of Enlightenment",
        "of Protection",
        "of Anger",
        "of Rage",
        "of Fury",
        "of Vitriol",
        "of the Fox",
        "of Detection",
        "of Reflection",
        "of the Twins"
    ];

    /**
     * @notice allow the owners to set the tokens used as pay-in for the weaponSmith
     * @param  _token address of the new token
     */
    function setToken(address _token) external onlyOwner {
        emit TokenUpdated(address(token), _token);
        token = IERC20(_token);
    }

    /**
     * @notice allow the owners to set the coefficient used for the upgrade boost
     * @param  _boostCoefficient coefficient used to modify the upgrade amount
     */
    function setBoostCoefficient(uint256 _boostCoefficient) external onlyOwner {
        emit BoostCoefficientUpdated(boostCoefficient, _boostCoefficient);
        boostCoefficient = _boostCoefficient;
    }

    /**
     * @notice allow the owners to open the weapon smith
     * @param  _weaponSmithOpen bool to open or close the weapon smith
     */
    function setWeaponSmithOpen(bool _weaponSmithOpen) external onlyOwner {
        emit WeaponSmithOpen(_weaponSmithOpen);
        weaponSmithOpen = _weaponSmithOpen;
    }

    /**
     * @notice allow the owners to sweep any erc20 tokens sent to the contract
     * @param  _token address of the token to be swept
     * @param  _amount amount to be swept
     */
    function sweep(address _token, uint256 _amount) external onlyOwner {
        IERC20(_token).safeTransfer(msg.sender, _amount);
    }

    function random(string memory input) internal pure returns (uint256) {
        return uint256(keccak256(abi.encodePacked(input)));
    }

    function getAttack(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "Attack", weapons, 0);
    }

    function getDefense(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "Defense", weapons, 1);
    }

    function getDurability(uint256 tokenId)
        public
        view
        returns (string memory)
    {
        return pluck(tokenId, "Durability", weapons, 2);
    }

    function getWeight(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "Weight", weapons, 3);
    }

    function getMagic(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "Magic", weapons, 4);
    }

    /**
     * @notice score calculator
     * @param  base the base amount taken from bases for the weapon class
     * @param  tokenId id of the token being scored
     * @param  output weapon class or description
     */
    function getScore(
        uint256 base,
        uint256 tokenId,
        string memory output
    ) public pure returns (uint256) {
        uint256 rando = uint256(
            keccak256(abi.encodePacked(output, toString(tokenId)))
        ) % 100;
        uint256 score;
        if (rando <= 10) {
            score += 10;
        } else if (rando > 10 && rando <= 25) {
            score += 50;
        } else if (rando > 25 && rando <= 75) {
            score += 100;
        } else if (rando > 75 && rando <= 90) {
            score += 150;
        } else if (rando > 90 && rando <= 100) {
            score += 250;
        }
        score += base;
        return score;
    }

    /**
     * @notice the weaponSmith, where you can upgrade your weapons send in the compatible erc20 token to upgrade
     * @param  tokenId id of the token being upgraded
     * @param  amount amount of token to be sent to the weaponSmith to be upgraded
     */
    function weaponSmith(uint256 tokenId, uint256 amount) external {
        require(weaponSmithOpen, "!open");
        require(ownerOf(tokenId) == msg.sender, "!owner");
        token.safeTransferFrom(msg.sender, address(this), amount);
        boosts[tokenId] += amount / boostCoefficient;
        emit Upgrade(tokenId, amount / boostCoefficient);
    }

    function pluck(
        uint256 tokenId,
        string memory keyPrefix,
        string[] memory sourceArray,
        uint256 baseIndex
    ) internal view returns (string memory) {
        // get the actual weapon class and greatness
        uint256 rand = random(
            string(abi.encodePacked("WEAPON", toString(tokenId)))
        );
        string memory output = sourceArray[rand % sourceArray.length];
        uint256 greatness = rand % 21;
        uint256 stat;
        if (
            keccak256(abi.encodePacked((output))) ==
            keccak256(abi.encodePacked(("Warhammer")))
        ) {
            stat = getScore(bases[0][baseIndex], tokenId, keyPrefix);
        } else if (
            keccak256(abi.encodePacked((output))) ==
            keccak256(abi.encodePacked(("Quarterstaff")))
        ) {
            stat = getScore(bases[1][baseIndex], tokenId, keyPrefix);
        } else if (
            keccak256(abi.encodePacked((output))) ==
            keccak256(abi.encodePacked(("Maul")))
        ) {
            stat = getScore(bases[2][baseIndex], tokenId, keyPrefix);
        } else if (
            keccak256(abi.encodePacked((output))) ==
            keccak256(abi.encodePacked(("Mace")))
        ) {
            stat = getScore(bases[3][baseIndex], tokenId, keyPrefix);
        } else if (
            keccak256(abi.encodePacked((output))) ==
            keccak256(abi.encodePacked(("Club")))
        ) {
            stat = getScore(bases[4][baseIndex], tokenId, keyPrefix);
        } else if (
            keccak256(abi.encodePacked((output))) ==
            keccak256(abi.encodePacked(("Katana")))
        ) {
            stat = getScore(bases[5][baseIndex], tokenId, keyPrefix);
        } else if (
            keccak256(abi.encodePacked((output))) ==
            keccak256(abi.encodePacked(("Falchion")))
        ) {
            stat = getScore(bases[6][baseIndex], tokenId, keyPrefix);
        } else if (
            keccak256(abi.encodePacked((output))) ==
            keccak256(abi.encodePacked(("Scimitar")))
        ) {
            stat = getScore(bases[7][baseIndex], tokenId, keyPrefix);
        } else if (
            keccak256(abi.encodePacked((output))) ==
            keccak256(abi.encodePacked(("Long Sword")))
        ) {
            stat = getScore(bases[8][baseIndex], tokenId, keyPrefix);
        } else if (
            keccak256(abi.encodePacked((output))) ==
            keccak256(abi.encodePacked(("Short Sword")))
        ) {
            stat = getScore(bases[9][baseIndex], tokenId, keyPrefix);
        } else if (
            keccak256(abi.encodePacked((output))) ==
            keccak256(abi.encodePacked(("Ghost Wand")))
        ) {
            stat = getScore(bases[10][baseIndex], tokenId, keyPrefix);
        } else if (
            keccak256(abi.encodePacked((output))) ==
            keccak256(abi.encodePacked(("Grave Wand")))
        ) {
            stat = getScore(bases[11][baseIndex], tokenId, keyPrefix);
        } else if (
            keccak256(abi.encodePacked((output))) ==
            keccak256(abi.encodePacked(("Bone Wand")))
        ) {
            stat = getScore(bases[12][baseIndex], tokenId, keyPrefix);
        } else if (
            keccak256(abi.encodePacked((output))) ==
            keccak256(abi.encodePacked(("Wand")))
        ) {
            stat = getScore(bases[13][baseIndex], tokenId, keyPrefix);
        } else if (
            keccak256(abi.encodePacked((output))) ==
            keccak256(abi.encodePacked(("Grimoire")))
        ) {
            stat = getScore(bases[14][baseIndex], tokenId, keyPrefix);
        } else if (
            keccak256(abi.encodePacked((output))) ==
            keccak256(abi.encodePacked(("Chronicle")))
        ) {
            stat = getScore(bases[15][baseIndex], tokenId, keyPrefix);
        } else if (
            keccak256(abi.encodePacked((output))) ==
            keccak256(abi.encodePacked(("Tome")))
        ) {
            stat = getScore(bases[16][baseIndex], tokenId, keyPrefix);
        } else if (
            keccak256(abi.encodePacked((output))) ==
            keccak256(abi.encodePacked(("Book")))
        ) {
            stat = getScore(bases[17][baseIndex], tokenId, keyPrefix);
        }
        if (baseIndex == 3) {
            output = string(abi.encodePacked(keyPrefix, ": ", toString(stat)));
            return output;
        }
        if (greatness > 14) {
            stat += getScore(0, tokenId, suffixes[rand % suffixes.length]);
        }
        if (greatness >= 19) {
            if (greatness == 19) {
                stat += getScore(
                    0,
                    tokenId,
                    string(
                        abi.encodePacked(
                            namePrefixes[rand % namePrefixes.length],
                            nameSuffixes[rand % nameSuffixes.length]
                        )
                    )
                );
            } else {
                stat += 300;
            }
        }
        stat += boosts[tokenId];
        output = string(abi.encodePacked(keyPrefix, ": ", toString(stat)));
        return output;
    }

    function tokenURI(uint256 tokenId)
        public
        view
        override
        returns (string memory)
    {
        string[13] memory parts;
        parts[
            0
        ] = '<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 350 350"><style>.base { fill: white; font-family: serif; font-size: 14px; }</style><rect width="100%" height="100%" fill="#7d5cff" /><text x="10" y="20" class="base">';

        parts[1] = "Skills";

        parts[2] = '</text><text x="10" y="40" class="base">';

        parts[3] = getAttack(tokenId);

        parts[4] = '</text><text x="10" y="60" class="base">';

        parts[5] = getDefense(tokenId);

        parts[6] = '</text><text x="10" y="80" class="base">';

        parts[7] = getDurability(tokenId);

        parts[8] = '</text><text x="10" y="100" class="base">';

        parts[9] = getWeight(tokenId);

        parts[10] = '</text><text x="10" y="120" class="base">';

        parts[11] = getMagic(tokenId);

        parts[12] = "</text></svg>";

        string memory output = string(
            abi.encodePacked(
                parts[0],
                parts[1],
                parts[2],
                parts[3],
                parts[4],
                parts[5],
                parts[6],
                parts[7],
                parts[8]
            )
        );
        output = string(
            abi.encodePacked(output, parts[9], parts[10], parts[11], parts[12])
        );

        string memory json = Base64.encode(
            bytes(
                string(
                    abi.encodePacked(
                        '{"name": "Weapon #',
                        toString(tokenId),
                        '", "description": "The Weaponsmith is open. Cudlers will be able to mint their weapons and reveal their underlying powers - attack, defense, durability, weight and magic. Mint your weapon, reveal your stats.", "image": "data:image/svg+xml;base64,',
                        Base64.encode(bytes(output)),
                        '"}'
                    )
                )
            )
        );
        output = string(
            abi.encodePacked("data:application/json;base64,", json)
        );

        return output;
    }

    receive() external payable {}

    function withdraw(address to) public onlyOwner {
        address payable muse = payable(
            0x6fBa46974b2b1bEfefA034e236A32e1f10C5A148
        ); //multisig)
        (bool sentMuse, ) = muse.call{value: (address(this).balance / 10)}("");
        require(sentMuse, "Failed to send Ether");

        address payable _to = payable(to); //multisig
        (bool sent, ) = _to.call{value: address(this).balance}("");
        require(sent, "Failed to send Ether");
    }

    function claimForMooncat(uint256 tokenId) public nonReentrant {
        require(tokenId > 0 && tokenId < 25440, "Token ID invalid");
        require(mooncat.ownerOf(tokenId) == msg.sender, "Not mooncat owner");
        _safeMint(_msgSender(), tokenId);
    }

    function claim(uint256 tokenId) public payable nonReentrant {
        require(tokenId > 25440 && tokenId < 33000, "Token ID invalid");
        require(msg.value >= 0.05 ether);

        _safeMint(_msgSender(), tokenId);
    }

    function ownerClaim(uint256 tokenId) public nonReentrant onlyOwner {
        require(tokenId > 33000 && tokenId < 33200, "Token ID invalid");
        _safeMint(owner(), tokenId);
    }

    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT license
        // 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);
    }

    constructor() ERC721("Cudl Weapon", "CWEAPON") Ownable() {
        bases[0] = [800, 350, 850, 800, 0];
        bases[1] = [200, 400, 350, 200, 0];
        bases[2] = [400, 250, 550, 400, 0];
        bases[3] = [500, 250, 550, 400, 0];
        bases[4] = [300, 150, 400, 300, 0];
        bases[5] = [950, 250, 700, 150, 0];
        bases[6] = [650, 150, 400, 150, 0];
        bases[7] = [700, 200, 500, 200, 0];
        bases[8] = [750, 250, 600, 250, 0];
        bases[9] = [400, 150, 400, 150, 0];
        bases[10] = [50, 50, 550, 50, 800];
        bases[11] = [50, 50, 400, 50, 700];
        bases[12] = [50, 50, 350, 50, 650];
        bases[13] = [50, 50, 400, 50, 600];
        bases[14] = [50, 50, 50, 25, 850];
        bases[15] = [15, 50, 50, 15, 0];
        bases[16] = [100, 100, 50, 50, 0];
        bases[17] = [50, 50, 50, 25, 0];
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"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":false,"internalType":"uint256","name":"oldBoostCoefficient","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBoostCoefficient","type":"uint256"}],"name":"BoostCoefficientUpdated","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":"oldToken","type":"address"},{"indexed":false,"internalType":"address","name":"newToken","type":"address"}],"name":"TokenUpdated","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":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"upgradeAmount","type":"uint256"}],"name":"Upgrade","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"open","type":"bool"}],"name":"WeaponSmithOpen","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":[{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"bases","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"boosts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"claimForMooncat","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getAttack","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getDefense","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getDurability","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getMagic","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"base","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"output","type":"string"}],"name":"getScore","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getWeight","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"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":"uint256","name":"_boostCoefficient","type":"uint256"}],"name":"setBoostCoefficient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"setToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_weaponSmithOpen","type":"bool"}],"name":"setWeaponSmithOpen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"sweep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"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":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","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":[],"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":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"weaponSmith","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

600c80546001600160a01b03191673c3f733ca98e0dad0386979eb96fb1722a1a05e6917815560096102c0818152682bb0b93430b6b6b2b960b91b6102e05260809081526103009283526b28bab0b93a32b939ba30b33360a11b6103205260a09290925260046103408181526313585d5b60e21b6103605260c052610380818152634d61636560e01b6103a05260e0526103c08181526321b63ab160e11b6103e052610100526006610400908152654b6174616e6160d01b61042052610120526008610440818152672330b631b434b7b760c11b61046052610140526104808181526729b1b4b6b4ba30b960c11b6104a05261016052600a6104c081815269131bdb99c814dddbdc9960b21b6104e05261018052600b6105009081526a14da1bdc9d0814dddbdc9960aa1b610520526101a0526105408181526911da1bdcdd0815d85b9960b21b610560526101c0526105809081526911dc985d994815d85b9960b21b6105a0526101e0526105c083815268109bdb994815d85b9960ba1b6105e052610200526106008281526315d85b9960e21b6106205261022052610640908152674772696d6f69726560c01b6106605261024052610680918252684368726f6e69636c6560b81b6106a052610260919091526106c081815263546f6d6560e01b6106e0526102805261074060405261070090815263426f6f6b60e01b610720526102a0526200021490601290816200175b565b50604080516108e08101825260056108a082018181526441676f6e7960d81b6108c0840152825282518084018452600a8082526941706f63616c7970736560b01b60208381019190915280850192909252845180860186528181526920b936b0b3b2b23237b760b11b818401528486015284518086018652838152641099585cdd60da1b81840152606085015284518086018652600880825267084cad0cadadee8d60c31b82850152608086019190915285518087018752600680825265109b1a59da1d60d21b8286015260a08701919091528651808801885285815264109b1bdbd960da1b8186015260c0870152865180880188526007808252664272616d626c6560c81b8287015260e0880191909152875180890189526009808252684272696d73746f6e6560b81b828801526101008901919091528851808a018a5287815264109c9bdbd960da1b818801526101208901528851808a018a528281526621b0b93934b7b760c91b818801526101408901528851808a018a528181526843617461636c79736d60b81b818801526101608901528851808a018a52848152674368696d6572696360c01b818801526101808901528851808a018a5283815265436f7270736560d01b818801526101a08901528851808a018a528581526921b7b9393ab83a34b7b760b11b818801526101c08901528851808a018a52818152682230b6b730ba34b7b760b91b818801526101e08901528851808a018a5287815264088cac2e8d60db1b818801526102008901528851808a018a52878152642232b6b7b760d91b818801526102208901528851808a018a526004808252634469726560e01b828901526102408a01919091528951808b018b5284815265223930b3b7b760d11b818901526102608a01528951808b018b5288815264111c99585960da1b818901526102808a01528951808b018b5281815263446f6f6d60e01b818901526102a08a01528951808b018b52818152634475736b60e01b818901526102c08a01528951808b018b52888152644561676c6560d81b818901526102e08a01528951808b018b528581526722b6b83cb932b0b760c11b818901526103008a01528951808b018b52818152634661746560e01b818901526103208a01528951808b018b52600380825262466f6560e81b828a01526103408b01919091528a51808c018c528281526347616c6560e01b818a01526103608b01528a51808c018c528981526411da1bdd5b60da1b818a01526103808b01528a51808c018c5289815264476c6f6f6d60d81b818a01526103a08b01528a51808c018c528981526408ed8f2e0d60db1b818a01526103c08b01528a51808c018c5289815264476f6c656d60d81b818a01526103e08b01528a51808c018c52828152634772696d60e01b818a01526104008b01528a51808c018c52828152634861746560e01b818a01526104208b01528a51808c018c52898152644861766f6360d81b818a01526104408b01528a51808c018c52858152652437b737bab960d11b818a01526104608b01528a51808c018c52858152652437b93937b960d11b818a01526104808b01528a51808c018c52868152674879706e6f74696360c01b818a01526104a08b01528a51808c018c528581526525b930b5b2b760d11b818a01526104c08b01528a51808c018c5289815264098dec2e8d60db1b818a01526104e08b01528a51808c018c52838152684d61656c7374726f6d60b81b818a01526105008b01528a51808c018c5282815263135a5b9960e21b818a01526105208b01528a51808c018c52848152664d697261636c6560c81b818a01526105408b01528a51808c018c5285815265135bdc989a5960d21b818a01526105608b01528a51808c018c529586526727b13634bb34b7b760c11b868901526105808a01959095528951808b018b528281526813db9cdb185d59da1d60ba1b818901526105a08a01528951808b018b52818152632830b4b760e11b818901526105c08a01528951808b018b52600b81526a50616e64656d6f6e69756d60a81b818901526105e08a01528951808b018b52838152660a0d0decadcd2f60cb1b818901526106008a01528951808b018b5284815265506c6167756560d01b818901526106208a01528951808b018b52818152635261676560e01b818901526106408a01528951808b018b52838152665261707475726560c81b818901526106608a01528951808b018b528181526352756e6560e01b818901526106808a01528951808b018b528881526414dadd5b1b60da1b818901526106a08a01528951808b018b528581526214dbdb60ea1b818901526106c08a01528951808b018b529081526314dbdd5b60e21b818801526106e08901528851808a018a5283815265536f72726f7760d01b818801526107008901528851808a018a528381526514dc1a5c9a5d60d21b818801526107208901528851808a018a528781526453746f726d60d81b818801526107408901528851808a018a528281526615195b5c195cdd60ca1b818801526107608901528851808a018a5282815266151bdc9b595b9d60ca1b818801526107808901528851808a018a529081526856656e6765616e636560b81b818701526107a08801528751808901895281815266566963746f727960c81b818701526107c088015287518089018952868152642b34b832b960d91b818701526107e088015287518089018952918252650acdee4e8caf60d31b828601526108008701919091528651808801885291825262576f6560e81b8285015261082086019190915285518087018752938452640aee4c2e8d60db1b8484015261084085019390935284518086018652928352664c69676874277360c81b838301526108608401929092528351808501909452908352695368696d6d6572696e6760b01b9083015261088081019190915262000a7e906013906045620017bf565b506040805161028081018252600461024082018181526342616e6560e01b61026084015282528251808401845281815263149bdbdd60e21b6020828101919091528084019190915283518085018552828152634269746560e01b81830152838501528351808501855282815263536f6e6760e01b81830152606084015283518085018552828152632937b0b960e11b81830152608084015283518085018552600580825264047726173760dc1b8284015260a085019190915284518086018652600a815269125b9cdd1c9d5b595b9d60b21b8184015260c08501528451808601865283815263476c6f7760e01b8184015260e0850152845180860186526006808252652132b73232b960d11b828501526101008601919091528551808701875290815265536861646f7760d01b818401526101208501528451808601865260078152662bb434b9b832b960c91b81840152610140850152845180860186528181526414da1bdd5d60da1b81840152610160850152845180860186529081526411dc9bdddb60da1b8183015261018084015283518085018552828152632a32b0b960e11b818301526101a084015283518085018552828152635065616b60e01b818301526101c08401528351808501855282815263466f726d60e01b818301526101e084015283518085018552600381526229bab760e91b8183015261020084015283518085019094529083526326b7b7b760e11b9083015261022081019190915262000caf9060149060126200175b565b506040805161024081018252600861020082018181526737b3102837bbb2b960c11b6102208401528252825180840184526009808252686f66204769616e747360b81b6020838101919091528085019290925284518086018652908152686f6620546974616e7360b81b818301528385015283518085018552828152671bd98814dada5b1b60c21b81830152606084015283518085018552600d8082526c37b3102832b93332b1ba34b7b760991b828401526080850191909152845180860186528181526c6f66204272696c6c69616e636560981b8184015260a08501528451808601865260108082526f1bd988115b9b1a59da1d195b9b595b9d60821b8285015260c0860191909152855180870187528281526c37b310283937ba32b1ba34b7b760991b8185015260e0860152855180870187529384526737b31020b733b2b960c11b84840152610100850193909352845180860186526007808252666f66205261676560c81b8285015261012086019190915285518087018752908152666f66204675727960c81b8184015261014085015284518086018652600a808252691bd988159a5d1c9a5bdb60b21b8285015261016086019190915285518087018752908152690decc40e8d0ca408cdef60b31b8184015261018085015284518086018652600c8082526b37b3102232ba32b1ba34b7b760a11b828501526101a0860191909152855180870187529182526c37b3102932b33632b1ba34b7b760991b828401526101c0850191909152845180860190955284526b6f6620746865205477696e7360a01b908401526101e082019290925262000f13916015919062001811565b5034801562000f2157600080fd5b50604080518082018252600b81526a21bab236102bb2b0b837b760a91b60208083019182528351808501909452600784526621aba2a0a827a760c91b90840152815191929162000f749160009162001863565b50805162000f8a90600190602084019062001863565b50506001600a555062000f9d3362001709565b6040805160a08101825261032080825261015e6020808401919091526103529383019390935260608201526000608082018190528052600f90915262001007907ff4803e074bd026baaf6ed2e288c9515f68c72fb7216eebdd7cae1718a53ec375906005620018ee565b506040805160a08101825260c880825261019060208084019190915261015e93830193909352606082015260006080820181905260019052600f90915262001073907f169f97de0d9a84d840042b17d3c6b9638b3d6fd9024c9eb0c7a306a17b49f88f906005620018ee565b506040805160a08101825261019080825260fa60208084019190915261022693830193909352606082015260006080820181905260029052600f909152620010df907fa74ba3945261e09fde15ba3db55005b205e61eeb4ad811ac0faa2b315bffeead906005620018ee565b506040805160a0810182526101f4815260fa60208083019190915261022692820192909252610190606082015260006080820181905260039052600f9091526200114d907f45f76dafbbad695564362934e24d72eedc57f9fc1a65f39bca62176cc8296828906005620018ee565b506040805160a08101825261012c808252609660208084019190915261019093830193909352606082015260006080820181905260049052600f909152620011b9907f367ccd2d0ac16bf7110a5dffe0801fdc9452a95a1adb7e1a12fe97dd3e9a4edd906005620018ee565b506040805160a0810182526103b6815260fa6020808301919091526102bc9282019290925260966060820152600060808201819052600590819052600f90925262001227917f6bda57492eba051cb4a12a1e19df47c9755d78165341d4009b1d09b3f36162049190620018ee565b506040805160a08101825261028a81526096602080830182905261019093830193909352606082015260006080820181905260069052600f90915262001291907fb5a1e7cda73b1608e93d4d50ab796c3d35aa6216cb006a1f920df154d13ff618906005620018ee565b506040805160a0810182526102bc815260c860208083018290526101f493830193909352606082015260006080820181905260079052600f909152620012fb907f73dfc495eb54bd6713ffc079b9f5e40f2fecd3793d143759ba0128fbedb40254906005620018ee565b506040805160a0810182526102ee815260fa602080830182905261025893830193909352606082015260006080820181905260089052600f90915262001365907f49a9092dc5c03b26195f6621c97b5cf515cb77afe659e3fe008a73456354eb68906005620018ee565b506040805160a0810182526101908082526096602080840182905293830191909152606082015260006080820181905260099052600f909152620013cd907f3e674ca654b1063e821161bbf601452dd0f1671d575d614ba17ca7f3cdc76039906005620018ee565b506040805160a081018252603280825260208083018290526102269383019390935260608201526103206080820152600a600052600f90915262001435907fa13a7a52a9cbb6a90f40d40fbf35f68146be73226e0f48ff16963183fd5684ad906005620018ee565b506040805160a081018252603280825260208083018290526101909383019390935260608201526102bc6080820152600b600052600f9091526200149d907f0db0e9d5a07148aa3e0acc10f721b78526b53a3f4f3d07794be76568de7347c5906005620018ee565b506040805160a0810182526032808252602080830182905261015e93830193909352606082015261028a6080820152600c600052600f90915262001505907faed549f926a17a28853af2d56b17ad8ad8d799c48d325a734362b810173b7729906005620018ee565b506040805160a081018252603280825260208083018290526101909383019390935260608201526102586080820152600d600052600f9091526200156d907fe48c37f5ec5b77098fcb2a7935f0925fec1a69796c076c65ed90d9c90ef07dc5906005620018ee565b506040805160a0810182526032808252602080830182905292820152601960608201526103526080820152600e600052600f909152620015d1907f61510b1e54e804ee2580bac0a66e3ff0bcf8eecee98d26e41ad5e6195d21ef9f906005620018ee565b506040805160a081018252600f80825260326020808401829052938301526060820181905260006080830181905281905290915262001634907f09567c41c2b819e512ebbfc896a7d795b901b9f15f7637726d97561d5276acb090600562001986565b506040805160a08101825260648082526020808301919091526032928201839052606082019290925260006080820181905260109052600f9091526200169e907f19a91e2e18c07202ee013c560f8ebffb9b71a05a6a09fdb1d62a413e2117a15990600562001986565b506040805160a08101825260328082526020808301829052928201526019606082015260006080820181905260119052600f90915262001702907f8252d0af7d8ed7c10ea80b7c6f14fb078bd62e077f890e6c18f704b57caaa5fe90600562001986565b5062001a98565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054828255906000526020600020908101928215620017ad579160200282015b82811115620017ad57825180516200179c91849160209091019062001863565b50916020019190600101906200177c565b50620017bb929150620019de565b5090565b828054828255906000526020600020908101928215620017ad579160200282015b82811115620017ad57825180516200180091849160209091019062001863565b5091602001919060010190620017e0565b828054828255906000526020600020908101928215620017ad579160200282015b82811115620017ad57825180516200185291849160209091019062001863565b509160200191906001019062001832565b828054620018719062001a5b565b90600052602060002090601f016020900481019282620018955760008555620018e0565b82601f10620018b057805160ff1916838001178555620018e0565b82800160010185558215620018e0579182015b82811115620018e0578251825591602001919060010190620018c3565b50620017bb929150620019ff565b600183019183908215620018e05791602002820160005b838211156200194757835183826101000a81548161ffff021916908361ffff160217905550926020019260020160208160010104928301926001030262001905565b8015620019775782816101000a81549061ffff021916905560020160208160010104928301926001030262001947565b5050620017bb929150620019ff565b600183019183908215620018e05791602002820160005b838211156200194757835183826101000a81548161ffff021916908360ff16021790555092602001926002016020816001010492830192600103026200199d565b80821115620017bb576000620019f5828262001a16565b50600101620019de565b5b80821115620017bb576000815560010162001a00565b50805462001a249062001a5b565b6000825580601f1062001a38575062001a58565b601f01602090049060005260206000209081019062001a589190620019ff565b50565b60028104600182168062001a7057607f821691505b6020821081141562001a9257634e487b7160e01b600052602260045260246000fd5b50919050565b6146e58062001aa86000396000f3fe60806040526004361061021e5760003560e01c80635bc0a62311610123578063b88d4fde116100ab578063d851fdfd1161006f578063d851fdfd14610655578063e985e9c514610675578063eb22daa3146106be578063f2fde38b146106de578063fc0c546a146106fe57610225565b8063b88d4fde146105b5578063c87b56dd146105d5578063ca0056e0146105f5578063cff840f014610615578063d7d0a45a1461063557610225565b8063715018a6116100f2578063715018a61461052d5780638da5cb5b14610542578063951ca9321461056057806395d89b4114610580578063a22cb4651461059557610225565b80635bc0a623146104ad5780636352211e146104cd5780636ea056a9146104ed57806370a082311461050d57610225565b8063379607f5116101a65780634afd82e7116101755780634afd82e7146104005780634f6ccce71461042d578063509d29271461044d57806351cff8d91461046d5780635466d84e1461048d57610225565b8063379607f51461038d57806341bc680f146103a057806342842e0e146103c0578063434f48c4146103e057610225565b8063144fa6d7116101ed578063144fa6d7146102db57806318160ddd146102fb57806323b872dd1461031a5780632914f8e91461033a5780632f745c591461036d57610225565b806301ffc9a71461022a57806306fdde031461025f578063081812fc14610281578063095ea7b3146102b957610225565b3661022557005b600080fd5b34801561023657600080fd5b5061024a610245366004613c2f565b61071e565b60405190151581526020015b60405180910390f35b34801561026b57600080fd5b5061027461074b565b60405161025691906141e7565b34801561028d57600080fd5b506102a161029c366004613c67565b6107dd565b6040516001600160a01b039091168152602001610256565b3480156102c557600080fd5b506102d96102d4366004613bcc565b610877565b005b3480156102e757600080fd5b506102d96102f6366004613a72565b61098d565b34801561030757600080fd5b506008545b604051908152602001610256565b34801561032657600080fd5b506102d9610335366004613ae2565b610a20565b34801561034657600080fd5b5061035a610355366004613d01565b610a51565b60405161ffff9091168152602001610256565b34801561037957600080fd5b5061030c610388366004613bcc565b610a8e565b6102d961039b366004613c67565b610b24565b3480156103ac57600080fd5b506102d96103bb366004613c7f565b610ba1565b3480156103cc57600080fd5b506102d96103db366004613ae2565b610cb9565b3480156103ec57600080fd5b506102d96103fb366004613c67565b610cd4565b34801561040c57600080fd5b5061030c61041b366004613c67565b600e6020526000908152604090205481565b34801561043957600080fd5b5061030c610448366004613c67565b610d69565b34801561045957600080fd5b50610274610468366004613c67565b610e0a565b34801561047957600080fd5b506102d9610488366004613a72565b610f0c565b34801561049957600080fd5b506102d96104a8366004613c67565b611083565b3480156104b957600080fd5b506102746104c8366004613c67565b61119d565b3480156104d957600080fd5b506102a16104e8366004613c67565b61129a565b3480156104f957600080fd5b506102d9610508366004613bcc565b611311565b34801561051957600080fd5b5061030c610528366004613a72565b611353565b34801561053957600080fd5b506102d96113da565b34801561054e57600080fd5b50600b546001600160a01b03166102a1565b34801561056c57600080fd5b506102d961057b366004613c67565b611410565b34801561058c57600080fd5b5061027461147b565b3480156105a157600080fd5b506102d96105b0366004613b9f565b61148a565b3480156105c157600080fd5b506102d96105d0366004613b22565b61155c565b3480156105e157600080fd5b506102746105f0366004613c67565b611594565b34801561060157600080fd5b506102d9610610366004613bf7565b6117de565b34801561062157600080fd5b50610274610630366004613c67565b611850565b34801561064157600080fd5b5061030c610650366004613ca0565b61194e565b34801561066157600080fd5b50610274610670366004613c67565b611a4c565b34801561068157600080fd5b5061024a610690366004613aaa565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156106ca57600080fd5b506102746106d9366004613c67565b611b4a565b3480156106ea57600080fd5b506102d96106f9366004613a72565b611c49565b34801561070a57600080fd5b50600d546102a1906001600160a01b031681565b60006001600160e01b0319821663780e9d6360e01b1480610743575061074382611ce4565b90505b919050565b60606000805461075a906143c1565b80601f0160208091040260200160405190810160405280929190818152602001828054610786906143c1565b80156107d35780601f106107a8576101008083540402835291602001916107d3565b820191906000526020600020905b8154815290600101906020018083116107b657829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b031661085b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006108828261129a565b9050806001600160a01b0316836001600160a01b031614156108f05760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610852565b336001600160a01b038216148061090c575061090c8133610690565b61097e5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610852565b6109888383611d34565b505050565b600b546001600160a01b031633146109b75760405162461bcd60e51b81526004016108529061424c565b600d54604080516001600160a01b03928316815291831660208301527f0b1186973f810894b87ab0bfbee422fddcaad21b46dc705a561451bbb6bac117910160405180910390a1600d80546001600160a01b0319166001600160a01b0392909216919091179055565b610a2a3382611da2565b610a465760405162461bcd60e51b8152600401610852906142ab565b610988838383611e99565b600f6020528160005260406000208160058110610a6d57600080fd5b60109182820401919006600202915091509054906101000a900461ffff1681565b6000610a9983611353565b8210610afb5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610852565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6002600a541415610b475760405162461bcd60e51b8152600401610852906142fc565b6002600a5561636081118015610b5e57506180e881105b610b7a5760405162461bcd60e51b815260040161085290614281565b66b1a2bc2ec50000341015610b8e57600080fd5b610b99335b82612044565b506001600a55565b60115460ff16610bdb5760405162461bcd60e51b815260206004820152600560248201526410b7b832b760d91b6044820152606401610852565b33610be58361129a565b6001600160a01b031614610c245760405162461bcd60e51b815260206004820152600660248201526510b7bbb732b960d11b6044820152606401610852565b600d54610c3c906001600160a01b031633308461205e565b601054610c49908261434b565b6000838152600e602052604081208054909190610c67908490614333565b90915550506010547feb0ebb51128928d7b1a6419c52128a9319bfcb55f0adafea75afbf75f9f2f3e9908390610c9d908461434b565b6040805192835260208301919091520160405180910390a15050565b6109888383836040518060200160405280600081525061155c565b6002600a541415610cf75760405162461bcd60e51b8152600401610852906142fc565b6002600a55600b546001600160a01b03163314610d265760405162461bcd60e51b81526004016108529061424c565b6180e881118015610d3857506181b081105b610d545760405162461bcd60e51b815260040161085290614281565b610b99610b93600b546001600160a01b031690565b6000610d7460085490565b8210610dd75760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610852565b60088281548110610df857634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b6060610743826040518060400160405280600a8152602001694475726162696c69747960b01b8152506012805480602002602001604051908101604052809291908181526020016000905b82821015610f01578382906000526020600020018054610e74906143c1565b80601f0160208091040260200160405190810160405280929190818152602001828054610ea0906143c1565b8015610eed5780601f10610ec257610100808354040283529160200191610eed565b820191906000526020600020905b815481529060010190602001808311610ed057829003601f168201915b505050505081526020019060010190610e55565b5050505060026120c9565b600b546001600160a01b03163314610f365760405162461bcd60e51b81526004016108529061424c565b736fba46974b2b1befefa034e236a32e1f10c5a148600081610f59600a4761434b565b604051600081818185875af1925050503d8060008114610f95576040519150601f19603f3d011682016040523d82523d6000602084013e610f9a565b606091505b5050905080610fe25760405162461bcd60e51b81526020600482015260146024820152732330b4b632b2103a379039b2b7321022ba3432b960611b6044820152606401610852565b60405183906000906001600160a01b0383169047908381818185875af1925050503d806000811461102f576040519150601f19603f3d011682016040523d82523d6000602084013e611034565b606091505b505090508061107c5760405162461bcd60e51b81526020600482015260146024820152732330b4b632b2103a379039b2b7321022ba3432b960611b6044820152606401610852565b5050505050565b6002600a5414156110a65760405162461bcd60e51b8152600401610852906142fc565b6002600a5580158015906110bb575061636081105b6110d75760405162461bcd60e51b815260040161085290614281565b600c546040516331a9108f60e11b81526004810183905233916001600160a01b031690636352211e9060240160206040518083038186803b15801561111b57600080fd5b505afa15801561112f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111539190613a8e565b6001600160a01b031614610b8e5760405162461bcd60e51b81526020600482015260116024820152702737ba1036b7b7b731b0ba1037bbb732b960791b6044820152606401610852565b606061074382604051806040016040528060058152602001644d6167696360d81b8152506012805480602002602001604051908101604052809291908181526020016000905b8282101561128f578382906000526020600020018054611202906143c1565b80601f016020809104026020016040519081016040528092919081815260200182805461122e906143c1565b801561127b5780601f106112505761010080835404028352916020019161127b565b820191906000526020600020905b81548152906001019060200180831161125e57829003601f168201915b5050505050815260200190600101906111e3565b5050505060046120c9565b6000818152600260205260408120546001600160a01b0316806107435760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610852565b600b546001600160a01b0316331461133b5760405162461bcd60e51b81526004016108529061424c565b61134f6001600160a01b0383163383612f7d565b5050565b60006001600160a01b0382166113be5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610852565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b031633146114045760405162461bcd60e51b81526004016108529061424c565b61140e6000612fad565b565b600b546001600160a01b0316331461143a5760405162461bcd60e51b81526004016108529061424c565b60105460408051918252602082018390527f442470ee4e479870e8d696076707c503d505ae7a5ebfeec93dcf02ca8ba6cb63910160405180910390a1601055565b60606001805461075a906143c1565b6001600160a01b0382163314156114e35760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610852565b3360008181526005602090815260408083206001600160a01b0387168085529252909120805460ff1916841515179055906001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611550911515815260200190565b60405180910390a35050565b6115663383611da2565b6115825760405162461bcd60e51b8152600401610852906142ab565b61158e84848484612fff565b50505050565b606061159e6139d4565b60405180610120016040528060ff815260200161454960ff91398152604080518082019091526006815265536b696c6c7360d01b6020820152816001602002018190525060405180606001604052806028815260200161468860289139604082015261160983611850565b60608083019190915260408051918201905260288082526144a76020830139608082015261163683611b4a565b60a0820152604080516060810190915260288082526144f8602083013960c082015261166183610e0a565b60e082015260408051606081019091526029808252614520602083013961010082015261168d83611a4c565b610120820152604080516060810190915260298082526144cf60208301396101408201526116ba8361119d565b610160820152604080518082018252600d81526c1e17ba32bc3a1f1e17b9bb339f60991b602080830191909152610180840191909152825181840151838501516060860151608087015160a088015160c089015160e08a01516101008b0151995160009a61172a9a909101613e9d565b60408051808303601f190181529082905261012084015161014085015161016086015161018087015193955061176594869490602001613e32565b604051602081830303815290604052905060006117b261178486613032565b61178d8461314d565b60405160200161179e929190613fde565b60405160208183030381529060405261314d565b9050806040516020016117c59190614165565b60408051808303601f1901815291905295945050505050565b600b546001600160a01b031633146118085760405162461bcd60e51b81526004016108529061424c565b60405181151581527feb8f94eb25ddc54db307c7449e958c7d25cba114a758d26a830aee610b2f0ea29060200160405180910390a16011805460ff1916911515919091179055565b6060610743826040518060400160405280600681526020016541747461636b60d01b8152506012805480602002602001604051908101604052809291908181526020016000905b828210156119435783829060005260206000200180546118b6906143c1565b80601f01602080910402602001604051908101604052809291908181526020018280546118e2906143c1565b801561192f5780601f106119045761010080835404028352916020019161192f565b820191906000526020600020905b81548152906001019060200180831161191257829003601f168201915b505050505081526020019060010190611897565b5050505060006120c9565b60008060648361195d86613032565b60405160200161196e929190613e03565b6040516020818303038152906040528051906020012060001c6119919190614417565b90506000600a82116119af576119a8600a82614333565b9050611a36565b600a821180156119c0575060198211155b156119d0576119a8603282614333565b6019821180156119e15750604b8211155b156119f1576119a8606482614333565b604b82118015611a025750605a8211155b15611a12576119a8609682614333565b605a82118015611a23575060648211155b15611a3657611a3360fa82614333565b90505b611a408682614333565b925050505b9392505050565b6060610743826040518060400160405280600681526020016515d95a59da1d60d21b8152506012805480602002602001604051908101604052809291908181526020016000905b82821015611b3f578382906000526020600020018054611ab2906143c1565b80601f0160208091040260200160405190810160405280929190818152602001828054611ade906143c1565b8015611b2b5780601f10611b0057610100808354040283529160200191611b2b565b820191906000526020600020905b815481529060010190602001808311611b0e57829003601f168201915b505050505081526020019060010190611a93565b5050505060036120c9565b60606107438260405180604001604052806007815260200166446566656e736560c81b8152506012805480602002602001604051908101604052809291908181526020016000905b82821015611c3e578382906000526020600020018054611bb1906143c1565b80601f0160208091040260200160405190810160405280929190818152602001828054611bdd906143c1565b8015611c2a5780601f10611bff57610100808354040283529160200191611c2a565b820191906000526020600020905b815481529060010190602001808311611c0d57829003601f168201915b505050505081526020019060010190611b92565b5050505060016120c9565b600b546001600160a01b03163314611c735760405162461bcd60e51b81526004016108529061424c565b6001600160a01b038116611cd85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610852565b611ce181612fad565b50565b60006001600160e01b031982166380ac58cd60e01b1480611d1557506001600160e01b03198216635b5e139f60e01b145b8061074357506301ffc9a760e01b6001600160e01b0319831614610743565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611d698261129a565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611e1b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610852565b6000611e268361129a565b9050806001600160a01b0316846001600160a01b03161480611e615750836001600160a01b0316611e56846107dd565b6001600160a01b0316145b80611e9157506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611eac8261129a565b6001600160a01b031614611f145760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610852565b6001600160a01b038216611f765760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610852565b611f818383836132c4565b611f8c600082611d34565b6001600160a01b0383166000908152600360205260408120805460019290611fb590849061437e565b90915550506001600160a01b0382166000908152600360205260408120805460019290611fe3908490614333565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b61134f828260405180602001604052806000815250613381565b6040516001600160a01b038085166024830152831660448201526064810182905261158e9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526133b4565b606060006120fd6120d987613032565b6040516020016120e99190613fb0565b604051602081830303815290604052613486565b905060008485518361210f9190614417565b8151811061212d57634e487b7160e01b600052603260045260246000fd5b6020026020010151905060006015836121469190614417565b9050600060405160200161216990682bb0b93430b6b6b2b960b91b815260090190565b60405160208183030381529060405280519060200120836040516020016121909190613de7565b6040516020818303038152906040528051906020012014156122245760008052600f60205261221d7ff4803e074bd026baaf6ed2e288c9515f68c72fb7216eebdd7cae1718a53ec37587600581106121f857634e487b7160e01b600052603260045260246000fd5b601091828204019190066002029054906101000a900461ffff1661ffff168a8a61194e565b9050612d36565b6040516b28bab0b93a32b939ba30b33360a11b6020820152602c0160405160208183030381529060405280519060200120836040516020016122669190613de7565b6040516020818303038152906040528051906020012014156122cf576001600052600f60205261221d7f169f97de0d9a84d840042b17d3c6b9638b3d6fd9024c9eb0c7a306a17b49f88f87600581106121f857634e487b7160e01b600052603260045260246000fd5b6040516313585d5b60e21b602082015260240160405160208183030381529060405280519060200120836040516020016123099190613de7565b604051602081830303815290604052805190602001201415612372576002600052600f60205261221d7fa74ba3945261e09fde15ba3db55005b205e61eeb4ad811ac0faa2b315bffeead87600581106121f857634e487b7160e01b600052603260045260246000fd5b604051634d61636560e01b602082015260240160405160208183030381529060405280519060200120836040516020016123ac9190613de7565b604051602081830303815290604052805190602001201415612415576003600052600f60205261221d7f45f76dafbbad695564362934e24d72eedc57f9fc1a65f39bca62176cc829682887600581106121f857634e487b7160e01b600052603260045260246000fd5b6040516321b63ab160e11b6020820152602401604051602081830303815290604052805190602001208360405160200161244f9190613de7565b6040516020818303038152906040528051906020012014156124b8576004600052600f60205261221d7f367ccd2d0ac16bf7110a5dffe0801fdc9452a95a1adb7e1a12fe97dd3e9a4edd87600581106121f857634e487b7160e01b600052603260045260246000fd5b604051654b6174616e6160d01b602082015260260160405160208183030381529060405280519060200120836040516020016124f49190613de7565b6040516020818303038152906040528051906020012014156125605760056000819052600f60205261221d907f6bda57492eba051cb4a12a1e19df47c9755d78165341d4009b1d09b3f361620490889081106121f857634e487b7160e01b600052603260045260246000fd5b604051672330b631b434b7b760c11b6020820152602801604051602081830303815290604052805190602001208360405160200161259e9190613de7565b604051602081830303815290604052805190602001201415612607576006600052600f60205261221d7fb5a1e7cda73b1608e93d4d50ab796c3d35aa6216cb006a1f920df154d13ff61887600581106121f857634e487b7160e01b600052603260045260246000fd5b6040516729b1b4b6b4ba30b960c11b602082015260280160405160208183030381529060405280519060200120836040516020016126459190613de7565b6040516020818303038152906040528051906020012014156126ae576007600052600f60205261221d7f73dfc495eb54bd6713ffc079b9f5e40f2fecd3793d143759ba0128fbedb4025487600581106121f857634e487b7160e01b600052603260045260246000fd5b60405169131bdb99c814dddbdc9960b21b6020820152602a0160405160208183030381529060405280519060200120836040516020016126ee9190613de7565b604051602081830303815290604052805190602001201415612757576008600052600f60205261221d7f49a9092dc5c03b26195f6621c97b5cf515cb77afe659e3fe008a73456354eb6887600581106121f857634e487b7160e01b600052603260045260246000fd5b6040516a14da1bdc9d0814dddbdc9960aa1b6020820152602b0160405160208183030381529060405280519060200120836040516020016127989190613de7565b604051602081830303815290604052805190602001201415612801576009600052600f60205261221d7f3e674ca654b1063e821161bbf601452dd0f1671d575d614ba17ca7f3cdc7603987600581106121f857634e487b7160e01b600052603260045260246000fd5b6040516911da1bdcdd0815d85b9960b21b6020820152602a0160405160208183030381529060405280519060200120836040516020016128419190613de7565b6040516020818303038152906040528051906020012014156128aa57600a600052600f60205261221d7fa13a7a52a9cbb6a90f40d40fbf35f68146be73226e0f48ff16963183fd5684ad87600581106121f857634e487b7160e01b600052603260045260246000fd5b6040516911dc985d994815d85b9960b21b6020820152602a0160405160208183030381529060405280519060200120836040516020016128ea9190613de7565b60405160208183030381529060405280519060200120141561295357600b600052600f60205261221d7f0db0e9d5a07148aa3e0acc10f721b78526b53a3f4f3d07794be76568de7347c587600581106121f857634e487b7160e01b600052603260045260246000fd5b60405168109bdb994815d85b9960ba1b602082015260290160405160208183030381529060405280519060200120836040516020016129929190613de7565b6040516020818303038152906040528051906020012014156129fb57600c600052600f60205261221d7faed549f926a17a28853af2d56b17ad8ad8d799c48d325a734362b810173b772987600581106121f857634e487b7160e01b600052603260045260246000fd5b6040516315d85b9960e21b60208201526024016040516020818303038152906040528051906020012083604051602001612a359190613de7565b604051602081830303815290604052805190602001201415612a9e57600d600052600f60205261221d7fe48c37f5ec5b77098fcb2a7935f0925fec1a69796c076c65ed90d9c90ef07dc587600581106121f857634e487b7160e01b600052603260045260246000fd5b604051674772696d6f69726560c01b60208201526028016040516020818303038152906040528051906020012083604051602001612adc9190613de7565b604051602081830303815290604052805190602001201415612b4557600e600052600f60205261221d7f61510b1e54e804ee2580bac0a66e3ff0bcf8eecee98d26e41ad5e6195d21ef9f87600581106121f857634e487b7160e01b600052603260045260246000fd5b604051684368726f6e69636c6560b81b60208201526029016040516020818303038152906040528051906020012083604051602001612b849190613de7565b604051602081830303815290604052805190602001201415612bed57600f600081905260205261221d7f09567c41c2b819e512ebbfc896a7d795b901b9f15f7637726d97561d5276acb087600581106121f857634e487b7160e01b600052603260045260246000fd5b60405163546f6d6560e01b60208201526024016040516020818303038152906040528051906020012083604051602001612c279190613de7565b604051602081830303815290604052805190602001201415612c90576010600052600f60205261221d7f19a91e2e18c07202ee013c560f8ebffb9b71a05a6a09fdb1d62a413e2117a15987600581106121f857634e487b7160e01b600052603260045260246000fd5b60405163426f6f6b60e01b60208201526024016040516020818303038152906040528051906020012083604051602001612cca9190613de7565b604051602081830303815290604052805190602001201415612d36576011600052600f602052612d337f8252d0af7d8ed7c10ea80b7c6f14fb078bd62e077f890e6c18f704b57caaa5fe87600581106121f857634e487b7160e01b600052603260045260246000fd5b90505b8560031415612d765787612d4982613032565b604051602001612d5a929190613f5e565b60408051601f198184030181529190529450611e919350505050565b600e821115612e5a57612e4d60008a6015808054905088612d979190614417565b81548110612db557634e487b7160e01b600052603260045260246000fd5b906000526020600020018054612dca906143c1565b80601f0160208091040260200160405190810160405280929190818152602001828054612df6906143c1565b8015612e435780601f10612e1857610100808354040283529160200191612e43565b820191906000526020600020905b815481529060010190602001808311612e2657829003601f168201915b505050505061194e565b612e579082614333565b90505b60138210612f2a578160131415612f1b57612f0a60008a6013808054905088612e839190614417565b81548110612ea157634e487b7160e01b600052603260045260246000fd5b906000526020600020016014808054905089612ebd9190614417565b81548110612edb57634e487b7160e01b600052603260045260246000fd5b90600052602060002001604051602001612ef6929190613f9b565b60405160208183030381529060405261194e565b612f149082614333565b9050612f2a565b612f2761012c82614333565b90505b6000898152600e6020526040902054612f439082614333565b905087612f4f82613032565b604051602001612f60929190613f5e565b60408051808303601f190181529190529998505050505050505050565b6040516001600160a01b03831660248201526044810182905261098890849063a9059cbb60e01b90606401612092565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61300a848484611e99565b613016848484846134b7565b61158e5760405162461bcd60e51b8152600401610852906141fa565b60608161305757506040805180820190915260018152600360fc1b6020820152610746565b8160005b8115613081578061306b816143fc565b915061307a9050600a8361434b565b915061305b565b60008167ffffffffffffffff8111156130aa57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156130d4576020820181803683370190505b5090505b8415611e91576130e960018361437e565b91506130f6600a86614417565b613101906030614333565b60f81b81838151811061312457634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350613146600a8661434b565b94506130d8565b606081516000141561316e5750604080516020810190915260008152610746565b6000604051806060016040528060408152602001614648604091399050600060038451600261319d9190614333565b6131a7919061434b565b6131b290600461435f565b905060006131c1826020614333565b67ffffffffffffffff8111156131e757634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015613211576020820181803683370190505b509050818152600183018586518101602084015b8183101561327f5760039283018051603f601282901c811687015160f890811b8552600c83901c8216880151811b6001860152600683901c8216880151811b60028601529116860151901b93820193909352600401613225565b60038951066001811461329957600281146132aa576132b6565b613d3d60f01b6001198301526132b6565b603d60f81b6000198301525b509398975050505050505050565b6001600160a01b03831661331f5761331a81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b613342565b816001600160a01b0316836001600160a01b0316146133425761334283826135c1565b6001600160a01b03821661335e576133598161365e565b610988565b826001600160a01b0316826001600160a01b031614610988576109888282613737565b61338b838361377b565b61339860008484846134b7565b6109885760405162461bcd60e51b8152600401610852906141fa565b6000613409826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166138c99092919063ffffffff16565b80519091501561098857808060200190518101906134279190613c13565b6109885760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610852565b6000816040516020016134999190613de7565b60408051601f19818403018152919052805160209091012092915050565b60006001600160a01b0384163b156135b957604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906134fb9033908990889088906004016141aa565b602060405180830381600087803b15801561351557600080fd5b505af1925050508015613545575060408051601f3d908101601f1916820190925261354291810190613c4b565b60015b61359f573d808015613573576040519150601f19603f3d011682016040523d82523d6000602084013e613578565b606091505b5080516135975760405162461bcd60e51b8152600401610852906141fa565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611e91565b506001611e91565b600060016135ce84611353565b6135d8919061437e565b60008381526007602052604090205490915080821461362b576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906136709060019061437e565b600083815260096020526040812054600880549394509092849081106136a657634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080600883815481106136d557634e487b7160e01b600052603260045260246000fd5b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061371b57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061374283611353565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166137d15760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610852565b6000818152600260205260409020546001600160a01b0316156138365760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610852565b613842600083836132c4565b6001600160a01b038216600090815260036020526040812080546001929061386b908490614333565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6060611e91848460008585843b6139225760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610852565b600080866001600160a01b0316858760405161393e9190613de7565b60006040518083038185875af1925050503d806000811461397b576040519150601f19603f3d011682016040523d82523d6000602084013e613980565b606091505b509150915061399082828661399b565b979650505050505050565b606083156139aa575081611a45565b8251156139ba5782518084602001fd5b8160405162461bcd60e51b815260040161085291906141e7565b604051806101a00160405280600d905b60608152602001906001900390816139e45790505090565b600067ffffffffffffffff80841115613a1757613a17614457565b604051601f8501601f19908116603f01168101908282118183101715613a3f57613a3f614457565b81604052809350858152868686011115613a5857600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215613a83578081fd5b8135611a458161446d565b600060208284031215613a9f578081fd5b8151611a458161446d565b60008060408385031215613abc578081fd5b8235613ac78161446d565b91506020830135613ad78161446d565b809150509250929050565b600080600060608486031215613af6578081fd5b8335613b018161446d565b92506020840135613b118161446d565b929592945050506040919091013590565b60008060008060808587031215613b37578081fd5b8435613b428161446d565b93506020850135613b528161446d565b925060408501359150606085013567ffffffffffffffff811115613b74578182fd5b8501601f81018713613b84578182fd5b613b93878235602084016139fc565b91505092959194509250565b60008060408385031215613bb1578182fd5b8235613bbc8161446d565b91506020830135613ad781614482565b60008060408385031215613bde578182fd5b8235613be98161446d565b946020939093013593505050565b600060208284031215613c08578081fd5b8135611a4581614482565b600060208284031215613c24578081fd5b8151611a4581614482565b600060208284031215613c40578081fd5b8135611a4581614490565b600060208284031215613c5c578081fd5b8151611a4581614490565b600060208284031215613c78578081fd5b5035919050565b60008060408385031215613c91578182fd5b50508035926020909101359150565b600080600060608486031215613cb4578081fd5b8335925060208401359150604084013567ffffffffffffffff811115613cd8578182fd5b8401601f81018613613ce8578182fd5b613cf7868235602084016139fc565b9150509250925092565b60008060408385031215613d13578182fd5b823560ff81168114613be9578283fd5b60008151808452613d3b816020860160208601614395565b601f01601f19169290920160200192915050565b805460009060028104600180831680613d6957607f831692505b6020808410821415613d8957634e487b7160e01b86526022600452602486fd5b818015613d9d5760018114613dae57613ddb565b60ff19861689528489019650613ddb565b60008881526020902060005b86811015613dd35781548b820152908501908301613dba565b505084890196505b50505050505092915050565b60008251613df9818460208701614395565b9190910192915050565b60008351613e15818460208801614395565b835190830190613e29818360208801614395565b01949350505050565b60008651613e44818460208b01614395565b865190830190613e58818360208b01614395565b8651910190613e6b818360208a01614395565b8551910190613e7e818360208901614395565b8451910190613e91818360208801614395565b01979650505050505050565b60008a51613eaf818460208f01614395565b8a51613ec18183860160208f01614395565b8a519184010190613ed6818360208e01614395565b8951613ee88183850160208e01614395565b8951929091010190613efe818360208c01614395565b8751613f108183850160208c01614395565b8751929091010190613f26818360208a01614395565b8551613f388183850160208a01614395565b8551929091010190613f4e818360208801614395565b019b9a5050505050505050505050565b60008351613f70818460208801614395565b6101d160f51b9083019081528351613f8f816002840160208801614395565b01600201949350505050565b6000611e91613faa8386613d4f565b84613d4f565b6000652ba2a0a827a760d11b82528251613fd1816006850160208701614395565b9190910160060192915050565b717b226e616d65223a2022576561706f6e202360701b8152825160009061400c816012850160208801614395565b80830190507f222c20226465736372697074696f6e223a202254686520576561706f6e736d6960128201527f7468206973206f70656e2e204375646c6572732077696c6c2062652061626c6560328201527f20746f206d696e7420746865697220776561706f6e7320616e6420726576656160528201527f6c20746865697220756e6465726c79696e6720706f77657273202d206174746160728201527f636b2c20646566656e73652c206475726162696c6974792c207765696768742060928201527f616e64206d616769632e204d696e7420796f757220776561706f6e2c2072657660b28201527f65616c20796f75722073746174732e222c2022696d616765223a20226461746160d2820152750e9a5b5859d94bdcdd99cade1b5b0ed8985cd94d8d0b60521b60f2820152610108845161414f8183850160208901614395565b613990828285010161227d60f01b815260020190565b60007f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008252825161419d81601d850160208701614395565b91909101601d0192915050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906141dd90830184613d23565b9695505050505050565b600060208252611a456020830184613d23565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526010908201526f151bdad95b881251081a5b9d985b1a5960821b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b600082198211156143465761434661442b565b500190565b60008261435a5761435a614441565b500490565b60008160001904831182151516156143795761437961442b565b500290565b6000828210156143905761439061442b565b500390565b60005b838110156143b0578181015183820152602001614398565b8381111561158e5750506000910152565b6002810460018216806143d557607f821691505b602082108114156143f657634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156144105761441061442b565b5060010190565b60008261442657614426614441565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611ce157600080fd5b8015158114611ce157600080fd5b6001600160e01b031981168114611ce157600080fdfe3c2f746578743e3c7465787420783d2231302220793d2236302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223132302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d2238302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223130302220636c6173733d2262617365223e3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e62617365207b2066696c6c3a2077686974653b20666f6e742d66616d696c793a2073657269663b20666f6e742d73697a653a20313470783b207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d222337643563666622202f3e3c7465787420783d2231302220793d2232302220636c6173733d2262617365223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c2f746578743e3c7465787420783d2231302220793d2234302220636c6173733d2262617365223ea26469706673582212204419559faf1c90ec61da164f0594571986bb9a36246096da102771d14e5cf33b64736f6c63430008020033

Deployed Bytecode

0x60806040526004361061021e5760003560e01c80635bc0a62311610123578063b88d4fde116100ab578063d851fdfd1161006f578063d851fdfd14610655578063e985e9c514610675578063eb22daa3146106be578063f2fde38b146106de578063fc0c546a146106fe57610225565b8063b88d4fde146105b5578063c87b56dd146105d5578063ca0056e0146105f5578063cff840f014610615578063d7d0a45a1461063557610225565b8063715018a6116100f2578063715018a61461052d5780638da5cb5b14610542578063951ca9321461056057806395d89b4114610580578063a22cb4651461059557610225565b80635bc0a623146104ad5780636352211e146104cd5780636ea056a9146104ed57806370a082311461050d57610225565b8063379607f5116101a65780634afd82e7116101755780634afd82e7146104005780634f6ccce71461042d578063509d29271461044d57806351cff8d91461046d5780635466d84e1461048d57610225565b8063379607f51461038d57806341bc680f146103a057806342842e0e146103c0578063434f48c4146103e057610225565b8063144fa6d7116101ed578063144fa6d7146102db57806318160ddd146102fb57806323b872dd1461031a5780632914f8e91461033a5780632f745c591461036d57610225565b806301ffc9a71461022a57806306fdde031461025f578063081812fc14610281578063095ea7b3146102b957610225565b3661022557005b600080fd5b34801561023657600080fd5b5061024a610245366004613c2f565b61071e565b60405190151581526020015b60405180910390f35b34801561026b57600080fd5b5061027461074b565b60405161025691906141e7565b34801561028d57600080fd5b506102a161029c366004613c67565b6107dd565b6040516001600160a01b039091168152602001610256565b3480156102c557600080fd5b506102d96102d4366004613bcc565b610877565b005b3480156102e757600080fd5b506102d96102f6366004613a72565b61098d565b34801561030757600080fd5b506008545b604051908152602001610256565b34801561032657600080fd5b506102d9610335366004613ae2565b610a20565b34801561034657600080fd5b5061035a610355366004613d01565b610a51565b60405161ffff9091168152602001610256565b34801561037957600080fd5b5061030c610388366004613bcc565b610a8e565b6102d961039b366004613c67565b610b24565b3480156103ac57600080fd5b506102d96103bb366004613c7f565b610ba1565b3480156103cc57600080fd5b506102d96103db366004613ae2565b610cb9565b3480156103ec57600080fd5b506102d96103fb366004613c67565b610cd4565b34801561040c57600080fd5b5061030c61041b366004613c67565b600e6020526000908152604090205481565b34801561043957600080fd5b5061030c610448366004613c67565b610d69565b34801561045957600080fd5b50610274610468366004613c67565b610e0a565b34801561047957600080fd5b506102d9610488366004613a72565b610f0c565b34801561049957600080fd5b506102d96104a8366004613c67565b611083565b3480156104b957600080fd5b506102746104c8366004613c67565b61119d565b3480156104d957600080fd5b506102a16104e8366004613c67565b61129a565b3480156104f957600080fd5b506102d9610508366004613bcc565b611311565b34801561051957600080fd5b5061030c610528366004613a72565b611353565b34801561053957600080fd5b506102d96113da565b34801561054e57600080fd5b50600b546001600160a01b03166102a1565b34801561056c57600080fd5b506102d961057b366004613c67565b611410565b34801561058c57600080fd5b5061027461147b565b3480156105a157600080fd5b506102d96105b0366004613b9f565b61148a565b3480156105c157600080fd5b506102d96105d0366004613b22565b61155c565b3480156105e157600080fd5b506102746105f0366004613c67565b611594565b34801561060157600080fd5b506102d9610610366004613bf7565b6117de565b34801561062157600080fd5b50610274610630366004613c67565b611850565b34801561064157600080fd5b5061030c610650366004613ca0565b61194e565b34801561066157600080fd5b50610274610670366004613c67565b611a4c565b34801561068157600080fd5b5061024a610690366004613aaa565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156106ca57600080fd5b506102746106d9366004613c67565b611b4a565b3480156106ea57600080fd5b506102d96106f9366004613a72565b611c49565b34801561070a57600080fd5b50600d546102a1906001600160a01b031681565b60006001600160e01b0319821663780e9d6360e01b1480610743575061074382611ce4565b90505b919050565b60606000805461075a906143c1565b80601f0160208091040260200160405190810160405280929190818152602001828054610786906143c1565b80156107d35780601f106107a8576101008083540402835291602001916107d3565b820191906000526020600020905b8154815290600101906020018083116107b657829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b031661085b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006108828261129a565b9050806001600160a01b0316836001600160a01b031614156108f05760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610852565b336001600160a01b038216148061090c575061090c8133610690565b61097e5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610852565b6109888383611d34565b505050565b600b546001600160a01b031633146109b75760405162461bcd60e51b81526004016108529061424c565b600d54604080516001600160a01b03928316815291831660208301527f0b1186973f810894b87ab0bfbee422fddcaad21b46dc705a561451bbb6bac117910160405180910390a1600d80546001600160a01b0319166001600160a01b0392909216919091179055565b610a2a3382611da2565b610a465760405162461bcd60e51b8152600401610852906142ab565b610988838383611e99565b600f6020528160005260406000208160058110610a6d57600080fd5b60109182820401919006600202915091509054906101000a900461ffff1681565b6000610a9983611353565b8210610afb5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610852565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6002600a541415610b475760405162461bcd60e51b8152600401610852906142fc565b6002600a5561636081118015610b5e57506180e881105b610b7a5760405162461bcd60e51b815260040161085290614281565b66b1a2bc2ec50000341015610b8e57600080fd5b610b99335b82612044565b506001600a55565b60115460ff16610bdb5760405162461bcd60e51b815260206004820152600560248201526410b7b832b760d91b6044820152606401610852565b33610be58361129a565b6001600160a01b031614610c245760405162461bcd60e51b815260206004820152600660248201526510b7bbb732b960d11b6044820152606401610852565b600d54610c3c906001600160a01b031633308461205e565b601054610c49908261434b565b6000838152600e602052604081208054909190610c67908490614333565b90915550506010547feb0ebb51128928d7b1a6419c52128a9319bfcb55f0adafea75afbf75f9f2f3e9908390610c9d908461434b565b6040805192835260208301919091520160405180910390a15050565b6109888383836040518060200160405280600081525061155c565b6002600a541415610cf75760405162461bcd60e51b8152600401610852906142fc565b6002600a55600b546001600160a01b03163314610d265760405162461bcd60e51b81526004016108529061424c565b6180e881118015610d3857506181b081105b610d545760405162461bcd60e51b815260040161085290614281565b610b99610b93600b546001600160a01b031690565b6000610d7460085490565b8210610dd75760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610852565b60088281548110610df857634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b6060610743826040518060400160405280600a8152602001694475726162696c69747960b01b8152506012805480602002602001604051908101604052809291908181526020016000905b82821015610f01578382906000526020600020018054610e74906143c1565b80601f0160208091040260200160405190810160405280929190818152602001828054610ea0906143c1565b8015610eed5780601f10610ec257610100808354040283529160200191610eed565b820191906000526020600020905b815481529060010190602001808311610ed057829003601f168201915b505050505081526020019060010190610e55565b5050505060026120c9565b600b546001600160a01b03163314610f365760405162461bcd60e51b81526004016108529061424c565b736fba46974b2b1befefa034e236a32e1f10c5a148600081610f59600a4761434b565b604051600081818185875af1925050503d8060008114610f95576040519150601f19603f3d011682016040523d82523d6000602084013e610f9a565b606091505b5050905080610fe25760405162461bcd60e51b81526020600482015260146024820152732330b4b632b2103a379039b2b7321022ba3432b960611b6044820152606401610852565b60405183906000906001600160a01b0383169047908381818185875af1925050503d806000811461102f576040519150601f19603f3d011682016040523d82523d6000602084013e611034565b606091505b505090508061107c5760405162461bcd60e51b81526020600482015260146024820152732330b4b632b2103a379039b2b7321022ba3432b960611b6044820152606401610852565b5050505050565b6002600a5414156110a65760405162461bcd60e51b8152600401610852906142fc565b6002600a5580158015906110bb575061636081105b6110d75760405162461bcd60e51b815260040161085290614281565b600c546040516331a9108f60e11b81526004810183905233916001600160a01b031690636352211e9060240160206040518083038186803b15801561111b57600080fd5b505afa15801561112f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111539190613a8e565b6001600160a01b031614610b8e5760405162461bcd60e51b81526020600482015260116024820152702737ba1036b7b7b731b0ba1037bbb732b960791b6044820152606401610852565b606061074382604051806040016040528060058152602001644d6167696360d81b8152506012805480602002602001604051908101604052809291908181526020016000905b8282101561128f578382906000526020600020018054611202906143c1565b80601f016020809104026020016040519081016040528092919081815260200182805461122e906143c1565b801561127b5780601f106112505761010080835404028352916020019161127b565b820191906000526020600020905b81548152906001019060200180831161125e57829003601f168201915b5050505050815260200190600101906111e3565b5050505060046120c9565b6000818152600260205260408120546001600160a01b0316806107435760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610852565b600b546001600160a01b0316331461133b5760405162461bcd60e51b81526004016108529061424c565b61134f6001600160a01b0383163383612f7d565b5050565b60006001600160a01b0382166113be5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610852565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b031633146114045760405162461bcd60e51b81526004016108529061424c565b61140e6000612fad565b565b600b546001600160a01b0316331461143a5760405162461bcd60e51b81526004016108529061424c565b60105460408051918252602082018390527f442470ee4e479870e8d696076707c503d505ae7a5ebfeec93dcf02ca8ba6cb63910160405180910390a1601055565b60606001805461075a906143c1565b6001600160a01b0382163314156114e35760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610852565b3360008181526005602090815260408083206001600160a01b0387168085529252909120805460ff1916841515179055906001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611550911515815260200190565b60405180910390a35050565b6115663383611da2565b6115825760405162461bcd60e51b8152600401610852906142ab565b61158e84848484612fff565b50505050565b606061159e6139d4565b60405180610120016040528060ff815260200161454960ff91398152604080518082019091526006815265536b696c6c7360d01b6020820152816001602002018190525060405180606001604052806028815260200161468860289139604082015261160983611850565b60608083019190915260408051918201905260288082526144a76020830139608082015261163683611b4a565b60a0820152604080516060810190915260288082526144f8602083013960c082015261166183610e0a565b60e082015260408051606081019091526029808252614520602083013961010082015261168d83611a4c565b610120820152604080516060810190915260298082526144cf60208301396101408201526116ba8361119d565b610160820152604080518082018252600d81526c1e17ba32bc3a1f1e17b9bb339f60991b602080830191909152610180840191909152825181840151838501516060860151608087015160a088015160c089015160e08a01516101008b0151995160009a61172a9a909101613e9d565b60408051808303601f190181529082905261012084015161014085015161016086015161018087015193955061176594869490602001613e32565b604051602081830303815290604052905060006117b261178486613032565b61178d8461314d565b60405160200161179e929190613fde565b60405160208183030381529060405261314d565b9050806040516020016117c59190614165565b60408051808303601f1901815291905295945050505050565b600b546001600160a01b031633146118085760405162461bcd60e51b81526004016108529061424c565b60405181151581527feb8f94eb25ddc54db307c7449e958c7d25cba114a758d26a830aee610b2f0ea29060200160405180910390a16011805460ff1916911515919091179055565b6060610743826040518060400160405280600681526020016541747461636b60d01b8152506012805480602002602001604051908101604052809291908181526020016000905b828210156119435783829060005260206000200180546118b6906143c1565b80601f01602080910402602001604051908101604052809291908181526020018280546118e2906143c1565b801561192f5780601f106119045761010080835404028352916020019161192f565b820191906000526020600020905b81548152906001019060200180831161191257829003601f168201915b505050505081526020019060010190611897565b5050505060006120c9565b60008060648361195d86613032565b60405160200161196e929190613e03565b6040516020818303038152906040528051906020012060001c6119919190614417565b90506000600a82116119af576119a8600a82614333565b9050611a36565b600a821180156119c0575060198211155b156119d0576119a8603282614333565b6019821180156119e15750604b8211155b156119f1576119a8606482614333565b604b82118015611a025750605a8211155b15611a12576119a8609682614333565b605a82118015611a23575060648211155b15611a3657611a3360fa82614333565b90505b611a408682614333565b925050505b9392505050565b6060610743826040518060400160405280600681526020016515d95a59da1d60d21b8152506012805480602002602001604051908101604052809291908181526020016000905b82821015611b3f578382906000526020600020018054611ab2906143c1565b80601f0160208091040260200160405190810160405280929190818152602001828054611ade906143c1565b8015611b2b5780601f10611b0057610100808354040283529160200191611b2b565b820191906000526020600020905b815481529060010190602001808311611b0e57829003601f168201915b505050505081526020019060010190611a93565b5050505060036120c9565b60606107438260405180604001604052806007815260200166446566656e736560c81b8152506012805480602002602001604051908101604052809291908181526020016000905b82821015611c3e578382906000526020600020018054611bb1906143c1565b80601f0160208091040260200160405190810160405280929190818152602001828054611bdd906143c1565b8015611c2a5780601f10611bff57610100808354040283529160200191611c2a565b820191906000526020600020905b815481529060010190602001808311611c0d57829003601f168201915b505050505081526020019060010190611b92565b5050505060016120c9565b600b546001600160a01b03163314611c735760405162461bcd60e51b81526004016108529061424c565b6001600160a01b038116611cd85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610852565b611ce181612fad565b50565b60006001600160e01b031982166380ac58cd60e01b1480611d1557506001600160e01b03198216635b5e139f60e01b145b8061074357506301ffc9a760e01b6001600160e01b0319831614610743565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611d698261129a565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611e1b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610852565b6000611e268361129a565b9050806001600160a01b0316846001600160a01b03161480611e615750836001600160a01b0316611e56846107dd565b6001600160a01b0316145b80611e9157506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611eac8261129a565b6001600160a01b031614611f145760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610852565b6001600160a01b038216611f765760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610852565b611f818383836132c4565b611f8c600082611d34565b6001600160a01b0383166000908152600360205260408120805460019290611fb590849061437e565b90915550506001600160a01b0382166000908152600360205260408120805460019290611fe3908490614333565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b61134f828260405180602001604052806000815250613381565b6040516001600160a01b038085166024830152831660448201526064810182905261158e9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526133b4565b606060006120fd6120d987613032565b6040516020016120e99190613fb0565b604051602081830303815290604052613486565b905060008485518361210f9190614417565b8151811061212d57634e487b7160e01b600052603260045260246000fd5b6020026020010151905060006015836121469190614417565b9050600060405160200161216990682bb0b93430b6b6b2b960b91b815260090190565b60405160208183030381529060405280519060200120836040516020016121909190613de7565b6040516020818303038152906040528051906020012014156122245760008052600f60205261221d7ff4803e074bd026baaf6ed2e288c9515f68c72fb7216eebdd7cae1718a53ec37587600581106121f857634e487b7160e01b600052603260045260246000fd5b601091828204019190066002029054906101000a900461ffff1661ffff168a8a61194e565b9050612d36565b6040516b28bab0b93a32b939ba30b33360a11b6020820152602c0160405160208183030381529060405280519060200120836040516020016122669190613de7565b6040516020818303038152906040528051906020012014156122cf576001600052600f60205261221d7f169f97de0d9a84d840042b17d3c6b9638b3d6fd9024c9eb0c7a306a17b49f88f87600581106121f857634e487b7160e01b600052603260045260246000fd5b6040516313585d5b60e21b602082015260240160405160208183030381529060405280519060200120836040516020016123099190613de7565b604051602081830303815290604052805190602001201415612372576002600052600f60205261221d7fa74ba3945261e09fde15ba3db55005b205e61eeb4ad811ac0faa2b315bffeead87600581106121f857634e487b7160e01b600052603260045260246000fd5b604051634d61636560e01b602082015260240160405160208183030381529060405280519060200120836040516020016123ac9190613de7565b604051602081830303815290604052805190602001201415612415576003600052600f60205261221d7f45f76dafbbad695564362934e24d72eedc57f9fc1a65f39bca62176cc829682887600581106121f857634e487b7160e01b600052603260045260246000fd5b6040516321b63ab160e11b6020820152602401604051602081830303815290604052805190602001208360405160200161244f9190613de7565b6040516020818303038152906040528051906020012014156124b8576004600052600f60205261221d7f367ccd2d0ac16bf7110a5dffe0801fdc9452a95a1adb7e1a12fe97dd3e9a4edd87600581106121f857634e487b7160e01b600052603260045260246000fd5b604051654b6174616e6160d01b602082015260260160405160208183030381529060405280519060200120836040516020016124f49190613de7565b6040516020818303038152906040528051906020012014156125605760056000819052600f60205261221d907f6bda57492eba051cb4a12a1e19df47c9755d78165341d4009b1d09b3f361620490889081106121f857634e487b7160e01b600052603260045260246000fd5b604051672330b631b434b7b760c11b6020820152602801604051602081830303815290604052805190602001208360405160200161259e9190613de7565b604051602081830303815290604052805190602001201415612607576006600052600f60205261221d7fb5a1e7cda73b1608e93d4d50ab796c3d35aa6216cb006a1f920df154d13ff61887600581106121f857634e487b7160e01b600052603260045260246000fd5b6040516729b1b4b6b4ba30b960c11b602082015260280160405160208183030381529060405280519060200120836040516020016126459190613de7565b6040516020818303038152906040528051906020012014156126ae576007600052600f60205261221d7f73dfc495eb54bd6713ffc079b9f5e40f2fecd3793d143759ba0128fbedb4025487600581106121f857634e487b7160e01b600052603260045260246000fd5b60405169131bdb99c814dddbdc9960b21b6020820152602a0160405160208183030381529060405280519060200120836040516020016126ee9190613de7565b604051602081830303815290604052805190602001201415612757576008600052600f60205261221d7f49a9092dc5c03b26195f6621c97b5cf515cb77afe659e3fe008a73456354eb6887600581106121f857634e487b7160e01b600052603260045260246000fd5b6040516a14da1bdc9d0814dddbdc9960aa1b6020820152602b0160405160208183030381529060405280519060200120836040516020016127989190613de7565b604051602081830303815290604052805190602001201415612801576009600052600f60205261221d7f3e674ca654b1063e821161bbf601452dd0f1671d575d614ba17ca7f3cdc7603987600581106121f857634e487b7160e01b600052603260045260246000fd5b6040516911da1bdcdd0815d85b9960b21b6020820152602a0160405160208183030381529060405280519060200120836040516020016128419190613de7565b6040516020818303038152906040528051906020012014156128aa57600a600052600f60205261221d7fa13a7a52a9cbb6a90f40d40fbf35f68146be73226e0f48ff16963183fd5684ad87600581106121f857634e487b7160e01b600052603260045260246000fd5b6040516911dc985d994815d85b9960b21b6020820152602a0160405160208183030381529060405280519060200120836040516020016128ea9190613de7565b60405160208183030381529060405280519060200120141561295357600b600052600f60205261221d7f0db0e9d5a07148aa3e0acc10f721b78526b53a3f4f3d07794be76568de7347c587600581106121f857634e487b7160e01b600052603260045260246000fd5b60405168109bdb994815d85b9960ba1b602082015260290160405160208183030381529060405280519060200120836040516020016129929190613de7565b6040516020818303038152906040528051906020012014156129fb57600c600052600f60205261221d7faed549f926a17a28853af2d56b17ad8ad8d799c48d325a734362b810173b772987600581106121f857634e487b7160e01b600052603260045260246000fd5b6040516315d85b9960e21b60208201526024016040516020818303038152906040528051906020012083604051602001612a359190613de7565b604051602081830303815290604052805190602001201415612a9e57600d600052600f60205261221d7fe48c37f5ec5b77098fcb2a7935f0925fec1a69796c076c65ed90d9c90ef07dc587600581106121f857634e487b7160e01b600052603260045260246000fd5b604051674772696d6f69726560c01b60208201526028016040516020818303038152906040528051906020012083604051602001612adc9190613de7565b604051602081830303815290604052805190602001201415612b4557600e600052600f60205261221d7f61510b1e54e804ee2580bac0a66e3ff0bcf8eecee98d26e41ad5e6195d21ef9f87600581106121f857634e487b7160e01b600052603260045260246000fd5b604051684368726f6e69636c6560b81b60208201526029016040516020818303038152906040528051906020012083604051602001612b849190613de7565b604051602081830303815290604052805190602001201415612bed57600f600081905260205261221d7f09567c41c2b819e512ebbfc896a7d795b901b9f15f7637726d97561d5276acb087600581106121f857634e487b7160e01b600052603260045260246000fd5b60405163546f6d6560e01b60208201526024016040516020818303038152906040528051906020012083604051602001612c279190613de7565b604051602081830303815290604052805190602001201415612c90576010600052600f60205261221d7f19a91e2e18c07202ee013c560f8ebffb9b71a05a6a09fdb1d62a413e2117a15987600581106121f857634e487b7160e01b600052603260045260246000fd5b60405163426f6f6b60e01b60208201526024016040516020818303038152906040528051906020012083604051602001612cca9190613de7565b604051602081830303815290604052805190602001201415612d36576011600052600f602052612d337f8252d0af7d8ed7c10ea80b7c6f14fb078bd62e077f890e6c18f704b57caaa5fe87600581106121f857634e487b7160e01b600052603260045260246000fd5b90505b8560031415612d765787612d4982613032565b604051602001612d5a929190613f5e565b60408051601f198184030181529190529450611e919350505050565b600e821115612e5a57612e4d60008a6015808054905088612d979190614417565b81548110612db557634e487b7160e01b600052603260045260246000fd5b906000526020600020018054612dca906143c1565b80601f0160208091040260200160405190810160405280929190818152602001828054612df6906143c1565b8015612e435780601f10612e1857610100808354040283529160200191612e43565b820191906000526020600020905b815481529060010190602001808311612e2657829003601f168201915b505050505061194e565b612e579082614333565b90505b60138210612f2a578160131415612f1b57612f0a60008a6013808054905088612e839190614417565b81548110612ea157634e487b7160e01b600052603260045260246000fd5b906000526020600020016014808054905089612ebd9190614417565b81548110612edb57634e487b7160e01b600052603260045260246000fd5b90600052602060002001604051602001612ef6929190613f9b565b60405160208183030381529060405261194e565b612f149082614333565b9050612f2a565b612f2761012c82614333565b90505b6000898152600e6020526040902054612f439082614333565b905087612f4f82613032565b604051602001612f60929190613f5e565b60408051808303601f190181529190529998505050505050505050565b6040516001600160a01b03831660248201526044810182905261098890849063a9059cbb60e01b90606401612092565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61300a848484611e99565b613016848484846134b7565b61158e5760405162461bcd60e51b8152600401610852906141fa565b60608161305757506040805180820190915260018152600360fc1b6020820152610746565b8160005b8115613081578061306b816143fc565b915061307a9050600a8361434b565b915061305b565b60008167ffffffffffffffff8111156130aa57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156130d4576020820181803683370190505b5090505b8415611e91576130e960018361437e565b91506130f6600a86614417565b613101906030614333565b60f81b81838151811061312457634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350613146600a8661434b565b94506130d8565b606081516000141561316e5750604080516020810190915260008152610746565b6000604051806060016040528060408152602001614648604091399050600060038451600261319d9190614333565b6131a7919061434b565b6131b290600461435f565b905060006131c1826020614333565b67ffffffffffffffff8111156131e757634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015613211576020820181803683370190505b509050818152600183018586518101602084015b8183101561327f5760039283018051603f601282901c811687015160f890811b8552600c83901c8216880151811b6001860152600683901c8216880151811b60028601529116860151901b93820193909352600401613225565b60038951066001811461329957600281146132aa576132b6565b613d3d60f01b6001198301526132b6565b603d60f81b6000198301525b509398975050505050505050565b6001600160a01b03831661331f5761331a81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b613342565b816001600160a01b0316836001600160a01b0316146133425761334283826135c1565b6001600160a01b03821661335e576133598161365e565b610988565b826001600160a01b0316826001600160a01b031614610988576109888282613737565b61338b838361377b565b61339860008484846134b7565b6109885760405162461bcd60e51b8152600401610852906141fa565b6000613409826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166138c99092919063ffffffff16565b80519091501561098857808060200190518101906134279190613c13565b6109885760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610852565b6000816040516020016134999190613de7565b60408051601f19818403018152919052805160209091012092915050565b60006001600160a01b0384163b156135b957604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906134fb9033908990889088906004016141aa565b602060405180830381600087803b15801561351557600080fd5b505af1925050508015613545575060408051601f3d908101601f1916820190925261354291810190613c4b565b60015b61359f573d808015613573576040519150601f19603f3d011682016040523d82523d6000602084013e613578565b606091505b5080516135975760405162461bcd60e51b8152600401610852906141fa565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611e91565b506001611e91565b600060016135ce84611353565b6135d8919061437e565b60008381526007602052604090205490915080821461362b576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906136709060019061437e565b600083815260096020526040812054600880549394509092849081106136a657634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080600883815481106136d557634e487b7160e01b600052603260045260246000fd5b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061371b57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061374283611353565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166137d15760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610852565b6000818152600260205260409020546001600160a01b0316156138365760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610852565b613842600083836132c4565b6001600160a01b038216600090815260036020526040812080546001929061386b908490614333565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6060611e91848460008585843b6139225760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610852565b600080866001600160a01b0316858760405161393e9190613de7565b60006040518083038185875af1925050503d806000811461397b576040519150601f19603f3d011682016040523d82523d6000602084013e613980565b606091505b509150915061399082828661399b565b979650505050505050565b606083156139aa575081611a45565b8251156139ba5782518084602001fd5b8160405162461bcd60e51b815260040161085291906141e7565b604051806101a00160405280600d905b60608152602001906001900390816139e45790505090565b600067ffffffffffffffff80841115613a1757613a17614457565b604051601f8501601f19908116603f01168101908282118183101715613a3f57613a3f614457565b81604052809350858152868686011115613a5857600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215613a83578081fd5b8135611a458161446d565b600060208284031215613a9f578081fd5b8151611a458161446d565b60008060408385031215613abc578081fd5b8235613ac78161446d565b91506020830135613ad78161446d565b809150509250929050565b600080600060608486031215613af6578081fd5b8335613b018161446d565b92506020840135613b118161446d565b929592945050506040919091013590565b60008060008060808587031215613b37578081fd5b8435613b428161446d565b93506020850135613b528161446d565b925060408501359150606085013567ffffffffffffffff811115613b74578182fd5b8501601f81018713613b84578182fd5b613b93878235602084016139fc565b91505092959194509250565b60008060408385031215613bb1578182fd5b8235613bbc8161446d565b91506020830135613ad781614482565b60008060408385031215613bde578182fd5b8235613be98161446d565b946020939093013593505050565b600060208284031215613c08578081fd5b8135611a4581614482565b600060208284031215613c24578081fd5b8151611a4581614482565b600060208284031215613c40578081fd5b8135611a4581614490565b600060208284031215613c5c578081fd5b8151611a4581614490565b600060208284031215613c78578081fd5b5035919050565b60008060408385031215613c91578182fd5b50508035926020909101359150565b600080600060608486031215613cb4578081fd5b8335925060208401359150604084013567ffffffffffffffff811115613cd8578182fd5b8401601f81018613613ce8578182fd5b613cf7868235602084016139fc565b9150509250925092565b60008060408385031215613d13578182fd5b823560ff81168114613be9578283fd5b60008151808452613d3b816020860160208601614395565b601f01601f19169290920160200192915050565b805460009060028104600180831680613d6957607f831692505b6020808410821415613d8957634e487b7160e01b86526022600452602486fd5b818015613d9d5760018114613dae57613ddb565b60ff19861689528489019650613ddb565b60008881526020902060005b86811015613dd35781548b820152908501908301613dba565b505084890196505b50505050505092915050565b60008251613df9818460208701614395565b9190910192915050565b60008351613e15818460208801614395565b835190830190613e29818360208801614395565b01949350505050565b60008651613e44818460208b01614395565b865190830190613e58818360208b01614395565b8651910190613e6b818360208a01614395565b8551910190613e7e818360208901614395565b8451910190613e91818360208801614395565b01979650505050505050565b60008a51613eaf818460208f01614395565b8a51613ec18183860160208f01614395565b8a519184010190613ed6818360208e01614395565b8951613ee88183850160208e01614395565b8951929091010190613efe818360208c01614395565b8751613f108183850160208c01614395565b8751929091010190613f26818360208a01614395565b8551613f388183850160208a01614395565b8551929091010190613f4e818360208801614395565b019b9a5050505050505050505050565b60008351613f70818460208801614395565b6101d160f51b9083019081528351613f8f816002840160208801614395565b01600201949350505050565b6000611e91613faa8386613d4f565b84613d4f565b6000652ba2a0a827a760d11b82528251613fd1816006850160208701614395565b9190910160060192915050565b717b226e616d65223a2022576561706f6e202360701b8152825160009061400c816012850160208801614395565b80830190507f222c20226465736372697074696f6e223a202254686520576561706f6e736d6960128201527f7468206973206f70656e2e204375646c6572732077696c6c2062652061626c6560328201527f20746f206d696e7420746865697220776561706f6e7320616e6420726576656160528201527f6c20746865697220756e6465726c79696e6720706f77657273202d206174746160728201527f636b2c20646566656e73652c206475726162696c6974792c207765696768742060928201527f616e64206d616769632e204d696e7420796f757220776561706f6e2c2072657660b28201527f65616c20796f75722073746174732e222c2022696d616765223a20226461746160d2820152750e9a5b5859d94bdcdd99cade1b5b0ed8985cd94d8d0b60521b60f2820152610108845161414f8183850160208901614395565b613990828285010161227d60f01b815260020190565b60007f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008252825161419d81601d850160208701614395565b91909101601d0192915050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906141dd90830184613d23565b9695505050505050565b600060208252611a456020830184613d23565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526010908201526f151bdad95b881251081a5b9d985b1a5960821b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b600082198211156143465761434661442b565b500190565b60008261435a5761435a614441565b500490565b60008160001904831182151516156143795761437961442b565b500290565b6000828210156143905761439061442b565b500390565b60005b838110156143b0578181015183820152602001614398565b8381111561158e5750506000910152565b6002810460018216806143d557607f821691505b602082108114156143f657634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156144105761441061442b565b5060010190565b60008261442657614426614441565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611ce157600080fd5b8015158114611ce157600080fd5b6001600160e01b031981168114611ce157600080fdfe3c2f746578743e3c7465787420783d2231302220793d2236302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223132302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d2238302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223130302220636c6173733d2262617365223e3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e62617365207b2066696c6c3a2077686974653b20666f6e742d66616d696c793a2073657269663b20666f6e742d73697a653a20313470783b207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d222337643563666622202f3e3c7465787420783d2231302220793d2232302220636c6173733d2262617365223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c2f746578743e3c7465787420783d2231302220793d2234302220636c6173733d2262617365223ea26469706673582212204419559faf1c90ec61da164f0594571986bb9a36246096da102771d14e5cf33b64736f6c63430008020033

Deployed Bytecode Sourcemap

54984:17790:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34644:224;;;;;;;;;;-1:-1:-1;34644:224:0;;;;;:::i;:::-;;:::i;:::-;;;21374:14:1;;21367:22;21349:41;;21337:2;21322:18;34644:224:0;;;;;;;;21529:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;23088:221::-;;;;;;;;;;-1:-1:-1;23088:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;19704:32:1;;;19686:51;;19674:2;19659:18;23088:221:0;19641:102:1;22611:411:0;;;;;;;;;;-1:-1:-1;22611:411:0;;;;;:::i;:::-;;:::i;:::-;;58635:146;;;;;;;;;;-1:-1:-1;58635:146:0;;;;;:::i;:::-;;:::i;35284:113::-;;;;;;;;;;-1:-1:-1;35372:10:0;:17;35284:113;;;32221:25:1;;;32209:2;32194:18;35284:113:0;32176:76:1;23978:339:0;;;;;;;;;;-1:-1:-1;23978:339:0;;;;;:::i;:::-;;:::i;55463:40::-;;;;;;;;;;-1:-1:-1;55463:40:0;;;;;:::i;:::-;;:::i;:::-;;;32056:6:1;32044:19;;;32026:38;;32014:2;31999:18;55463:40:0;31981:89:1;34952:256:0;;;;;;;;;;-1:-1:-1;34952:256:0;;;;;:::i;:::-;;:::i;70740:230::-;;;;;;:::i;:::-;;:::i;61959:357::-;;;;;;;;;;-1:-1:-1;61959:357:0;;;;;:::i;:::-;;:::i;24388:185::-;;;;;;;;;;-1:-1:-1;24388:185:0;;;;;:::i;:::-;;:::i;70978:187::-;;;;;;;;;;-1:-1:-1;70978:187:0;;;;;:::i;:::-;;:::i;55351:41::-;;;;;;;;;;-1:-1:-1;55351:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;35474:233;;;;;;;;;;-1:-1:-1;35474:233:0;;;;;:::i;:::-;;:::i;60283:174::-;;;;;;;;;;-1:-1:-1;60283:174:0;;;;;:::i;:::-;;:::i;69979:483::-;;;;;;;;;;-1:-1:-1;69979:483:0;;;;;:::i;:::-;;:::i;70470:262::-;;;;;;;;;;-1:-1:-1;70470:262:0;;;;;:::i;:::-;;:::i;60607:132::-;;;;;;;;;;-1:-1:-1;60607:132:0;;;;;:::i;:::-;;:::i;21223:239::-;;;;;;;;;;-1:-1:-1;21223:239:0;;;;;:::i;:::-;;:::i;59709:134::-;;;;;;;;;;-1:-1:-1;59709:134:0;;;;;:::i;:::-;;:::i;20953:208::-;;;;;;;;;;-1:-1:-1;20953:208:0;;;;;:::i;:::-;;:::i;45147:94::-;;;;;;;;;;;;;:::i;44496:87::-;;;;;;;;;;-1:-1:-1;44569:6:0;;-1:-1:-1;;;;;44569:6:0;44496:87;;58970:206;;;;;;;;;;-1:-1:-1;58970:206:0;;;;;:::i;:::-;;:::i;21698:104::-;;;;;;;;;;;;;:::i;23381:295::-;;;;;;;;;;-1:-1:-1;23381:295:0;;;;;:::i;:::-;;:::i;24644:328::-;;;;;;;;;;-1:-1:-1;24644:328:0;;;;;:::i;:::-;;:::i;67603:2331::-;;;;;;;;;;-1:-1:-1;67603:2331:0;;;;;:::i;:::-;;:::i;59332:172::-;;;;;;;;;;-1:-1:-1;59332:172:0;;;;;:::i;:::-;;:::i;59997:134::-;;;;;;;;;;-1:-1:-1;59997:134:0;;;;;:::i;:::-;;:::i;60977:703::-;;;;;;;;;;-1:-1:-1;60977:703:0;;;;;:::i;:::-;;:::i;60465:134::-;;;;;;;;;;-1:-1:-1;60465:134:0;;;;;:::i;:::-;;:::i;23747:164::-;;;;;;;;;;-1:-1:-1;23747:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;23868:25:0;;;23844:4;23868:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;23747:164;60139:136;;;;;;;;;;-1:-1:-1;60139:136:0;;;;;:::i;:::-;;:::i;45396:192::-;;;;;;;;;;-1:-1:-1;45396:192:0;;;;;:::i;:::-;;:::i;55252:19::-;;;;;;;;;;-1:-1:-1;55252:19:0;;;;-1:-1:-1;;;;;55252:19:0;;;34644:224;34746:4;-1:-1:-1;;;;;;34770:50:0;;-1:-1:-1;;;34770:50:0;;:90;;;34824:36;34848:11;34824:23;:36::i;:::-;34763:97;;34644:224;;;;:::o;21529:100::-;21583:13;21616:5;21609:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21529:100;:::o;23088:221::-;23164:7;26571:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26571:16:0;23184:73;;;;-1:-1:-1;;;23184:73:0;;27526:2:1;23184:73:0;;;27508:21:1;27565:2;27545:18;;;27538:30;27604:34;27584:18;;;27577:62;-1:-1:-1;;;27655:18:1;;;27648:42;27707:19;;23184:73:0;;;;;;;;;-1:-1:-1;23277:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;23277:24:0;;23088:221::o;22611:411::-;22692:13;22708:23;22723:7;22708:14;:23::i;:::-;22692:39;;22756:5;-1:-1:-1;;;;;22750:11:0;:2;-1:-1:-1;;;;;22750:11:0;;;22742:57;;;;-1:-1:-1;;;22742:57:0;;29055:2:1;22742:57:0;;;29037:21:1;29094:2;29074:18;;;29067:30;29133:34;29113:18;;;29106:62;-1:-1:-1;;;29184:18:1;;;29177:31;29225:19;;22742:57:0;29027:223:1;22742:57:0;16066:10;-1:-1:-1;;;;;22834:21:0;;;;:62;;-1:-1:-1;22859:37:0;22876:5;16066:10;22883:12;15986:98;22859:37;22812:168;;;;-1:-1:-1;;;22812:168:0;;25919:2:1;22812:168:0;;;25901:21:1;25958:2;25938:18;;;25931:30;25997:34;25977:18;;;25970:62;26068:26;26048:18;;;26041:54;26112:19;;22812:168:0;25891:246:1;22812:168:0;22993:21;23002:2;23006:7;22993:8;:21::i;:::-;22611:411;;;:::o;58635:146::-;44569:6;;-1:-1:-1;;;;;44569:6:0;16066:10;44716:23;44708:68;;;;-1:-1:-1;;;44708:68:0;;;;;;;:::i;:::-;58725:5:::1;::::0;58704:36:::1;::::0;;-1:-1:-1;;;;;58725:5:0;;::::1;19960:34:1::0;;20030:15;;;20025:2;20010:18;;20003:43;58704:36:0::1;::::0;19895:18:1;58704:36:0::1;;;;;;;58751:5;:22:::0;;-1:-1:-1;;;;;;58751:22:0::1;-1:-1:-1::0;;;;;58751:22:0;;;::::1;::::0;;;::::1;::::0;;58635:146::o;23978:339::-;24173:41;16066:10;24206:7;24173:18;:41::i;:::-;24165:103;;;;-1:-1:-1;;;24165:103:0;;;;;;;:::i;:::-;24281:28;24291:4;24297:2;24301:7;24281:9;:28::i;55463:40::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;34952:256::-;35049:7;35085:23;35102:5;35085:16;:23::i;:::-;35077:5;:31;35069:87;;;;-1:-1:-1;;;35069:87:0;;22050:2:1;35069:87:0;;;22032:21:1;22089:2;22069:18;;;22062:30;22128:34;22108:18;;;22101:62;-1:-1:-1;;;22179:18:1;;;22172:41;22230:19;;35069:87:0;22022:233:1;35069:87:0;-1:-1:-1;;;;;;35174:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;34952:256::o;70740:230::-;42547:1;43143:7;;:19;;43135:63;;;;-1:-1:-1;;;43135:63:0;;;;;;;:::i;:::-;42547:1;43276:7;:18;70829:5:::1;70819:15:::0;::::1;:34:::0;::::1;;;;70848:5;70838:7;:15;70819:34;70811:63;;;;-1:-1:-1::0;;;70811:63:0::1;;;;;;;:::i;:::-;70906:10;70893:9;:23;;70885:32;;;::::0;::::1;;70930;16066:10:::0;70940:12:::1;70954:7;70930:9;:32::i;:::-;-1:-1:-1::0;42503:1:0;43455:7;:22;70740:230::o;61959:357::-;62041:15;;;;62033:33;;;;-1:-1:-1;;;62033:33:0;;31057:2:1;62033:33:0;;;31039:21:1;31096:1;31076:18;;;31069:29;-1:-1:-1;;;31114:18:1;;;31107:35;31159:18;;62033:33:0;31029:154:1;62033:33:0;62105:10;62085:16;62093:7;62085;:16::i;:::-;-1:-1:-1;;;;;62085:30:0;;62077:49;;;;-1:-1:-1;;;62077:49:0;;31750:2:1;62077:49:0;;;31732:21:1;31789:1;31769:18;;;31762:29;-1:-1:-1;;;31807:18:1;;;31800:36;31853:18;;62077:49:0;31722:155:1;62077:49:0;62137:5;;:57;;-1:-1:-1;;;;;62137:5:0;62160:10;62180:4;62187:6;62137:22;:57::i;:::-;62233:16;;62224:25;;:6;:25;:::i;:::-;62205:15;;;;:6;:15;;;;;:44;;:15;;;:44;;;;;:::i;:::-;;;;-1:-1:-1;;62291:16:0;;62265:43;;62273:7;;62282:25;;:6;:25;:::i;:::-;62265:43;;;32431:25:1;;;32487:2;32472:18;;32465:34;;;;32404:18;62265:43:0;;;;;;;61959:357;;:::o;24388:185::-;24526:39;24543:4;24549:2;24553:7;24526:39;;;;;;;;;;;;:16;:39::i;70978:187::-;42547:1;43143:7;;:19;;43135:63;;;;-1:-1:-1;;;43135:63:0;;;;;;;:::i;:::-;42547:1;43276:7;:18;44569:6;;-1:-1:-1;;;;;44569:6:0;16066:10;44716:23:::1;44708:68;;;;-1:-1:-1::0;;;44708:68:0::1;;;;;;;:::i;:::-;71074:5:::2;71064:7;:15;:34;;;;;71093:5;71083:7;:15;71064:34;71056:63;;;;-1:-1:-1::0;;;71056:63:0::2;;;;;;;:::i;:::-;71130:27;71140:7;44569:6:::0;;-1:-1:-1;;;;;44569:6:0;44496:87;;35474:233;35549:7;35585:30;35372:10;:17;35284:113;;35585:30;35577:5;:38;35569:95;;;;-1:-1:-1;;;35569:95:0;;30233:2:1;35569:95:0;;;30215:21:1;30272:2;30252:18;;;30245:30;30311:34;30291:18;;;30284:62;-1:-1:-1;;;30362:18:1;;;30355:42;30414:19;;35569:95:0;30205:234:1;35569:95:0;35682:10;35693:5;35682:17;;;;;;-1:-1:-1;;;35682:17:0;;;;;;;;;;;;;;;;;35675:24;;35474:233;;;:::o;60283:174::-;60371:13;60409:40;60415:7;60409:40;;;;;;;;;;;;;-1:-1:-1;;;60409:40:0;;;60438:7;60409:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60447:1;60409:5;:40::i;69979:483::-;44569:6;;-1:-1:-1;;;;;44569:6:0;16066:10;44716:23;44708:68;;;;-1:-1:-1;;;44708:68:0;;;;;;;:::i;:::-;70082:42:::1;70037:20;70082:42:::0;70196:26:::1;70220:2;70196:21;:26;:::i;:::-;70178:50;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70158:70;;;70247:8;70239:41;;;::::0;-1:-1:-1;;;70239:41:0;;23645:2:1;70239:41:0::1;::::0;::::1;23627:21:1::0;23684:2;23664:18;;;23657:30;-1:-1:-1;;;23703:18:1;;;23696:50;23763:18;;70239:41:0::1;23617:170:1::0;70239:41:0::1;70364:42;::::0;70323:2;;70293:19:::1;::::0;-1:-1:-1;;;;;70364:8:0;::::1;::::0;70380:21:::1;::::0;70293:19;70364:42;70293:19;70364:42;70380:21;70364:8;:42:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70348:58;;;70425:4;70417:37;;;::::0;-1:-1:-1;;;70417:37:0;;23645:2:1;70417:37:0::1;::::0;::::1;23627:21:1::0;23684:2;23664:18;;;23657:30;-1:-1:-1;;;23703:18:1;;;23696:50;23763:18;;70417:37:0::1;23617:170:1::0;70417:37:0::1;44787:1;;;;69979:483:::0;:::o;70470:262::-;42547:1;43143:7;;:19;;43135:63;;;;-1:-1:-1;;;43135:63:0;;;;;;;:::i;:::-;42547:1;43276:7;:18;70551:11;;;;;:30:::1;;;70576:5;70566:7;:15;70551:30;70543:59;;;;-1:-1:-1::0;;;70543:59:0::1;;;;;;;:::i;:::-;70621:7;::::0;:24:::1;::::0;-1:-1:-1;;;70621:24:0;;::::1;::::0;::::1;32221:25:1::0;;;70649:10:0::1;::::0;-1:-1:-1;;;;;70621:7:0::1;::::0;:15:::1;::::0;32194:18:1;;70621:24:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;70621:38:0::1;;70613:68;;;::::0;-1:-1:-1;;;70613:68:0;;24753:2:1;70613:68:0::1;::::0;::::1;24735:21:1::0;24792:2;24772:18;;;24765:30;-1:-1:-1;;;24811:18:1;;;24804:47;24868:18;;70613:68:0::1;24725:167:1::0;60607:132:0;60663:13;60696:35;60702:7;60696:35;;;;;;;;;;;;;-1:-1:-1;;;60696:35:0;;;60720:7;60696:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60729:1;60696:5;:35::i;21223:239::-;21295:7;21331:16;;;:7;:16;;;;;;-1:-1:-1;;;;;21331:16:0;21366:19;21358:73;;;;-1:-1:-1;;;21358:73:0;;26755:2:1;21358:73:0;;;26737:21:1;26794:2;26774:18;;;26767:30;26833:34;26813:18;;;26806:62;-1:-1:-1;;;26884:18:1;;;26877:39;26933:19;;21358:73:0;26727:231:1;59709:134:0;44569:6;;-1:-1:-1;;;;;44569:6:0;16066:10;44716:23;44708:68;;;;-1:-1:-1;;;44708:68:0;;;;;;;:::i;:::-;59787:48:::1;-1:-1:-1::0;;;;;59787:27:0;::::1;59815:10;59827:7:::0;59787:27:::1;:48::i;:::-;59709:134:::0;;:::o;20953:208::-;21025:7;-1:-1:-1;;;;;21053:19:0;;21045:74;;;;-1:-1:-1;;;21045:74:0;;26344:2:1;21045:74:0;;;26326:21:1;26383:2;26363:18;;;26356:30;26422:34;26402:18;;;26395:62;-1:-1:-1;;;26473:18:1;;;26466:40;26523:19;;21045:74:0;26316:232:1;21045:74:0;-1:-1:-1;;;;;;21137:16:0;;;;;:9;:16;;;;;;;20953:208::o;45147:94::-;44569:6;;-1:-1:-1;;;;;44569:6:0;16066:10;44716:23;44708:68;;;;-1:-1:-1;;;44708:68:0;;;;;;;:::i;:::-;45212:21:::1;45230:1;45212:9;:21::i;:::-;45147:94::o:0;58970:206::-;44569:6;;-1:-1:-1;;;;;44569:6:0;16066:10;44716:23;44708:68;;;;-1:-1:-1;;;44708:68:0;;;;;;;:::i;:::-;59085:16:::1;::::0;59061:60:::1;::::0;;32431:25:1;;;32487:2;32472:18;;32465:34;;;59061:60:0::1;::::0;32404:18:1;59061:60:0::1;;;;;;;59132:16;:36:::0;58970:206::o;21698:104::-;21754:13;21787:7;21780:14;;;;;:::i;23381:295::-;-1:-1:-1;;;;;23484:24:0;;16066:10;23484:24;;23476:62;;;;-1:-1:-1;;;23476:62:0;;24399:2:1;23476:62:0;;;24381:21:1;24438:2;24418:18;;;24411:30;24477:27;24457:18;;;24450:55;24522:18;;23476:62:0;24371:175:1;23476:62:0;16066:10;23551:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;23551:42:0;;;;;;;;;;:53;;-1:-1:-1;;23551:53:0;;;;;;;:42;-1:-1:-1;;;;;23620:48:0;;23659:8;23620:48;;;;21374:14:1;21367:22;21349:41;;21337:2;21322:18;;21304:92;23620:48:0;;;;;;;;23381:295;;:::o;24644:328::-;24819:41;16066:10;24852:7;24819:18;:41::i;:::-;24811:103;;;;-1:-1:-1;;;24811:103:0;;;;;;;:::i;:::-;24925:39;24939:4;24945:2;24949:7;24958:5;24925:13;:39::i;:::-;24644:328;;;;:::o;67603:2331::-;67704:13;67735:23;;:::i;:::-;67769:292;;;;;;;;;;;;;;;;;;;68074:19;;;;;;;;;;;;-1:-1:-1;;;67769:32:0;68074:19;;;67769:5;68080:1;68074:8;;;:19;;;;68106:53;;;;;;;;;;;;;;;;;:8;;;:53;68183:18;68193:7;68183:9;:18::i;:::-;68172:8;;;;:29;;;;68214:53;;;;;;;;;;;;;68172:8;68214:53;;;:8;;;:53;68291:19;68302:7;68291:10;:19::i;:::-;68280:8;;;:30;68323:53;;;;;;;;;;;;;;68280:8;68323:53;;;:8;;;:53;68400:22;68414:7;68400:13;:22::i;:::-;68389:8;;;:33;68435:54;;;;;;;;;;;;;;68389:8;68435:54;;;:8;;;:54;68513:18;68523:7;68513:9;:18::i;:::-;68502:8;;;:29;68544:55;;;;;;;;;;;;;;68502:8;68544:55;;;:9;;;:55;68624:17;68633:7;68624:8;:17::i;:::-;68612:9;;;:29;68654:27;;;;;;;;;;;-1:-1:-1;;;68612:9:0;68654:27;;;;;;;:9;;;:27;;;;68773:8;;68800;;;;68827;;;;68854;;;;68881;;;;68908;;;;68935;;;;68962;;;;68989;;;;68738:274;;-1:-1:-1;;68738:274:0;;68989:8;;68738:274;;:::i;:::-;;;;;;;-1:-1:-1;;68738:274:0;;;;;;;69089:8;;;;69099:9;;;;69110;;;;69121;;;;68738:274;;-1:-1:-1;69064:67:0;;68738:274;;69121:9;69089:8;69064:67;;:::i;:::-;;;;;;;;;;;;;69034:108;;69155:18;69176:617;69347:17;69356:7;69347:8;:17::i;:::-;69666:28;69686:6;69666:13;:28::i;:::-;69257:491;;;;;;;;;:::i;:::-;;;;;;;;;;;;;69176:13;:617::i;:::-;69155:638;;69884:4;69834:55;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;69834:55:0;;;;;;;67603:2331;-1:-1:-1;;;;;67603:2331:0:o;59332:172::-;44569:6;;-1:-1:-1;;;;;44569:6:0;16066:10;44716:23;44708:68;;;;-1:-1:-1;;;44708:68:0;;;;;;;:::i;:::-;59418:33:::1;::::0;21374:14:1;;21367:22;21349:41;;59418:33:0::1;::::0;21337:2:1;21322:18;59418:33:0::1;;;;;;;59462:15;:34:::0;;-1:-1:-1;;59462:34:0::1;::::0;::::1;;::::0;;;::::1;::::0;;59332:172::o;59997:134::-;60054:13;60087:36;60093:7;60087:36;;;;;;;;;;;;;-1:-1:-1;;;60087:36:0;;;60112:7;60087:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60121:1;60087:5;:36::i;60977:703::-;61103:7;61123:13;61229:3;61188:6;61196:17;61205:7;61196:8;:17::i;:::-;61171:43;;;;;;;;;:::i;:::-;;;;;;;;;;;;;61161:54;;;;;;61139:87;;:93;;;;:::i;:::-;61123:109;;61243:13;61280:2;61271:5;:11;61267:359;;61299:11;61308:2;61299:11;;:::i;:::-;;;61267:359;;;61340:2;61332:5;:10;:25;;;;;61355:2;61346:5;:11;;61332:25;61328:298;;;61374:11;61383:2;61374:11;;:::i;61328:298::-;61415:2;61407:5;:10;:25;;;;;61430:2;61421:5;:11;;61407:25;61403:223;;;61449:12;61458:3;61449:12;;:::i;61403:223::-;61491:2;61483:5;:10;:25;;;;;61506:2;61497:5;:11;;61483:25;61479:147;;;61525:12;61534:3;61525:12;;:::i;61479:147::-;61567:2;61559:5;:10;:26;;;;;61582:3;61573:5;:12;;61559:26;61555:71;;;61602:12;61611:3;61602:12;;:::i;:::-;;;61555:71;61636:13;61645:4;61636:13;;:::i;:::-;;-1:-1:-1;;;60977:703:0;;;;;;:::o;60465:134::-;60522:13;60555:36;60561:7;60555:36;;;;;;;;;;;;;-1:-1:-1;;;60555:36:0;;;60580:7;60555:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60589:1;60555:5;:36::i;60139:136::-;60197:13;60230:37;60236:7;60230:37;;;;;;;;;;;;;-1:-1:-1;;;60230:37:0;;;60256:7;60230:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60265:1;60230:5;:37::i;45396:192::-;44569:6;;-1:-1:-1;;;;;44569:6:0;16066:10;44716:23;44708:68;;;;-1:-1:-1;;;44708:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;45485:22:0;::::1;45477:73;;;::::0;-1:-1:-1;;;45477:73:0;;22881:2:1;45477:73:0::1;::::0;::::1;22863:21:1::0;22920:2;22900:18;;;22893:30;22959:34;22939:18;;;22932:62;-1:-1:-1;;;23010:18:1;;;23003:36;23056:19;;45477:73:0::1;22853:228:1::0;45477:73:0::1;45561:19;45571:8;45561:9;:19::i;:::-;45396:192:::0;:::o;20584:305::-;20686:4;-1:-1:-1;;;;;;20723:40:0;;-1:-1:-1;;;20723:40:0;;:105;;-1:-1:-1;;;;;;;20780:48:0;;-1:-1:-1;;;20780:48:0;20723:105;:158;;;-1:-1:-1;;;;;;;;;;19191:40:0;;;20845:36;19082:157;30464:174;30539:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;30539:29:0;-1:-1:-1;;;;;30539:29:0;;;;;;;;:24;;30593:23;30539:24;30593:14;:23::i;:::-;-1:-1:-1;;;;;30584:46:0;;;;;;;;;;;30464:174;;:::o;26776:348::-;26869:4;26571:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26571:16:0;26886:73;;;;-1:-1:-1;;;26886:73:0;;25506:2:1;26886:73:0;;;25488:21:1;25545:2;25525:18;;;25518:30;25584:34;25564:18;;;25557:62;-1:-1:-1;;;25635:18:1;;;25628:42;25687:19;;26886:73:0;25478:234:1;26886:73:0;26970:13;26986:23;27001:7;26986:14;:23::i;:::-;26970:39;;27039:5;-1:-1:-1;;;;;27028:16:0;:7;-1:-1:-1;;;;;27028:16:0;;:51;;;;27072:7;-1:-1:-1;;;;;27048:31:0;:20;27060:7;27048:11;:20::i;:::-;-1:-1:-1;;;;;27048:31:0;;27028:51;:87;;;-1:-1:-1;;;;;;23868:25:0;;;23844:4;23868:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;27083:32;27020:96;26776:348;-1:-1:-1;;;;26776:348:0:o;29768:578::-;29927:4;-1:-1:-1;;;;;29900:31:0;:23;29915:7;29900:14;:23::i;:::-;-1:-1:-1;;;;;29900:31:0;;29892:85;;;;-1:-1:-1;;;29892:85:0;;28645:2:1;29892:85:0;;;28627:21:1;28684:2;28664:18;;;28657:30;28723:34;28703:18;;;28696:62;-1:-1:-1;;;28774:18:1;;;28767:39;28823:19;;29892:85:0;28617:231:1;29892:85:0;-1:-1:-1;;;;;29996:16:0;;29988:65;;;;-1:-1:-1;;;29988:65:0;;23994:2:1;29988:65:0;;;23976:21:1;24033:2;24013:18;;;24006:30;24072:34;24052:18;;;24045:62;-1:-1:-1;;;24123:18:1;;;24116:34;24167:19;;29988:65:0;23966:226:1;29988:65:0;30066:39;30087:4;30093:2;30097:7;30066:20;:39::i;:::-;30170:29;30187:1;30191:7;30170:8;:29::i;:::-;-1:-1:-1;;;;;30212:15:0;;;;;;:9;:15;;;;;:20;;30231:1;;30212:15;:20;;30231:1;;30212:20;:::i;:::-;;;;-1:-1:-1;;;;;;;30243:13:0;;;;;;:9;:13;;;;;:18;;30260:1;;30243:13;:18;;30260:1;;30243:18;:::i;:::-;;;;-1:-1:-1;;30272:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;30272:21:0;-1:-1:-1;;;;;30272:21:0;;;;;;;;;30311:27;;30272:16;;30311:27;;;;;;;29768:578;;;:::o;27466:110::-;27542:26;27552:2;27556:7;27542:26;;;;;;;;;;;;:9;:26::i;49475:248::-;49646:68;;-1:-1:-1;;;;;20315:15:1;;;49646:68:0;;;20297:34:1;20367:15;;20347:18;;;20340:43;20399:18;;;20392:34;;;49619:96:0;;49639:5;;-1:-1:-1;;;49669:27:0;20232:18:1;;49646:68:0;;;;-1:-1:-1;;49646:68:0;;;;;;;;;;;;;;-1:-1:-1;;;;;49646:68:0;-1:-1:-1;;;;;;49646:68:0;;;;;;;;;;49619:19;:96::i;62324:5271::-;62495:13;62575:12;62590:85;62645:17;62654:7;62645:8;:17::i;:::-;62618:45;;;;;;;;:::i;:::-;;;;;;;;;;;;;62590:6;:85::i;:::-;62575:100;;62686:20;62709:11;62728;:18;62721:4;:25;;;;:::i;:::-;62709:38;;;;;;-1:-1:-1;;;62709:38:0;;;;;;;;;;;;;;;62686:61;;62758:17;62785:2;62778:4;:9;;;;:::i;:::-;62758:29;;62798:12;62903:31;;;;;;-1:-1:-1;;;14953:24:1;;15002:1;14993:11;;14943:67;62903:31:0;;;;;;;;;;;;;62893:42;;;;;;62867:6;62849:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;62839:37;;;;;;:96;62821:3844;;;62978:8;;;:5;:8;;62969:49;62978:8;62987:9;62978:19;;;;;-1:-1:-1;;;62978:19:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62969:49;;62999:7;63008:9;62969:8;:49::i;:::-;62962:56;;62821:3844;;;63118:34;;-1:-1:-1;;;63118:34:0;;;18427:27:1;18470:12;;63118:34:0;;;;;;;;;;;;63108:45;;;;;;63082:6;63064:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;63054:37;;;;;;:99;63036:3629;;;63202:1;63196:8;;:5;:8;;63187:49;63196:8;63205:9;63196:19;;;;;-1:-1:-1;;;63196:19:0;;;;;;;;63036:3629;63336:26;;-1:-1:-1;;;63336:26:0;;;19217:19:1;19252:11;;63336:26:0;;;;;;;;;;;;63326:37;;;;;;63300:6;63282:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;63272:37;;;;;;:91;63254:3411;;;63412:1;63406:8;;:5;:8;;63397:49;63406:8;63415:9;63406:19;;;;;-1:-1:-1;;;63406:19:0;;;;;;;;63254:3411;63546:26;;-1:-1:-1;;;63546:26:0;;;13219:19:1;13254:11;;63546:26:0;;;;;;;;;;;;63536:37;;;;;;63510:6;63492:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;63482:37;;;;;;:91;63464:3201;;;63622:1;63616:8;;:5;:8;;63607:49;63616:8;63625:9;63616:19;;;;;-1:-1:-1;;;63616:19:0;;;;;;;;63464:3201;63756:26;;-1:-1:-1;;;63756:26:0;;;12699:19:1;12734:11;;63756:26:0;;;;;;;;;;;;63746:37;;;;;;63720:6;63702:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;63692:37;;;;;;:91;63674:2991;;;63832:1;63826:8;;:5;:8;;63817:49;63826:8;63835:9;63826:19;;;;;-1:-1:-1;;;63826:19:0;;;;;;;;63674:2991;63966:28;;-1:-1:-1;;;63966:28:0;;;12958:21:1;12995:11;;63966:28:0;;;;;;;;;;;;63956:39;;;;;;63930:6;63912:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;63902:37;;;;;;:93;63884:2781;;;64044:1;64038:8;;;;:5;:8;;64029:49;;64038:8;;64047:9;;64038:19;;;;-1:-1:-1;;;64038:19:0;;;;;;;;63884:2781;64178:30;;-1:-1:-1;;;64178:30:0;;;18695:23:1;18734:11;;64178:30:0;;;;;;;;;;;;64168:41;;;;;;64142:6;64124:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;64114:37;;;;;;:95;64096:2569;;;64258:1;64252:8;;:5;:8;;64243:49;64252:8;64261:9;64252:19;;;;;-1:-1:-1;;;64252:19:0;;;;;;;;64096:2569;64392:30;;-1:-1:-1;;;64392:30:0;;;15483:23:1;15522:11;;64392:30:0;;;;;;;;;;;;64382:41;;;;;;64356:6;64338:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;64328:37;;;;;;:95;64310:2355;;;64472:1;64466:8;;:5;:8;;64457:49;64466:8;64475:9;64466:19;;;;;-1:-1:-1;;;64466:19:0;;;;;;;;64310:2355;64606:32;;-1:-1:-1;;;64606:32:0;;;15217:25:1;15258:12;;64606:32:0;;;;;;;;;;;;64596:43;;;;;;64570:6;64552:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;64542:37;;;;;;:97;64524:2141;;;64688:1;64682:8;;:5;:8;;64673:49;64682:8;64691:9;64682:19;;;;;-1:-1:-1;;;64682:19:0;;;;;;;;64524:2141;64822:33;;-1:-1:-1;;;64822:33:0;;;12432:26:1;12474:12;;64822:33:0;;;;;;;;;;;;64812:44;;;;;;64786:6;64768:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;64758:37;;;;;;:98;64740:1925;;;64905:1;64899:8;;:5;:8;;64890:49;64899:8;64908:9;64899:19;;;;;-1:-1:-1;;;64899:19:0;;;;;;;;64740:1925;65039:32;;-1:-1:-1;;;65039:32:0;;;14259:25:1;14300:12;;65039:32:0;;;;;;;;;;;;65029:43;;;;;;65003:6;64985:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;64975:37;;;;;;:97;64957:1708;;;65121:2;65115:9;;:5;:9;;65106:50;65115:9;65125;65115:20;;;;;-1:-1:-1;;;65115:20:0;;;;;;;;64957:1708;65256:32;;-1:-1:-1;;;65256:32:0;;;19476:25:1;19517:12;;65256:32:0;;;;;;;;;;;;65246:43;;;;;;65220:6;65202:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;65192:37;;;;;;:97;65174:1491;;;65338:2;65332:9;;:5;:9;;65323:50;65332:9;65342;65332:20;;;;;-1:-1:-1;;;65332:20:0;;;;;;;;65174:1491;65473:31;;-1:-1:-1;;;65473:31:0;;;17236:24:1;17276:11;;65473:31:0;;;;;;;;;;;;65463:42;;;;;;65437:6;65419:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;65409:37;;;;;;:96;65391:1274;;;65554:2;65548:9;;:5;:9;;65539:50;65548:9;65558;65548:20;;;;;-1:-1:-1;;;65548:20:0;;;;;;;;65391:1274;65689:26;;-1:-1:-1;;;65689:26:0;;;18958:19:1;18993:11;;65689:26:0;;;;;;;;;;;;65679:37;;;;;;65653:6;65635:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;65625:37;;;;;;:91;65607:1058;;;65765:2;65759:9;;:5;:9;;65750:50;65759:9;65769;65759:20;;;;;-1:-1:-1;;;65759:20:0;;;;;;;;65607:1058;65900:30;;-1:-1:-1;;;65900:30:0;;;13996:23:1;14035:11;;65900:30:0;;;;;;;;;;;;65890:41;;;;;;65864:6;65846:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;65836:37;;;;;;:95;65818:847;;;65980:2;65974:9;;:5;:9;;65965:50;65974:9;65984;65974:20;;;;;-1:-1:-1;;;65974:20:0;;;;;;;;65818:847;66115:31;;-1:-1:-1;;;66115:31:0;;;18163:24:1;18203:11;;66115:31:0;;;;;;;;;;;;66105:42;;;;;;66079:6;66061:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;66051:37;;;;;;:96;66033:632;;;66190:5;:9;;;;;;66181:50;66190:9;66200;66190:20;;;;;-1:-1:-1;;;66190:20:0;;;;;;;;66033:632;66331:26;;-1:-1:-1;;;66331:26:0;;;13737:19:1;13772:11;;66331:26:0;;;;;;;;;;;;66321:37;;;;;;66295:6;66277:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;66267:37;;;;;;:91;66249:416;;;66407:2;66401:9;;:5;:9;;66392:50;66401:9;66411;66401:20;;;;;-1:-1:-1;;;66401:20:0;;;;;;;;66249:416;66542:26;;-1:-1:-1;;;66542:26:0;;;13478:19:1;13513:11;;66542:26:0;;;;;;;;;;;;66532:37;;;;;;66506:6;66488:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;66478:37;;;;;;:91;66460:205;;;66618:2;66612:9;;:5;:9;;66603:50;66612:9;66622;66612:20;;;;;-1:-1:-1;;;66612:20:0;;;;;;;;66603:50;66596:57;;66460:205;66679:9;66692:1;66679:14;66675:141;;;66743:9;66760:14;66769:4;66760:8;:14::i;:::-;66726:49;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;66726:49:0;;;;;;;;;;-1:-1:-1;66791:13:0;;-1:-1:-1;;;;66791:13:0;66675:141;66842:2;66830:9;:14;66826:109;;;66869:54;66878:1;66881:7;66890:8;66906;:15;;;;66899:4;:22;;;;:::i;:::-;66890:32;;;;;;-1:-1:-1;;;66890:32:0;;;;;;;;;;;;;;;;66869:54;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:8;:54::i;:::-;66861:62;;;;:::i;:::-;;;66826:109;66962:2;66949:9;:15;66945:508;;66985:9;66998:2;66985:15;66981:461;;;67029:345;67060:1;67084:7;67194:12;67214;:19;;;;67207:4;:26;;;;:::i;:::-;67194:40;;;;;;-1:-1:-1;;;67194:40:0;;;;;;;;;;;;;;;;67265:12;67285;:19;;;;67278:4;:26;;;;:::i;:::-;67265:40;;;;;;-1:-1:-1;;;67265:40:0;;;;;;;;;;;;;;;;67147:185;;;;;;;;;:::i;:::-;;;;;;;;;;;;;67029:8;:345::i;:::-;67021:353;;;;:::i;:::-;;;66981:461;;;67415:11;67423:3;67415:11;;:::i;:::-;;;66981:461;67471:15;;;;:6;:15;;;;;;67463:23;;;;:::i;:::-;;;67530:9;67547:14;67556:4;67547:8;:14::i;:::-;67513:49;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;67513:49:0;;;;;;;62324:5271;-1:-1:-1;;;;;;;;;62324:5271:0:o;49256:211::-;49400:58;;-1:-1:-1;;;;;21122:32:1;;49400:58:0;;;21104:51:1;21171:18;;;21164:34;;;49373:86:0;;49393:5;;-1:-1:-1;;;49423:23:0;21077:18:1;;49400:58:0;21059:145:1;45596:173:0;45671:6;;;-1:-1:-1;;;;;45688:17:0;;;-1:-1:-1;;;;;;45688:17:0;;;;;;;45721:40;;45671:6;;;45688:17;45671:6;;45721:40;;45652:16;;45721:40;45596:173;;:::o;25854:315::-;26011:28;26021:4;26027:2;26031:7;26011:9;:28::i;:::-;26058:48;26081:4;26087:2;26091:7;26100:5;26058:22;:48::i;:::-;26050:111;;;;-1:-1:-1;;;26050:111:0;;;;;;;:::i;71173:723::-;71229:13;71450:10;71446:53;;-1:-1:-1;71477:10:0;;;;;;;;;;;;-1:-1:-1;;;71477:10:0;;;;;;71446:53;71524:5;71509:12;71565:78;71572:9;;71565:78;;71598:8;;;;:::i;:::-;;-1:-1:-1;71621:10:0;;-1:-1:-1;71629:2:0;71621:10;;:::i;:::-;;;71565:78;;;71653:19;71685:6;71675:17;;;;;;-1:-1:-1;;;71675:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;71675:17:0;;71653:39;;71703:154;71710:10;;71703:154;;71737:11;71747:1;71737:11;;:::i;:::-;;-1:-1:-1;71806:10:0;71814:2;71806:5;:10;:::i;:::-;71793:24;;:2;:24;:::i;:::-;71780:39;;71763:6;71770;71763:14;;;;;;-1:-1:-1;;;71763:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;71763:56:0;;;;;;;;-1:-1:-1;71834:11:0;71843:2;71834:11;;:::i;:::-;;;71703:154;;52864:2037;52922:13;52952:4;:11;52967:1;52952:16;52948:31;;;-1:-1:-1;52970:9:0;;;;;;;;;-1:-1:-1;52970:9:0;;;;52948:31;53039:19;53061:5;;;;;;;;;;;;;;;;;53039:27;;53118:18;53164:1;53145:4;:11;53159:1;53145:15;;;;:::i;:::-;53144:21;;;;:::i;:::-;53139:27;;:1;:27;:::i;:::-;53118:48;-1:-1:-1;53249:20:0;53283:15;53118:48;53296:2;53283:15;:::i;:::-;53272:27;;;;;;-1:-1:-1;;;53272:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53272:27:0;;53249:50;;53396:10;53388:6;53381:26;53503:1;53496:5;53492:13;53574:4;53625;53619:11;53610:7;53606:25;53733:2;53725:6;53721:15;53818:810;53837:6;53828:7;53825:19;53818:810;;;53903:1;53890:15;;;53984:14;;54137:4;54125:2;54121:14;;;54117:25;;54103:40;;54097:47;54092:3;54088:57;;;54070:76;;54265:2;54261:14;;;54257:25;;54243:40;;54237:47;54228:57;;54191:1;54176:17;;54210:76;54406:1;54401:14;;;54397:25;;54383:40;;54377:47;54368:57;;54316:17;;;54350:76;54537:25;;54523:40;;54517:47;54508:57;;54456:17;;;54490:76;;;;54596:17;;53818:810;;;54713:1;54706:4;54700:11;54696:19;54734:1;54729:54;;;;54802:1;54797:52;;;;54689:160;;54729:54;-1:-1:-1;;;;;54745:17:0;;54738:43;54729:54;;54797:52;-1:-1:-1;;;;;54813:17:0;;54806:41;54689:160;-1:-1:-1;54887:6:0;;52864:2037;-1:-1:-1;;;;;;;;52864:2037:0:o;36320:589::-;-1:-1:-1;;;;;36526:18:0;;36522:187;;36561:40;36593:7;37736:10;:17;;37709:24;;;;:15;:24;;;;;:44;;;37764:24;;;;;;;;;;;;37632:164;36561:40;36522:187;;;36631:2;-1:-1:-1;;;;;36623:10:0;:4;-1:-1:-1;;;;;36623:10:0;;36619:90;;36650:47;36683:4;36689:7;36650:32;:47::i;:::-;-1:-1:-1;;;;;36723:16:0;;36719:183;;36756:45;36793:7;36756:36;:45::i;:::-;36719:183;;;36829:4;-1:-1:-1;;;;;36823:10:0;:2;-1:-1:-1;;;;;36823:10:0;;36819:83;;36850:40;36878:2;36882:7;36850:27;:40::i;27803:321::-;27933:18;27939:2;27943:7;27933:5;:18::i;:::-;27984:54;28015:1;28019:2;28023:7;28032:5;27984:22;:54::i;:::-;27962:154;;;;-1:-1:-1;;;27962:154:0;;;;;;;:::i;51829:716::-;52253:23;52279:69;52307:4;52279:69;;;;;;;;;;;;;;;;;52287:5;-1:-1:-1;;;;;52279:27:0;;;:69;;;;;:::i;:::-;52363:17;;52253:95;;-1:-1:-1;52363:21:0;52359:179;;52460:10;52449:30;;;;;;;;;;;;:::i;:::-;52441:85;;;;-1:-1:-1;;;52441:85:0;;30646:2:1;52441:85:0;;;30628:21:1;30685:2;30665:18;;;30658:30;30724:34;30704:18;;;30697:62;-1:-1:-1;;;30775:18:1;;;30768:40;30825:19;;52441:85:0;30618:232:1;59851:138:0;59911:7;59973:5;59956:23;;;;;;;;:::i;:::-;;;;-1:-1:-1;;59956:23:0;;;;;;;;;59946:34;;59956:23;59946:34;;;;;59851:138;-1:-1:-1;;59851:138:0:o;31203:803::-;31358:4;-1:-1:-1;;;;;31379:13:0;;8563:20;8611:8;31375:624;;31415:72;;-1:-1:-1;;;31415:72:0;;-1:-1:-1;;;;;31415:36:0;;;;;:72;;16066:10;;31466:4;;31472:7;;31481:5;;31415:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31415:72:0;;;;;;;;-1:-1:-1;;31415:72:0;;;;;;;;;;;;:::i;:::-;;;31411:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31661:13:0;;31657:272;;31704:60;;-1:-1:-1;;;31704:60:0;;;;;;;:::i;31657:272::-;31879:6;31873:13;31864:6;31860:2;31856:15;31849:38;31411:533;-1:-1:-1;;;;;;31538:55:0;-1:-1:-1;;;31538:55:0;;-1:-1:-1;31531:62:0;;31375:624;-1:-1:-1;31983:4:0;31976:11;;38423:988;38689:22;38739:1;38714:22;38731:4;38714:16;:22::i;:::-;:26;;;;:::i;:::-;38751:18;38772:26;;;:17;:26;;;;;;38689:51;;-1:-1:-1;38905:28:0;;;38901:328;;-1:-1:-1;;;;;38972:18:0;;38950:19;38972:18;;;:12;:18;;;;;;;;:34;;;;;;;;;39023:30;;;;;;:44;;;39140:30;;:17;:30;;;;;:43;;;38901:328;-1:-1:-1;39325:26:0;;;;:17;:26;;;;;;;;39318:33;;;-1:-1:-1;;;;;39369:18:0;;;;;:12;:18;;;;;:34;;;;;;;39362:41;38423:988::o;39706:1079::-;39984:10;:17;39959:22;;39984:21;;40004:1;;39984:21;:::i;:::-;40016:18;40037:24;;;:15;:24;;;;;;40410:10;:26;;39959:46;;-1:-1:-1;40037:24:0;;39959:46;;40410:26;;;;-1:-1:-1;;;40410:26:0;;;;;;;;;;;;;;;;;40388:48;;40474:11;40449:10;40460;40449:22;;;;;;-1:-1:-1;;;40449:22:0;;;;;;;;;;;;;;;;;;;;:36;;;;40554:28;;;:15;:28;;;;;;;:41;;;40726:24;;;;;40719:31;40761:10;:16;;;;;-1:-1:-1;;;40761:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;39706:1079;;;;:::o;37210:221::-;37295:14;37312:20;37329:2;37312:16;:20::i;:::-;-1:-1:-1;;;;;37343:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;37388:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;37210:221:0:o;28460:382::-;-1:-1:-1;;;;;28540:16:0;;28532:61;;;;-1:-1:-1;;;28532:61:0;;27165:2:1;28532:61:0;;;27147:21:1;;;27184:18;;;27177:30;27243:34;27223:18;;;27216:62;27295:18;;28532:61:0;27137:182:1;28532:61:0;26547:4;26571:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26571:16:0;:30;28604:58;;;;-1:-1:-1;;;28604:58:0;;23288:2:1;28604:58:0;;;23270:21:1;23327:2;23307:18;;;23300:30;23366;23346:18;;;23339:58;23414:18;;28604:58:0;23260:178:1;28604:58:0;28675:45;28704:1;28708:2;28712:7;28675:20;:45::i;:::-;-1:-1:-1;;;;;28733:13:0;;;;;;:9;:13;;;;;:18;;28750:1;;28733:13;:18;;28750:1;;28733:18;:::i;:::-;;;;-1:-1:-1;;28762:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;28762:21:0;-1:-1:-1;;;;;28762:21:0;;;;;;;;28801:33;;28762:16;;;28801:33;;28762:16;;28801:33;28460:382;;:::o;11046:229::-;11183:12;11215:52;11237:6;11245:4;11251:1;11254:12;11183;8563:20;;12453:60;;;;-1:-1:-1;;;12453:60:0;;29875:2:1;12453:60:0;;;29857:21:1;29914:2;29894:18;;;29887:30;29953:31;29933:18;;;29926:59;30002:18;;12453:60:0;29847:179:1;12453:60:0;12527:12;12541:23;12568:6;-1:-1:-1;;;;;12568:11:0;12587:5;12594:4;12568:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12526:73;;;;12617:52;12635:7;12644:10;12656:12;12617:17;:52::i;:::-;12610:59;12166:511;-1:-1:-1;;;;;;;12166:511:0:o;14635:712::-;14785:12;14814:7;14810:530;;;-1:-1:-1;14845:10:0;14838:17;;14810:530;14959:17;;:21;14955:374;;15157:10;15151:17;15218:15;15205:10;15201:2;15197:19;15190:44;15105:148;15300:12;15293:20;;-1:-1:-1;;;15293:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:631:1:-;;108:18;149:2;141:6;138:14;135:2;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:2;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:2;;;532:1;529;522:12;491:2;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;88:557;;;;;:::o;650:257::-;;762:2;750:9;741:7;737:23;733:32;730:2;;;783:6;775;768:22;730:2;827:9;814:23;846:31;871:5;846:31;:::i;912:261::-;;1035:2;1023:9;1014:7;1010:23;1006:32;1003:2;;;1056:6;1048;1041:22;1003:2;1093:9;1087:16;1112:31;1137:5;1112:31;:::i;1178:398::-;;;1307:2;1295:9;1286:7;1282:23;1278:32;1275:2;;;1328:6;1320;1313:22;1275:2;1372:9;1359:23;1391:31;1416:5;1391:31;:::i;:::-;1441:5;-1:-1:-1;1498:2:1;1483:18;;1470:32;1511:33;1470:32;1511:33;:::i;:::-;1563:7;1553:17;;;1265:311;;;;;:::o;1581:466::-;;;;1727:2;1715:9;1706:7;1702:23;1698:32;1695:2;;;1748:6;1740;1733:22;1695:2;1792:9;1779:23;1811:31;1836:5;1811:31;:::i;:::-;1861:5;-1:-1:-1;1918:2:1;1903:18;;1890:32;1931:33;1890:32;1931:33;:::i;:::-;1685:362;;1983:7;;-1:-1:-1;;;2037:2:1;2022:18;;;;2009:32;;1685:362::o;2052:824::-;;;;;2224:3;2212:9;2203:7;2199:23;2195:33;2192:2;;;2246:6;2238;2231:22;2192:2;2290:9;2277:23;2309:31;2334:5;2309:31;:::i;:::-;2359:5;-1:-1:-1;2416:2:1;2401:18;;2388:32;2429:33;2388:32;2429:33;:::i;:::-;2481:7;-1:-1:-1;2535:2:1;2520:18;;2507:32;;-1:-1:-1;2590:2:1;2575:18;;2562:32;2617:18;2606:30;;2603:2;;;2654:6;2646;2639:22;2603:2;2682:22;;2735:4;2727:13;;2723:27;-1:-1:-1;2713:2:1;;2769:6;2761;2754:22;2713:2;2797:73;2862:7;2857:2;2844:16;2839:2;2835;2831:11;2797:73;:::i;:::-;2787:83;;;2182:694;;;;;;;:::o;2881:392::-;;;3007:2;2995:9;2986:7;2982:23;2978:32;2975:2;;;3028:6;3020;3013:22;2975:2;3072:9;3059:23;3091:31;3116:5;3091:31;:::i;:::-;3141:5;-1:-1:-1;3198:2:1;3183:18;;3170:32;3211:30;3170:32;3211:30;:::i;3278:325::-;;;3407:2;3395:9;3386:7;3382:23;3378:32;3375:2;;;3428:6;3420;3413:22;3375:2;3472:9;3459:23;3491:31;3516:5;3491:31;:::i;:::-;3541:5;3593:2;3578:18;;;;3565:32;;-1:-1:-1;;;3365:238:1:o;3608:251::-;;3717:2;3705:9;3696:7;3692:23;3688:32;3685:2;;;3738:6;3730;3723:22;3685:2;3782:9;3769:23;3801:28;3823:5;3801:28;:::i;3864:255::-;;3984:2;3972:9;3963:7;3959:23;3955:32;3952:2;;;4005:6;3997;3990:22;3952:2;4042:9;4036:16;4061:28;4083:5;4061:28;:::i;4124:255::-;;4235:2;4223:9;4214:7;4210:23;4206:32;4203:2;;;4256:6;4248;4241:22;4203:2;4300:9;4287:23;4319:30;4343:5;4319:30;:::i;4384:259::-;;4506:2;4494:9;4485:7;4481:23;4477:32;4474:2;;;4527:6;4519;4512:22;4474:2;4564:9;4558:16;4583:30;4607:5;4583:30;:::i;4648:190::-;;4760:2;4748:9;4739:7;4735:23;4731:32;4728:2;;;4781:6;4773;4766:22;4728:2;-1:-1:-1;4809:23:1;;4718:120;-1:-1:-1;4718:120:1:o;4843:258::-;;;4972:2;4960:9;4951:7;4947:23;4943:32;4940:2;;;4993:6;4985;4978:22;4940:2;-1:-1:-1;;5021:23:1;;;5091:2;5076:18;;;5063:32;;-1:-1:-1;4930:171:1:o;5106:616::-;;;;5262:2;5250:9;5241:7;5237:23;5233:32;5230:2;;;5283:6;5275;5268:22;5230:2;5324:9;5311:23;5301:33;;5381:2;5370:9;5366:18;5353:32;5343:42;;5436:2;5425:9;5421:18;5408:32;5463:18;5455:6;5452:30;5449:2;;;5500:6;5492;5485:22;5449:2;5528:22;;5581:4;5573:13;;5569:27;-1:-1:-1;5559:2:1;;5615:6;5607;5600:22;5559:2;5643:73;5708:7;5703:2;5690:16;5685:2;5681;5677:11;5643:73;:::i;:::-;5633:83;;;5220:502;;;;;:::o;5727:357::-;;;5854:2;5842:9;5833:7;5829:23;5825:32;5822:2;;;5875:6;5867;5860:22;5822:2;5919:9;5906:23;5969:4;5962:5;5958:16;5951:5;5948:27;5938:2;;5994:6;5986;5979:22;6089:257;;6168:5;6162:12;6195:6;6190:3;6183:19;6211:63;6267:6;6260:4;6255:3;6251:14;6244:4;6237:5;6233:16;6211:63;:::i;:::-;6328:2;6307:15;-1:-1:-1;;6303:29:1;6294:39;;;;6335:4;6290:50;;6138:208;-1:-1:-1;;6138:208:1:o;6351:978::-;6436:12;;6351:978;;6508:1;6493:17;;6529:1;6565:18;;;;6592:2;;6646:4;6638:6;6634:17;6624:27;;6592:2;6672;6720;6712:6;6709:14;6689:18;6686:38;6683:2;;;-1:-1:-1;;;6747:33:1;;6803:4;6800:1;6793:15;6833:4;6754:3;6821:17;6683:2;6864:18;6891:104;;;;7009:1;7004:319;;;;6857:466;;6891:104;-1:-1:-1;;6924:24:1;;6912:37;;6969:16;;;;-1:-1:-1;6891:104:1;;7004:319;32510:127;32576:17;;;32626:4;32610:21;;7098:1;7112:165;7126:6;7123:1;7120:13;7112:165;;;7204:14;;7191:11;;;7184:35;7247:16;;;;7141:10;;7112:165;;;7116:3;;7306:6;7301:3;7297:16;7290:23;;6857:466;;;;;;;6409:920;;;;:::o;7464:274::-;;7631:6;7625:13;7647:53;7693:6;7688:3;7681:4;7673:6;7669:17;7647:53;:::i;:::-;7716:16;;;;;7601:137;-1:-1:-1;;7601:137:1:o;8024:470::-;;8241:6;8235:13;8257:53;8303:6;8298:3;8291:4;8283:6;8279:17;8257:53;:::i;:::-;8373:13;;8332:16;;;;8395:57;8373:13;8332:16;8429:4;8417:17;;8395:57;:::i;:::-;8468:20;;8211:283;-1:-1:-1;;;;8211:283:1:o;8499:1052::-;;8860:6;8854:13;8876:53;8922:6;8917:3;8910:4;8902:6;8898:17;8876:53;:::i;:::-;8992:13;;8951:16;;;;9014:57;8992:13;8951:16;9048:4;9036:17;;9014:57;:::i;:::-;9138:13;;9093:20;;;9160:57;9138:13;9093:20;9194:4;9182:17;;9160:57;:::i;:::-;9284:13;;9239:20;;;9306:57;9284:13;9239:20;9340:4;9328:17;;9306:57;:::i;:::-;9430:13;;9385:20;;;9452:57;9430:13;9385:20;9486:4;9474:17;;9452:57;:::i;:::-;9525:20;;8830:721;-1:-1:-1;;;;;;;8830:721:1:o;9556:1767::-;;10109:6;10103:13;10125:53;10171:6;10166:3;10159:4;10151:6;10147:17;10125:53;:::i;:::-;10209:6;10203:13;10225:68;10284:8;10275:6;10270:3;10266:16;10259:4;10251:6;10247:17;10225:68;:::i;:::-;10371:13;;10319:16;;;10315:31;;10393:57;10371:13;10315:31;10427:4;10415:17;;10393:57;:::i;:::-;10481:6;10475:13;10497:72;10560:8;10549;10542:5;10538:20;10531:4;10523:6;10519:17;10497:72;:::i;:::-;10651:13;;10595:20;;;;10591:35;;10673:57;10651:13;10591:35;10707:4;10695:17;;10673:57;:::i;:::-;10761:6;10755:13;10777:72;10840:8;10829;10822:5;10818:20;10811:4;10803:6;10799:17;10777:72;:::i;:::-;10931:13;;10875:20;;;;10871:35;;10953:57;10931:13;10871:35;10987:4;10975:17;;10953:57;:::i;:::-;11041:6;11035:13;11057:72;11120:8;11109;11102:5;11098:20;11091:4;11083:6;11079:17;11057:72;:::i;:::-;11208:13;;11152:20;;;;11148:35;;11230:54;11208:13;11148:35;11264:4;11252:17;;11230:54;:::i;:::-;11300:17;;10079:1244;-1:-1:-1;;;;;;;;;;;10079:1244:1:o;11328:615::-;;11646:6;11640:13;11662:53;11708:6;11703:3;11696:4;11688:6;11684:17;11662:53;:::i;:::-;-1:-1:-1;;;11737:16:1;;;11762:19;;;11806:13;;11828:65;11806:13;11880:1;11869:13;;11862:4;11850:17;;11828:65;:::i;:::-;11913:20;11935:1;11909:28;;11616:327;-1:-1:-1;;;;11616:327:1:o;11948:277::-;;12146:73;12180:38;12214:3;12206:6;12180:38;:::i;:::-;12172:6;12146:73;:::i;14323:423::-;;-1:-1:-1;;;14580:3:1;14573:21;14623:6;14617:13;14639:61;14693:6;14689:1;14684:3;14680:11;14673:4;14665:6;14661:17;14639:61;:::i;:::-;14720:16;;;;14738:1;14716:24;;14563:183;-1:-1:-1;;14563:183:1:o;15544:1485::-;-1:-1:-1;;;16044:61:1;;16128:13;;15544:1485;;16150:62;16128:13;16200:2;16191:12;;16184:4;16172:17;;16150:62;:::i;:::-;16240:6;16235:3;16231:16;16221:26;;16276:66;16271:2;16267;16263:11;16256:87;16372:34;16367:2;16363;16359:11;16352:55;16436:34;16431:2;16427;16423:11;16416:55;16501:34;16495:3;16491:2;16487:12;16480:56;16566:34;16560:3;16556:2;16552:12;16545:56;16631:34;16625:3;16621:2;16617:12;16610:56;16696:66;16690:3;16686:2;16682:12;16675:88;-1:-1:-1;;;16787:3:1;16783:2;16779:12;16772:46;16837:3;16871:6;16865:13;16887:63;16941:8;16936:2;16932;16928:11;16921:4;16913:6;16909:17;16887:63;:::i;:::-;16966:57;17019:2;17008:8;17004:2;17000:17;16996:26;-1:-1:-1;;;7399:27:1;;7451:1;7442:11;;7389:70;17298:448;;17560:31;17555:3;17548:44;17621:6;17615:13;17637:62;17692:6;17687:2;17682:3;17678:12;17671:4;17663:6;17659:17;17637:62;:::i;:::-;17719:16;;;;17737:2;17715:25;;17538:208;-1:-1:-1;;17538:208:1:o;20437:488::-;-1:-1:-1;;;;;20706:15:1;;;20688:34;;20758:15;;20753:2;20738:18;;20731:43;20805:2;20790:18;;20783:34;;;20853:3;20848:2;20833:18;;20826:31;;;20437:488;;20874:45;;20899:19;;20891:6;20874:45;:::i;:::-;20866:53;20640:285;-1:-1:-1;;;;;;20640:285:1:o;21624:219::-;;21773:2;21762:9;21755:21;21793:44;21833:2;21822:9;21818:18;21810:6;21793:44;:::i;22260:414::-;22462:2;22444:21;;;22501:2;22481:18;;;22474:30;22540:34;22535:2;22520:18;;22513:62;-1:-1:-1;;;22606:2:1;22591:18;;22584:48;22664:3;22649:19;;22434:240::o;27737:356::-;27939:2;27921:21;;;27958:18;;;27951:30;28017:34;28012:2;27997:18;;27990:62;28084:2;28069:18;;27911:182::o;28098:340::-;28300:2;28282:21;;;28339:2;28319:18;;;28312:30;-1:-1:-1;;;28373:2:1;28358:18;;28351:46;28429:2;28414:18;;28272:166::o;29255:413::-;29457:2;29439:21;;;29496:2;29476:18;;;29469:30;29535:34;29530:2;29515:18;;29508:62;-1:-1:-1;;;29601:2:1;29586:18;;29579:47;29658:3;29643:19;;29429:239::o;31188:355::-;31390:2;31372:21;;;31429:2;31409:18;;;31402:30;31468:33;31463:2;31448:18;;31441:61;31534:2;31519:18;;31362:181::o;32642:128::-;;32713:1;32709:6;32706:1;32703:13;32700:2;;;32719:18;;:::i;:::-;-1:-1:-1;32755:9:1;;32690:80::o;32775:120::-;;32841:1;32831:2;;32846:18;;:::i;:::-;-1:-1:-1;32880:9:1;;32821:74::o;32900:168::-;;33006:1;33002;32998:6;32994:14;32991:1;32988:21;32983:1;32976:9;32969:17;32965:45;32962:2;;;33013:18;;:::i;:::-;-1:-1:-1;33053:9:1;;32952:116::o;33073:125::-;;33141:1;33138;33135:8;33132:2;;;33146:18;;:::i;:::-;-1:-1:-1;33183:9:1;;33122:76::o;33203:258::-;33275:1;33285:113;33299:6;33296:1;33293:13;33285:113;;;33375:11;;;33369:18;33356:11;;;33349:39;33321:2;33314:10;33285:113;;;33416:6;33413:1;33410:13;33407:2;;;-1:-1:-1;;33451:1:1;33433:16;;33426:27;33256:205::o;33466:380::-;33551:1;33541:12;;33598:1;33588:12;;;33609:2;;33663:4;33655:6;33651:17;33641:27;;33609:2;33716;33708:6;33705:14;33685:18;33682:38;33679:2;;;33762:10;33757:3;33753:20;33750:1;33743:31;33797:4;33794:1;33787:15;33825:4;33822:1;33815:15;33679:2;;33521:325;;;:::o;33851:135::-;;-1:-1:-1;;33911:17:1;;33908:2;;;33931:18;;:::i;:::-;-1:-1:-1;33978:1:1;33967:13;;33898:88::o;33991:112::-;;34049:1;34039:2;;34054:18;;:::i;:::-;-1:-1:-1;34088:9:1;;34029:74::o;34108:127::-;34169:10;34164:3;34160:20;34157:1;34150:31;34200:4;34197:1;34190:15;34224:4;34221:1;34214:15;34240:127;34301:10;34296:3;34292:20;34289:1;34282:31;34332:4;34329:1;34322:15;34356:4;34353:1;34346:15;34372:127;34433:10;34428:3;34424:20;34421:1;34414:31;34464:4;34461:1;34454:15;34488:4;34485:1;34478:15;34504:131;-1:-1:-1;;;;;34579:31:1;;34569:42;;34559:2;;34625:1;34622;34615:12;34640:118;34726:5;34719:13;34712:21;34705:5;34702:32;34692:2;;34748:1;34745;34738:12;34763:131;-1:-1:-1;;;;;;34837:32:1;;34827:43;;34817:2;;34884:1;34881;34874:12

Swarm Source

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