Token CrowPunks Raffle

 

Overview ERC-721

Total Supply:
99,995 CPR

Holders:
98,761 addresses
 
Balance
1 CPR
0xd2c24bcf8c20be73700ca05a9668c5606b07209b
Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
CrowPunksRaffleTickets

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at PolygonScan.com on 2021-10-22
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

contract CrowPunksRaffleTickets is ERC721, ERC721Enumerable, ERC721Burnable, Ownable {
    
    using Counters for Counters.Counter;

    Counters.Counter private _tokenIdCounter;

    constructor() ERC721("CrowPunks Raffle", "CPR") {}

    function _baseURI() internal pure override returns (string memory) {
        return "http://crowpunks.com/tickets/metafiles/";
    }

    function safeMint(uint amount) public onlyOwner {
        for (uint i=0; i<amount; i++){
            _safeMint(msg.sender, _tokenIdCounter.current());
            _tokenIdCounter.increment();
        }
    }
    
    function transferBatch(address[] memory to) public onlyOwner {
        for (uint i=0; i<to.length; i++){
            safeTransferFrom(msg.sender, to[i], i);
        }
    }
    
    // The following functions are overrides required by Solidity.

    function _beforeTokenTransfer(address from, address to, uint256 tokenId)
        internal
        override(ERC721, ERC721Enumerable)
    {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721, ERC721Enumerable)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }
    
    /**
   * Override isApprovedForAll to auto-approve OS's proxy contract
   */
    function isApprovedForAll(
        address _owner,
        address _operator
    ) public override view returns (bool isOperator) {
      // if OpenSea's ERC721 Proxy Address is detected, auto-return true
        if (_operator == address(0x58807baD0B376efc12F5AD86aAc70E78ed67deaE)) {
            return true;
        }
        
        // otherwise, use the default ERC721.isApprovedForAll()
        return ERC721.isApprovedForAll(_owner, _operator);
    }
    
}

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":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","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":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"isOperator","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":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"safeMint","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":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":"to","type":"address[]"}],"name":"transferBatch","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":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040518060400160405280601081526020017f43726f7750756e6b7320526166666c65000000000000000000000000000000008152506040518060400160405280600381526020017f4350520000000000000000000000000000000000000000000000000000000000815250816000908051906020019062000096929190620001a6565b508060019080519060200190620000af929190620001a6565b505050620000d2620000c6620000d860201b60201c565b620000e060201b60201c565b620002bb565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001b49062000256565b90600052602060002090601f016020900481019282620001d8576000855562000224565b82601f10620001f357805160ff191683800117855562000224565b8280016001018555821562000224579182015b828111156200022357825182559160200191906001019062000206565b5b50905062000233919062000237565b5090565b5b808211156200025257600081600090555060010162000238565b5090565b600060028204905060018216806200026f57607f821691505b602082108114156200028657620002856200028c565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61385e80620002cb6000396000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c80636352211e116100b8578063a22cb4651161007c578063a22cb46514610375578063b88d4fde14610391578063c87b56dd146103ad578063d1b7cb9b146103dd578063e985e9c5146103f9578063f2fde38b1461042957610142565b80636352211e146102cf57806370a08231146102ff578063715018a61461032f5780638da5cb5b1461033957806395d89b411461035757610142565b806323b872dd1161010a57806323b872dd146101ff5780632f745c591461021b57806331c864e81461024b57806342842e0e1461026757806342966c68146102835780634f6ccce71461029f57610142565b806301ffc9a71461014757806306fdde0314610177578063081812fc14610195578063095ea7b3146101c557806318160ddd146101e1575b600080fd5b610161600480360381019061015c91906126d6565b610445565b60405161016e9190612b51565b60405180910390f35b61017f610457565b60405161018c9190612b6c565b60405180910390f35b6101af60048036038101906101aa9190612730565b6104e9565b6040516101bc9190612aea565b60405180910390f35b6101df60048036038101906101da919061264d565b61056e565b005b6101e9610686565b6040516101f69190612dee565b60405180910390f35b61021960048036038101906102149190612537565b610693565b005b6102356004803603810190610230919061264d565b6106f3565b6040516102429190612dee565b60405180910390f35b61026560048036038101906102609190612730565b610798565b005b610281600480360381019061027c9190612537565b610853565b005b61029d60048036038101906102989190612730565b610873565b005b6102b960048036038101906102b49190612730565b6108cf565b6040516102c69190612dee565b60405180910390f35b6102e960048036038101906102e49190612730565b610940565b6040516102f69190612aea565b60405180910390f35b610319600480360381019061031491906124ca565b6109f2565b6040516103269190612dee565b60405180910390f35b610337610aaa565b005b610341610b32565b60405161034e9190612aea565b60405180910390f35b61035f610b5c565b60405161036c9190612b6c565b60405180910390f35b61038f600480360381019061038a919061260d565b610bee565b005b6103ab60048036038101906103a6919061258a565b610d6f565b005b6103c760048036038101906103c29190612730565b610dd1565b6040516103d49190612b6c565b60405180910390f35b6103f760048036038101906103f2919061268d565b610e78565b005b610413600480360381019061040e91906124f7565b610f3c565b6040516104209190612b51565b60405180910390f35b610443600480360381019061043e91906124ca565b610fa2565b005b60006104508261109a565b9050919050565b6060600080546104669061303f565b80601f01602080910402602001604051908101604052809291908181526020018280546104929061303f565b80156104df5780601f106104b4576101008083540402835291602001916104df565b820191906000526020600020905b8154815290600101906020018083116104c257829003601f168201915b5050505050905090565b60006104f482611114565b610533576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161052a90612cee565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061057982610940565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156105ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105e190612d6e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610609611180565b73ffffffffffffffffffffffffffffffffffffffff161480610638575061063781610632611180565b610f3c565b5b610677576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161066e90612c6e565b60405180910390fd5b6106818383611188565b505050565b6000600880549050905090565b6106a461069e611180565b82611241565b6106e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106da90612d8e565b60405180910390fd5b6106ee83838361131f565b505050565b60006106fe836109f2565b821061073f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073690612b8e565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6107a0611180565b73ffffffffffffffffffffffffffffffffffffffff166107be610b32565b73ffffffffffffffffffffffffffffffffffffffff1614610814576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080b90612d0e565b60405180910390fd5b60005b8181101561084f576108323361082d600b61157b565b611589565b61083c600b6115a7565b8080610847906130a2565b915050610817565b5050565b61086e83838360405180602001604052806000815250610d6f565b505050565b61088461087e611180565b82611241565b6108c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ba90612dce565b60405180910390fd5b6108cc816115bd565b50565b60006108d9610686565b821061091a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091190612dae565b60405180910390fd5b6008828154811061092e5761092d6131d8565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156109e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e090612cae565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610a63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5a90612c8e565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610ab2611180565b73ffffffffffffffffffffffffffffffffffffffff16610ad0610b32565b73ffffffffffffffffffffffffffffffffffffffff1614610b26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1d90612d0e565b60405180910390fd5b610b3060006116ce565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610b6b9061303f565b80601f0160208091040260200160405190810160405280929190818152602001828054610b979061303f565b8015610be45780601f10610bb957610100808354040283529160200191610be4565b820191906000526020600020905b815481529060010190602001808311610bc757829003601f168201915b5050505050905090565b610bf6611180565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610c64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5b90612c2e565b60405180910390fd5b8060056000610c71611180565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610d1e611180565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610d639190612b51565b60405180910390a35050565b610d80610d7a611180565b83611241565b610dbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db690612d8e565b60405180910390fd5b610dcb84848484611794565b50505050565b6060610ddc82611114565b610e1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1290612d4e565b60405180910390fd5b6000610e256117f0565b90506000815111610e455760405180602001604052806000815250610e70565b80610e4f84611810565b604051602001610e60929190612ac6565b6040516020818303038152906040525b915050919050565b610e80611180565b73ffffffffffffffffffffffffffffffffffffffff16610e9e610b32565b73ffffffffffffffffffffffffffffffffffffffff1614610ef4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eeb90612d0e565b60405180910390fd5b60005b8151811015610f3857610f2533838381518110610f1757610f166131d8565b5b602002602001015183610853565b8080610f30906130a2565b915050610ef7565b5050565b60007358807bad0b376efc12f5ad86aac70e78ed67deae73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f8f5760019050610f9c565b610f998383611971565b90505b92915050565b610faa611180565b73ffffffffffffffffffffffffffffffffffffffff16610fc8610b32565b73ffffffffffffffffffffffffffffffffffffffff161461101e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101590612d0e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561108e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108590612bce565b60405180910390fd5b611097816116ce565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061110d575061110c82611a05565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166111fb83610940565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061124c82611114565b61128b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128290612c4e565b60405180910390fd5b600061129683610940565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061130557508373ffffffffffffffffffffffffffffffffffffffff166112ed846104e9565b73ffffffffffffffffffffffffffffffffffffffff16145b8061131657506113158185610f3c565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661133f82610940565b73ffffffffffffffffffffffffffffffffffffffff1614611395576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138c90612d2e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611405576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fc90612c0e565b60405180910390fd5b611410838383611ae7565b61141b600082611188565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461146b9190612f55565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114c29190612ece565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600081600001549050919050565b6115a3828260405180602001604052806000815250611af7565b5050565b6001816000016000828254019250508190555050565b60006115c882610940565b90506115d681600084611ae7565b6115e1600083611188565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116319190612f55565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61179f84848461131f565b6117ab84848484611b52565b6117ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e190612bae565b60405180910390fd5b50505050565b606060405180606001604052806027815260200161380260279139905090565b60606000821415611858576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061196c565b600082905060005b6000821461188a578080611873906130a2565b915050600a826118839190612f24565b9150611860565b60008167ffffffffffffffff8111156118a6576118a5613207565b5b6040519080825280601f01601f1916602001820160405280156118d85781602001600182028036833780820191505090505b5090505b60008514611965576001826118f19190612f55565b9150600a8561190091906130eb565b603061190c9190612ece565b60f81b818381518110611922576119216131d8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561195e9190612f24565b94506118dc565b8093505050505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611ad057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611ae05750611adf82611ce9565b5b9050919050565b611af2838383611d53565b505050565b611b018383611e67565b611b0e6000848484611b52565b611b4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4490612bae565b60405180910390fd5b505050565b6000611b738473ffffffffffffffffffffffffffffffffffffffff16612035565b15611cdc578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611b9c611180565b8786866040518563ffffffff1660e01b8152600401611bbe9493929190612b05565b602060405180830381600087803b158015611bd857600080fd5b505af1925050508015611c0957506040513d601f19601f82011682018060405250810190611c069190612703565b60015b611c8c573d8060008114611c39576040519150601f19603f3d011682016040523d82523d6000602084013e611c3e565b606091505b50600081511415611c84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7b90612bae565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611ce1565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611d5e838383612048565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611da157611d9c8161204d565b611de0565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611ddf57611dde8382612096565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e2357611e1e81612203565b611e62565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611e6157611e6082826122d4565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ed7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ece90612cce565b60405180910390fd5b611ee081611114565b15611f20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1790612bee565b60405180910390fd5b611f2c60008383611ae7565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f7c9190612ece565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016120a3846109f2565b6120ad9190612f55565b9050600060076000848152602001908152602001600020549050818114612192576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506122179190612f55565b9050600060096000848152602001908152602001600020549050600060088381548110612247576122466131d8565b5b906000526020600020015490508060088381548110612269576122686131d8565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806122b8576122b76131a9565b5b6001900381819060005260206000200160009055905550505050565b60006122df836109f2565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600061236661236184612e2e565b612e09565b905080838252602082019050828560208602820111156123895761238861323b565b5b60005b858110156123b9578161239f8882612405565b84526020840193506020830192505060018101905061238c565b5050509392505050565b60006123d66123d184612e5a565b612e09565b9050828152602081018484840111156123f2576123f1613240565b5b6123fd848285612ffd565b509392505050565b600081359050612414816137a5565b92915050565b600082601f83011261242f5761242e613236565b5b813561243f848260208601612353565b91505092915050565b600081359050612457816137bc565b92915050565b60008135905061246c816137d3565b92915050565b600081519050612481816137d3565b92915050565b600082601f83011261249c5761249b613236565b5b81356124ac8482602086016123c3565b91505092915050565b6000813590506124c4816137ea565b92915050565b6000602082840312156124e0576124df61324a565b5b60006124ee84828501612405565b91505092915050565b6000806040838503121561250e5761250d61324a565b5b600061251c85828601612405565b925050602061252d85828601612405565b9150509250929050565b6000806000606084860312156125505761254f61324a565b5b600061255e86828701612405565b935050602061256f86828701612405565b9250506040612580868287016124b5565b9150509250925092565b600080600080608085870312156125a4576125a361324a565b5b60006125b287828801612405565b94505060206125c387828801612405565b93505060406125d4878288016124b5565b925050606085013567ffffffffffffffff8111156125f5576125f4613245565b5b61260187828801612487565b91505092959194509250565b600080604083850312156126245761262361324a565b5b600061263285828601612405565b925050602061264385828601612448565b9150509250929050565b600080604083850312156126645761266361324a565b5b600061267285828601612405565b9250506020612683858286016124b5565b9150509250929050565b6000602082840312156126a3576126a261324a565b5b600082013567ffffffffffffffff8111156126c1576126c0613245565b5b6126cd8482850161241a565b91505092915050565b6000602082840312156126ec576126eb61324a565b5b60006126fa8482850161245d565b91505092915050565b6000602082840312156127195761271861324a565b5b600061272784828501612472565b91505092915050565b6000602082840312156127465761274561324a565b5b6000612754848285016124b5565b91505092915050565b61276681612f89565b82525050565b61277581612f9b565b82525050565b600061278682612e8b565b6127908185612ea1565b93506127a081856020860161300c565b6127a98161324f565b840191505092915050565b60006127bf82612e96565b6127c98185612eb2565b93506127d981856020860161300c565b6127e28161324f565b840191505092915050565b60006127f882612e96565b6128028185612ec3565b935061281281856020860161300c565b80840191505092915050565b600061282b602b83612eb2565b915061283682613260565b604082019050919050565b600061284e603283612eb2565b9150612859826132af565b604082019050919050565b6000612871602683612eb2565b915061287c826132fe565b604082019050919050565b6000612894601c83612eb2565b915061289f8261334d565b602082019050919050565b60006128b7602483612eb2565b91506128c282613376565b604082019050919050565b60006128da601983612eb2565b91506128e5826133c5565b602082019050919050565b60006128fd602c83612eb2565b9150612908826133ee565b604082019050919050565b6000612920603883612eb2565b915061292b8261343d565b604082019050919050565b6000612943602a83612eb2565b915061294e8261348c565b604082019050919050565b6000612966602983612eb2565b9150612971826134db565b604082019050919050565b6000612989602083612eb2565b91506129948261352a565b602082019050919050565b60006129ac602c83612eb2565b91506129b782613553565b604082019050919050565b60006129cf602083612eb2565b91506129da826135a2565b602082019050919050565b60006129f2602983612eb2565b91506129fd826135cb565b604082019050919050565b6000612a15602f83612eb2565b9150612a208261361a565b604082019050919050565b6000612a38602183612eb2565b9150612a4382613669565b604082019050919050565b6000612a5b603183612eb2565b9150612a66826136b8565b604082019050919050565b6000612a7e602c83612eb2565b9150612a8982613707565b604082019050919050565b6000612aa1603083612eb2565b9150612aac82613756565b604082019050919050565b612ac081612ff3565b82525050565b6000612ad282856127ed565b9150612ade82846127ed565b91508190509392505050565b6000602082019050612aff600083018461275d565b92915050565b6000608082019050612b1a600083018761275d565b612b27602083018661275d565b612b346040830185612ab7565b8181036060830152612b46818461277b565b905095945050505050565b6000602082019050612b66600083018461276c565b92915050565b60006020820190508181036000830152612b8681846127b4565b905092915050565b60006020820190508181036000830152612ba78161281e565b9050919050565b60006020820190508181036000830152612bc781612841565b9050919050565b60006020820190508181036000830152612be781612864565b9050919050565b60006020820190508181036000830152612c0781612887565b9050919050565b60006020820190508181036000830152612c27816128aa565b9050919050565b60006020820190508181036000830152612c47816128cd565b9050919050565b60006020820190508181036000830152612c67816128f0565b9050919050565b60006020820190508181036000830152612c8781612913565b9050919050565b60006020820190508181036000830152612ca781612936565b9050919050565b60006020820190508181036000830152612cc781612959565b9050919050565b60006020820190508181036000830152612ce78161297c565b9050919050565b60006020820190508181036000830152612d078161299f565b9050919050565b60006020820190508181036000830152612d27816129c2565b9050919050565b60006020820190508181036000830152612d47816129e5565b9050919050565b60006020820190508181036000830152612d6781612a08565b9050919050565b60006020820190508181036000830152612d8781612a2b565b9050919050565b60006020820190508181036000830152612da781612a4e565b9050919050565b60006020820190508181036000830152612dc781612a71565b9050919050565b60006020820190508181036000830152612de781612a94565b9050919050565b6000602082019050612e036000830184612ab7565b92915050565b6000612e13612e24565b9050612e1f8282613071565b919050565b6000604051905090565b600067ffffffffffffffff821115612e4957612e48613207565b5b602082029050602081019050919050565b600067ffffffffffffffff821115612e7557612e74613207565b5b612e7e8261324f565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612ed982612ff3565b9150612ee483612ff3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612f1957612f1861311c565b5b828201905092915050565b6000612f2f82612ff3565b9150612f3a83612ff3565b925082612f4a57612f4961314b565b5b828204905092915050565b6000612f6082612ff3565b9150612f6b83612ff3565b925082821015612f7e57612f7d61311c565b5b828203905092915050565b6000612f9482612fd3565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561302a57808201518184015260208101905061300f565b83811115613039576000848401525b50505050565b6000600282049050600182168061305757607f821691505b6020821081141561306b5761306a61317a565b5b50919050565b61307a8261324f565b810181811067ffffffffffffffff8211171561309957613098613207565b5b80604052505050565b60006130ad82612ff3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156130e0576130df61311c565b5b600182019050919050565b60006130f682612ff3565b915061310183612ff3565b9250826131115761311061314b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b6137ae81612f89565b81146137b957600080fd5b50565b6137c581612f9b565b81146137d057600080fd5b50565b6137dc81612fa7565b81146137e757600080fd5b50565b6137f381612ff3565b81146137fe57600080fd5b5056fe687474703a2f2f63726f7770756e6b732e636f6d2f7469636b6574732f6d65746166696c65732fa2646970667358221220b82127fc3ef9d13f4f7fcb3811405e29649f5c95502c1d9a005ca1fd41cff93764736f6c63430008070033

