Token Bot Squad Llama

 

Overview ERC-721

Total Supply:
820 BSLA

Holders:
407 addresses

Transfers:
-

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:
BotSquadLlama

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 8888 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-01-06
*/

// SPDX-License-Identifier: MIT

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

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

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

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

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

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

pragma solidity ^0.8.0;

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

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        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"
        );

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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

pragma solidity ^0.8.0;

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

    function _msgData() internal view virtual returns (bytes calldata) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

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

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant alphabet = "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] = alphabet[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

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

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Base URI for computing {tokenURI}. Empty by default, can be overriden
     * in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    function _baseExtension() internal view virtual returns (string memory) {
        return "";
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

        string memory base = _baseURI();
        string memory ext = _baseExtension();

        
        
       return string(abi.encodePacked(base, (tokenId).toString(), ext));

    }

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

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

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

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

pragma solidity ^0.8.0;

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

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

    bool private _paused;

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), 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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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"
        );
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

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

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented or decremented by one. 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;
        }
    }
}

pragma solidity ^0.8.7;

/**
 * @dev Interface for the NFT Royalty Standard
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Called with the sale price to determine how much royalty is owed and to whom.
     * @param tokenId - the NFT asset queried for royalty information
     * @param salePrice - the sale price of the NFT asset specified by `tokenId`
     * @return receiver - address of who should be sent the royalty payment
     * @return royaltyAmount - the royalty payment amount for `salePrice`
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}


library SafeMath {

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }


    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

pragma solidity ^0.8.0;

contract BotSquadLlama is
    ERC721,
    ERC721Enumerable,
    ERC721URIStorage,
    IERC2981,
    Pausable,
    Ownable,
    ERC721Burnable
{
    modifier onlyDevs {
         require(msg.sender == primaryDevAddress || msg.sender == secondaryDevAddress || msg.sender == tertiaryDevAddress || msg.sender == quaternaryDevAddress || msg.sender == quinaryDevAddress, "Dev Only: caller is not the developer");
        _;
    }
    
    event WithdrawFees(address indexed devAddress, uint256 amount);
    event WithdrawWrongTokens(address indexed devAddress,address tokenAddress, uint256 amount);
    event WithdrawWrongNfts(address indexed devAddress,address tokenAddress, uint256 tokenId);


    using Counters for Counters.Counter;
    using SafeMath for uint256;
    using Address for address;
    Counters.Counter private _tokenIdCounter;


    address  public royaltyAddress = 0x48407950C0A25544e9F50BF9EE57E90Ae7649B3e;
    address  public primaryDevAddress = 0x3acDC09A3C4Fc659BfDA7CFE8e6B04237d751e18;
    address  public secondaryDevAddress = 0x982D9A2E8D487C698B29E72701068A5Ac207e139;
    address  public tertiaryDevAddress = 0xf60B7751B3227B4a34477aB144358d44f21d6fc0;
    address  public quaternaryDevAddress = 0xA6e950aa70EBaAf99686A5d95aFe8aca8B5E353B;
    address  public quinaryDevAddress = 0x16D45386253E607aF5E6434Ce3f465f7843D58B6;
    string public baseURI;
    string public baseExtension = ".json";


    // VARIABLES 
    uint256 public maxSupply = 820;
    uint256 public maxPerTx = 5;
    uint256 public maxPerPerson = 5;
    uint256 public price = 20 ether;
    // FEES
    uint256 public primaryDevFee = 1000;
    uint256 public secondaryDevFee = 2000;
    uint256 public tertiaryDevFee = 1000;
    uint256 public quaternaryDevFee = 1000;
    uint256 public quinaryDevFee = 5000;
    uint256 public royalty = 600;
    // COLLECTED FESS
    mapping(address => uint256) public devFees;

    bool public whitelistedOnly = true;
    mapping(address => bool) public whiteListed;
  
    constructor() ERC721("Bot Squad Llama", "BSLA") {
        _pause();
    }

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

     
    function splitFees(uint256 sentAmount) internal {

        uint256 primaryDevFeeAmount = sentAmount.mul(primaryDevFee).div(10000);
        uint256 secondaryDevFeeAmount = sentAmount.mul(secondaryDevFee).div(10000);
        uint256 tertiaryDevFeeAmount = sentAmount.mul(tertiaryDevFee).div(10000);
        uint256 quaternaryDevFeeAmount = sentAmount.mul(quaternaryDevFee).div(10000);
        uint256 quinaryDevFeeAmount = sentAmount.mul(quinaryDevFee).div(10000);
       
        devFees[primaryDevAddress] += primaryDevFeeAmount;
        devFees[secondaryDevAddress] += secondaryDevFeeAmount;
        devFees[tertiaryDevAddress] += tertiaryDevFeeAmount;
        devFees[quaternaryDevAddress] += quaternaryDevFeeAmount;
        devFees[quinaryDevAddress] += quinaryDevFeeAmount;

    } 

    function mint(uint256 amount) public payable {
        uint256 supply = totalSupply();
        require(!paused(),"Sale must be active to mint");
        require(amount > 0 && amount <= maxPerTx,"Number of NFTs must be more than 0 and less than 5");
        require(balanceOf(msg.sender) + 1 <= maxPerPerson,"You cant mint more than limit");
        require(msg.value == price * amount, "Must send correct price");
        require(supply + amount - 1 < maxSupply, "Cannot mint more than total supply");
        if(whitelistedOnly){
            require(whiteListed[msg.sender] == true,"You are not whitelisted");
        }
        for (uint256 i = 0; i < amount; i++)
        internalMint(msg.sender);
        splitFees(msg.value);
    }

    

    function tokenURI(uint256 tokenId)
        public
        view
        override(ERC721, ERC721URIStorage)
        returns (string memory)
    {
        return super.tokenURI(tokenId);
    }

    function Owned(address _owner)
        external
        view
        returns (uint256[] memory)
    {
        uint256 tokenCount = balanceOf(_owner);
        if (tokenCount == 0) {
            return new uint256[](0);
        } else {
            uint256[] memory result = new uint256[](tokenCount);
            uint256 index;
            for (index = 0; index < tokenCount; index++) {
                result[index] = tokenOfOwnerByIndex(_owner, index);
            }
            return result;
        }
    }

    function tokenExists(uint256 _id) external view returns (bool) {
        return (_exists(_id));
    }

    function royaltyInfo(uint256, uint256 _salePrice)
        external
        view
        override
        returns (address receiver, uint256 royaltyAmount)
    {
        return (royaltyAddress, (_salePrice * royalty) / 10000);
    }

    
    
    //dev 

    function whiteList(address[] memory addressList) public onlyOwner {
        require(addressList.length > 0,"No List");
        for(uint256 i = 0;i<addressList.length;i++)
        whiteListed[addressList[i]] = true;
    }

    function removeWhiteList(address[] memory addressList) public onlyOwner {
        require(addressList.length > 0,"No List");
        for(uint256 i = 0;i<addressList.length;i++)
        whiteListed[addressList[i]] = false;
    }

    function unlock() public onlyOwner {
        whitelistedOnly = false;
    }

    function lock() public onlyOwner {
        whitelistedOnly = true;
    }
    
    function pause() public onlyOwner {
        _pause();
    }

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

    function setMaxPerPerson(uint256 newMaxBuy) public onlyOwner {
        maxPerPerson = newMaxBuy;
    }

    function setMaxPerTx(uint256 newMaxBuy) public onlyOwner {
        maxPerTx = newMaxBuy;
    }

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

    function setPrice(uint256 newPrice) public onlyOwner {
        price = newPrice;
    }
    
    
    function setURI(uint256 tokenId, string memory uri) external onlyOwner {
        _setTokenURI(tokenId, uri);
    }
    
 
    
    function setRoyalty(uint16 _royalty) external onlyOwner {
        require(_royalty >= 0, "Royalty must be greater than or equal to 0%");
        require(_royalty <= 750, "Royalty must be greater than or equal to 7.5%" );
        royalty = _royalty;
    }
    
    function setRoyaltyAddress(address _royaltyAddress) external onlyOwner {
        royaltyAddress = _royaltyAddress;
    }
    
    
    //Overrides
    
     function internalMint(address to) internal {
        _safeMint(to, _tokenIdCounter.current());
        _tokenIdCounter.increment();
    }

    function safeMint(address to) public onlyOwner {
        internalMint(to);
    }
    
    
    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721, ERC721Enumerable, IERC165)
        returns (bool)
    {
        return
            interfaceId == type(IERC2981).interfaceId ||
            super.supportsInterface(interfaceId);
    }
    
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal override(ERC721, ERC721Enumerable) whenNotPaused {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    

    function _burn(uint256 tokenId)
        internal
        override(ERC721, ERC721URIStorage)
    {
        super._burn(tokenId);
    }

 /// @dev withdraw fees
    function withdraw() public onlyDevs {
        uint256 amount = devFees[msg.sender];
        require(amount > 0,"No Fees:(");
        payable(msg.sender).transfer(amount);
        devFees[msg.sender] = 0;
        emit WithdrawFees(msg.sender,amount);
    }
    
    /// @dev withdraw ERC20 tokens
    function withdrawTokens(address _tokenContract) external onlyOwner {
        IERC20 tokenContract = IERC20(_tokenContract);
        uint256 _amount = tokenContract.balanceOf(address(this));
        tokenContract.transfer(owner(), _amount);
        emit WithdrawWrongTokens(msg.sender,_tokenContract,_amount);
    }

    /// @dev withdraw ERC721 tokens to the contract owner
    function withdrawNFT(address _tokenContract, uint256[] memory _id) external onlyOwner {
        IERC721 tokenContract = IERC721(_tokenContract);
        for (uint256 i = 0; i < _id.length; i++) {
            tokenContract.safeTransferFrom(address(this), owner(), _id[i]);
            emit WithdrawWrongNfts(msg.sender,_tokenContract,_id[i]);
        }
    }
}

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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"devAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"devAddress","type":"address"},{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"WithdrawWrongNfts","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"devAddress","type":"address"},{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawWrongTokens","type":"event"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"Owned","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"devFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxPerPerson","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"primaryDevAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"primaryDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"quaternaryDevAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"quaternaryDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"quinaryDevAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"quinaryDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addressList","type":"address[]"}],"name":"removeWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"royalty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"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":[],"name":"secondaryDevAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"secondaryDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxBuy","type":"uint256"}],"name":"setMaxPerPerson","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxBuy","type":"uint256"}],"name":"setMaxPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_royalty","type":"uint16"}],"name":"setRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_royaltyAddress","type":"address"}],"name":"setRoyaltyAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"uri","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tertiaryDevAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tertiaryDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"tokenExists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addressList","type":"address[]"}],"name":"whiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whiteListed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistedOnly","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"},{"internalType":"uint256[]","name":"_id","type":"uint256[]"}],"name":"withdrawNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]

600d80546001600160a01b03199081167348407950c0a25544e9f50bf9ee57e90ae7649b3e17909155600e80548216733acdc09a3c4fc659bfda7cfe8e6b04237d751e18179055600f8054821673982d9a2e8d487c698b29e72701068a5ac207e13917905560108054821673f60b7751b3227b4a34477ab144358d44f21d6fc017905560118054821673a6e950aa70ebaaf99686a5d95afe8aca8b5e353b179055601280549091167316d45386253e607af5e6434ce3f465f7843d58b617905560c06040526005608081905264173539b7b760d91b60a0908152620000e89160149190620002a8565b50610334601555600560168190556017556801158e460913d000006018556103e860198190556107d0601a55601b819055601c55611388601d55610258601e556020805460ff191660011790553480156200014257600080fd5b50604080518082018252600f81526e426f74205371756164204c6c616d6160881b60208083019182528351808501909452600484526342534c4160e01b9084015281519192916200019691600091620002a8565b508051620001ac906001906020840190620002a8565b5050600b80546001600160a81b0319163361010081029190911790915560405190915081906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350620002046200020a565b6200038b565b600b5460ff1615620002555760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640160405180910390fd5b600b805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586200028b3390565b6040516001600160a01b03909116815260200160405180910390a1565b828054620002b6906200034e565b90600052602060002090601f016020900481019282620002da576000855562000325565b82601f10620002f557805160ff191683800117855562000325565b8280016001018555821562000325579182015b828111156200032557825182559160200191906001019062000308565b506200033392915062000337565b5090565b5b8082111562000333576000815560010162000338565b600181811c908216806200036357607f821691505b602082108114156200038557634e487b7160e01b600052602260045260246000fd5b50919050565b614458806200039b6000396000f3fe6080604052600436106103b75760003560e01c8063715018a6116101f2578063ad2f852a1161010d578063d5abeb01116100a0578063f38cc1111161006f578063f38cc11114610ae8578063f83d08ba14610b08578063f968adbe14610b1d578063fa0fca8414610b3357600080fd5b8063d5abeb0114610a3c578063e985e9c514610a52578063f147efeb14610a9b578063f2fde38b14610ac857600080fd5b8063c87b56dd116100dc578063c87b56dd146109c3578063cdaa2a43146109e3578063d2f8dd45146109f9578063d51980d014610a2657600080fd5b8063ad2f852a1461094e578063b88d4fde1461096e578063c66828621461098e578063c6f6f216146109a357600080fd5b806395d89b4111610185578063a22cb46511610154578063a22cb465146108e3578063a64e001514610903578063a69df4b514610919578063a879b6321461092e57600080fd5b806395d89b41146108855780639bdedea51461089a578063a035b1fe146108ba578063a0712d68146108d057600080fd5b80638da5cb5b116101c15780638da5cb5b146108085780639186b4251461082b57806391b7f5ed1461084557806391c5f4a61461086557600080fd5b8063715018a6146107a8578063768d7138146107bd5780638456cb59146107d3578063862440e2146107e857600080fd5b806337648cbb116102e2578063496bc29e116102755780635c975abb116102445780635c975abb1461073b5780636352211e146107535780636c0360eb1461077357806370a082311461078857600080fd5b8063496bc29e146106bb57806349df728c146106db5780634f6ccce7146106fb57806355f804b31461071b57600080fd5b806340d097c3116102b157806340d097c31461063b57806342842e0e1461065b57806342966c681461067b578063483efda21461069b57600080fd5b806337648cbb146105d157806339745791146105f15780633ccfd60b146106115780633f4ba83a1461062657600080fd5b806318160ddd1161035a5780632a55205a116103295780632a55205a1461053c5780632f745c591461057b578063355e81941461059b57806336e79a5a146105b157600080fd5b806318160ddd146104d157806323b872dd146104e6578063281037701461050657806329ee566c1461052657600080fd5b806306d254da1161039657806306d254da1461043557806306fdde0314610457578063081812fc14610479578063095ea7b3146104b157600080fd5b8062923f9e146103bc57806301ffc9a7146103f157806304dd3bb414610411575b600080fd5b3480156103c857600080fd5b506103dc6103d7366004613f86565b610b63565b60405190151581526020015b60405180910390f35b3480156103fd57600080fd5b506103dc61040c366004613ef3565b610b84565b34801561041d57600080fd5b50610427601b5481565b6040519081526020016103e8565b34801561044157600080fd5b50610455610450366004613c20565b610bda565b005b34801561046357600080fd5b5061046c610c79565b6040516103e8919061412e565b34801561048557600080fd5b50610499610494366004613f86565b610d0b565b6040516001600160a01b0390911681526020016103e8565b3480156104bd57600080fd5b506104556104cc366004613e0d565b610db1565b3480156104dd57600080fd5b50600854610427565b3480156104f257600080fd5b50610455610501366004613c6e565b610ee3565b34801561051257600080fd5b50601054610499906001600160a01b031681565b34801561053257600080fd5b50610427601e5481565b34801561054857600080fd5b5061055c610557366004613fff565b610f6b565b604080516001600160a01b0390931683526020830191909152016103e8565b34801561058757600080fd5b50610427610596366004613e0d565b610fa5565b3480156105a757600080fd5b50610427601c5481565b3480156105bd57600080fd5b506104556105cc366004613f62565b61104d565b3480156105dd57600080fd5b50601154610499906001600160a01b031681565b3480156105fd57600080fd5b5061045561060c366004613e37565b611132565b34801561061d57600080fd5b5061045561124f565b34801561063257600080fd5b506104556113fd565b34801561064757600080fd5b50610455610656366004613c20565b611467565b34801561066757600080fd5b50610455610676366004613c6e565b6114d3565b34801561068757600080fd5b50610455610696366004613f86565b6114ee565b3480156106a757600080fd5b506104556106b6366004613f86565b611572565b3480156106c757600080fd5b50601254610499906001600160a01b031681565b3480156106e757600080fd5b506104556106f6366004613c20565b6115d7565b34801561070757600080fd5b50610427610716366004613f86565b6117d7565b34801561072757600080fd5b50610455610736366004613f2d565b61187b565b34801561074757600080fd5b50600b5460ff166103dc565b34801561075f57600080fd5b5061049961076e366004613f86565b6118ee565b34801561077f57600080fd5b5061046c611979565b34801561079457600080fd5b506104276107a3366004613c20565b611a07565b3480156107b457600080fd5b50610455611aa1565b3480156107c957600080fd5b5061042760175481565b3480156107df57600080fd5b50610455611b68565b3480156107f457600080fd5b50610455610803366004613fb8565b611bd0565b34801561081457600080fd5b50600b5461010090046001600160a01b0316610499565b34801561083757600080fd5b506020546103dc9060ff1681565b34801561085157600080fd5b50610455610860366004613f86565b611c3a565b34801561087157600080fd5b50610455610880366004613e37565b611c9f565b34801561089157600080fd5b5061046c611db8565b3480156108a657600080fd5b506104556108b5366004613d26565b611dc7565b3480156108c657600080fd5b5061042760185481565b6104556108de366004613f86565b611f80565b3480156108ef57600080fd5b506104556108fe366004613dd6565b612256565b34801561090f57600080fd5b50610427601a5481565b34801561092557600080fd5b5061045561231b565b34801561093a57600080fd5b50600f54610499906001600160a01b031681565b34801561095a57600080fd5b50600d54610499906001600160a01b031681565b34801561097a57600080fd5b50610455610989366004613caa565b612387565b34801561099a57600080fd5b5061046c61240f565b3480156109af57600080fd5b506104556109be366004613f86565b61241c565b3480156109cf57600080fd5b5061046c6109de366004613f86565b612481565b3480156109ef57600080fd5b5061042760195481565b348015610a0557600080fd5b50610a19610a14366004613c20565b61248c565b6040516103e891906140ea565b348015610a3257600080fd5b50610427601d5481565b348015610a4857600080fd5b5061042760155481565b348015610a5e57600080fd5b506103dc610a6d366004613c3b565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610aa757600080fd5b50610427610ab6366004613c20565b601f6020526000908152604090205481565b348015610ad457600080fd5b50610455610ae3366004613c20565b61254b565b348015610af457600080fd5b50600e54610499906001600160a01b031681565b348015610b1457600080fd5b506104556126a5565b348015610b2957600080fd5b5061042760165481565b348015610b3f57600080fd5b506103dc610b4e366004613c20565b60216020526000908152604090205460ff1681565b6000818152600260205260408120546001600160a01b031615155b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f2a55205a000000000000000000000000000000000000000000000000000000001480610b7e5750610b7e82612714565b600b546001600160a01b03610100909104163314610c3f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600d80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b606060008054610c8890614260565b80601f0160208091040260200160405190810160405280929190818152602001828054610cb490614260565b8015610d015780601f10610cd657610100808354040283529160200191610d01565b820191906000526020600020905b815481529060010190602001808311610ce457829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610d955760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610c36565b506000908152600460205260409020546001600160a01b031690565b6000610dbc826118ee565b9050806001600160a01b0316836001600160a01b03161415610e465760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610c36565b336001600160a01b0382161480610e625750610e628133610a6d565b610ed45760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610c36565b610ede838361276a565b505050565b610eee335b826127f0565b610f605760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610c36565b610ede8383836128f8565b600d54601e5460009182916001600160a01b039091169061271090610f9090866141e0565b610f9a91906141cc565b915091509250929050565b6000610fb083611a07565b82106110245760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e64730000000000000000000000000000000000000000006064820152608401610c36565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600b546001600160a01b036101009091041633146110ad5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c36565b6102ee8161ffff1611156111295760405162461bcd60e51b815260206004820152602d60248201527f526f79616c7479206d7573742062652067726561746572207468616e206f722060448201527f657175616c20746f20372e3525000000000000000000000000000000000000006064820152608401610c36565b61ffff16601e55565b600b546001600160a01b036101009091041633146111925760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c36565b60008151116111e35760405162461bcd60e51b815260206004820152600760248201527f4e6f204c697374000000000000000000000000000000000000000000000000006044820152606401610c36565b60005b815181101561124b5760006021600084848151811061120757611207614388565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580611243816142ae565b9150506111e6565b5050565b600e546001600160a01b03163314806112725750600f546001600160a01b031633145b8061128757506010546001600160a01b031633145b8061129c57506011546001600160a01b031633145b806112b157506012546001600160a01b031633145b6113235760405162461bcd60e51b815260206004820152602560248201527f446576204f6e6c793a2063616c6c6572206973206e6f7420746865206465766560448201527f6c6f7065720000000000000000000000000000000000000000000000000000006064820152608401610c36565b336000908152601f6020526040902054806113805760405162461bcd60e51b815260206004820152600960248201527f4e6f20466565733a2800000000000000000000000000000000000000000000006044820152606401610c36565b604051339082156108fc029083906000818181858888f193505050501580156113ad573d6000803e3d6000fd5b50336000818152601f602052604080822091909155517f9bba815921f12cb7b1408e14b5ade745234397d39623ae5e7c82d693cb45815f906113f29084815260200190565b60405180910390a250565b600b546001600160a01b0361010090910416331461145d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c36565b611465612ae8565b565b600b546001600160a01b036101009091041633146114c75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c36565b6114d081612b84565b50565b610ede83838360405180602001604052806000815250612387565b6114f733610ee8565b6115695760405162461bcd60e51b815260206004820152603060248201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f766564000000000000000000000000000000006064820152608401610c36565b6114d081612ba4565b600b546001600160a01b036101009091041633146115d25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c36565b601755565b600b546001600160a01b036101009091041633146116375760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c36565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015281906000906001600160a01b038316906370a082319060240160206040518083038186803b15801561169457600080fd5b505afa1580156116a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116cc9190613f9f565b9050816001600160a01b031663a9059cbb6116f5600b546001600160a01b036101009091041690565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b03909116600482015260248101849052604401602060405180830381600087803b15801561175557600080fd5b505af1158015611769573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061178d9190613ed6565b50604080516001600160a01b03851681526020810183905233917f5aa586896a67fb05c3b86276f66eecee7da00719d0e7299c403596fa2ec58ca4910160405180910390a2505050565b60006117e260085490565b82106118565760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e647300000000000000000000000000000000000000006064820152608401610c36565b6008828154811061186957611869614388565b90600052602060002001549050919050565b600b546001600160a01b036101009091041633146118db5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c36565b805161124b906013906020840190613a9f565b6000818152600260205260408120546001600160a01b031680610b7e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610c36565b6013805461198690614260565b80601f01602080910402602001604051908101604052809291908181526020018280546119b290614260565b80156119ff5780601f106119d4576101008083540402835291602001916119ff565b820191906000526020600020905b8154815290600101906020018083116119e257829003601f168201915b505050505081565b60006001600160a01b038216611a855760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610c36565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b03610100909104163314611b015760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c36565b600b5460405160009161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600b80547fffffffffffffffffffffff0000000000000000000000000000000000000000ff169055565b600b546001600160a01b03610100909104163314611bc85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c36565b611465612bad565b600b546001600160a01b03610100909104163314611c305760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c36565b61124b8282612c35565b600b546001600160a01b03610100909104163314611c9a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c36565b601855565b600b546001600160a01b03610100909104163314611cff5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c36565b6000815111611d505760405162461bcd60e51b815260206004820152600760248201527f4e6f204c697374000000000000000000000000000000000000000000000000006044820152606401610c36565b60005b815181101561124b57600160216000848481518110611d7457611d74614388565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580611db0816142ae565b915050611d53565b606060018054610c8890614260565b600b546001600160a01b03610100909104163314611e275760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c36565b8160005b8251811015611f7a57816001600160a01b03166342842e0e30611e5c600b546001600160a01b036101009091041690565b868581518110611e6e57611e6e614388565b60209081029190910101516040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b158015611ee057600080fd5b505af1158015611ef4573d6000803e3d6000fd5b50505050336001600160a01b03167fb8dbf4ce06446b88ef02ffd28a948c2637ac80fb0bd4d3a31c70878c1046eb7f85858481518110611f3657611f36614388565b6020026020010151604051611f609291906001600160a01b03929092168252602082015260400190565b60405180910390a280611f72816142ae565b915050611e2b565b50505050565b6000611f8b60085490565b9050611f99600b5460ff1690565b15611fe65760405162461bcd60e51b815260206004820152601b60248201527f53616c65206d7573742062652061637469766520746f206d696e7400000000006044820152606401610c36565b600082118015611ff857506016548211155b61206a5760405162461bcd60e51b815260206004820152603260248201527f4e756d626572206f66204e465473206d757374206265206d6f7265207468616e60448201527f203020616e64206c657373207468616e203500000000000000000000000000006064820152608401610c36565b60175461207633611a07565b6120819060016141b4565b11156120cf5760405162461bcd60e51b815260206004820152601d60248201527f596f752063616e74206d696e74206d6f7265207468616e206c696d69740000006044820152606401610c36565b816018546120dd91906141e0565b341461212b5760405162461bcd60e51b815260206004820152601760248201527f4d7573742073656e6420636f72726563742070726963650000000000000000006044820152606401610c36565b601554600161213a84846141b4565b612144919061421d565b106121b75760405162461bcd60e51b815260206004820152602260248201527f43616e6e6f74206d696e74206d6f7265207468616e20746f74616c207375707060448201527f6c790000000000000000000000000000000000000000000000000000000000006064820152608401610c36565b60205460ff1615612226573360009081526021602052604090205460ff1615156001146122265760405162461bcd60e51b815260206004820152601760248201527f596f7520617265206e6f742077686974656c69737465640000000000000000006044820152606401610c36565b60005b8281101561224c5761223a33612b84565b80612244816142ae565b915050612229565b5061124b34612cde565b6001600160a01b0382163314156122af5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610c36565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600b546001600160a01b0361010090910416331461237b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c36565b6020805460ff19169055565b61239133836127f0565b6124035760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610c36565b611f7a84848484612e75565b6014805461198690614260565b600b546001600160a01b0361010090910416331461247c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c36565b601655565b6060610b7e82612efe565b6060600061249983611a07565b9050806124ba5760408051600080825260208201909252905b509392505050565b60008167ffffffffffffffff8111156124d5576124d56143b7565b6040519080825280602002602001820160405280156124fe578160200160208202803683370190505b50905060005b828110156124b2576125168582610fa5565b82828151811061252857612528614388565b60209081029190910101528061253d816142ae565b915050612504565b50919050565b600b546001600160a01b036101009091041633146125ab5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c36565b6001600160a01b0381166126275760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610c36565b600b546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600b80546001600160a01b03909216610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff909216919091179055565b600b546001600160a01b036101009091041633146127055760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c36565b6020805460ff19166001179055565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d63000000000000000000000000000000000000000000000000000000001480610b7e5750610b7e82612fd8565b600081815260046020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03841690811790915581906127b7826118ee565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b031661287a5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610c36565b6000612885836118ee565b9050806001600160a01b0316846001600160a01b031614806128c05750836001600160a01b03166128b584610d0b565b6001600160a01b0316145b806128f057506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661290b826118ee565b6001600160a01b0316146129875760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e00000000000000000000000000000000000000000000006064820152608401610c36565b6001600160a01b038216612a025760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610c36565b612a0d8383836130bb565b612a1860008261276a565b6001600160a01b0383166000908152600360205260408120805460019290612a4190849061421d565b90915550506001600160a01b0382166000908152600360205260408120805460019290612a6f9084906141b4565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600b5460ff16612b3a5760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610c36565b600b805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b612b9681612b91600c5490565b613119565b6114d0600c80546001019055565b6114d081613133565b600b5460ff1615612c005760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610c36565b600b805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612b673390565b6000828152600260205260409020546001600160a01b0316612cbf5760405162461bcd60e51b815260206004820152602e60248201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60448201527f6578697374656e7420746f6b656e0000000000000000000000000000000000006064820152608401610c36565b6000828152600a602090815260409091208251610ede92840190613a9f565b6000612d01612710612cfb6019548561317390919063ffffffff16565b90613215565b90506000612d20612710612cfb601a548661317390919063ffffffff16565b90506000612d3f612710612cfb601b548761317390919063ffffffff16565b90506000612d5e612710612cfb601c548861317390919063ffffffff16565b90506000612d7d612710612cfb601d548961317390919063ffffffff16565b600e546001600160a01b03166000908152601f6020526040812080549293508792909190612dac9084906141b4565b9091555050600f546001600160a01b03166000908152601f602052604081208054869290612ddb9084906141b4565b90915550506010546001600160a01b03166000908152601f602052604081208054859290612e0a9084906141b4565b90915550506011546001600160a01b03166000908152601f602052604081208054849290612e399084906141b4565b90915550506012546001600160a01b03166000908152601f602052604081208054839290612e689084906141b4565b9091555050505050505050565b612e808484846128f8565b612e8c84848484613257565b611f7a5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610c36565b6000818152600260205260409020546060906001600160a01b0316612f8b5760405162461bcd60e51b815260206004820152603160248201527f45524337323155524953746f726167653a2055524920717565727920666f722060448201527f6e6f6e6578697374656e7420746f6b656e0000000000000000000000000000006064820152608401610c36565b6000612f95613422565b90506000612fa1613431565b905081612fad85613440565b82604051602001612fc09392919061406b565b60405160208183030381529060405292505050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061306b57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610b7e57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610b7e565b600b5460ff161561310e5760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610c36565b610ede838383613572565b61124b82826040518060200160405280600081525061362a565b61313c816136b3565b6000818152600a60205260409020805461315590614260565b1590506114d0576000818152600a602052604081206114d091613b23565b60008261318257506000610b7e565b600061318e83856141e0565b90508261319b85836141cc565b1461320e5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60448201527f77000000000000000000000000000000000000000000000000000000000000006064820152608401610c36565b9392505050565b600061320e83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613772565b60006001600160a01b0384163b15613417576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a02906132b49033908990889088906004016140ae565b602060405180830381600087803b1580156132ce57600080fd5b505af192505050801561331c575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261331991810190613f10565b60015b6133cc573d80801561334a576040519150601f19603f3d011682016040523d82523d6000602084013e61334f565b606091505b5080516133c45760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610c36565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a02000000000000000000000000000000000000000000000000000000001490506128f0565b506001949350505050565b606060138054610c8890614260565b606060148054610c8890614260565b60608161348057505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156134aa5780613494816142ae565b91506134a39050600a836141cc565b9150613484565b60008167ffffffffffffffff8111156134c5576134c56143b7565b6040519080825280601f01601f1916602001820160405280156134ef576020820181803683370190505b5090505b84156128f05761350460018361421d565b9150613511600a866142e7565b61351c9060306141b4565b60f81b81838151811061353157613531614388565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061356b600a866141cc565b94506134f3565b6001600160a01b0383166135cd576135c881600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6135f0565b816001600160a01b0316836001600160a01b0316146135f0576135f083826137a9565b6001600160a01b03821661360757610ede81613846565b826001600160a01b0316826001600160a01b031614610ede57610ede82826138f5565b6136348383613939565b6136416000848484613257565b610ede5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610c36565b60006136be826118ee565b90506136cc816000846130bb565b6136d760008361276a565b6001600160a01b038116600090815260036020526040812080546001929061370090849061421d565b909155505060008281526002602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600081836137935760405162461bcd60e51b8152600401610c36919061412e565b5060006137a084866141cc565b95945050505050565b600060016137b684611a07565b6137c0919061421d565b600083815260076020526040902054909150808214613813576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906138589060019061421d565b6000838152600960205260408120546008805493945090928490811061388057613880614388565b9060005260206000200154905080600883815481106138a1576138a1614388565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806138d9576138d9614359565b6001900381819060005260206000200160009055905550505050565b600061390083611a07565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b03821661398f5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610c36565b6000818152600260205260409020546001600160a01b0316156139f45760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610c36565b613a00600083836130bb565b6001600160a01b0382166000908152600360205260408120805460019290613a299084906141b4565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054613aab90614260565b90600052602060002090601f016020900481019282613acd5760008555613b13565b82601f10613ae657805160ff1916838001178555613b13565b82800160010185558215613b13579182015b82811115613b13578251825591602001919060010190613af8565b50613b1f929150613b59565b5090565b508054613b2f90614260565b6000825580601f10613b3f575050565b601f0160209004906000526020600020908101906114d091905b5b80821115613b1f5760008155600101613b5a565b600067ffffffffffffffff831115613b8857613b886143b7565b613bb960207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601614141565b9050828152838383011115613bcd57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b0381168114613bfb57600080fd5b919050565b600082601f830112613c1157600080fd5b61320e83833560208501613b6e565b600060208284031215613c3257600080fd5b61320e82613be4565b60008060408385031215613c4e57600080fd5b613c5783613be4565b9150613c6560208401613be4565b90509250929050565b600080600060608486031215613c8357600080fd5b613c8c84613be4565b9250613c9a60208501613be4565b9150604084013590509250925092565b60008060008060808587031215613cc057600080fd5b613cc985613be4565b9350613cd760208601613be4565b925060408501359150606085013567ffffffffffffffff811115613cfa57600080fd5b8501601f81018713613d0b57600080fd5b613d1a87823560208401613b6e565b91505092959194509250565b60008060408385031215613d3957600080fd5b613d4283613be4565b915060208084013567ffffffffffffffff811115613d5f57600080fd5b8401601f81018613613d7057600080fd5b8035613d83613d7e82614190565b614141565b80828252848201915084840189868560051b8701011115613da357600080fd5b600094505b83851015613dc6578035835260019490940193918501918501613da8565b5080955050505050509250929050565b60008060408385031215613de957600080fd5b613df283613be4565b91506020830135613e02816143e6565b809150509250929050565b60008060408385031215613e2057600080fd5b613e2983613be4565b946020939093013593505050565b60006020808385031215613e4a57600080fd5b823567ffffffffffffffff811115613e6157600080fd5b8301601f81018513613e7257600080fd5b8035613e80613d7e82614190565b80828252848201915084840188868560051b8701011115613ea057600080fd5b600094505b83851015613eca57613eb681613be4565b835260019490940193918501918501613ea5565b50979650505050505050565b600060208284031215613ee857600080fd5b815161320e816143e6565b600060208284031215613f0557600080fd5b813561320e816143f4565b600060208284031215613f2257600080fd5b815161320e816143f4565b600060208284031215613f3f57600080fd5b813567ffffffffffffffff811115613f5657600080fd5b6128f084828501613c00565b600060208284031215613f7457600080fd5b813561ffff8116811461320e57600080fd5b600060208284031215613f9857600080fd5b5035919050565b600060208284031215613fb157600080fd5b5051919050565b60008060408385031215613fcb57600080fd5b82359150602083013567ffffffffffffffff811115613fe957600080fd5b613ff585828601613c00565b9150509250929050565b6000806040838503121561401257600080fd5b50508035926020909101359150565b60008151808452614039816020860160208601614234565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000845161407d818460208901614234565b845190830190614091818360208901614234565b84519101906140a4818360208801614234565b0195945050505050565b60006001600160a01b038087168352808616602084015250836040830152608060608301526140e06080830184614021565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561412257835183529284019291840191600101614106565b50909695505050505050565b60208152600061320e6020830184614021565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614188576141886143b7565b604052919050565b600067ffffffffffffffff8211156141aa576141aa6143b7565b5060051b60200190565b600082198211156141c7576141c76142fb565b500190565b6000826141db576141db61432a565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614218576142186142fb565b500290565b60008282101561422f5761422f6142fb565b500390565b60005b8381101561424f578181015183820152602001614237565b83811115611f7a5750506000910152565b600181811c9082168061427457607f821691505b60208210811415612545577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156142e0576142e06142fb565b5060010190565b6000826142f6576142f661432a565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b80151581146114d057600080fd5b7fffffffff00000000000000000000000000000000000000000000000000000000811681146114d057600080fdfea2646970667358221220af11389ddb91394dd43d3428e7af9c0052f6a7de7af653bffca8fa9bbfab809264736f6c63430008070033

Deployed ByteCode Sourcemap

54625:8886:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59312:103;;;;;;;;;;-1:-1:-1;59312:103:0;;;;;:::i;:::-;;:::i;:::-;;;10468:14:1;;10461:22;10443:41;;10431:2;10416:18;59312:103:0;;;;;;;;61730:292;;;;;;;;;;-1:-1:-1;61730:292:0;;;;;:::i;:::-;;:::i;56349:36::-;;;;;;;;;;;;;;;;;;;24146:25:1;;;24134:2;24119:18;56349:36:0;24000:177:1;61318:122:0;;;;;;;;;;-1:-1:-1;61318:122:0;;;;;:::i;:::-;;:::i;:::-;;22839:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;24529:308::-;;;;;;;;;;-1:-1:-1;24529:308:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;8378:55:1;;;8360:74;;8348:2;8333:18;24529:308:0;8214:226:1;24052:411:0;;;;;;;;;;-1:-1:-1;24052:411:0;;;;;:::i;:::-;;:::i;37613:113::-;;;;;;;;;;-1:-1:-1;37701:10:0;:17;37613:113;;25588:376;;;;;;;;;;-1:-1:-1;25588:376:0;;;;;:::i;:::-;;:::i;55749:79::-;;;;;;;;;;-1:-1:-1;55749:79:0;;;;-1:-1:-1;;;;;55749:79:0;;;56479:28;;;;;;;;;;;;;;;;59423:238;;;;;;;;;;-1:-1:-1;59423:238:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;9556:55:1;;;9538:74;;9643:2;9628:18;;9621:34;;;;9511:18;59423:238:0;9364:297:1;37194:343:0;;;;;;;;;;-1:-1:-1;37194:343:0;;;;;:::i;:::-;;:::i;56392:38::-;;;;;;;;;;;;;;;;61048:258;;;;;;;;;;-1:-1:-1;61048:258:0;;;;;:::i;:::-;;:::i;55835:81::-;;;;;;;;;;-1:-1:-1;55835:81:0;;;;-1:-1:-1;;;;;55835:81:0;;;59927:231;;;;;;;;;;-1:-1:-1;59927:231:0;;;;;:::i;:::-;;:::i;62450:261::-;;;;;;;;;;;;;:::i;60406:65::-;;;;;;;;;;;;;:::i;61630:82::-;;;;;;;;;;-1:-1:-1;61630:82:0;;;;;:::i;:::-;;:::i;26035:185::-;;;;;;;;;;-1:-1:-1;26035:185:0;;;;;:::i;:::-;;:::i;50065:282::-;;;;;;;;;;-1:-1:-1;50065:282:0;;;;;:::i;:::-;;:::i;60479:104::-;;;;;;;;;;-1:-1:-1;60479:104:0;;;;;:::i;:::-;;:::i;55923:78::-;;;;;;;;;;-1:-1:-1;55923:78:0;;;;-1:-1:-1;;;;;55923:78:0;;;62759:319;;;;;;;;;;-1:-1:-1;62759:319:0;;;;;:::i;:::-;;:::i;37803:320::-;;;;;;;;;;-1:-1:-1;37803:320:0;;;;;:::i;:::-;;:::i;60695:102::-;;;;;;;;;;-1:-1:-1;60695:102:0;;;;;:::i;:::-;;:::i;46062:86::-;;;;;;;;;;-1:-1:-1;46133:7:0;;;;46062:86;;22446:326;;;;;;;;;;-1:-1:-1;22446:326:0;;;;;:::i;:::-;;:::i;56008:21::-;;;;;;;;;;;;;:::i;22089:295::-;;;;;;;;;;-1:-1:-1;22089:295:0;;;;;:::i;:::-;;:::i;49019:148::-;;;;;;;;;;;;;:::i;56174:31::-;;;;;;;;;;;;;;;;60337:61;;;;;;;;;;;;;:::i;60911:116::-;;;;;;;;;;-1:-1:-1;60911:116:0;;;;;:::i;:::-;;:::i;48368:87::-;;;;;;;;;;-1:-1:-1;48441:6:0;;;;;-1:-1:-1;;;;;48441:6:0;48368:87;;56588:34;;;;;;;;;;-1:-1:-1;56588:34:0;;;;;;;;60805:88;;;;;;;;;;-1:-1:-1;60805:88:0;;;;;:::i;:::-;;:::i;59695:224::-;;;;;;;;;;-1:-1:-1;59695:224:0;;;;;:::i;:::-;;:::i;23008:104::-;;;;;;;;;;;;;:::i;63145:363::-;;;;;;;;;;-1:-1:-1;63145:363:0;;;;;:::i;:::-;;:::i;56212:31::-;;;;;;;;;;;;;;;;57810:748;;;;;;:::i;:::-;;:::i;24909:327::-;;;;;;;;;;-1:-1:-1;24909:327:0;;;;;:::i;:::-;;:::i;56305:37::-;;;;;;;;;;;;;;;;60166:77;;;;;;;;;;;;;:::i;55662:80::-;;;;;;;;;;-1:-1:-1;55662:80:0;;;;-1:-1:-1;;;;;55662:80:0;;;55495:75;;;;;;;;;;-1:-1:-1;55495:75:0;;;;-1:-1:-1;;;;;55495:75:0;;;26291:365;;;;;;;;;;-1:-1:-1;26291:365:0;;;;;:::i;:::-;;:::i;56036:37::-;;;;;;;;;;;;;:::i;60591:96::-;;;;;;;;;;-1:-1:-1;60591:96:0;;;;;:::i;:::-;;:::i;58574:196::-;;;;;;;;;;-1:-1:-1;58574:196:0;;;;;:::i;:::-;;:::i;56263:35::-;;;;;;;;;;;;;;;;58778:526;;;;;;;;;;-1:-1:-1;58778:526:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;56437:35::-;;;;;;;;;;;;;;;;56103:30;;;;;;;;;;;;;;;;25307:214;;;;;;;;;;-1:-1:-1;25307:214:0;;;;;:::i;:::-;-1:-1:-1;;;;;25478:25:0;;;25449:4;25478:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;25307:214;56537:42;;;;;;;;;;-1:-1:-1;56537:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;49322:281;;;;;;;;;;-1:-1:-1;49322:281:0;;;;;:::i;:::-;;:::i;55577:78::-;;;;;;;;;;-1:-1:-1;55577:78:0;;;;-1:-1:-1;;;;;55577:78:0;;;60251:74;;;;;;;;;;;;;:::i;56140:27::-;;;;;;;;;;;;;;;;56629:43;;;;;;;;;;-1:-1:-1;56629:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;59312:103;59369:4;28292:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28292:16:0;:30;;59394:12;59386:21;59312:103;-1:-1:-1;;59312:103:0:o;61730:292::-;61878:4;61920:41;;;61935:26;61920:41;;:94;;;61978:36;62002:11;61978:23;:36::i;61318:122::-;48441:6;;-1:-1:-1;;;;;48441:6:0;;;;;16974:10;48588:23;48580:68;;;;-1:-1:-1;;;48580:68:0;;20611:2:1;48580:68:0;;;20593:21:1;;;20630:18;;;20623:30;20689:34;20669:18;;;20662:62;20741:18;;48580:68:0;;;;;;;;;61400:14:::1;:32:::0;;;::::1;-1:-1:-1::0;;;;;61400:32:0;;;::::1;::::0;;;::::1;::::0;;61318:122::o;22839:100::-;22893:13;22926:5;22919:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22839:100;:::o;24529:308::-;24650:7;28292:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28292:16:0;24675:110;;;;-1:-1:-1;;;24675:110:0;;20198:2:1;24675:110:0;;;20180:21:1;20237:2;20217:18;;;20210:30;20276:34;20256:18;;;20249:62;20347:14;20327:18;;;20320:42;20379:19;;24675:110:0;19996:408:1;24675:110:0;-1:-1:-1;24805:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;24805:24:0;;24529:308::o;24052:411::-;24133:13;24149:23;24164:7;24149:14;:23::i;:::-;24133:39;;24197:5;-1:-1:-1;;;;;24191:11:0;:2;-1:-1:-1;;;;;24191:11:0;;;24183:57;;;;-1:-1:-1;;;24183:57:0;;21801:2:1;24183:57:0;;;21783:21:1;21840:2;21820:18;;;21813:30;21879:34;21859:18;;;21852:62;21950:3;21930:18;;;21923:31;21971:19;;24183:57:0;21599:397:1;24183:57:0;16974:10;-1:-1:-1;;;;;24275:21:0;;;;:62;;-1:-1:-1;24300:37:0;24317:5;16974:10;25307:214;:::i;24300:37::-;24253:168;;;;-1:-1:-1;;;24253:168:0;;16186:2:1;24253:168:0;;;16168:21:1;16225:2;16205:18;;;16198:30;16264:34;16244:18;;;16237:62;16335:26;16315:18;;;16308:54;16379:19;;24253:168:0;15984:420:1;24253:168:0;24434:21;24443:2;24447:7;24434:8;:21::i;:::-;24122:341;24052:411;;:::o;25588:376::-;25797:41;16974:10;25816:12;25830:7;25797:18;:41::i;:::-;25775:140;;;;-1:-1:-1;;;25775:140:0;;22617:2:1;25775:140:0;;;22599:21:1;22656:2;22636:18;;;22629:30;22695:34;22675:18;;;22668:62;22766:19;22746:18;;;22739:47;22803:19;;25775:140:0;22415:413:1;25775:140:0;25928:28;25938:4;25944:2;25948:7;25928:9;:28::i;59423:238::-;59606:14;;59636:7;;59541:16;;;;-1:-1:-1;;;;;59606:14:0;;;;59647:5;;59623:20;;:10;:20;:::i;:::-;59622:30;;;;:::i;:::-;59598:55;;;;59423:238;;;;;:::o;37194:343::-;37336:7;37391:23;37408:5;37391:16;:23::i;:::-;37383:5;:31;37361:124;;;;-1:-1:-1;;;37361:124:0;;11605:2:1;37361:124:0;;;11587:21:1;11644:2;11624:18;;;11617:30;11683:34;11663:18;;;11656:62;11754:13;11734:18;;;11727:41;11785:19;;37361:124:0;11403:407:1;37361:124:0;-1:-1:-1;;;;;;37503:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;37194:343::o;61048:258::-;48441:6;;-1:-1:-1;;;;;48441:6:0;;;;;16974:10;48588:23;48580:68;;;;-1:-1:-1;;;48580:68:0;;20611:2:1;48580:68:0;;;20593:21:1;;;20630:18;;;20623:30;20689:34;20669:18;;;20662:62;20741:18;;48580:68:0;20409:356:1;48580:68:0;61215:3:::1;61203:8;:15;;;;61195:74;;;::::0;-1:-1:-1;;;61195:74:0;;22203:2:1;61195:74:0::1;::::0;::::1;22185:21:1::0;22242:2;22222:18;;;22215:30;22281:34;22261:18;;;22254:62;22352:15;22332:18;;;22325:43;22385:19;;61195:74:0::1;22001:409:1::0;61195:74:0::1;61280:18;;:7;:18:::0;61048:258::o;59927:231::-;48441:6;;-1:-1:-1;;;;;48441:6:0;;;;;16974:10;48588:23;48580:68;;;;-1:-1:-1;;;48580:68:0;;20611:2:1;48580:68:0;;;20593:21:1;;;20630:18;;;20623:30;20689:34;20669:18;;;20662:62;20741:18;;48580:68:0;20409:356:1;48580:68:0;60039:1:::1;60018:11;:18;:22;60010:41;;;::::0;-1:-1:-1;;;60010:41:0;;11270:2:1;60010:41:0::1;::::0;::::1;11252:21:1::0;11309:1;11289:18;;;11282:29;11347:9;11327:18;;;11320:37;11374:18;;60010:41:0::1;11068:330:1::0;60010:41:0::1;60066:9;60062:88;60082:11;:18;60080:1;:20;60062:88;;;60145:5;60115:11;:27;60127:11;60139:1;60127:14;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;60115:27:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;60115:27:0;:35;;-1:-1:-1;;60115:35:0::1;::::0;::::1;;::::0;;;::::1;::::0;;60101:3;::::1;::::0;::::1;:::i;:::-;;;;60062:88;;;;59927:231:::0;:::o;62450:261::-;54834:17;;-1:-1:-1;;;;;54834:17:0;54820:10;:31;;:68;;-1:-1:-1;54869:19:0;;-1:-1:-1;;;;;54869:19:0;54855:10;:33;54820:68;:104;;;-1:-1:-1;54906:18:0;;-1:-1:-1;;;;;54906:18:0;54892:10;:32;54820:104;:142;;;-1:-1:-1;54942:20:0;;-1:-1:-1;;;;;54942:20:0;54928:10;:34;54820:142;:177;;;-1:-1:-1;54980:17:0;;-1:-1:-1;;;;;54980:17:0;54966:10;:31;54820:177;54812:227;;;;-1:-1:-1;;;54812:227:0;;18259:2:1;54812:227:0;;;18241:21:1;18298:2;18278:18;;;18271:30;18337:34;18317:18;;;18310:62;18408:7;18388:18;;;18381:35;18433:19;;54812:227:0;18057:401:1;54812:227:0;62522:10:::1;62497:14;62514:19:::0;;;:7:::1;:19;::::0;;;;;62552:10;62544:31:::1;;;::::0;-1:-1:-1;;;62544:31:0;;23448:2:1;62544:31:0::1;::::0;::::1;23430:21:1::0;23487:1;23467:18;;;23460:29;23525:11;23505:18;;;23498:39;23554:18;;62544:31:0::1;23246:332:1::0;62544:31:0::1;62586:36;::::0;62594:10:::1;::::0;62586:36;::::1;;;::::0;62615:6;;62586:36:::1;::::0;;;62615:6;62594:10;62586:36;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;62641:10:0::1;62655:1;62633:19:::0;;;:7:::1;:19;::::0;;;;;:23;;;;62672:31;::::1;::::0;::::1;::::0;62696:6;24146:25:1;;24134:2;24119:18;;24000:177;62672:31:0::1;;;;;;;;62486:225;62450:261::o:0;60406:65::-;48441:6;;-1:-1:-1;;;;;48441:6:0;;;;;16974:10;48588:23;48580:68;;;;-1:-1:-1;;;48580:68:0;;20611:2:1;48580:68:0;;;20593:21:1;;;20630:18;;;20623:30;20689:34;20669:18;;;20662:62;20741:18;;48580:68:0;20409:356:1;48580:68:0;60453:10:::1;:8;:10::i;:::-;60406:65::o:0;61630:82::-;48441:6;;-1:-1:-1;;;;;48441:6:0;;;;;16974:10;48588:23;48580:68;;;;-1:-1:-1;;;48580:68:0;;20611:2:1;48580:68:0;;;20593:21:1;;;20630:18;;;20623:30;20689:34;20669:18;;;20662:62;20741:18;;48580:68:0;20409:356:1;48580:68:0;61688:16:::1;61701:2;61688:12;:16::i;:::-;61630:82:::0;:::o;26035:185::-;26173:39;26190:4;26196:2;26200:7;26173:39;;;;;;;;;;;;:16;:39::i;50065:282::-;50197:41;16974:10;50216:12;16894:98;50197:41;50175:139;;;;-1:-1:-1;;;50175:139:0;;23785:2:1;50175:139:0;;;23767:21:1;23824:2;23804:18;;;23797:30;23863:34;23843:18;;;23836:62;23934:18;23914;;;23907:46;23970:19;;50175:139:0;23583:412:1;50175:139:0;50325:14;50331:7;50325:5;:14::i;60479:104::-;48441:6;;-1:-1:-1;;;;;48441:6:0;;;;;16974:10;48588:23;48580:68;;;;-1:-1:-1;;;48580:68:0;;20611:2:1;48580:68:0;;;20593:21:1;;;20630:18;;;20623:30;20689:34;20669:18;;;20662:62;20741:18;;48580:68:0;20409:356:1;48580:68:0;60551:12:::1;:24:::0;60479:104::o;62759:319::-;48441:6;;-1:-1:-1;;;;;48441:6:0;;;;;16974:10;48588:23;48580:68;;;;-1:-1:-1;;;48580:68:0;;20611:2:1;48580:68:0;;;20593:21:1;;;20630:18;;;20623:30;20689:34;20669:18;;;20662:62;20741:18;;48580:68:0;20409:356:1;48580:68:0;62911:38:::1;::::0;;;;62943:4:::1;62911:38;::::0;::::1;8360:74:1::0;62867:14:0;;62837:20:::1;::::0;-1:-1:-1;;;;;62911:23:0;::::1;::::0;::::1;::::0;8333:18:1;;62911:38:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62893:56;;62960:13;-1:-1:-1::0;;;;;62960:22:0::1;;62983:7;48441:6:::0;;-1:-1:-1;;;;;48441:6:0;;;;;;48368:87;62983:7:::1;62960:40;::::0;;::::1;::::0;;;;;;-1:-1:-1;;;;;9556:55:1;;;62960:40:0::1;::::0;::::1;9538:74:1::0;9628:18;;;9621:34;;;9511:18;;62960:40:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;63016:54:0::1;::::0;;-1:-1:-1;;;;;9556:55:1;;9538:74;;9643:2;9628:18;;9621:34;;;63036:10:0::1;::::0;63016:54:::1;::::0;9511:18:1;63016:54:0::1;;;;;;;62826:252;;62759:319:::0;:::o;37803:320::-;37923:7;37978:30;37701:10;:17;;37613:113;37978:30;37970:5;:38;37948:132;;;;-1:-1:-1;;;37948:132:0;;23035:2:1;37948:132:0;;;23017:21:1;23074:2;23054:18;;;23047:30;23113:34;23093:18;;;23086:62;23184:14;23164:18;;;23157:42;23216:19;;37948:132:0;22833:408:1;37948:132:0;38098:10;38109:5;38098:17;;;;;;;;:::i;:::-;;;;;;;;;38091:24;;37803:320;;;:::o;60695:102::-;48441:6;;-1:-1:-1;;;;;48441:6:0;;;;;16974:10;48588:23;48580:68;;;;-1:-1:-1;;;48580:68:0;;20611:2:1;48580:68:0;;;20593:21:1;;;20630:18;;;20623:30;20689:34;20669:18;;;20662:62;20741:18;;48580:68:0;20409:356:1;48580:68:0;60769:20;;::::1;::::0;:7:::1;::::0;:20:::1;::::0;::::1;::::0;::::1;:::i;22446:326::-:0;22563:7;22604:16;;;:7;:16;;;;;;-1:-1:-1;;;;;22604:16:0;22653:19;22631:110;;;;-1:-1:-1;;;22631:110:0;;17434:2:1;22631:110:0;;;17416:21:1;17473:2;17453:18;;;17446:30;17512:34;17492:18;;;17485:62;17583:11;17563:18;;;17556:39;17612:19;;22631:110:0;17232:405:1;56008:21:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22089:295::-;22206:7;-1:-1:-1;;;;;22253:19:0;;22231:111;;;;-1:-1:-1;;;22231:111:0;;17023:2:1;22231:111:0;;;17005:21:1;17062:2;17042:18;;;17035:30;17101:34;17081:18;;;17074:62;17172:12;17152:18;;;17145:40;17202:19;;22231:111:0;16821:406:1;22231:111:0;-1:-1:-1;;;;;;22360:16:0;;;;;:9;:16;;;;;;;22089:295::o;49019:148::-;48441:6;;-1:-1:-1;;;;;48441:6:0;;;;;16974:10;48588:23;48580:68;;;;-1:-1:-1;;;48580:68:0;;20611:2:1;48580:68:0;;;20593:21:1;;;20630:18;;;20623:30;20689:34;20669:18;;;20662:62;20741:18;;48580:68:0;20409:356:1;48580:68:0;49110:6:::1;::::0;49089:40:::1;::::0;49126:1:::1;::::0;49110:6:::1;::::0;::::1;-1:-1:-1::0;;;;;49110:6:0::1;::::0;49089:40:::1;::::0;49126:1;;49089:40:::1;49140:6;:19:::0;;;::::1;::::0;;49019:148::o;60337:61::-;48441:6;;-1:-1:-1;;;;;48441:6:0;;;;;16974:10;48588:23;48580:68;;;;-1:-1:-1;;;48580:68:0;;20611:2:1;48580:68:0;;;20593:21:1;;;20630:18;;;20623:30;20689:34;20669:18;;;20662:62;20741:18;;48580:68:0;20409:356:1;48580:68:0;60382:8:::1;:6;:8::i;60911:116::-:0;48441:6;;-1:-1:-1;;;;;48441:6:0;;;;;16974:10;48588:23;48580:68;;;;-1:-1:-1;;;48580:68:0;;20611:2:1;48580:68:0;;;20593:21:1;;;20630:18;;;20623:30;20689:34;20669:18;;;20662:62;20741:18;;48580:68:0;20409:356:1;48580:68:0;60993:26:::1;61006:7;61015:3;60993:12;:26::i;60805:88::-:0;48441:6;;-1:-1:-1;;;;;48441:6:0;;;;;16974:10;48588:23;48580:68;;;;-1:-1:-1;;;48580:68:0;;20611:2:1;48580:68:0;;;20593:21:1;;;20630:18;;;20623:30;20689:34;20669:18;;;20662:62;20741:18;;48580:68:0;20409:356:1;48580:68:0;60869:5:::1;:16:::0;60805:88::o;59695:224::-;48441:6;;-1:-1:-1;;;;;48441:6:0;;;;;16974:10;48588:23;48580:68;;;;-1:-1:-1;;;48580:68:0;;20611:2:1;48580:68:0;;;20593:21:1;;;20630:18;;;20623:30;20689:34;20669:18;;;20662:62;20741:18;;48580:68:0;20409:356:1;48580:68:0;59801:1:::1;59780:11;:18;:22;59772:41;;;::::0;-1:-1:-1;;;59772:41:0;;11270:2:1;59772:41:0::1;::::0;::::1;11252:21:1::0;11309:1;11289:18;;;11282:29;11347:9;11327:18;;;11320:37;11374:18;;59772:41:0::1;11068:330:1::0;59772:41:0::1;59828:9;59824:87;59844:11;:18;59842:1;:20;59824:87;;;59907:4;59877:11;:27;59889:11;59901:1;59889:14;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;59877:27:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;59877:27:0;:34;;-1:-1:-1;;59877:34:0::1;::::0;::::1;;::::0;;;::::1;::::0;;59863:3;::::1;::::0;::::1;:::i;:::-;;;;59824:87;;23008:104:::0;23064:13;23097:7;23090:14;;;;;:::i;63145:363::-;48441:6;;-1:-1:-1;;;;;48441:6:0;;;;;16974:10;48588:23;48580:68;;;;-1:-1:-1;;;48580:68:0;;20611:2:1;48580:68:0;;;20593:21:1;;;20630:18;;;20623:30;20689:34;20669:18;;;20662:62;20741:18;;48580:68:0;20409:356:1;48580:68:0;63274:14;63242:21:::1;63300:201;63324:3;:10;63320:1;:14;63300:201;;;63356:13;-1:-1:-1::0;;;;;63356:30:0::1;;63395:4;63402:7;48441:6:::0;;-1:-1:-1;;;;;48441:6:0;;;;;;48368:87;63402:7:::1;63411:3;63415:1;63411:6;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;63356:62:::1;::::0;;::::1;::::0;;;;;;-1:-1:-1;;;;;8726:15:1;;;63356:62:0::1;::::0;::::1;8708:34:1::0;8778:15;;;;8758:18;;;8751:43;8810:18;;;8803:34;8620:18;;63356:62:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;63456:10;-1:-1:-1::0;;;;;63438:51:0::1;;63467:14;63482:3;63486:1;63482:6;;;;;;;;:::i;:::-;;;;;;;63438:51;;;;;;-1:-1:-1::0;;;;;9556:55:1;;;;9538:74;;9643:2;9628:18;;9621:34;9526:2;9511:18;;9364:297;63438:51:0::1;;;;;;;;63336:3:::0;::::1;::::0;::::1;:::i;:::-;;;;63300:201;;;;63231:277;63145:363:::0;;:::o;57810:748::-;57866:14;57883:13;37701:10;:17;;37613:113;57883:13;57866:30;;57916:8;46133:7;;;;;46062:86;57916:8;57915:9;57907:48;;;;-1:-1:-1;;;57907:48:0;;15072:2:1;57907:48:0;;;15054:21:1;15111:2;15091:18;;;15084:30;15150:29;15130:18;;;15123:57;15197:18;;57907:48:0;14870:351:1;57907:48:0;57983:1;57974:6;:10;:32;;;;;57998:8;;57988:6;:18;;57974:32;57966:94;;;;-1:-1:-1;;;57966:94:0;;21382:2:1;57966:94:0;;;21364:21:1;21421:2;21401:18;;;21394:30;21460:34;21440:18;;;21433:62;21531:20;21511:18;;;21504:48;21569:19;;57966:94:0;21180:414:1;57966:94:0;58108:12;;58079:21;58089:10;58079:9;:21::i;:::-;:25;;58103:1;58079:25;:::i;:::-;:41;;58071:82;;;;-1:-1:-1;;;58071:82:0;;14714:2:1;58071:82:0;;;14696:21:1;14753:2;14733:18;;;14726:30;14792:31;14772:18;;;14765:59;14841:18;;58071:82:0;14512:353:1;58071:82:0;58193:6;58185:5;;:14;;;;:::i;:::-;58172:9;:27;58164:63;;;;-1:-1:-1;;;58164:63:0;;13200:2:1;58164:63:0;;;13182:21:1;13239:2;13219:18;;;13212:30;13278:25;13258:18;;;13251:53;13321:18;;58164:63:0;12998:347:1;58164:63:0;58268:9;;58264:1;58246:15;58255:6;58246;:15;:::i;:::-;:19;;;;:::i;:::-;:31;58238:78;;;;-1:-1:-1;;;58238:78:0;;13552:2:1;58238:78:0;;;13534:21:1;13591:2;13571:18;;;13564:30;13630:34;13610:18;;;13603:62;13701:4;13681:18;;;13674:32;13723:19;;58238:78:0;13350:398:1;58238:78:0;58330:15;;;;58327:112;;;58381:10;58369:23;;;;:11;:23;;;;;;;;:31;;:23;:31;58361:66;;;;-1:-1:-1;;;58361:66:0;;19026:2:1;58361:66:0;;;19008:21:1;19065:2;19045:18;;;19038:30;19104:25;19084:18;;;19077:53;19147:18;;58361:66:0;18824:347:1;58361:66:0;58454:9;58449:70;58473:6;58469:1;:10;58449:70;;;58495:24;58508:10;58495:12;:24::i;:::-;58481:3;;;;:::i;:::-;;;;58449:70;;;;58530:20;58540:9;58530;:20::i;24909:327::-;-1:-1:-1;;;;;25044:24:0;;16974:10;25044:24;;25036:62;;;;-1:-1:-1;;;25036:62:0;;14360:2:1;25036:62:0;;;14342:21:1;14399:2;14379:18;;;14372:30;14438:27;14418:18;;;14411:55;14483:18;;25036:62:0;14158:349:1;25036:62:0;16974:10;25111:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;25111:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;25111:53:0;;;;;;;;;;25180:48;;10443:41:1;;;25111:42:0;;16974:10;25180:48;;10416:18:1;25180:48:0;;;;;;;24909:327;;:::o;60166:77::-;48441:6;;-1:-1:-1;;;;;48441:6:0;;;;;16974:10;48588:23;48580:68;;;;-1:-1:-1;;;48580:68:0;;20611:2:1;48580:68:0;;;20593:21:1;;;20630:18;;;20623:30;20689:34;20669:18;;;20662:62;20741:18;;48580:68:0;20409:356:1;48580:68:0;60212:15:::1;:23:::0;;-1:-1:-1;;60212:23:0::1;::::0;;60166:77::o;26291:365::-;26480:41;16974:10;26513:7;26480:18;:41::i;:::-;26458:140;;;;-1:-1:-1;;;26458:140:0;;22617:2:1;26458:140:0;;;22599:21:1;22656:2;22636:18;;;22629:30;22695:34;22675:18;;;22668:62;22766:19;22746:18;;;22739:47;22803:19;;26458:140:0;22415:413:1;26458:140:0;26609:39;26623:4;26629:2;26633:7;26642:5;26609:13;:39::i;56036:37::-;;;;;;;:::i;60591:96::-;48441:6;;-1:-1:-1;;;;;48441:6:0;;;;;16974:10;48588:23;48580:68;;;;-1:-1:-1;;;48580:68:0;;20611:2:1;48580:68:0;;;20593:21:1;;;20630:18;;;20623:30;20689:34;20669:18;;;20662:62;20741:18;;48580:68:0;20409:356:1;48580:68:0;60659:8:::1;:20:::0;60591:96::o;58574:196::-;58701:13;58739:23;58754:7;58739:14;:23::i;58778:526::-;58859:16;58893:18;58914:17;58924:6;58914:9;:17::i;:::-;58893:38;-1:-1:-1;58946:15:0;58942:355;;58985:16;;;58999:1;58985:16;;;;;;;;;;;-1:-1:-1;58978:23:0;58778:526;-1:-1:-1;;;58778:526:0:o;58942:355::-;59034:23;59074:10;59060:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59060:25:0;;59034:51;;59100:13;59128:130;59152:10;59144:5;:18;59128:130;;;59208:34;59228:6;59236:5;59208:19;:34::i;:::-;59192:6;59199:5;59192:13;;;;;;;;:::i;:::-;;;;;;;;;;:50;59164:7;;;;:::i;:::-;;;;59128:130;;58942:355;58882:422;58778:526;;;:::o;49322:281::-;48441:6;;-1:-1:-1;;;;;48441:6:0;;;;;16974:10;48588:23;48580:68;;;;-1:-1:-1;;;48580:68:0;;20611:2:1;48580:68:0;;;20593:21:1;;;20630:18;;;20623:30;20689:34;20669:18;;;20662:62;20741:18;;48580:68:0;20409:356:1;48580:68:0;-1:-1:-1;;;;;49425:22:0;::::1;49403:110;;;::::0;-1:-1:-1;;;49403:110:0;;12436:2:1;49403:110:0::1;::::0;::::1;12418:21:1::0;12475:2;12455:18;;;12448:30;12514:34;12494:18;;;12487:62;12585:8;12565:18;;;12558:36;12611:19;;49403:110:0::1;12234:402:1::0;49403:110:0::1;49550:6;::::0;49529:38:::1;::::0;-1:-1:-1;;;;;49529:38:0;;::::1;::::0;49550:6:::1;::::0;::::1;;::::0;49529:38:::1;::::0;;;::::1;49578:6;:17:::0;;-1:-1:-1;;;;;49578:17:0;;::::1;;;::::0;;;::::1;::::0;;;::::1;::::0;;49322:281::o;60251:74::-;48441:6;;-1:-1:-1;;;;;48441:6:0;;;;;16974:10;48588:23;48580:68;;;;-1:-1:-1;;;48580:68:0;;20611:2:1;48580:68:0;;;20593:21:1;;;20630:18;;;20623:30;20689:34;20669:18;;;20662:62;20741:18;;48580:68:0;20409:356:1;48580:68:0;60295:15:::1;:22:::0;;-1:-1:-1;;60295:22:0::1;60313:4;60295:22;::::0;;60251:74::o;36810:300::-;36957:4;36999:50;;;37014:35;36999:50;;:103;;;37066:36;37090:11;37066:23;:36::i;32326:174::-;32401:24;;;;:15;:24;;;;;:29;;;;-1:-1:-1;;;;;32401:29:0;;;;;;;;:24;;32455:23;32401:24;32455:14;:23::i;:::-;-1:-1:-1;;;;;32446:46:0;;;;;;;;;;;32326:174;;:::o;28497:452::-;28626:4;28292:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28292:16:0;28648:110;;;;-1:-1:-1;;;28648:110:0;;15428:2:1;28648:110:0;;;15410:21:1;15467:2;15447:18;;;15440:30;15506:34;15486:18;;;15479:62;15577:14;15557:18;;;15550:42;15609:19;;28648:110:0;15226:408:1;28648:110:0;28769:13;28785:23;28800:7;28785:14;:23::i;:::-;28769:39;;28838:5;-1:-1:-1;;;;;28827:16:0;:7;-1:-1:-1;;;;;28827:16:0;;:64;;;;28884:7;-1:-1:-1;;;;;28860:31:0;:20;28872:7;28860:11;:20::i;:::-;-1:-1:-1;;;;;28860:31:0;;28827:64;:113;;;-1:-1:-1;;;;;;25478:25:0;;;25449:4;25478:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;28908:32;28819:122;28497:452;-1:-1:-1;;;;28497:452:0:o;31593:615::-;31766:4;-1:-1:-1;;;;;31739:31:0;:23;31754:7;31739:14;:23::i;:::-;-1:-1:-1;;;;;31739:31:0;;31717:122;;;;-1:-1:-1;;;31717:122:0;;20972:2:1;31717:122:0;;;20954:21:1;21011:2;20991:18;;;20984:30;21050:34;21030:18;;;21023:62;21121:11;21101:18;;;21094:39;21150:19;;31717:122:0;20770:405:1;31717:122:0;-1:-1:-1;;;;;31858:16:0;;31850:65;;;;-1:-1:-1;;;31850:65:0;;13955:2:1;31850:65:0;;;13937:21:1;13994:2;13974:18;;;13967:30;14033:34;14013:18;;;14006:62;14104:6;14084:18;;;14077:34;14128:19;;31850:65:0;13753:400:1;31850:65:0;31928:39;31949:4;31955:2;31959:7;31928:20;:39::i;:::-;32032:29;32049:1;32053:7;32032:8;:29::i;:::-;-1:-1:-1;;;;;32074:15:0;;;;;;:9;:15;;;;;:20;;32093:1;;32074:15;:20;;32093:1;;32074:20;:::i;:::-;;;;-1:-1:-1;;;;;;;32105:13:0;;;;;;:9;:13;;;;;:18;;32122:1;;32105:13;:18;;32122:1;;32105:18;:::i;:::-;;;;-1:-1:-1;;32134:16:0;;;;:7;:16;;;;;;:21;;;;-1:-1:-1;;;;;32134:21:0;;;;;;;;;32173:27;;32134:16;;32173:27;;;;;;;31593:615;;;:::o;47121:120::-;46133:7;;;;46657:41;;;;-1:-1:-1;;;46657:41:0;;10921:2:1;46657:41:0;;;10903:21:1;10960:2;10940:18;;;10933:30;10999:22;10979:18;;;10972:50;11039:18;;46657:41:0;10719:344:1;46657:41:0;47180:7:::1;:15:::0;;-1:-1:-1;;47180:15:0::1;::::0;;47211:22:::1;16974:10:::0;47220:12:::1;47211:22;::::0;-1:-1:-1;;;;;8378:55:1;;;8360:74;;8348:2;8333:18;47211:22:0::1;;;;;;;47121:120::o:0;61482:140::-;61536:40;61546:2;61550:25;:15;51265:14;;51173:114;61550:25;61536:9;:40::i;:::-;61587:27;:15;51384:19;;51402:1;51384:19;;;51295:127;62279:138;62389:20;62401:7;62389:11;:20::i;46862:118::-;46133:7;;;;46387:9;46379:38;;;;-1:-1:-1;;;46379:38:0;;15841:2:1;46379:38:0;;;15823:21:1;15880:2;15860:18;;;15853:30;15919:18;15899;;;15892:46;15955:18;;46379:38:0;15639:340:1;46379:38:0;46922:7:::1;:14:::0;;-1:-1:-1;;46922:14:0::1;46932:4;46922:14;::::0;;46952:20:::1;46959:12;16974:10:::0;;16894:98;44269:277;28268:4;28292:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28292:16:0;44384:112;;;;-1:-1:-1;;;44384:112:0;;17844:2:1;44384:112:0;;;17826:21:1;17883:2;17863:18;;;17856:30;17922:34;17902:18;;;17895:62;17993:16;17973:18;;;17966:44;18027:19;;44384:112:0;17642:410:1;44384:112:0;44507:19;;;;:10;:19;;;;;;;;:31;;;;;;;;:::i;57003:798::-;57064:27;57094:40;57128:5;57094:29;57109:13;;57094:10;:14;;:29;;;;:::i;:::-;:33;;:40::i;:::-;57064:70;;57145:29;57177:42;57213:5;57177:31;57192:15;;57177:10;:14;;:31;;;;:::i;:42::-;57145:74;;57230:28;57261:41;57296:5;57261:30;57276:14;;57261:10;:14;;:30;;;;:::i;:41::-;57230:72;;57313:30;57346:43;57383:5;57346:32;57361:16;;57346:10;:14;;:32;;;;:::i;:43::-;57313:76;;57400:27;57430:40;57464:5;57430:29;57445:13;;57430:10;:14;;:29;;;;:::i;:40::-;57498:17;;-1:-1:-1;;;;;57498:17:0;57490:26;;;;:7;:26;;;;;:49;;57400:70;;-1:-1:-1;57520:19:0;;57490:26;;;:49;;57520:19;;57490:49;:::i;:::-;;;;-1:-1:-1;;57558:19:0;;-1:-1:-1;;;;;57558:19:0;57550:28;;;;:7;:28;;;;;:53;;57582:21;;57550:28;:53;;57582:21;;57550:53;:::i;:::-;;;;-1:-1:-1;;57622:18:0;;-1:-1:-1;;;;;57622:18:0;57614:27;;;;:7;:27;;;;;:51;;57645:20;;57614:27;:51;;57645:20;;57614:51;:::i;:::-;;;;-1:-1:-1;;57684:20:0;;-1:-1:-1;;;;;57684:20:0;57676:29;;;;:7;:29;;;;;:55;;57709:22;;57676:29;:55;;57709:22;;57676:55;:::i;:::-;;;;-1:-1:-1;;57750:17:0;;-1:-1:-1;;;;;57750:17:0;57742:26;;;;:7;:26;;;;;:49;;57772:19;;57742:26;:49;;57772:19;;57742:49;:::i;:::-;;;;-1:-1:-1;;;;;;;;57003:798:0:o;27538:352::-;27695:28;27705:4;27711:2;27715:7;27695:9;:28::i;:::-;27756:48;27779:4;27785:2;27789:7;27798:5;27756:22;:48::i;:::-;27734:148;;;;-1:-1:-1;;;27734:148:0;;12017:2:1;27734:148:0;;;11999:21:1;12056:2;12036:18;;;12029:30;12095:34;12075:18;;;12068:62;12166:20;12146:18;;;12139:48;12204:19;;27734:148:0;11815:414:1;43652:461:0;28268:4;28292:16;;;:7;:16;;;;;;43770:13;;-1:-1:-1;;;;;28292:16:0;43801:115;;;;-1:-1:-1;;;43801:115:0;;19378:2:1;43801:115:0;;;19360:21:1;19417:2;19397:18;;;19390:30;19456:34;19436:18;;;19429:62;19527:19;19507:18;;;19500:47;19564:19;;43801:115:0;19176:413:1;43801:115:0;43929:18;43950:10;:8;:10::i;:::-;43929:31;;43971:17;43991:16;:14;:16::i;:::-;43971:36;;44070:4;44076:20;44077:7;44076:18;:20::i;:::-;44098:3;44053:49;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44039:64;;;;43652:461;;;:::o;21670:355::-;21817:4;21859:40;;;21874:25;21859:40;;:105;;-1:-1:-1;21916:48:0;;;21931:33;21916:48;21859:105;:158;;;-1:-1:-1;20310:25:0;20295:40;;;;21981:36;20136:207;62034:229;46133:7;;;;46387:9;46379:38;;;;-1:-1:-1;;;46379:38:0;;15841:2:1;46379:38:0;;;15823:21:1;15880:2;15860:18;;;15853:30;15919:18;15899;;;15892:46;15955:18;;46379:38:0;15639:340:1;46379:38:0;62210:45:::1;62237:4;62243:2;62247:7;62210:26;:45::i;29291:110::-:0;29367:26;29377:2;29381:7;29367:26;;;;;;;;;;;;:9;:26::i;44775:206::-;44844:20;44856:7;44844:11;:20::i;:::-;44887:19;;;;:10;:19;;;;;44881:33;;;;;:::i;:::-;:38;;-1:-1:-1;44877:97:0;;44943:19;;;;:10;:19;;;;;44936:26;;;:::i;53601:250::-;53659:7;53683:6;53679:47;;-1:-1:-1;53713:1:0;53706:8;;53679:47;53738:9;53750:5;53754:1;53750;:5;:::i;:::-;53738:17;-1:-1:-1;53783:1:0;53774:5;53778:1;53738:17;53774:5;:::i;:::-;:10;53766:56;;;;-1:-1:-1;;;53766:56:0;;19796:2:1;53766:56:0;;;19778:21:1;19835:2;19815:18;;;19808:30;19874:34;19854:18;;;19847:62;19945:3;19925:18;;;19918:31;19966:19;;53766:56:0;19594:397:1;53766:56:0;53842:1;53601:250;-1:-1:-1;;;53601:250:0:o;53861:132::-;53919:7;53946:39;53950:1;53953;53946:39;;;;;;;;;;;;;;;;;:3;:39::i;33065:1053::-;33220:4;-1:-1:-1;;;;;33241:13:0;;8688:20;8736:8;33237:874;;33294:175;;;;;-1:-1:-1;;;;;33294:36:0;;;;;:175;;16974:10;;33388:4;;33415:7;;33445:5;;33294:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33294:175:0;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33273:783;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33656:13:0;;33652:389;;33699:108;;-1:-1:-1;;;33699:108:0;;12017:2:1;33699:108:0;;;11999:21:1;12056:2;12036:18;;;12029:30;12095:34;12075:18;;;12068:62;12166:20;12146:18;;;12139:48;12204:19;;33699:108:0;11815:414:1;33652:389:0;33991:6;33985:13;33976:6;33972:2;33968:15;33961:38;33273:783;33533:55;;33543:45;33533:55;;-1:-1:-1;33526:62:0;;33237:874;-1:-1:-1;34095:4:0;33065:1053;;;;;;:::o;56888:100::-;56940:13;56973:7;56966:14;;;;;:::i;56766:112::-;56824:13;56857;56850:20;;;;;:::i;17551:723::-;17607:13;17828:10;17824:53;;-1:-1:-1;;17855:10:0;;;;;;;;;;;;;;;;;;17551:723::o;17824:53::-;17902:5;17887:12;17943:78;17950:9;;17943:78;;17976:8;;;;:::i;:::-;;-1:-1:-1;17999:10:0;;-1:-1:-1;18007:2:0;17999:10;;:::i;:::-;;;17943:78;;;18031:19;18063:6;18053:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18053:17:0;;18031:39;;18081:154;18088:10;;18081:154;;18115:11;18125:1;18115:11;;:::i;:::-;;-1:-1:-1;18184:10:0;18192:2;18184:5;:10;:::i;:::-;18171:24;;:2;:24;:::i;:::-;18158:39;;18141:6;18148;18141:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;18212:11:0;18221:2;18212:11;;:::i;:::-;;;18081:154;;38736:589;-1:-1:-1;;;;;38942:18:0;;38938:187;;38977:40;39009:7;40152:10;:17;;40125:24;;;;:15;:24;;;;;:44;;;40180:24;;;;;;;;;;;;40048:164;38977:40;38938:187;;;39047:2;-1:-1:-1;;;;;39039:10:0;:4;-1:-1:-1;;;;;39039:10:0;;39035:90;;39066:47;39099:4;39105:7;39066:32;:47::i;:::-;-1:-1:-1;;;;;39139:16:0;;39135:183;;39172:45;39209:7;39172:36;:45::i;39135:183::-;39245:4;-1:-1:-1;;;;;39239:10:0;:2;-1:-1:-1;;;;;39239:10:0;;39235:83;;39266:40;39294:2;39298:7;39266:27;:40::i;29628:321::-;29758:18;29764:2;29768:7;29758:5;:18::i;:::-;29809:54;29840:1;29844:2;29848:7;29857:5;29809:22;:54::i;:::-;29787:154;;;;-1:-1:-1;;;29787:154:0;;12017:2:1;29787:154:0;;;11999:21:1;12056:2;12036:18;;;12029:30;12095:34;12075:18;;;12068:62;12166:20;12146:18;;;12139:48;12204:19;;29787:154:0;11815:414:1;30896:360:0;30956:13;30972:23;30987:7;30972:14;:23::i;:::-;30956:39;;31008:48;31029:5;31044:1;31048:7;31008:20;:48::i;:::-;31097:29;31114:1;31118:7;31097:8;:29::i;:::-;-1:-1:-1;;;;;31139:16:0;;;;;;:9;:16;;;;;:21;;31159:1;;31139:16;:21;;31159:1;;31139:21;:::i;:::-;;;;-1:-1:-1;;31178:16:0;;;;:7;:16;;;;;;31171:23;;;;;;31212:36;31186:7;;31178:16;-1:-1:-1;;;;;31212:36:0;;;;;31178:16;;31212:36;30945:311;30896:360;:::o;54001:278::-;54087:7;54122:12;54115:5;54107:28;;;;-1:-1:-1;;;54107:28:0;;;;;;;;:::i;:::-;-1:-1:-1;54146:9:0;54158:5;54162:1;54158;:5;:::i;:::-;54146:17;54001:278;-1:-1:-1;;;;;54001:278:0:o;40839:1002::-;41119:22;41169:1;41144:22;41161:4;41144:16;:22::i;:::-;:26;;;;:::i;:::-;41181:18;41202:26;;;:17;:26;;;;;;41119:51;;-1:-1:-1;41335:28:0;;;41331:328;;-1:-1:-1;;;;;41402:18:0;;41380:19;41402:18;;;:12;:18;;;;;;;;:34;;;;;;;;;41453:30;;;;;;:44;;;41570:30;;:17;:30;;;;;:43;;;41331:328;-1:-1:-1;41755:26:0;;;;:17;:26;;;;;;;;41748:33;;;-1:-1:-1;;;;;41799:18:0;;;;;:12;:18;;;;;:34;;;;;;;41792:41;40839:1002::o;42136:1079::-;42414:10;:17;42389:22;;42414:21;;42434:1;;42414:21;:::i;:::-;42446:18;42467:24;;;:15;:24;;;;;;42840:10;:26;;42389:46;;-1:-1:-1;42467:24:0;;42389:46;;42840:26;;;;;;:::i;:::-;;;;;;;;;42818:48;;42904:11;42879:10;42890;42879:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;42984:28;;;:15;:28;;;;;;;:41;;;43156:24;;;;;43149:31;43191:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;42207:1008;;;42136:1079;:::o;39626:221::-;39711:14;39728:20;39745:2;39728:16;:20::i;:::-;-1:-1:-1;;;;;39759:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;39804:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;39626:221:0:o;30285:382::-;-1:-1:-1;;;;;30365:16:0;;30357:61;;;;-1:-1:-1;;;30357:61:0;;18665:2:1;30357:61:0;;;18647:21:1;;;18684:18;;;18677:30;18743:34;18723:18;;;18716:62;18795:18;;30357:61:0;18463:356:1;30357:61:0;28268:4;28292:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28292:16:0;:30;30429:58;;;;-1:-1:-1;;;30429:58:0;;12843:2:1;30429:58:0;;;12825:21:1;12882:2;12862:18;;;12855:30;12921;12901:18;;;12894:58;12969:18;;30429:58:0;12641:352:1;30429:58:0;30500:45;30529:1;30533:2;30537:7;30500:20;:45::i;:::-;-1:-1:-1;;;;;30558:13:0;;;;;;:9;:13;;;;;:18;;30575:1;;30558:13;:18;;30575:1;;30558:18;:::i;:::-;;;;-1:-1:-1;;30587:16:0;;;;:7;:16;;;;;;:21;;;;-1:-1:-1;;;;;30587:21:0;;;;;;;;30626:33;;30587:16;;;30626:33;;30587:16;;30626:33;30285:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:465:1;78:5;112:18;104:6;101:30;98:56;;;134:18;;:::i;:::-;172:116;282:4;213:66;208:2;200:6;196:15;192:88;188:99;172:116;:::i;:::-;163:125;;311:6;304:5;297:21;351:3;342:6;337:3;333:16;330:25;327:45;;;368:1;365;358:12;327:45;417:6;412:3;405:4;398:5;394:16;381:43;471:1;464:4;455:6;448:5;444:18;440:29;433:40;14:465;;;;;:::o;484:196::-;552:20;;-1:-1:-1;;;;;601:54:1;;591:65;;581:93;;670:1;667;660:12;581:93;484:196;;;:::o;685:221::-;728:5;781:3;774:4;766:6;762:17;758:27;748:55;;799:1;796;789:12;748:55;821:79;896:3;887:6;874:20;867:4;859:6;855:17;821:79;:::i;911:186::-;970:6;1023:2;1011:9;1002:7;998:23;994:32;991:52;;;1039:1;1036;1029:12;991:52;1062:29;1081:9;1062:29;:::i;1102:260::-;1170:6;1178;1231:2;1219:9;1210:7;1206:23;1202:32;1199:52;;;1247:1;1244;1237:12;1199:52;1270:29;1289:9;1270:29;:::i;:::-;1260:39;;1318:38;1352:2;1341:9;1337:18;1318:38;:::i;:::-;1308:48;;1102:260;;;;;:::o;1367:328::-;1444:6;1452;1460;1513:2;1501:9;1492:7;1488:23;1484:32;1481:52;;;1529:1;1526;1519:12;1481:52;1552:29;1571:9;1552:29;:::i;:::-;1542:39;;1600:38;1634:2;1623:9;1619:18;1600:38;:::i;:::-;1590:48;;1685:2;1674:9;1670:18;1657:32;1647:42;;1367:328;;;;;:::o;1700:666::-;1795:6;1803;1811;1819;1872:3;1860:9;1851:7;1847:23;1843:33;1840:53;;;1889:1;1886;1879:12;1840:53;1912:29;1931:9;1912:29;:::i;:::-;1902:39;;1960:38;1994:2;1983:9;1979:18;1960:38;:::i;:::-;1950:48;;2045:2;2034:9;2030:18;2017:32;2007:42;;2100:2;2089:9;2085:18;2072:32;2127:18;2119:6;2116:30;2113:50;;;2159:1;2156;2149:12;2113:50;2182:22;;2235:4;2227:13;;2223:27;-1:-1:-1;2213:55:1;;2264:1;2261;2254:12;2213:55;2287:73;2352:7;2347:2;2334:16;2329:2;2325;2321:11;2287:73;:::i;:::-;2277:83;;;1700:666;;;;;;;:::o;2371:976::-;2464:6;2472;2525:2;2513:9;2504:7;2500:23;2496:32;2493:52;;;2541:1;2538;2531:12;2493:52;2564:29;2583:9;2564:29;:::i;:::-;2554:39;;2612:2;2665;2654:9;2650:18;2637:32;2692:18;2684:6;2681:30;2678:50;;;2724:1;2721;2714:12;2678:50;2747:22;;2800:4;2792:13;;2788:27;-1:-1:-1;2778:55:1;;2829:1;2826;2819:12;2778:55;2865:2;2852:16;2888:60;2904:43;2944:2;2904:43;:::i;:::-;2888:60;:::i;:::-;2970:3;2994:2;2989:3;2982:15;3022:2;3017:3;3013:12;3006:19;;3053:2;3049;3045:11;3101:7;3096:2;3090;3087:1;3083:10;3079:2;3075:19;3071:28;3068:41;3065:61;;;3122:1;3119;3112:12;3065:61;3144:1;3135:10;;3154:163;3168:2;3165:1;3162:9;3154:163;;;3225:17;;3213:30;;3186:1;3179:9;;;;;3263:12;;;;3295;;3154:163;;;3158:3;3336:5;3326:15;;;;;;;2371:976;;;;;:::o;3352:315::-;3417:6;3425;3478:2;3466:9;3457:7;3453:23;3449:32;3446:52;;;3494:1;3491;3484:12;3446:52;3517:29;3536:9;3517:29;:::i;:::-;3507:39;;3596:2;3585:9;3581:18;3568:32;3609:28;3631:5;3609:28;:::i;:::-;3656:5;3646:15;;;3352:315;;;;;:::o;3672:254::-;3740:6;3748;3801:2;3789:9;3780:7;3776:23;3772:32;3769:52;;;3817:1;3814;3807:12;3769:52;3840:29;3859:9;3840:29;:::i;:::-;3830:39;3916:2;3901:18;;;;3888:32;;-1:-1:-1;;;3672:254:1:o;3931:908::-;4015:6;4046:2;4089;4077:9;4068:7;4064:23;4060:32;4057:52;;;4105:1;4102;4095:12;4057:52;4145:9;4132:23;4178:18;4170:6;4167:30;4164:50;;;4210:1;4207;4200:12;4164:50;4233:22;;4286:4;4278:13;;4274:27;-1:-1:-1;4264:55:1;;4315:1;4312;4305:12;4264:55;4351:2;4338:16;4374:60;4390:43;4430:2;4390:43;:::i;4374:60::-;4456:3;4480:2;4475:3;4468:15;4508:2;4503:3;4499:12;4492:19;;4539:2;4535;4531:11;4587:7;4582:2;4576;4573:1;4569:10;4565:2;4561:19;4557:28;4554:41;4551:61;;;4608:1;4605;4598:12;4551:61;4630:1;4621:10;;4640:169;4654:2;4651:1;4648:9;4640:169;;;4711:23;4730:3;4711:23;:::i;:::-;4699:36;;4672:1;4665:9;;;;;4755:12;;;;4787;;4640:169;;;-1:-1:-1;4828:5:1;3931:908;-1:-1:-1;;;;;;;3931:908:1:o;4844:245::-;4911:6;4964:2;4952:9;4943:7;4939:23;4935:32;4932:52;;;4980:1;4977;4970:12;4932:52;5012:9;5006:16;5031:28;5053:5;5031:28;:::i;5094:245::-;5152:6;5205:2;5193:9;5184:7;5180:23;5176:32;5173:52;;;5221:1;5218;5211:12;5173:52;5260:9;5247:23;5279:30;5303:5;5279:30;:::i;5344:249::-;5413:6;5466:2;5454:9;5445:7;5441:23;5437:32;5434:52;;;5482:1;5479;5472:12;5434:52;5514:9;5508:16;5533:30;5557:5;5533:30;:::i;5598:322::-;5667:6;5720:2;5708:9;5699:7;5695:23;5691:32;5688:52;;;5736:1;5733;5726:12;5688:52;5776:9;5763:23;5809:18;5801:6;5798:30;5795:50;;;5841:1;5838;5831:12;5795:50;5864;5906:7;5897:6;5886:9;5882:22;5864:50;:::i;5925:272::-;5983:6;6036:2;6024:9;6015:7;6011:23;6007:32;6004:52;;;6052:1;6049;6042:12;6004:52;6091:9;6078:23;6141:6;6134:5;6130:18;6123:5;6120:29;6110:57;;6163:1;6160;6153:12;6202:180;6261:6;6314:2;6302:9;6293:7;6289:23;6285:32;6282:52;;;6330:1;6327;6320:12;6282:52;-1:-1:-1;6353:23:1;;6202:180;-1:-1:-1;6202:180:1:o;6387:184::-;6457:6;6510:2;6498:9;6489:7;6485:23;6481:32;6478:52;;;6526:1;6523;6516:12;6478:52;-1:-1:-1;6549:16:1;;6387:184;-1:-1:-1;6387:184:1:o;6576:390::-;6654:6;6662;6715:2;6703:9;6694:7;6690:23;6686:32;6683:52;;;6731:1;6728;6721:12;6683:52;6767:9;6754:23;6744:33;;6828:2;6817:9;6813:18;6800:32;6855:18;6847:6;6844:30;6841:50;;;6887:1;6884;6877:12;6841:50;6910;6952:7;6943:6;6932:9;6928:22;6910:50;:::i;:::-;6900:60;;;6576:390;;;;;:::o;6971:248::-;7039:6;7047;7100:2;7088:9;7079:7;7075:23;7071:32;7068:52;;;7116:1;7113;7106:12;7068:52;-1:-1:-1;;7139:23:1;;;7209:2;7194:18;;;7181:32;;-1:-1:-1;6971:248:1:o;7224:316::-;7265:3;7303:5;7297:12;7330:6;7325:3;7318:19;7346:63;7402:6;7395:4;7390:3;7386:14;7379:4;7372:5;7368:16;7346:63;:::i;:::-;7454:2;7442:15;7459:66;7438:88;7429:98;;;;7529:4;7425:109;;7224:316;-1:-1:-1;;7224:316:1:o;7545:664::-;7772:3;7810:6;7804:13;7826:53;7872:6;7867:3;7860:4;7852:6;7848:17;7826:53;:::i;:::-;7942:13;;7901:16;;;;7964:57;7942:13;7901:16;7998:4;7986:17;;7964:57;:::i;:::-;8088:13;;8043:20;;;8110:57;8088:13;8043:20;8144:4;8132:17;;8110:57;:::i;:::-;8183:20;;7545:664;-1:-1:-1;;;;;7545:664:1:o;8848:511::-;9042:4;-1:-1:-1;;;;;9152:2:1;9144:6;9140:15;9129:9;9122:34;9204:2;9196:6;9192:15;9187:2;9176:9;9172:18;9165:43;;9244:6;9239:2;9228:9;9224:18;9217:34;9287:3;9282:2;9271:9;9267:18;9260:31;9308:45;9348:3;9337:9;9333:19;9325:6;9308:45;:::i;:::-;9300:53;8848:511;-1:-1:-1;;;;;;8848:511:1:o;9666:632::-;9837:2;9889:21;;;9959:13;;9862:18;;;9981:22;;;9808:4;;9837:2;10060:15;;;;10034:2;10019:18;;;9808:4;10103:169;10117:6;10114:1;10111:13;10103:169;;;10178:13;;10166:26;;10247:15;;;;10212:12;;;;10139:1;10132:9;10103:169;;;-1:-1:-1;10289:3:1;;9666:632;-1:-1:-1;;;;;;9666:632:1:o;10495:219::-;10644:2;10633:9;10626:21;10607:4;10664:44;10704:2;10693:9;10689:18;10681:6;10664:44;:::i;24182:334::-;24253:2;24247:9;24309:2;24299:13;;24314:66;24295:86;24283:99;;24412:18;24397:34;;24433:22;;;24394:62;24391:88;;;24459:18;;:::i;:::-;24495:2;24488:22;24182:334;;-1:-1:-1;24182:334:1:o;24521:183::-;24581:4;24614:18;24606:6;24603:30;24600:56;;;24636:18;;:::i;:::-;-1:-1:-1;24681:1:1;24677:14;24693:4;24673:25;;24521:183::o;24709:128::-;24749:3;24780:1;24776:6;24773:1;24770:13;24767:39;;;24786:18;;:::i;:::-;-1:-1:-1;24822:9:1;;24709:128::o;24842:120::-;24882:1;24908;24898:35;;24913:18;;:::i;:::-;-1:-1:-1;24947:9:1;;24842:120::o;24967:228::-;25007:7;25133:1;25065:66;25061:74;25058:1;25055:81;25050:1;25043:9;25036:17;25032:105;25029:131;;;25140:18;;:::i;:::-;-1:-1:-1;25180:9:1;;24967:228::o;25200:125::-;25240:4;25268:1;25265;25262:8;25259:34;;;25273:18;;:::i;:::-;-1:-1:-1;25310:9:1;;25200:125::o;25330:258::-;25402:1;25412:113;25426:6;25423:1;25420:13;25412:113;;;25502:11;;;25496:18;25483:11;;;25476:39;25448:2;25441:10;25412:113;;;25543:6;25540:1;25537:13;25534:48;;;-1:-1:-1;;25578:1:1;25560:16;;25553:27;25330:258::o;25593:437::-;25672:1;25668:12;;;;25715;;;25736:61;;25790:4;25782:6;25778:17;25768:27;;25736:61;25843:2;25835:6;25832:14;25812:18;25809:38;25806:218;;;25880:77;25877:1;25870:88;25981:4;25978:1;25971:15;26009:4;26006:1;25999:15;26035:195;26074:3;26105:66;26098:5;26095:77;26092:103;;;26175:18;;:::i;:::-;-1:-1:-1;26222:1:1;26211:13;;26035:195::o;26235:112::-;26267:1;26293;26283:35;;26298:18;;:::i;:::-;-1:-1:-1;26332:9:1;;26235:112::o;26352:184::-;26404:77;26401:1;26394:88;26501:4;26498:1;26491:15;26525:4;26522:1;26515:15;26541:184;26593:77;26590:1;26583:88;26690:4;26687:1;26680:15;26714:4;26711:1;26704:15;26730:184;26782:77;26779:1;26772:88;26879:4;26876:1;26869:15;26903:4;26900:1;26893:15;26919:184;26971:77;26968:1;26961:88;27068:4;27065:1;27058:15;27092:4;27089:1;27082:15;27108:184;27160:77;27157:1;27150:88;27257:4;27254:1;27247:15;27281:4;27278:1;27271:15;27297:118;27383:5;27376:13;27369:21;27362:5;27359:32;27349:60;;27405:1;27402;27395:12;27420:177;27505:66;27498:5;27494:78;27487:5;27484:89;27474:117;;27587:1;27584;27577:12

Swarm Source

ipfs://af11389ddb91394dd43d3428e7af9c0052f6a7de7af653bffca8fa9bbfab8092
Loading