Deployed ByteCode Sourcemap

43919:1870:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45004:212;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25176:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26735:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26258:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38411:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27625:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38079:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44310:212;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28035:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36705:245;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38601:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24870:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24600:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5686:94;;;:::i;:::-;;5035:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25345:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27028:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28291:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25520:334;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44534:176;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45312:468;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5935:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45004:212;45143:4;45172:36;45196:11;45172:23;:36::i;:::-;45165:43;;45004:212;;;:::o;25176:100::-;25230:13;25263:5;25256:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25176:100;:::o;26735:221::-;26811:7;26839:16;26847:7;26839;:16::i;:::-;26831:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26924:15;:24;26940:7;26924:24;;;;;;;;;;;;;;;;;;;;;26917:31;;26735:221;;;:::o;26258:411::-;26339:13;26355:23;26370:7;26355:14;:23::i;:::-;26339:39;;26403:5;26397:11;;:2;:11;;;;26389:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;26497:5;26481:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;26506:37;26523:5;26530:12;:10;:12::i;:::-;26506:16;:37::i;:::-;26481:62;26459:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;26640:21;26649:2;26653:7;26640:8;:21::i;:::-;26328:341;26258:411;;:::o;38411:113::-;38472:7;38499:10;:17;;;;38492:24;;38411:113;:::o;27625:339::-;27820:41;27839:12;:10;:12::i;:::-;27853:7;27820:18;:41::i;:::-;27812:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;27928:28;27938:4;27944:2;27948:7;27928:9;:28::i;:::-;27625:339;;;:::o;38079:256::-;38176:7;38212:23;38229:5;38212:16;:23::i;:::-;38204:5;:31;38196:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;38301:12;:19;38314:5;38301:19;;;;;;;;;;;;;;;:26;38321:5;38301:26;;;;;;;;;;;;38294:33;;38079:256;;;;:::o;44310:212::-;5266:12;:10;:12::i;:::-;5255:23;;:7;:5;:7::i;:::-;:23;;;5247:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44374:6:::1;44369:146;44386:6;44384:1;:8;44369:146;;;44413:48;44423:10;44435:25;:15;:23;:25::i;:::-;44413:9;:48::i;:::-;44476:27;:15;:25;:27::i;:::-;44394:3;;;;;:::i;:::-;;;;44369:146;;;;44310:212:::0;:::o;28035:185::-;28173:39;28190:4;28196:2;28200:7;28173:39;;;;;;;;;;;;:16;:39::i;:::-;28035:185;;;:::o;36705:245::-;36823:41;36842:12;:10;:12::i;:::-;36856:7;36823:18;:41::i;:::-;36815:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;36928:14;36934:7;36928:5;:14::i;:::-;36705:245;:::o;38601:233::-;38676:7;38712:30;:28;:30::i;:::-;38704:5;:38;38696:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;38809:10;38820:5;38809:17;;;;;;;;:::i;:::-;;;;;;;;;;38802:24;;38601:233;;;:::o;24870:239::-;24942:7;24962:13;24978:7;:16;24986:7;24978:16;;;;;;;;;;;;;;;;;;;;;24962:32;;25030:1;25013:19;;:5;:19;;;;25005:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25096:5;25089:12;;;24870:239;;;:::o;24600:208::-;24672:7;24717:1;24700:19;;:5;:19;;;;24692:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;24784:9;:16;24794:5;24784:16;;;;;;;;;;;;;;;;24777:23;;24600:208;;;:::o;5686:94::-;5266:12;:10;:12::i;:::-;5255:23;;:7;:5;:7::i;:::-;:23;;;5247:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5751:21:::1;5769:1;5751:9;:21::i;:::-;5686:94::o:0;5035:87::-;5081:7;5108:6;;;;;;;;;;;5101:13;;5035:87;:::o;25345:104::-;25401:13;25434:7;25427:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25345:104;:::o;27028:295::-;27143:12;:10;:12::i;:::-;27131:24;;:8;:24;;;;27123:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;27243:8;27198:18;:32;27217:12;:10;:12::i;:::-;27198:32;;;;;;;;;;;;;;;:42;27231:8;27198:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;27296:8;27267:48;;27282:12;:10;:12::i;:::-;27267:48;;;27306:8;27267:48;;;;;;:::i;:::-;;;;;;;;27028:295;;:::o;28291:328::-;28466:41;28485:12;:10;:12::i;:::-;28499:7;28466:18;:41::i;:::-;28458:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28572:39;28586:4;28592:2;28596:7;28605:5;28572:13;:39::i;:::-;28291:328;;;;:::o;25520:334::-;25593:13;25627:16;25635:7;25627;:16::i;:::-;25619:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;25708:21;25732:10;:8;:10::i;:::-;25708:34;;25784:1;25766:7;25760:21;:25;:86;;;;;;;;;;;;;;;;;25812:7;25821:18;:7;:16;:18::i;:::-;25795:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;25760:86;25753:93;;;25520:334;;;:::o;44534:176::-;5266:12;:10;:12::i;:::-;5255:23;;:7;:5;:7::i;:::-;:23;;;5247:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44611:6:::1;44606:97;44623:2;:9;44621:1;:11;44606:97;;;44653:38;44670:10;44682:2;44685:1;44682:5;;;;;;;;:::i;:::-;;;;;;;;44689:1;44653:16;:38::i;:::-;44634:3;;;;;:::i;:::-;;;;44606:97;;;;44534:176:::0;:::o;45312:468::-;45428:15;45555:42;45534:64;;:9;:64;;;45530:108;;;45622:4;45615:11;;;;45530:108;45730:42;45754:6;45762:9;45730:23;:42::i;:::-;45723:49;;45312:468;;;;;:::o;5935:192::-;5266:12;:10;:12::i;:::-;5255:23;;:7;:5;:7::i;:::-;:23;;;5247:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6044:1:::1;6024:22;;:8;:22;;;;6016:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;6100:19;6110:8;6100:9;:19::i;:::-;5935:192:::0;:::o;37771:224::-;37873:4;37912:35;37897:50;;;:11;:50;;;;:90;;;;37951:36;37975:11;37951:23;:36::i;:::-;37897:90;37890:97;;37771:224;;;:::o;30129:127::-;30194:4;30246:1;30218:30;;:7;:16;30226:7;30218:16;;;;;;;;;;;;;;;;;;;;;:30;;;;30211:37;;30129:127;;;:::o;3911:98::-;3964:7;3991:10;3984:17;;3911:98;:::o;34119:174::-;34221:2;34194:15;:24;34210:7;34194:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;34277:7;34273:2;34239:46;;34248:23;34263:7;34248:14;:23::i;:::-;34239:46;;;;;;;;;;;;34119:174;;:::o;30423:348::-;30516:4;30541:16;30549:7;30541;:16::i;:::-;30533:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30617:13;30633:23;30648:7;30633:14;:23::i;:::-;30617:39;;30686:5;30675:16;;:7;:16;;;:51;;;;30719:7;30695:31;;:20;30707:7;30695:11;:20::i;:::-;:31;;;30675:51;:87;;;;30730:32;30747:5;30754:7;30730:16;:32::i;:::-;30675:87;30667:96;;;30423:348;;;;:::o;33423:578::-;33582:4;33555:31;;:23;33570:7;33555:14;:23::i;:::-;:31;;;33547:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;33665:1;33651:16;;:2;:16;;;;33643:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;33721:39;33742:4;33748:2;33752:7;33721:20;:39::i;:::-;33825:29;33842:1;33846:7;33825:8;:29::i;:::-;33886:1;33867:9;:15;33877:4;33867:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;33915:1;33898:9;:13;33908:2;33898:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33946:2;33927:7;:16;33935:7;33927:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33985:7;33981:2;33966:27;;33975:4;33966:27;;;;;;;;;;;;33423:578;;;:::o;793:114::-;858:7;885;:14;;;878:21;;793:114;;;:::o;31113:110::-;31189:26;31199:2;31203:7;31189:26;;;;;;;;;;;;:9;:26::i;:::-;31113:110;;:::o;915:127::-;1022:1;1004:7;:14;;;:19;;;;;;;;;;;915:127;:::o;32726:360::-;32786:13;32802:23;32817:7;32802:14;:23::i;:::-;32786:39;;32838:48;32859:5;32874:1;32878:7;32838:20;:48::i;:::-;32927:29;32944:1;32948:7;32927:8;:29::i;:::-;32989:1;32969:9;:16;32979:5;32969:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;33008:7;:16;33016:7;33008:16;;;;;;;;;;;;33001:23;;;;;;;;;;;33070:7;33066:1;33042:36;;33051:5;33042:36;;;;;;;;;;;;32775:311;32726:360;:::o;6135:173::-;6191:16;6210:6;;;;;;;;;;;6191:25;;6236:8;6227:6;;:17;;;;;;;;;;;;;;;;;;6291:8;6260:40;;6281:8;6260:40;;;;;;;;;;;;6180:128;6135:173;:::o;29501:315::-;29658:28;29668:4;29674:2;29678:7;29658:9;:28::i;:::-;29705:48;29728:4;29734:2;29738:7;29747:5;29705:22;:48::i;:::-;29697:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;29501:315;;;;:::o;44168:134::-;44220:13;44246:48;;;;;;;;;;;;;;;;;;;44168:134;:::o;1612:723::-;1668:13;1898:1;1889:5;:10;1885:53;;;1916:10;;;;;;;;;;;;;;;;;;;;;1885:53;1948:12;1963:5;1948:20;;1979:14;2004:78;2019:1;2011:4;:9;2004:78;;2037:8;;;;;:::i;:::-;;;;2068:2;2060:10;;;;;:::i;:::-;;;2004:78;;;2092:19;2124:6;2114:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2092:39;;2142:154;2158:1;2149:5;:10;2142:154;;2186:1;2176:11;;;;;:::i;:::-;;;2253:2;2245:5;:10;;;;:::i;:::-;2232:2;:24;;;;:::i;:::-;2219:39;;2202:6;2209;2202:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;2282:2;2273:11;;;;;:::i;:::-;;;2142:154;;;2320:6;2306:21;;;;;1612:723;;;;:::o;27394:164::-;27491:4;27515:18;:25;27534:5;27515:25;;;;;;;;;;;;;;;:35;27541:8;27515:35;;;;;;;;;;;;;;;;;;;;;;;;;27508:42;;27394:164;;;;:::o;24231:305::-;24333:4;24385:25;24370:40;;;:11;:40;;;;:105;;;;24442:33;24427:48;;;:11;:48;;;;24370:105;:158;;;;24492:36;24516:11;24492:23;:36::i;:::-;24370:158;24350:178;;24231:305;;;:::o;44792:204::-;44943:45;44970:4;44976:2;44980:7;44943:26;:45::i;:::-;44792:204;;;:::o;31450:321::-;31580:18;31586:2;31590:7;31580:5;:18::i;:::-;31631:54;31662:1;31666:2;31670:7;31679:5;31631:22;:54::i;:::-;31609:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;31450:321;;;:::o;34858:799::-;35013:4;35034:15;:2;:13;;;:15::i;:::-;35030:620;;;35086:2;35070:36;;;35107:12;:10;:12::i;:::-;35121:4;35127:7;35136:5;35070:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;35066:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35329:1;35312:6;:13;:18;35308:272;;;35355:60;;;;;;;;;;:::i;:::-;;;;;;;;35308:272;35530:6;35524:13;35515:6;35511:2;35507:15;35500:38;35066:529;35203:41;;;35193:51;;;:6;:51;;;;35186:58;;;;;35030:620;35634:4;35627:11;;34858:799;;;;;;;:::o;16637:157::-;16722:4;16761:25;16746:40;;;:11;:40;;;;16739:47;;16637:157;;;:::o;39447:589::-;39591:45;39618:4;39624:2;39628:7;39591:26;:45::i;:::-;39669:1;39653:18;;:4;:18;;;39649:187;;;39688:40;39720:7;39688:31;:40::i;:::-;39649:187;;;39758:2;39750:10;;:4;:10;;;39746:90;;39777:47;39810:4;39816:7;39777:32;:47::i;:::-;39746:90;39649:187;39864:1;39850:16;;:2;:16;;;39846:183;;;39883:45;39920:7;39883:36;:45::i;:::-;39846:183;;;39956:4;39950:10;;:2;:10;;;39946:83;;39977:40;40005:2;40009:7;39977:27;:40::i;:::-;39946:83;39846:183;39447:589;;;:::o;32107:390::-;32201:1;32187:16;;:2;:16;;;;32179:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;32260:16;32268:7;32260;:16::i;:::-;32259:17;32251:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;32322:45;32351:1;32355:2;32359:7;32322:20;:45::i;:::-;32397:1;32380:9;:13;32390:2;32380:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32428:2;32409:7;:16;32417:7;32409:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32481:7;32477:2;32456:33;;32473:1;32456:33;;;;;;;;;;;;32107:390;;:::o;6996:387::-;7056:4;7264:12;7331:7;7319:20;7311:28;;7374:1;7367:4;:8;7360:15;;;6996:387;;;:::o;36229:126::-;;;;:::o;40759:164::-;40863:10;:17;;;;40836:15;:24;40852:7;40836:24;;;;;;;;;;;:44;;;;40891:10;40907:7;40891:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40759:164;:::o;41550:988::-;41816:22;41866:1;41841:22;41858:4;41841:16;:22::i;:::-;:26;;;;:::i;:::-;41816:51;;41878:18;41899:17;:26;41917:7;41899:26;;;;;;;;;;;;41878:47;;42046:14;42032:10;:28;42028:328;;42077:19;42099:12;:18;42112:4;42099:18;;;;;;;;;;;;;;;:34;42118:14;42099:34;;;;;;;;;;;;42077:56;;42183:11;42150:12;:18;42163:4;42150:18;;;;;;;;;;;;;;;:30;42169:10;42150:30;;;;;;;;;;;:44;;;;42300:10;42267:17;:30;42285:11;42267:30;;;;;;;;;;;:43;;;;42062:294;42028:328;42452:17;:26;42470:7;42452:26;;;;;;;;;;;42445:33;;;42496:12;:18;42509:4;42496:18;;;;;;;;;;;;;;;:34;42515:14;42496:34;;;;;;;;;;;42489:41;;;41631:907;;41550:988;;:::o;42833:1079::-;43086:22;43131:1;43111:10;:17;;;;:21;;;;:::i;:::-;43086:46;;43143:18;43164:15;:24;43180:7;43164:24;;;;;;;;;;;;43143:45;;43515:19;43537:10;43548:14;43537:26;;;;;;;;:::i;:::-;;;;;;;;;;43515:48;;43601:11;43576:10;43587;43576:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;43712:10;43681:15;:28;43697:11;43681:28;;;;;;;;;;;:41;;;;43853:15;:24;43869:7;43853:24;;;;;;;;;;;43846:31;;;43888:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;42904:1008;;;42833:1079;:::o;40337:221::-;40422:14;40439:20;40456:2;40439:16;:20::i;:::-;40422:37;;40497:7;40470:12;:16;40483:2;40470:16;;;;;;;;;;;;;;;:24;40487:6;40470:24;;;;;;;;;;;:34;;;;40544:6;40515:17;:26;40533:7;40515:26;;;;;;;;;;;:35;;;;40411:147;40337:221;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:139::-;1214:5;1252:6;1239:20;1230:29;;1268:33;1295:5;1268:33;:::i;:::-;1168:139;;;;:::o;1330:370::-;1401:5;1450:3;1443:4;1435:6;1431:17;1427:27;1417:122;;1458:79;;:::i;:::-;1417:122;1575:6;1562:20;1600:94;1690:3;1682:6;1675:4;1667:6;1663:17;1600:94;:::i;:::-;1591:103;;1407:293;1330:370;;;;:::o;1706:133::-;1749:5;1787:6;1774:20;1765:29;;1803:30;1827:5;1803:30;:::i;:::-;1706:133;;;;:::o;1845:137::-;1890:5;1928:6;1915:20;1906:29;;1944:32;1970:5;1944:32;:::i;:::-;1845:137;;;;:::o;1988:141::-;2044:5;2075:6;2069:13;2060:22;;2091:32;2117:5;2091:32;:::i;:::-;1988:141;;;;:::o;2148:338::-;2203:5;2252:3;2245:4;2237:6;2233:17;2229:27;2219:122;;2260:79;;:::i;:::-;2219:122;2377:6;2364:20;2402:78;2476:3;2468:6;2461:4;2453:6;2449:17;2402:78;:::i;:::-;2393:87;;2209:277;2148:338;;;;:::o;2492:139::-;2538:5;2576:6;2563:20;2554:29;;2592:33;2619:5;2592:33;:::i;:::-;2492:139;;;;:::o;2637:329::-;2696:6;2745:2;2733:9;2724:7;2720:23;2716:32;2713:119;;;2751:79;;:::i;:::-;2713:119;2871:1;2896:53;2941:7;2932:6;2921:9;2917:22;2896:53;:::i;:::-;2886:63;;2842:117;2637:329;;;;:::o;2972:474::-;3040:6;3048;3097:2;3085:9;3076:7;3072:23;3068:32;3065:119;;;3103:79;;:::i;:::-;3065:119;3223:1;3248:53;3293:7;3284:6;3273:9;3269:22;3248:53;:::i;:::-;3238:63;;3194:117;3350:2;3376:53;3421:7;3412:6;3401:9;3397:22;3376:53;:::i;:::-;3366:63;;3321:118;2972:474;;;;;:::o;3452:619::-;3529:6;3537;3545;3594:2;3582:9;3573:7;3569:23;3565:32;3562:119;;;3600:79;;:::i;:::-;3562:119;3720:1;3745:53;3790:7;3781:6;3770:9;3766:22;3745:53;:::i;:::-;3735:63;;3691:117;3847:2;3873:53;3918:7;3909:6;3898:9;3894:22;3873:53;:::i;:::-;3863:63;;3818:118;3975:2;4001:53;4046:7;4037:6;4026:9;4022:22;4001:53;:::i;:::-;3991:63;;3946:118;3452:619;;;;;:::o;4077:943::-;4172:6;4180;4188;4196;4245:3;4233:9;4224:7;4220:23;4216:33;4213:120;;;4252:79;;:::i;:::-;4213:120;4372:1;4397:53;4442:7;4433:6;4422:9;4418:22;4397:53;:::i;:::-;4387:63;;4343:117;4499:2;4525:53;4570:7;4561:6;4550:9;4546:22;4525:53;:::i;:::-;4515:63;;4470:118;4627:2;4653:53;4698:7;4689:6;4678:9;4674:22;4653:53;:::i;:::-;4643:63;;4598:118;4783:2;4772:9;4768:18;4755:32;4814:18;4806:6;4803:30;4800:117;;;4836:79;;:::i;:::-;4800:117;4941:62;4995:7;4986:6;4975:9;4971:22;4941:62;:::i;:::-;4931:72;;4726:287;4077:943;;;;;;;:::o;5026:468::-;5091:6;5099;5148:2;5136:9;5127:7;5123:23;5119:32;5116:119;;;5154:79;;:::i;:::-;5116:119;5274:1;5299:53;5344:7;5335:6;5324:9;5320:22;5299:53;:::i;:::-;5289:63;;5245:117;5401:2;5427:50;5469:7;5460:6;5449:9;5445:22;5427:50;:::i;:::-;5417:60;;5372:115;5026:468;;;;;:::o;5500:474::-;5568:6;5576;5625:2;5613:9;5604:7;5600:23;5596:32;5593:119;;;5631:79;;:::i;:::-;5593:119;5751:1;5776:53;5821:7;5812:6;5801:9;5797:22;5776:53;:::i;:::-;5766:63;;5722:117;5878:2;5904:53;5949:7;5940:6;5929:9;5925:22;5904:53;:::i;:::-;5894:63;;5849:118;5500:474;;;;;:::o;5980:539::-;6064:6;6113:2;6101:9;6092:7;6088:23;6084:32;6081:119;;;6119:79;;:::i;:::-;6081:119;6267:1;6256:9;6252:17;6239:31;6297:18;6289:6;6286:30;6283:117;;;6319:79;;:::i;:::-;6283:117;6424:78;6494:7;6485:6;6474:9;6470:22;6424:78;:::i;:::-;6414:88;;6210:302;5980:539;;;;:::o;6525:327::-;6583:6;6632:2;6620:9;6611:7;6607:23;6603:32;6600:119;;;6638:79;;:::i;:::-;6600:119;6758:1;6783:52;6827:7;6818:6;6807:9;6803:22;6783:52;:::i;:::-;6773:62;;6729:116;6525:327;;;;:::o;6858:349::-;6927:6;6976:2;6964:9;6955:7;6951:23;6947:32;6944:119;;;6982:79;;:::i;:::-;6944:119;7102:1;7127:63;7182:7;7173:6;7162:9;7158:22;7127:63;:::i;:::-;7117:73;;7073:127;6858:349;;;;:::o;7213:329::-;7272:6;7321:2;7309:9;7300:7;7296:23;7292:32;7289:119;;;7327:79;;:::i;:::-;7289:119;7447:1;7472:53;7517:7;7508:6;7497:9;7493:22;7472:53;:::i;:::-;7462:63;;7418:117;7213:329;;;;:::o;7548:118::-;7635:24;7653:5;7635:24;:::i;:::-;7630:3;7623:37;7548:118;;:::o;7672:109::-;7753:21;7768:5;7753:21;:::i;:::-;7748:3;7741:34;7672:109;;:::o;7787:360::-;7873:3;7901:38;7933:5;7901:38;:::i;:::-;7955:70;8018:6;8013:3;7955:70;:::i;:::-;7948:77;;8034:52;8079:6;8074:3;8067:4;8060:5;8056:16;8034:52;:::i;:::-;8111:29;8133:6;8111:29;:::i;:::-;8106:3;8102:39;8095:46;;7877:270;7787:360;;;;:::o;8153:364::-;8241:3;8269:39;8302:5;8269:39;:::i;:::-;8324:71;8388:6;8383:3;8324:71;:::i;:::-;8317:78;;8404:52;8449:6;8444:3;8437:4;8430:5;8426:16;8404:52;:::i;:::-;8481:29;8503:6;8481:29;:::i;:::-;8476:3;8472:39;8465:46;;8245:272;8153:364;;;;:::o;8523:377::-;8629:3;8657:39;8690:5;8657:39;:::i;:::-;8712:89;8794:6;8789:3;8712:89;:::i;:::-;8705:96;;8810:52;8855:6;8850:3;8843:4;8836:5;8832:16;8810:52;:::i;:::-;8887:6;8882:3;8878:16;8871:23;;8633:267;8523:377;;;;:::o;8906:366::-;9048:3;9069:67;9133:2;9128:3;9069:67;:::i;:::-;9062:74;;9145:93;9234:3;9145:93;:::i;:::-;9263:2;9258:3;9254:12;9247:19;;8906:366;;;:::o;9278:::-;9420:3;9441:67;9505:2;9500:3;9441:67;:::i;:::-;9434:74;;9517:93;9606:3;9517:93;:::i;:::-;9635:2;9630:3;9626:12;9619:19;;9278:366;;;:::o;9650:::-;9792:3;9813:67;9877:2;9872:3;9813:67;:::i;:::-;9806:74;;9889:93;9978:3;9889:93;:::i;:::-;10007:2;10002:3;9998:12;9991:19;;9650:366;;;:::o;10022:::-;10164:3;10185:67;10249:2;10244:3;10185:67;:::i;:::-;10178:74;;10261:93;10350:3;10261:93;:::i;:::-;10379:2;10374:3;10370:12;10363:19;;10022:366;;;:::o;10394:::-;10536:3;10557:67;10621:2;10616:3;10557:67;:::i;:::-;10550:74;;10633:93;10722:3;10633:93;:::i;:::-;10751:2;10746:3;10742:12;10735:19;;10394:366;;;:::o;10766:::-;10908:3;10929:67;10993:2;10988:3;10929:67;:::i;:::-;10922:74;;11005:93;11094:3;11005:93;:::i;:::-;11123:2;11118:3;11114:12;11107:19;;10766:366;;;:::o;11138:::-;11280:3;11301:67;11365:2;11360:3;11301:67;:::i;:::-;11294:74;;11377:93;11466:3;11377:93;:::i;:::-;11495:2;11490:3;11486:12;11479:19;;11138:366;;;:::o;11510:::-;11652:3;11673:67;11737:2;11732:3;11673:67;:::i;:::-;11666:74;;11749:93;11838:3;11749:93;:::i;:::-;11867:2;11862:3;11858:12;11851:19;;11510:366;;;:::o;11882:::-;12024:3;12045:67;12109:2;12104:3;12045:67;:::i;:::-;12038:74;;12121:93;12210:3;12121:93;:::i;:::-;12239:2;12234:3;12230:12;12223:19;;11882:366;;;:::o;12254:::-;12396:3;12417:67;12481:2;12476:3;12417:67;:::i;:::-;12410:74;;12493:93;12582:3;12493:93;:::i;:::-;12611:2;12606:3;12602:12;12595:19;;12254:366;;;:::o;12626:::-;12768:3;12789:67;12853:2;12848:3;12789:67;:::i;:::-;12782:74;;12865:93;12954:3;12865:93;:::i;:::-;12983:2;12978:3;12974:12;12967:19;;12626:366;;;:::o;12998:::-;13140:3;13161:67;13225:2;13220:3;13161:67;:::i;:::-;13154:74;;13237:93;13326:3;13237:93;:::i;:::-;13355:2;13350:3;13346:12;13339:19;;12998:366;;;:::o;13370:::-;13512:3;13533:67;13597:2;13592:3;13533:67;:::i;:::-;13526:74;;13609:93;13698:3;13609:93;:::i;:::-;13727:2;13722:3;13718:12;13711:19;;13370:366;;;:::o;13742:::-;13884:3;13905:67;13969:2;13964:3;13905:67;:::i;:::-;13898:74;;13981:93;14070:3;13981:93;:::i;:::-;14099:2;14094:3;14090:12;14083:19;;13742:366;;;:::o;14114:::-;14256:3;14277:67;14341:2;14336:3;14277:67;:::i;:::-;14270:74;;14353:93;14442:3;14353:93;:::i;:::-;14471:2;14466:3;14462:12;14455:19;;14114:366;;;:::o;14486:::-;14628:3;14649:67;14713:2;14708:3;14649:67;:::i;:::-;14642:74;;14725:93;14814:3;14725:93;:::i;:::-;14843:2;14838:3;14834:12;14827:19;;14486:366;;;:::o;14858:::-;15000:3;15021:67;15085:2;15080:3;15021:67;:::i;:::-;15014:74;;15097:93;15186:3;15097:93;:::i;:::-;15215:2;15210:3;15206:12;15199:19;;14858:366;;;:::o;15230:::-;15372:3;15393:67;15457:2;15452:3;15393:67;:::i;:::-;15386:74;;15469:93;15558:3;15469:93;:::i;:::-;15587:2;15582:3;15578:12;15571:19;;15230:366;;;:::o;15602:::-;15744:3;15765:67;15829:2;15824:3;15765:67;:::i;:::-;15758:74;;15841:93;15930:3;15841:93;:::i;:::-;15959:2;15954:3;15950:12;15943:19;;15602:366;;;:::o;15974:118::-;16061:24;16079:5;16061:24;:::i;:::-;16056:3;16049:37;15974:118;;:::o;16098:435::-;16278:3;16300:95;16391:3;16382:6;16300:95;:::i;:::-;16293:102;;16412:95;16503:3;16494:6;16412:95;:::i;:::-;16405:102;;16524:3;16517:10;;16098:435;;;;;:::o;16539:222::-;16632:4;16670:2;16659:9;16655:18;16647:26;;16683:71;16751:1;16740:9;16736:17;16727:6;16683:71;:::i;:::-;16539:222;;;;:::o;16767:640::-;16962:4;17000:3;16989:9;16985:19;16977:27;;17014:71;17082:1;17071:9;17067:17;17058:6;17014:71;:::i;:::-;17095:72;17163:2;17152:9;17148:18;17139:6;17095:72;:::i;:::-;17177;17245:2;17234:9;17230:18;17221:6;17177:72;:::i;:::-;17296:9;17290:4;17286:20;17281:2;17270:9;17266:18;17259:48;17324:76;17395:4;17386:6;17324:76;:::i;:::-;17316:84;;16767:640;;;;;;;:::o;17413:210::-;17500:4;17538:2;17527:9;17523:18;17515:26;;17551:65;17613:1;17602:9;17598:17;17589:6;17551:65;:::i;:::-;17413:210;;;;:::o;17629:313::-;17742:4;17780:2;17769:9;17765:18;17757:26;;17829:9;17823:4;17819:20;17815:1;17804:9;17800:17;17793:47;17857:78;17930:4;17921:6;17857:78;:::i;:::-;17849:86;;17629:313;;;;:::o;17948:419::-;18114:4;18152:2;18141:9;18137:18;18129:26;;18201:9;18195:4;18191:20;18187:1;18176:9;18172:17;18165:47;18229:131;18355:4;18229:131;:::i;:::-;18221:139;;17948:419;;;:::o;18373:::-;18539:4;18577:2;18566:9;18562:18;18554:26;;18626:9;18620:4;18616:20;18612:1;18601:9;18597:17;18590:47;18654:131;18780:4;18654:131;:::i;:::-;18646:139;;18373:419;;;:::o;18798:::-;18964:4;19002:2;18991:9;18987:18;18979:26;;19051:9;19045:4;19041:20;19037:1;19026:9;19022:17;19015:47;19079:131;19205:4;19079:131;:::i;:::-;19071:139;;18798:419;;;:::o;19223:::-;19389:4;19427:2;19416:9;19412:18;19404:26;;19476:9;19470:4;19466:20;19462:1;19451:9;19447:17;19440:47;19504:131;19630:4;19504:131;:::i;:::-;19496:139;;19223:419;;;:::o;19648:::-;19814:4;19852:2;19841:9;19837:18;19829:26;;19901:9;19895:4;19891:20;19887:1;19876:9;19872:17;19865:47;19929:131;20055:4;19929:131;:::i;:::-;19921:139;;19648:419;;;:::o;20073:::-;20239:4;20277:2;20266:9;20262:18;20254:26;;20326:9;20320:4;20316:20;20312:1;20301:9;20297:17;20290:47;20354:131;20480:4;20354:131;:::i;:::-;20346:139;;20073:419;;;:::o;20498:::-;20664:4;20702:2;20691:9;20687:18;20679:26;;20751:9;20745:4;20741:20;20737:1;20726:9;20722:17;20715:47;20779:131;20905:4;20779:131;:::i;:::-;20771:139;;20498:419;;;:::o;20923:::-;21089:4;21127:2;21116:9;21112:18;21104:26;;21176:9;21170:4;21166:20;21162:1;21151:9;21147:17;21140:47;21204:131;21330:4;21204:131;:::i;:::-;21196:139;;20923:419;;;:::o;21348:::-;21514:4;21552:2;21541:9;21537:18;21529:26;;21601:9;21595:4;21591:20;21587:1;21576:9;21572:17;21565:47;21629:131;21755:4;21629:131;:::i;:::-;21621:139;;21348:419;;;:::o;21773:::-;21939:4;21977:2;21966:9;21962:18;21954:26;;22026:9;22020:4;22016:20;22012:1;22001:9;21997:17;21990:47;22054:131;22180:4;22054:131;:::i;:::-;22046:139;;21773:419;;;:::o;22198:::-;22364:4;22402:2;22391:9;22387:18;22379:26;;22451:9;22445:4;22441:20;22437:1;22426:9;22422:17;22415:47;22479:131;22605:4;22479:131;:::i;:::-;22471:139;;22198:419;;;:::o;22623:::-;22789:4;22827:2;22816:9;22812:18;22804:26;;22876:9;22870:4;22866:20;22862:1;22851:9;22847:17;22840:47;22904:131;23030:4;22904:131;:::i;:::-;22896:139;;22623:419;;;:::o;23048:::-;23214:4;23252:2;23241:9;23237:18;23229:26;;23301:9;23295:4;23291:20;23287:1;23276:9;23272:17;23265:47;23329:131;23455:4;23329:131;:::i;:::-;23321:139;;23048:419;;;:::o;23473:::-;23639:4;23677:2;23666:9;23662:18;23654:26;;23726:9;23720:4;23716:20;23712:1;23701:9;23697:17;23690:47;23754:131;23880:4;23754:131;:::i;:::-;23746:139;;23473:419;;;:::o;23898:::-;24064:4;24102:2;24091:9;24087:18;24079:26;;24151:9;24145:4;24141:20;24137:1;24126:9;24122:17;24115:47;24179:131;24305:4;24179:131;:::i;:::-;24171:139;;23898:419;;;:::o;24323:::-;24489:4;24527:2;24516:9;24512:18;24504:26;;24576:9;24570:4;24566:20;24562:1;24551:9;24547:17;24540:47;24604:131;24730:4;24604:131;:::i;:::-;24596:139;;24323:419;;;:::o;24748:::-;24914:4;24952:2;24941:9;24937:18;24929:26;;25001:9;24995:4;24991:20;24987:1;24976:9;24972:17;24965:47;25029:131;25155:4;25029:131;:::i;:::-;25021:139;;24748:419;;;:::o;25173:::-;25339:4;25377:2;25366:9;25362:18;25354:26;;25426:9;25420:4;25416:20;25412:1;25401:9;25397:17;25390:47;25454:131;25580:4;25454:131;:::i;:::-;25446:139;;25173:419;;;:::o;25598:::-;25764:4;25802:2;25791:9;25787:18;25779:26;;25851:9;25845:4;25841:20;25837:1;25826:9;25822:17;25815:47;25879:131;26005:4;25879:131;:::i;:::-;25871:139;;25598:419;;;:::o;26023:222::-;26116:4;26154:2;26143:9;26139:18;26131:26;;26167:71;26235:1;26224:9;26220:17;26211:6;26167:71;:::i;:::-;26023:222;;;;:::o;26251:129::-;26285:6;26312:20;;:::i;:::-;26302:30;;26341:33;26369:4;26361:6;26341:33;:::i;:::-;26251:129;;;:::o;26386:75::-;26419:6;26452:2;26446:9;26436:19;;26386:75;:::o;26467:311::-;26544:4;26634:18;26626:6;26623:30;26620:56;;;26656:18;;:::i;:::-;26620:56;26706:4;26698:6;26694:17;26686:25;;26766:4;26760;26756:15;26748:23;;26467:311;;;:::o;26784:307::-;26845:4;26935:18;26927:6;26924:30;26921:56;;;26957:18;;:::i;:::-;26921:56;26995:29;27017:6;26995:29;:::i;:::-;26987:37;;27079:4;27073;27069:15;27061:23;;26784:307;;;:::o;27097:98::-;27148:6;27182:5;27176:12;27166:22;;27097:98;;;:::o;27201:99::-;27253:6;27287:5;27281:12;27271:22;;27201:99;;;:::o;27306:168::-;27389:11;27423:6;27418:3;27411:19;27463:4;27458:3;27454:14;27439:29;;27306:168;;;;:::o;27480:169::-;27564:11;27598:6;27593:3;27586:19;27638:4;27633:3;27629:14;27614:29;;27480:169;;;;:::o;27655:148::-;27757:11;27794:3;27779:18;;27655:148;;;;:::o;27809:305::-;27849:3;27868:20;27886:1;27868:20;:::i;:::-;27863:25;;27902:20;27920:1;27902:20;:::i;:::-;27897:25;;28056:1;27988:66;27984:74;27981:1;27978:81;27975:107;;;28062:18;;:::i;:::-;27975:107;28106:1;28103;28099:9;28092:16;;27809:305;;;;:::o;28120:185::-;28160:1;28177:20;28195:1;28177:20;:::i;:::-;28172:25;;28211:20;28229:1;28211:20;:::i;:::-;28206:25;;28250:1;28240:35;;28255:18;;:::i;:::-;28240:35;28297:1;28294;28290:9;28285:14;;28120:185;;;;:::o;28311:191::-;28351:4;28371:20;28389:1;28371:20;:::i;:::-;28366:25;;28405:20;28423:1;28405:20;:::i;:::-;28400:25;;28444:1;28441;28438:8;28435:34;;;28449:18;;:::i;:::-;28435:34;28494:1;28491;28487:9;28479:17;;28311:191;;;;:::o;28508:96::-;28545:7;28574:24;28592:5;28574:24;:::i;:::-;28563:35;;28508:96;;;:::o;28610:90::-;28644:7;28687:5;28680:13;28673:21;28662:32;;28610:90;;;:::o;28706:149::-;28742:7;28782:66;28775:5;28771:78;28760:89;;28706:149;;;:::o;28861:126::-;28898:7;28938:42;28931:5;28927:54;28916:65;;28861:126;;;:::o;28993:77::-;29030:7;29059:5;29048:16;;28993:77;;;:::o;29076:154::-;29160:6;29155:3;29150;29137:30;29222:1;29213:6;29208:3;29204:16;29197:27;29076:154;;;:::o;29236:307::-;29304:1;29314:113;29328:6;29325:1;29322:13;29314:113;;;29413:1;29408:3;29404:11;29398:18;29394:1;29389:3;29385:11;29378:39;29350:2;29347:1;29343:10;29338:15;;29314:113;;;29445:6;29442:1;29439:13;29436:101;;;29525:1;29516:6;29511:3;29507:16;29500:27;29436:101;29285:258;29236:307;;;:::o;29549:320::-;29593:6;29630:1;29624:4;29620:12;29610:22;;29677:1;29671:4;29667:12;29698:18;29688:81;;29754:4;29746:6;29742:17;29732:27;;29688:81;29816:2;29808:6;29805:14;29785:18;29782:38;29779:84;;;29835:18;;:::i;:::-;29779:84;29600:269;29549:320;;;:::o;29875:281::-;29958:27;29980:4;29958:27;:::i;:::-;29950:6;29946:40;30088:6;30076:10;30073:22;30052:18;30040:10;30037:34;30034:62;30031:88;;;30099:18;;:::i;:::-;30031:88;30139:10;30135:2;30128:22;29918:238;29875:281;;:::o;30162:233::-;30201:3;30224:24;30242:5;30224:24;:::i;:::-;30215:33;;30270:66;30263:5;30260:77;30257:103;;;30340:18;;:::i;:::-;30257:103;30387:1;30380:5;30376:13;30369:20;;30162:233;;;:::o;30401:176::-;30433:1;30450:20;30468:1;30450:20;:::i;:::-;30445:25;;30484:20;30502:1;30484:20;:::i;:::-;30479:25;;30523:1;30513:35;;30528:18;;:::i;:::-;30513:35;30569:1;30566;30562:9;30557:14;;30401:176;;;;:::o;30583:180::-;30631:77;30628:1;30621:88;30728:4;30725:1;30718:15;30752:4;30749:1;30742:15;30769:180;30817:77;30814:1;30807:88;30914:4;30911:1;30904:15;30938:4;30935:1;30928:15;30955:180;31003:77;31000:1;30993:88;31100:4;31097:1;31090:15;31124:4;31121:1;31114:15;31141:180;31189:77;31186:1;31179:88;31286:4;31283:1;31276:15;31310:4;31307:1;31300:15;31327:180;31375:77;31372:1;31365:88;31472:4;31469:1;31462:15;31496:4;31493:1;31486:15;31513:180;31561:77;31558:1;31551:88;31658:4;31655:1;31648:15;31682:4;31679:1;31672:15;31699:117;31808:1;31805;31798:12;31822:117;31931:1;31928;31921:12;31945:117;32054:1;32051;32044:12;32068:117;32177:1;32174;32167:12;32191:117;32300:1;32297;32290:12;32314:102;32355:6;32406:2;32402:7;32397:2;32390:5;32386:14;32382:28;32372:38;;32314:102;;;:::o;32422:230::-;32562:34;32558:1;32550:6;32546:14;32539:58;32631:13;32626:2;32618:6;32614:15;32607:38;32422:230;:::o;32658:237::-;32798:34;32794:1;32786:6;32782:14;32775:58;32867:20;32862:2;32854:6;32850:15;32843:45;32658:237;:::o;32901:225::-;33041:34;33037:1;33029:6;33025:14;33018:58;33110:8;33105:2;33097:6;33093:15;33086:33;32901:225;:::o;33132:178::-;33272:30;33268:1;33260:6;33256:14;33249:54;33132:178;:::o;33316:223::-;33456:34;33452:1;33444:6;33440:14;33433:58;33525:6;33520:2;33512:6;33508:15;33501:31;33316:223;:::o;33545:175::-;33685:27;33681:1;33673:6;33669:14;33662:51;33545:175;:::o;33726:231::-;33866:34;33862:1;33854:6;33850:14;33843:58;33935:14;33930:2;33922:6;33918:15;33911:39;33726:231;:::o;33963:243::-;34103:34;34099:1;34091:6;34087:14;34080:58;34172:26;34167:2;34159:6;34155:15;34148:51;33963:243;:::o;34212:229::-;34352:34;34348:1;34340:6;34336:14;34329:58;34421:12;34416:2;34408:6;34404:15;34397:37;34212:229;:::o;34447:228::-;34587:34;34583:1;34575:6;34571:14;34564:58;34656:11;34651:2;34643:6;34639:15;34632:36;34447:228;:::o;34681:182::-;34821:34;34817:1;34809:6;34805:14;34798:58;34681:182;:::o;34869:231::-;35009:34;35005:1;34997:6;34993:14;34986:58;35078:14;35073:2;35065:6;35061:15;35054:39;34869:231;:::o;35106:182::-;35246:34;35242:1;35234:6;35230:14;35223:58;35106:182;:::o;35294:228::-;35434:34;35430:1;35422:6;35418:14;35411:58;35503:11;35498:2;35490:6;35486:15;35479:36;35294:228;:::o;35528:234::-;35668:34;35664:1;35656:6;35652:14;35645:58;35737:17;35732:2;35724:6;35720:15;35713:42;35528:234;:::o;35768:220::-;35908:34;35904:1;35896:6;35892:14;35885:58;35977:3;35972:2;35964:6;35960:15;35953:28;35768:220;:::o;35994:236::-;36134:34;36130:1;36122:6;36118:14;36111:58;36203:19;36198:2;36190:6;36186:15;36179:44;35994:236;:::o;36236:231::-;36376:34;36372:1;36364:6;36360:14;36353:58;36445:14;36440:2;36432:6;36428:15;36421:39;36236:231;:::o;36473:235::-;36613:34;36609:1;36601:6;36597:14;36590:58;36682:18;36677:2;36669:6;36665:15;36658:43;36473:235;:::o;36714:122::-;36787:24;36805:5;36787:24;:::i;:::-;36780:5;36777:35;36767:63;;36826:1;36823;36816:12;36767:63;36714:122;:::o;36842:116::-;36912:21;36927:5;36912:21;:::i;:::-;36905:5;36902:32;36892:60;;36948:1;36945;36938:12;36892:60;36842:116;:::o;36964:120::-;37036:23;37053:5;37036:23;:::i;:::-;37029:5;37026:34;37016:62;;37074:1;37071;37064:12;37016:62;36964:120;:::o;37090:122::-;37163:24;37181:5;37163:24;:::i;:::-;37156:5;37153:35;37143:63;;37202:1;37199;37192:12;37143:63;37090:122;:::o

Swarm Source

ipfs://b82127fc3ef9d13f4f7fcb3811405e29649f5c95502c1d9a005ca1fd41cff937
Loading