ETH Price: $3,693.50 (-6.07%)

Token

Sick Ape Society Genesis (SAS)
 

Overview

Max Total Supply

3,333 SAS

Holders

1,773

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 SAS
0xb53d9bd2a9985d822887456a0bf7eca899768fca
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
SAS

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// File: @openzeppelin/contracts/utils/Strings.sol


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

// File: erc721a/contracts/IERC721A.sol


// ERC721A Contracts v4.2.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

/**
 * @dev Interface of ERC721A.
 */
interface IERC721A {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();

    /**
     * The caller cannot approve to their own address.
     */
    error ApproveToCaller();

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the
     * ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();

    /**
     * The `quantity` minted with ERC2309 exceeds the safety limit.
     */
    error MintERC2309QuantityExceedsLimit();

    /**
     * The `extraData` cannot be set on an unintialized ownership slot.
     */
    error OwnershipNotInitializedForExtraData();

    // =============================================================
    //                            STRUCTS
    // =============================================================

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Stores the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
        // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}.
        uint24 extraData;
    }

    // =============================================================
    //                         TOKEN COUNTERS
    // =============================================================

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see {_totalMinted}.
     */
    function totalSupply() external view returns (uint256);

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);

    // =============================================================
    //                            IERC721
    // =============================================================

    /**
     * @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,
        bytes calldata data
    ) external;

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` 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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

    // =============================================================
    //                        IERC721Metadata
    // =============================================================

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

    // =============================================================
    //                           IERC2309
    // =============================================================

    /**
     * @dev Emitted when tokens in `fromTokenId` to `toTokenId`
     * (inclusive) is transferred from `from` to `to`, as defined in the
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard.
     *
     * See {_mintERC2309} for more details.
     */
    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}

// File: erc721a/contracts/ERC721A.sol


// ERC721A Contracts v4.2.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;


/**
 * @dev Interface of ERC721 token receiver.
 */
interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

/**
 * @title ERC721A
 *
 * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721)
 * Non-Fungible Token Standard, including the Metadata extension.
 * Optimized for lower gas during batch mints.
 *
 * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...)
 * starting from `_startTokenId()`.
 *
 * Assumptions:
 *
 * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // Reference type for token approval.
    struct TokenApprovalRef {
        address value;
    }

    // =============================================================
    //                           CONSTANTS
    // =============================================================

    // Mask of an entry in packed address data.
    uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

    // The bit position of `numberMinted` in packed address data.
    uint256 private constant _BITPOS_NUMBER_MINTED = 64;

    // The bit position of `numberBurned` in packed address data.
    uint256 private constant _BITPOS_NUMBER_BURNED = 128;

    // The bit position of `aux` in packed address data.
    uint256 private constant _BITPOS_AUX = 192;

    // Mask of all 256 bits in packed address data except the 64 bits for `aux`.
    uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;

    // The bit position of `startTimestamp` in packed ownership.
    uint256 private constant _BITPOS_START_TIMESTAMP = 160;

    // The bit mask of the `burned` bit in packed ownership.
    uint256 private constant _BITMASK_BURNED = 1 << 224;

    // The bit position of the `nextInitialized` bit in packed ownership.
    uint256 private constant _BITPOS_NEXT_INITIALIZED = 225;

    // The bit mask of the `nextInitialized` bit in packed ownership.
    uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225;

    // The bit position of `extraData` in packed ownership.
    uint256 private constant _BITPOS_EXTRA_DATA = 232;

    // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`.
    uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;

    // The mask of the lower 160 bits for addresses.
    uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1;

    // The maximum `quantity` that can be minted with {_mintERC2309}.
    // This limit is to prevent overflows on the address data entries.
    // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309}
    // is required to cause an overflow, which is unrealistic.
    uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;

    // The `Transfer` event signature is given by:
    // `keccak256(bytes("Transfer(address,address,uint256)"))`.
    bytes32 private constant _TRANSFER_EVENT_SIGNATURE =
        0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;

    // =============================================================
    //                            STORAGE
    // =============================================================

    // The next token ID to be minted.
    uint256 private _currentIndex;

    // The number of tokens burned.
    uint256 private _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned.
    // See {_packedOwnershipOf} implementation for details.
    //
    // Bits Layout:
    // - [0..159]   `addr`
    // - [160..223] `startTimestamp`
    // - [224]      `burned`
    // - [225]      `nextInitialized`
    // - [232..255] `extraData`
    mapping(uint256 => uint256) private _packedOwnerships;

    // Mapping owner address to address data.
    //
    // Bits Layout:
    // - [0..63]    `balance`
    // - [64..127]  `numberMinted`
    // - [128..191] `numberBurned`
    // - [192..255] `aux`
    mapping(address => uint256) private _packedAddressData;

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

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

    // =============================================================
    //                          CONSTRUCTOR
    // =============================================================

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

    // =============================================================
    //                   TOKEN COUNTING OPERATIONS
    // =============================================================

    /**
     * @dev Returns the starting token ID.
     * To change the starting token ID, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Returns the next token ID to be minted.
     */
    function _nextTokenId() internal view virtual returns (uint256) {
        return _currentIndex;
    }

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see {_totalMinted}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than `_currentIndex - _startTokenId()` times.
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * @dev Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view virtual returns (uint256) {
        // Counter underflow is impossible as `_currentIndex` does not decrement,
        // and it is initialized to `_startTokenId()`.
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @dev Returns the total number of tokens burned.
     */
    function _totalBurned() internal view virtual returns (uint256) {
        return _burnCounter;
    }

    // =============================================================
    //                    ADDRESS DATA OPERATIONS
    // =============================================================

    /**
     * @dev Returns the number of tokens in `owner`'s account.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return uint64(_packedAddressData[owner] >> _BITPOS_AUX);
    }

    /**
     * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal virtual {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        // Cast `aux` with assembly to avoid redundant masking.
        assembly {
            auxCasted := aux
        }
        packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        // The interface IDs are constants representing the first 4 bytes
        // of the XOR of all function selectors in the interface.
        // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165)
        // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`)
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

    // =============================================================
    //                        IERC721Metadata
    // =============================================================

    /**
     * @dev Returns the token collection name.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

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

    // =============================================================
    //                     OWNERSHIPS OPERATIONS
    // =============================================================

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

    /**
     * @dev Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around over time.
     */
    function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }

    /**
     * @dev Returns the unpacked `TokenOwnership` struct at `index`.
     */
    function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnerships[index]);
    }

    /**
     * @dev Initializes the ownership slot minted at `index` for efficiency purposes.
     */
    function _initializeOwnershipAt(uint256 index) internal virtual {
        if (_packedOwnerships[index] == 0) {
            _packedOwnerships[index] = _packedOwnershipOf(index);
        }
    }

    /**
     * Returns the packed ownership data of `tokenId`.
     */
    function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & _BITMASK_BURNED == 0) {
                        // Invariant:
                        // There will always be an initialized ownership slot
                        // (i.e. `ownership.addr != address(0) && ownership.burned == false`)
                        // before an unintialized ownership slot
                        // (i.e. `ownership.addr == address(0) && ownership.burned == false`)
                        // Hence, `curr` will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed will be zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev Returns the unpacked `TokenOwnership` struct from `packed`.
     */
    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP);
        ownership.burned = packed & _BITMASK_BURNED != 0;
        ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA);
    }

    /**
     * @dev Packs ownership data into a single uint256.
     */
    function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`.
            result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags))
        }
    }

    /**
     * @dev Returns the `nextInitialized` flag set if `quantity` equals 1.
     */
    function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) {
        // For branchless setting of the `nextInitialized` flag.
        assembly {
            // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`.
            result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1))
        }
    }

    // =============================================================
    //                      APPROVAL OPERATIONS
    // =============================================================

    /**
     * @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) public virtual override {
        address owner = ownerOf(tokenId);

        if (_msgSenderERC721A() != owner)
            if (!isApprovedForAll(owner, _msgSenderERC721A())) {
                revert ApprovalCallerNotOwnerNorApproved();
            }

        _tokenApprovals[tokenId].value = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId].value;
    }

    /**
     * @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) public virtual override {
        if (operator == _msgSenderERC721A()) revert ApproveToCaller();

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

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

    /**
     * @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. See {_mint}.
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned.
    }

    /**
     * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`.
     */
    function _isSenderApprovedOrOwner(
        address approvedAddress,
        address owner,
        address msgSender
    ) private pure returns (bool result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean.
            msgSender := and(msgSender, _BITMASK_ADDRESS)
            // `msgSender == owner || msgSender == approvedAddress`.
            result := or(eq(msgSender, owner), eq(msgSender, approvedAddress))
        }
    }

    /**
     * @dev Returns the storage slot and value for the approved address of `tokenId`.
     */
    function _getApprovedSlotAndAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId];
        // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`.
        assembly {
            approvedAddressSlot := tokenApproval.slot
            approvedAddress := sload(approvedAddressSlot)
        }
    }

    // =============================================================
    //                      TRANSFER OPERATIONS
    // =============================================================

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) public virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner();

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);

        // The nested ifs save around 20+ gas over a compound boolean condition.
        if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
            if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();

        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256.
        unchecked {
            // We can directly increment and decrement the balances.
            --_packedAddressData[from]; // Updates: `balance -= 1`.
            ++_packedAddressData[to]; // Updates: `balance += 1`.

            // Updates:
            // - `address` to the next owner.
            // - `startTimestamp` to the timestamp of transfering.
            // - `burned` to `false`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                to,
                _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked)
            );

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

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

    /**
     * @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 memory _data
    ) public virtual override {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token IDs
     * are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * `startTokenId` - the first token ID to be transferred.
     * `quantity` - the amount to be transferred.
     *
     * 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, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token IDs
     * have been transferred. This includes minting.
     * And also called after one token has been burned.
     *
     * `startTokenId` - the first token ID to be transferred.
     * `quantity` - the amount to be transferred.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * `from` - Previous owner of the given token ID.
     * `to` - Target address that will receive the token.
     * `tokenId` - Token ID to be transferred.
     * `_data` - Optional data to send along with the call.
     *
     * Returns whether the call correctly returned the expected magic value.
     */
    function _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
            bytes4 retval
        ) {
            return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    // =============================================================
    //                        MINT OPERATIONS
    // =============================================================

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _mint(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // `balance` and `numberMinted` have a maximum limit of 2**64.
        // `tokenId` has a maximum limit of 2**256.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            uint256 toMasked;
            uint256 end = startTokenId + quantity;

            // Use assembly to loop and emit the `Transfer` event for gas savings.
            assembly {
                // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
                toMasked := and(to, _BITMASK_ADDRESS)
                // Emit the `Transfer` event.
                log4(
                    0, // Start of data (0, since no data).
                    0, // End of data (0, since no data).
                    _TRANSFER_EVENT_SIGNATURE, // Signature.
                    0, // `address(0)`.
                    toMasked, // `to`.
                    startTokenId // `tokenId`.
                )

                for {
                    let tokenId := add(startTokenId, 1)
                } iszero(eq(tokenId, end)) {
                    tokenId := add(tokenId, 1)
                } {
                    // Emit the `Transfer` event. Similar to above.
                    log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
                }
            }
            if (toMasked == 0) revert MintToZeroAddress();

            _currentIndex = end;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * This function is intended for efficient minting only during contract creation.
     *
     * It emits only one {ConsecutiveTransfer} as defined in
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309),
     * instead of a sequence of {Transfer} event(s).
     *
     * Calling this function outside of contract creation WILL make your contract
     * non-compliant with the ERC721 standard.
     * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309
     * {ConsecutiveTransfer} event is only permissible during contract creation.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {ConsecutiveTransfer} event.
     */
    function _mintERC2309(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();
        if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are unrealistic due to the above check for `quantity` to be below the limit.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to);

            _currentIndex = startTokenId + quantity;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement
     * {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * See {_mint}.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal virtual {
        _mint(to, quantity);

        unchecked {
            if (to.code.length != 0) {
                uint256 end = _currentIndex;
                uint256 index = end - quantity;
                do {
                    if (!_checkContractOnERC721Received(address(0), to, index++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (index < end);
                // Reentrancy protection.
                if (_currentIndex != end) revert();
            }
        }
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal virtual {
        _safeMint(to, quantity, '');
    }

    // =============================================================
    //                        BURN OPERATIONS
    // =============================================================

    /**
     * @dev Equivalent to `_burn(tokenId, false)`.
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

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

        address from = address(uint160(prevOwnershipPacked));

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);

        if (approvalCheck) {
            // The nested ifs save around 20+ gas over a compound boolean condition.
            if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
                if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256.
        unchecked {
            // Updates:
            // - `balance -= 1`.
            // - `numberBurned += 1`.
            //
            // We can directly decrement the balance, and increment the number burned.
            // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`.
            _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1;

            // Updates:
            // - `address` to the last owner.
            // - `startTimestamp` to the timestamp of burning.
            // - `burned` to `true`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                from,
                (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked)
            );

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

    // =============================================================
    //                     EXTRA DATA OPERATIONS
    // =============================================================

    /**
     * @dev Directly sets the extra data for the ownership data `index`.
     */
    function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual {
        uint256 packed = _packedOwnerships[index];
        if (packed == 0) revert OwnershipNotInitializedForExtraData();
        uint256 extraDataCasted;
        // Cast `extraData` with assembly to avoid redundant masking.
        assembly {
            extraDataCasted := extraData
        }
        packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA);
        _packedOwnerships[index] = packed;
    }

    /**
     * @dev Called during each token transfer to set the 24bit `extraData` field.
     * Intended to be overridden by the cosumer contract.
     *
     * `previousExtraData` - the value of `extraData` before transfer.
     *
     * 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, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

    /**
     * @dev Returns the next extra data for the packed ownership data.
     * The returned result is shifted into position.
     */
    function _nextExtraData(
        address from,
        address to,
        uint256 prevOwnershipPacked
    ) private view returns (uint256) {
        uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA);
        return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA;
    }

    // =============================================================
    //                       OTHER OPERATIONS
    // =============================================================

    /**
     * @dev Returns the message sender (defaults to `msg.sender`).
     *
     * If you are writing GSN compatible contracts, you need to override this function.
     */
    function _msgSenderERC721A() internal view virtual returns (address) {
        return msg.sender;
    }

    /**
     * @dev Converts a uint256 to its ASCII string decimal representation.
     */
    function _toString(uint256 value) internal pure virtual returns (string memory ptr) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit),
            // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged.
            // We will need 1 32-byte word to store the length,
            // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128.
            ptr := add(mload(0x40), 128)
            // Update the free memory pointer to allocate.
            mstore(0x40, ptr)

            // Cache the end of the memory to calculate the length later.
            let end := ptr

            // We write the string from the rightmost digit to the leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // Costs a bit more than early returning for the zero case,
            // but cheaper in terms of deployment and overall runtime costs.
            for {
                // Initialize and perform the first pass without check.
                let temp := value
                // Move the pointer 1 byte leftwards to point to an empty character slot.
                ptr := sub(ptr, 1)
                // Write the character to the pointer.
                // The ASCII index of the '0' character is 48.
                mstore8(ptr, add(48, mod(temp, 10)))
                temp := div(temp, 10)
            } temp {
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
            } {
                // Body of the for loop.
                ptr := sub(ptr, 1)
                mstore8(ptr, add(48, mod(temp, 10)))
            }

            let length := sub(end, ptr)
            // Move the pointer 32 bytes leftwards to make room for the length.
            ptr := sub(ptr, 32)
            // Store the length.
            mstore(ptr, length)
        }
    }
}

// File: contracts/SAS.sol



pragma solidity >=0.8.5 <0.9.0;





contract SAS is ERC721A{
   
    uint all_count_mint;
    uint free_mint;

     address public address_contract;
     address public owner;

    string public baseTokenURI;

    address[] public WhiteList1;
    bool public WL_Toggle;
  
    address constant walet1 = 0x9b768BD523cD6d7586372fd61acc4F2f31b03c3A;
    address constant walet2 = 0x015d10BFC02ca5BE6325aebaEbB0ee732Ea11ae9;

    bool is_freeMint;
    bool is_mint;

    uint256 price = 0.05 ether;

    mapping(address => uint) public checker_count_mint;
    mapping(address => uint) public checker_count_claim;

    constructor() ERC721A("Sick Ape Society Genesis", "SAS"){
       address_contract = address(this);
       owner = msg.sender;
       all_count_mint = 3200;
       free_mint = 1800;
      
    }

    string newURI;

    function pay() public payable{
            
    }

    function SetNewURI(string memory _NewURI ) public checker_Owner(){
        newURI = _NewURI;
    } 

    function set_balance() public view returns(uint){
        return address_contract.balance;
    } 

    function get_address_owner() public view returns(address){
        return owner;
    } 

    function get_address_contract() public view returns(address){
        return address_contract;
    } 

     function get_isMint() public view returns(bool){
        return is_mint;
    } 

      function get_isFreeMint() public view returns(bool){
        return is_freeMint;
    } 

     function get_price() public view returns(uint){
        return price;
    }

    function get_count_mint() public view returns(uint){
        return all_count_mint;
    }

    function get_count_fREEmint() public view returns(uint){
        return free_mint;
    }

    function _baseURI() internal view virtual override returns (string memory) {
    return baseTokenURI;
  }
  
   function checker_count_mint1() public view returns(uint){
        return checker_count_mint[msg.sender];
    }

    function checker_count_claim1() public view returns(uint){
        return checker_count_claim[msg.sender];
    }

    function WL_Toggle_C() public checker_Owner(){
        WL_Toggle = !WL_Toggle;
    }

    function setBaseTokenURI(string memory _baseTokenURI) public checker_Owner(){
    baseTokenURI = _baseTokenURI;
    }
    
    function Splitter() public checker_Owner(){
        address payable walet1_2 = payable(walet1);
        address payable walet2_2 = payable(walet2);

        address payable address_contract_2 = payable(address_contract);

        walet1_2.transfer(address_contract_2.balance/2);
        walet2_2.transfer(address_contract_2.balance);
    }

    function Mint(uint256 count_mint1) public payable{

        require(is_mint == true, "Sale not started");
        require(msg.value == price * count_mint1, "No ETH");
        require(all_count_mint >=1, "No count");
        require(count_mint1 <= 3, "Max mint 3" );
        require(checker_count_mint[msg.sender] + count_mint1 <=3, "Unlimit mint");

       
       _mint(msg.sender,count_mint1);
     

        all_count_mint -= count_mint1;

        checker_count_mint[msg.sender] = checker_count_mint[msg.sender] + count_mint1;
    }

    function Claim(uint256 count_mint) public  {

        if (is_freeMint == true || WL_Toggle == true ){

            if (is_freeMint == false || WL_Toggle == true){
                if (checker_address_FreeMint() == false)
                revert("address not WL");
                
            }

        require(all_count_mint >=1, "No count");
        require(free_mint >=1, "No count");
        require(count_mint <= 1, "Max mint 1" );
        require(checker_count_claim[msg.sender] + count_mint <=1, "Unlimit claim");
       
      
        _mint(msg.sender,count_mint);
        

        
        free_mint -= count_mint;

         checker_count_claim[msg.sender] = checker_count_claim[msg.sender] + count_mint;
        }

        else revert("Sale not started");
      
    }

    
    

    function Set_Price(uint256 new_price) public checker_Owner(){
            price = new_price;
    }

    function Free_sale_Toggle() public checker_Owner(){
        is_freeMint =! is_freeMint;
    }

    function Mint_Toggle() public checker_Owner(){
        is_mint =! is_mint;
    }

    function Owner_Mint(uint256 count) public checker_Owner() { 

        uint256 count2 = count;

        if (count > free_mint){
            
            count2 -=free_mint;
            free_mint = 0;
            all_count_mint -=count2;

        }
        else{
            free_mint -=count2;
        }

          _mint(msg.sender,count);
    }

    function checker_address_FreeMint() public view returns (bool){
         
         for(uint i = 0; i < WhiteList1.length; i++) {
             if(msg.sender == WhiteList1[i])
             return true;
         }
        return false;
    }
    
    modifier checker_Owner(){
        require(owner == msg.sender,"You not owner");
        _;
    }

   function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        return string(string(abi.encodePacked(newURI, 
        Strings.toString(tokenId),
        ".json")));

        
    }
    

    function AddAddress(address[] memory adr) public checker_Owner{
        
         for(uint i = 0; i < adr.length; i++) {
             WhiteList1.push(adr[i]);
         }

    }

    function setURI(string memory newuri) public checker_Owner {
        setURI(newuri);
    }

    function  arrayOfTokenIDs(address user) view public returns (uint256[] memory) {
         uint[] memory arrayID = new uint[](balanceOf(user));
         uint16  a=0;
        for (uint256 i=0;i<totalSupply();i++){
            if (ownerOf(i)==user){
                arrayID[a]=i;
                a++;
            }
        }
        return (arrayID);
    }

    function arrayOfNftHolders (uint number) view public returns (address[] memory) {
        
        address [] memory arrayOfIDHolders = new address[](totalSupply());
        address [] memory arrayOfHolders = new address[](totalSupply());
        for (uint i=0;i<totalSupply();i++){
               arrayOfIDHolders[i]=ownerOf(i);
        }

        uint nmb;
        for (uint i=0;i<totalSupply();i++) {
            uint cnter=0;
            for (uint a=i;a<totalSupply();a++){
                if (arrayOfIDHolders[a]==arrayOfIDHolders[i]){
                    cnter++;
                }
            } 
            if (cnter==1){
                arrayOfHolders[nmb]=arrayOfIDHolders[i];
                nmb++;
            }
        }
        address [] memory finalARRAY = new address[](nmb);
        for (uint i=0;i<nmb;i++) {
            finalARRAY[i]=arrayOfHolders[i];
        }


        return finalARRAY;
    }
    
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address[]","name":"adr","type":"address[]"}],"name":"AddAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count_mint","type":"uint256"}],"name":"Claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"Free_sale_Toggle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count_mint1","type":"uint256"}],"name":"Mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"Mint_Toggle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"Owner_Mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_NewURI","type":"string"}],"name":"SetNewURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"new_price","type":"uint256"}],"name":"Set_Price","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"Splitter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"WL_Toggle","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WL_Toggle_C","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"WhiteList1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"address_contract","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"uint256","name":"number","type":"uint256"}],"name":"arrayOfNftHolders","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"arrayOfTokenIDs","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checker_address_FreeMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"checker_count_claim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checker_count_claim1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"checker_count_mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checker_count_mint1","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":[],"name":"get_address_contract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"get_address_owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"get_count_fREEmint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"get_count_mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"get_isFreeMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"get_isMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"get_price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pay","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseTokenURI","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newuri","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"set_balance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"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"}]

608060405266b1a2bc2ec50000600f553480156200001c57600080fd5b506040518060400160405280601881526020017f5369636b2041706520536f63696574792047656e6573697300000000000000008152506040518060400160405280600381526020017f53415300000000000000000000000000000000000000000000000000000000008152508160029080519060200190620000a192919062000172565b508060039080519060200190620000ba92919062000172565b50620000cb6200016d60201b60201c565b600081905550505030600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610c8060088190555061070860098190555062000287565b600090565b828054620001809062000222565b90600052602060002090601f016020900481019282620001a45760008555620001f0565b82601f10620001bf57805160ff1916838001178555620001f0565b82800160010185558215620001f0579182015b82811115620001ef578251825591602001919060010190620001d2565b5b509050620001ff919062000203565b5090565b5b808211156200021e57600081600090555060010162000204565b5090565b600060028204905060018216806200023b57607f821691505b6020821081141562000252576200025162000258565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61448880620002976000396000f3fe6080604052600436106102885760003560e01c8063644738f41161015a578063a22cb465116100c1578063d547cfb71161007a578063d547cfb714610990578063d9d2d058146109bb578063e55bc837146109d2578063e985e9c514610a0f578063efd4064f14610a4c578063fdf53ad014610a8957610288565b8063a22cb46514610884578063aeed77f3146108ad578063b88d4fde146108d6578063bff810b2146108ff578063c87b56dd14610928578063d1e286841461096557610288565b806381b1b2851161011357806381b1b285146107705780638da5cb5b1461079b5780638fd18834146107c657806394eeb5f5146107f157806395d89b411461081c5780639a87d6ff1461084757610288565b8063644738f41461064c5780636c3d81141461068957806370a08231146106b457806373b504cd146106f15780637b1187661461071c5780637bb2b3c11461074757610288565b806322e5ad51116101fe5780633eea646b116101b75780633eea646b1461053c578063408cbf841461056757806342842e0e146105925780634f77b6c8146105bb5780636124a2d0146105e65780636352211e1461060f57610288565b806322e5ad511461044057806323b872dd1461046b5780632a2a9681146104945780632c4b5586146104ab57806330176e13146104d65780633c0be637146104ff57610288565b8063095ea7b311610250578063095ea7b31461037757806311f37ceb146103a05780631797bd90146103cb57806318160ddd146103e25780631b9265b81461040d5780631f5ca1ed1461041757610288565b806301ffc9a71461028d57806302fe5305146102ca57806306fdde03146102f3578063078837031461031e578063081812fc1461033a575b600080fd5b34801561029957600080fd5b506102b460048036038101906102af9190613610565b610aa0565b6040516102c19190613b71565b60405180910390f35b3480156102d657600080fd5b506102f160048036038101906102ec919061366a565b610b32565b005b3480156102ff57600080fd5b50610308610bce565b6040516103159190613b8c565b60405180910390f35b610338600480360381019061033391906136b3565b610c60565b005b34801561034657600080fd5b50610361600480360381019061035c91906136b3565b610ed1565b60405161036e9190613ac6565b60405180910390f35b34801561038357600080fd5b5061039e60048036038101906103999190613587565b610f50565b005b3480156103ac57600080fd5b506103b5611094565b6040516103c29190613cce565b60405180910390f35b3480156103d757600080fd5b506103e061109e565b005b3480156103ee57600080fd5b506103f761115a565b6040516104049190613cce565b60405180910390f35b610415611171565b005b34801561042357600080fd5b5061043e600480360381019061043991906136b3565b611173565b005b34801561044c57600080fd5b50610455611270565b6040516104629190613ac6565b60405180910390f35b34801561047757600080fd5b50610492600480360381019061048d9190613471565b61129a565b005b3480156104a057600080fd5b506104a96115bf565b005b3480156104b757600080fd5b506104c061167b565b6040516104cd9190613cce565b60405180910390f35b3480156104e257600080fd5b506104fd60048036038101906104f8919061366a565b6116bc565b005b34801561050b57600080fd5b5061052660048036038101906105219190613404565b611766565b6040516105339190613b4f565b60405180910390f35b34801561054857600080fd5b5061055161185d565b60405161055e9190613cce565b60405180910390f35b34801561057357600080fd5b5061057c611867565b6040516105899190613b71565b60405180910390f35b34801561059e57600080fd5b506105b960048036038101906105b49190613471565b61187e565b005b3480156105c757600080fd5b506105d061189e565b6040516105dd9190613cce565b60405180910390f35b3480156105f257600080fd5b5061060d600480360381019061060891906135c7565b6118e5565b005b34801561061b57600080fd5b50610636600480360381019061063191906136b3565b611a15565b6040516106439190613ac6565b60405180910390f35b34801561065857600080fd5b50610673600480360381019061066e9190613404565b611a27565b6040516106809190613cce565b60405180910390f35b34801561069557600080fd5b5061069e611a3f565b6040516106ab9190613b71565b60405180910390f35b3480156106c057600080fd5b506106db60048036038101906106d69190613404565b611a56565b6040516106e89190613cce565b60405180910390f35b3480156106fd57600080fd5b50610706611b0f565b6040516107139190613cce565b60405180910390f35b34801561072857600080fd5b50610731611b19565b60405161073e9190613b71565b60405180910390f35b34801561075357600080fd5b5061076e600480360381019061076991906136b3565b611b2c565b005b34801561077c57600080fd5b50610785611e42565b6040516107929190613ac6565b60405180910390f35b3480156107a757600080fd5b506107b0611e6c565b6040516107bd9190613ac6565b60405180910390f35b3480156107d257600080fd5b506107db611e92565b6040516107e89190613b71565b60405180910390f35b3480156107fd57600080fd5b50610806611f3f565b6040516108139190613ac6565b60405180910390f35b34801561082857600080fd5b50610831611f65565b60405161083e9190613b8c565b60405180910390f35b34801561085357600080fd5b5061086e60048036038101906108699190613404565b611ff7565b60405161087b9190613cce565b60405180910390f35b34801561089057600080fd5b506108ab60048036038101906108a69190613547565b61200f565b005b3480156108b957600080fd5b506108d460048036038101906108cf919061366a565b612187565b005b3480156108e257600080fd5b506108fd60048036038101906108f891906134c4565b612231565b005b34801561090b57600080fd5b50610926600480360381019061092191906136b3565b6122a4565b005b34801561093457600080fd5b5061094f600480360381019061094a91906136b3565b61233e565b60405161095c9190613b8c565b60405180910390f35b34801561097157600080fd5b5061097a612372565b6040516109879190613cce565b60405180910390f35b34801561099c57600080fd5b506109a56123b9565b6040516109b29190613b8c565b60405180910390f35b3480156109c757600080fd5b506109d0612447565b005b3480156109de57600080fd5b506109f960048036038101906109f491906136b3565b6125fd565b604051610a069190613ac6565b60405180910390f35b348015610a1b57600080fd5b50610a366004803603810190610a319190613431565b61263c565b604051610a439190613b71565b60405180910390f35b348015610a5857600080fd5b50610a736004803603810190610a6e91906136b3565b6126d0565b604051610a809190613b2d565b60405180910390f35b348015610a9557600080fd5b50610a9e612a23565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610afb57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b2b5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b3373ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610bc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb990613bce565b60405180910390fd5b610bcb81610b32565b50565b606060028054610bdd9061403f565b80601f0160208091040260200160405190810160405280929190818152602001828054610c099061403f565b8015610c565780601f10610c2b57610100808354040283529160200191610c56565b820191906000526020600020905b815481529060010190602001808311610c3957829003601f168201915b5050505050905090565b60011515600e60029054906101000a900460ff16151514610cb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cad90613c0e565b60405180910390fd5b80600f54610cc49190613eed565b3414610d05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfc90613bae565b60405180910390fd5b60016008541015610d4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4290613c4e565b60405180910390fd5b6003811115610d8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8690613cae565b60405180910390fd5b600381601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610ddc9190613e66565b1115610e1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1490613bee565b60405180910390fd5b610e273382612adf565b8060086000828254610e399190613f47565b9250508190555080601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610e8b9190613e66565b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b6000610edc82612c9c565b610f12576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610f5b82611a15565b90508073ffffffffffffffffffffffffffffffffffffffff16610f7c612cfb565b73ffffffffffffffffffffffffffffffffffffffff1614610fdf57610fa881610fa3612cfb565b61263c565b610fde576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000600f54905090565b3373ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461112e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112590613bce565b60405180910390fd5b600e60019054906101000a900460ff1615600e60016101000a81548160ff021916908315150217905550565b6000611164612d03565b6001546000540303905090565b565b3373ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611203576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111fa90613bce565b60405180910390fd5b600081905060095482111561124857600954816112209190613f47565b90506000600981905550806008600082825461123c9190613f47565b92505081905550611262565b806009600082825461125a9190613f47565b925050819055505b61126c3383612adf565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006112a582612d08565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461130c576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061131884612dd6565b9150915061132e8187611329612cfb565b612dfd565b61137a576113438661133e612cfb565b61263c565b611379576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156113e1576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113ee8686866001612e41565b80156113f957600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506114c7856114a3888887612e47565b7c020000000000000000000000000000000000000000000000000000000017612e6f565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416141561154f57600060018501905060006004600083815260200190815260200160002054141561154d57600054811461154c578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46115b78686866001612e9a565b505050505050565b3373ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461164f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164690613bce565b60405180910390fd5b600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1631905090565b3373ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461174c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174390613bce565b60405180910390fd5b80600c908051906020019061176292919061317a565b5050565b6060600061177383611a56565b67ffffffffffffffff81111561178c5761178b614203565b5b6040519080825280602002602001820160405280156117ba5781602001602082028036833780820191505090505b5090506000805b6117c961115a565b811015611852578473ffffffffffffffffffffffffffffffffffffffff166117f082611a15565b73ffffffffffffffffffffffffffffffffffffffff16141561183f5780838361ffff1681518110611824576118236141d4565b5b602002602001018181525050818061183b906140a2565b9250505b808061184a906140cd565b9150506117c1565b508192505050919050565b6000600954905090565b6000600e60019054906101000a900460ff16905090565b61189983838360405180602001604052806000815250612231565b505050565b6000601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905090565b3373ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611975576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196c90613bce565b60405180910390fd5b60005b8151811015611a1157600d828281518110611996576119956141d4565b5b60200260200101519080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508080611a09906140cd565b915050611978565b5050565b6000611a2082612d08565b9050919050565b60106020528060005260406000206000915090505481565b6000600e60029054906101000a900460ff16905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611abe576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6000600854905090565b600e60009054906101000a900460ff1681565b60011515600e60019054906101000a900460ff1615151480611b61575060011515600e60009054906101000a900460ff161515145b15611e045760001515600e60019054906101000a900460ff1615151480611b9b575060011515600e60009054906101000a900460ff161515145b15611bf05760001515611bac611e92565b15151415611bef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be690613c8e565b60405180910390fd5b5b60016008541015611c36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2d90613c4e565b60405180910390fd5b60016009541015611c7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7390613c4e565b60405180910390fd5b6001811115611cc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb790613c6e565b60405180910390fd5b600181601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d0d9190613e66565b1115611d4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4590613c2e565b60405180910390fd5b611d583382612adf565b8060096000828254611d6a9190613f47565b9250508190555080601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611dbc9190613e66565b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611e3f565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3690613c0e565b60405180910390fd5b50565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600090505b600d80549050811015611f3657600d8181548110611ebb57611eba6141d4565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415611f23576001915050611f3c565b8080611f2e906140cd565b915050611e9a565b50600090505b90565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060038054611f749061403f565b80601f0160208091040260200160405190810160405280929190818152602001828054611fa09061403f565b8015611fed5780601f10611fc257610100808354040283529160200191611fed565b820191906000526020600020905b815481529060010190602001808311611fd057829003601f168201915b5050505050905090565b60116020528060005260406000206000915090505481565b612017612cfb565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561207c576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000612089612cfb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612136612cfb565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161217b9190613b71565b60405180910390a35050565b3373ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612217576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220e90613bce565b60405180910390fd5b806012908051906020019061222d92919061317a565b5050565b61223c84848461129a565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461229e5761226784848484612ea0565b61229d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b3373ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612334576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232b90613bce565b60405180910390fd5b80600f8190555050565b6060601261234b83613000565b60405160200161235c929190613a97565b6040516020818303038152906040529050919050565b6000601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905090565b600c80546123c69061403f565b80601f01602080910402602001604051908101604052809291908181526020018280546123f29061403f565b801561243f5780601f106124145761010080835404028352916020019161243f565b820191906000526020600020905b81548152906001019060200180831161242257829003601f168201915b505050505081565b3373ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146124d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ce90613bce565b60405180910390fd5b6000739b768bd523cd6d7586372fd61acc4f2f31b03c3a9050600073015d10bfc02ca5be6325aebaebb0ee732ea11ae990506000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508273ffffffffffffffffffffffffffffffffffffffff166108fc60028373ffffffffffffffffffffffffffffffffffffffff163161256e9190613ebc565b9081150290604051600060405180830381858888f19350505050158015612599573d6000803e3d6000fd5b508173ffffffffffffffffffffffffffffffffffffffff166108fc8273ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f193505050501580156125f7573d6000803e3d6000fd5b50505050565b600d818154811061260d57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060006126dc61115a565b67ffffffffffffffff8111156126f5576126f4614203565b5b6040519080825280602002602001820160405280156127235781602001602082028036833780820191505090505b509050600061273061115a565b67ffffffffffffffff81111561274957612748614203565b5b6040519080825280602002602001820160405280156127775781602001602082028036833780820191505090505b50905060005b61278561115a565b8110156127f55761279581611a15565b8382815181106127a8576127a76141d4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505080806127ed906140cd565b91505061277d565b50600080600090505b61280661115a565b811015612942576000808290505b61281c61115a565b8110156128ad57858381518110612836576128356141d4565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16868281518110612867576128666141d4565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16141561289a578180612896906140cd565b9250505b80806128a5906140cd565b915050612814565b50600181141561292e578482815181106128ca576128c96141d4565b5b60200260200101518484815181106128e5576128e46141d4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050828061292a906140cd565b9350505b50808061293a906140cd565b9150506127fe565b5060008167ffffffffffffffff81111561295f5761295e614203565b5b60405190808252806020026020018201604052801561298d5781602001602082028036833780820191505090505b50905060005b82811015612a16578381815181106129ae576129ad6141d4565b5b60200260200101518282815181106129c9576129c86141d4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080612a0e906140cd565b915050612993565b5080945050505050919050565b3373ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612ab3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aaa90613bce565b60405180910390fd5b600e60029054906101000a900460ff1615600e60026101000a81548160ff021916908315150217905550565b6000805490506000821415612b20576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612b2d6000848385612e41565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612ba483612b956000866000612e47565b612b9e85613161565b17612e6f565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114612c4557808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612c0a565b506000821415612c81576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050612c976000848385612e9a565b505050565b600081612ca7612d03565b11158015612cb6575060005482105b8015612cf4575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b60008082905080612d17612d03565b11612d9f57600054811015612d9e5760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415612d9c575b6000811415612d92576004600083600190039350838152602001908152602001600020549050612d67565b8092505050612dd1565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8612e5e868684613171565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612ec6612cfb565b8786866040518563ffffffff1660e01b8152600401612ee89493929190613ae1565b602060405180830381600087803b158015612f0257600080fd5b505af1925050508015612f3357506040513d601f19601f82011682018060405250810190612f30919061363d565b60015b612fad573d8060008114612f63576040519150601f19603f3d011682016040523d82523d6000602084013e612f68565b606091505b50600081511415612fa5576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606000821415613048576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061315c565b600082905060005b6000821461307a578080613063906140cd565b915050600a826130739190613ebc565b9150613050565b60008167ffffffffffffffff81111561309657613095614203565b5b6040519080825280601f01601f1916602001820160405280156130c85781602001600182028036833780820191505090505b5090505b60008514613155576001826130e19190613f47565b9150600a856130f09190614116565b60306130fc9190613e66565b60f81b818381518110613112576131116141d4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561314e9190613ebc565b94506130cc565b8093505050505b919050565b60006001821460e11b9050919050565b60009392505050565b8280546131869061403f565b90600052602060002090601f0160209004810192826131a857600085556131ef565b82601f106131c157805160ff19168380011785556131ef565b828001600101855582156131ef579182015b828111156131ee5782518255916020019190600101906131d3565b5b5090506131fc9190613200565b5090565b5b80821115613219576000816000905550600101613201565b5090565b600061323061322b84613d0e565b613ce9565b9050808382526020820190508285602086028201111561325357613252614237565b5b60005b8581101561328357816132698882613311565b845260208401935060208301925050600181019050613256565b5050509392505050565b60006132a061329b84613d3a565b613ce9565b9050828152602081018484840111156132bc576132bb61423c565b5b6132c7848285613ffd565b509392505050565b60006132e26132dd84613d6b565b613ce9565b9050828152602081018484840111156132fe576132fd61423c565b5b613309848285613ffd565b509392505050565b600081359050613320816143f6565b92915050565b600082601f83011261333b5761333a614232565b5b813561334b84826020860161321d565b91505092915050565b6000813590506133638161440d565b92915050565b60008135905061337881614424565b92915050565b60008151905061338d81614424565b92915050565b600082601f8301126133a8576133a7614232565b5b81356133b884826020860161328d565b91505092915050565b600082601f8301126133d6576133d5614232565b5b81356133e68482602086016132cf565b91505092915050565b6000813590506133fe8161443b565b92915050565b60006020828403121561341a57613419614246565b5b600061342884828501613311565b91505092915050565b6000806040838503121561344857613447614246565b5b600061345685828601613311565b925050602061346785828601613311565b9150509250929050565b60008060006060848603121561348a57613489614246565b5b600061349886828701613311565b93505060206134a986828701613311565b92505060406134ba868287016133ef565b9150509250925092565b600080600080608085870312156134de576134dd614246565b5b60006134ec87828801613311565b94505060206134fd87828801613311565b935050604061350e878288016133ef565b925050606085013567ffffffffffffffff81111561352f5761352e614241565b5b61353b87828801613393565b91505092959194509250565b6000806040838503121561355e5761355d614246565b5b600061356c85828601613311565b925050602061357d85828601613354565b9150509250929050565b6000806040838503121561359e5761359d614246565b5b60006135ac85828601613311565b92505060206135bd858286016133ef565b9150509250929050565b6000602082840312156135dd576135dc614246565b5b600082013567ffffffffffffffff8111156135fb576135fa614241565b5b61360784828501613326565b91505092915050565b60006020828403121561362657613625614246565b5b600061363484828501613369565b91505092915050565b60006020828403121561365357613652614246565b5b60006136618482850161337e565b91505092915050565b6000602082840312156136805761367f614246565b5b600082013567ffffffffffffffff81111561369e5761369d614241565b5b6136aa848285016133c1565b91505092915050565b6000602082840312156136c9576136c8614246565b5b60006136d7848285016133ef565b91505092915050565b60006136ec8383613710565b60208301905092915050565b60006137048383613a79565b60208301905092915050565b61371981613f7b565b82525050565b61372881613f7b565b82525050565b600061373982613dd1565b6137438185613e17565b935061374e83613d9c565b8060005b8381101561377f57815161376688826136e0565b975061377183613dfd565b925050600181019050613752565b5085935050505092915050565b600061379782613ddc565b6137a18185613e28565b93506137ac83613dac565b8060005b838110156137dd5781516137c488826136f8565b97506137cf83613e0a565b9250506001810190506137b0565b5085935050505092915050565b6137f381613f8d565b82525050565b600061380482613de7565b61380e8185613e39565b935061381e81856020860161400c565b6138278161424b565b840191505092915050565b600061383d82613df2565b6138478185613e4a565b935061385781856020860161400c565b6138608161424b565b840191505092915050565b600061387682613df2565b6138808185613e5b565b935061389081856020860161400c565b80840191505092915050565b600081546138a98161403f565b6138b38186613e5b565b945060018216600081146138ce57600181146138df57613912565b60ff19831686528186019350613912565b6138e885613dbc565b60005b8381101561390a578154818901526001820191506020810190506138eb565b838801955050505b50505092915050565b6000613928600683613e4a565b91506139338261425c565b602082019050919050565b600061394b600d83613e4a565b915061395682614285565b602082019050919050565b600061396e600c83613e4a565b9150613979826142ae565b602082019050919050565b6000613991601083613e4a565b915061399c826142d7565b602082019050919050565b60006139b4600d83613e4a565b91506139bf82614300565b602082019050919050565b60006139d7600583613e5b565b91506139e282614329565b600582019050919050565b60006139fa600883613e4a565b9150613a0582614352565b602082019050919050565b6000613a1d600a83613e4a565b9150613a288261437b565b602082019050919050565b6000613a40600e83613e4a565b9150613a4b826143a4565b602082019050919050565b6000613a63600a83613e4a565b9150613a6e826143cd565b602082019050919050565b613a8281613ff3565b82525050565b613a9181613ff3565b82525050565b6000613aa3828561389c565b9150613aaf828461386b565b9150613aba826139ca565b91508190509392505050565b6000602082019050613adb600083018461371f565b92915050565b6000608082019050613af6600083018761371f565b613b03602083018661371f565b613b106040830185613a88565b8181036060830152613b2281846137f9565b905095945050505050565b60006020820190508181036000830152613b47818461372e565b905092915050565b60006020820190508181036000830152613b69818461378c565b905092915050565b6000602082019050613b8660008301846137ea565b92915050565b60006020820190508181036000830152613ba68184613832565b905092915050565b60006020820190508181036000830152613bc78161391b565b9050919050565b60006020820190508181036000830152613be78161393e565b9050919050565b60006020820190508181036000830152613c0781613961565b9050919050565b60006020820190508181036000830152613c2781613984565b9050919050565b60006020820190508181036000830152613c47816139a7565b9050919050565b60006020820190508181036000830152613c67816139ed565b9050919050565b60006020820190508181036000830152613c8781613a10565b9050919050565b60006020820190508181036000830152613ca781613a33565b9050919050565b60006020820190508181036000830152613cc781613a56565b9050919050565b6000602082019050613ce36000830184613a88565b92915050565b6000613cf3613d04565b9050613cff8282614071565b919050565b6000604051905090565b600067ffffffffffffffff821115613d2957613d28614203565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613d5557613d54614203565b5b613d5e8261424b565b9050602081019050919050565b600067ffffffffffffffff821115613d8657613d85614203565b5b613d8f8261424b565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613e7182613ff3565b9150613e7c83613ff3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613eb157613eb0614147565b5b828201905092915050565b6000613ec782613ff3565b9150613ed283613ff3565b925082613ee257613ee1614176565b5b828204905092915050565b6000613ef882613ff3565b9150613f0383613ff3565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613f3c57613f3b614147565b5b828202905092915050565b6000613f5282613ff3565b9150613f5d83613ff3565b925082821015613f7057613f6f614147565b5b828203905092915050565b6000613f8682613fd3565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561402a57808201518184015260208101905061400f565b83811115614039576000848401525b50505050565b6000600282049050600182168061405757607f821691505b6020821081141561406b5761406a6141a5565b5b50919050565b61407a8261424b565b810181811067ffffffffffffffff8211171561409957614098614203565b5b80604052505050565b60006140ad82613fc5565b915061ffff8214156140c2576140c1614147565b5b600182019050919050565b60006140d882613ff3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561410b5761410a614147565b5b600182019050919050565b600061412182613ff3565b915061412c83613ff3565b92508261413c5761413b614176565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e6f204554480000000000000000000000000000000000000000000000000000600082015250565b7f596f75206e6f74206f776e657200000000000000000000000000000000000000600082015250565b7f556e6c696d6974206d696e740000000000000000000000000000000000000000600082015250565b7f53616c65206e6f74207374617274656400000000000000000000000000000000600082015250565b7f556e6c696d697420636c61696d00000000000000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4e6f20636f756e74000000000000000000000000000000000000000000000000600082015250565b7f4d6178206d696e74203100000000000000000000000000000000000000000000600082015250565b7f61646472657373206e6f7420574c000000000000000000000000000000000000600082015250565b7f4d6178206d696e74203300000000000000000000000000000000000000000000600082015250565b6143ff81613f7b565b811461440a57600080fd5b50565b61441681613f8d565b811461442157600080fd5b50565b61442d81613f99565b811461443857600080fd5b50565b61444481613ff3565b811461444f57600080fd5b5056fea26469706673582212205c352332b42f585cd9cd0cd76dd6b4d3b35e95d34fe51c6e3882cc5c0adef31464736f6c63430008070033

Deployed Bytecode

0x6080604052600436106102885760003560e01c8063644738f41161015a578063a22cb465116100c1578063d547cfb71161007a578063d547cfb714610990578063d9d2d058146109bb578063e55bc837146109d2578063e985e9c514610a0f578063efd4064f14610a4c578063fdf53ad014610a8957610288565b8063a22cb46514610884578063aeed77f3146108ad578063b88d4fde146108d6578063bff810b2146108ff578063c87b56dd14610928578063d1e286841461096557610288565b806381b1b2851161011357806381b1b285146107705780638da5cb5b1461079b5780638fd18834146107c657806394eeb5f5146107f157806395d89b411461081c5780639a87d6ff1461084757610288565b8063644738f41461064c5780636c3d81141461068957806370a08231146106b457806373b504cd146106f15780637b1187661461071c5780637bb2b3c11461074757610288565b806322e5ad51116101fe5780633eea646b116101b75780633eea646b1461053c578063408cbf841461056757806342842e0e146105925780634f77b6c8146105bb5780636124a2d0146105e65780636352211e1461060f57610288565b806322e5ad511461044057806323b872dd1461046b5780632a2a9681146104945780632c4b5586146104ab57806330176e13146104d65780633c0be637146104ff57610288565b8063095ea7b311610250578063095ea7b31461037757806311f37ceb146103a05780631797bd90146103cb57806318160ddd146103e25780631b9265b81461040d5780631f5ca1ed1461041757610288565b806301ffc9a71461028d57806302fe5305146102ca57806306fdde03146102f3578063078837031461031e578063081812fc1461033a575b600080fd5b34801561029957600080fd5b506102b460048036038101906102af9190613610565b610aa0565b6040516102c19190613b71565b60405180910390f35b3480156102d657600080fd5b506102f160048036038101906102ec919061366a565b610b32565b005b3480156102ff57600080fd5b50610308610bce565b6040516103159190613b8c565b60405180910390f35b610338600480360381019061033391906136b3565b610c60565b005b34801561034657600080fd5b50610361600480360381019061035c91906136b3565b610ed1565b60405161036e9190613ac6565b60405180910390f35b34801561038357600080fd5b5061039e60048036038101906103999190613587565b610f50565b005b3480156103ac57600080fd5b506103b5611094565b6040516103c29190613cce565b60405180910390f35b3480156103d757600080fd5b506103e061109e565b005b3480156103ee57600080fd5b506103f761115a565b6040516104049190613cce565b60405180910390f35b610415611171565b005b34801561042357600080fd5b5061043e600480360381019061043991906136b3565b611173565b005b34801561044c57600080fd5b50610455611270565b6040516104629190613ac6565b60405180910390f35b34801561047757600080fd5b50610492600480360381019061048d9190613471565b61129a565b005b3480156104a057600080fd5b506104a96115bf565b005b3480156104b757600080fd5b506104c061167b565b6040516104cd9190613cce565b60405180910390f35b3480156104e257600080fd5b506104fd60048036038101906104f8919061366a565b6116bc565b005b34801561050b57600080fd5b5061052660048036038101906105219190613404565b611766565b6040516105339190613b4f565b60405180910390f35b34801561054857600080fd5b5061055161185d565b60405161055e9190613cce565b60405180910390f35b34801561057357600080fd5b5061057c611867565b6040516105899190613b71565b60405180910390f35b34801561059e57600080fd5b506105b960048036038101906105b49190613471565b61187e565b005b3480156105c757600080fd5b506105d061189e565b6040516105dd9190613cce565b60405180910390f35b3480156105f257600080fd5b5061060d600480360381019061060891906135c7565b6118e5565b005b34801561061b57600080fd5b50610636600480360381019061063191906136b3565b611a15565b6040516106439190613ac6565b60405180910390f35b34801561065857600080fd5b50610673600480360381019061066e9190613404565b611a27565b6040516106809190613cce565b60405180910390f35b34801561069557600080fd5b5061069e611a3f565b6040516106ab9190613b71565b60405180910390f35b3480156106c057600080fd5b506106db60048036038101906106d69190613404565b611a56565b6040516106e89190613cce565b60405180910390f35b3480156106fd57600080fd5b50610706611b0f565b6040516107139190613cce565b60405180910390f35b34801561072857600080fd5b50610731611b19565b60405161073e9190613b71565b60405180910390f35b34801561075357600080fd5b5061076e600480360381019061076991906136b3565b611b2c565b005b34801561077c57600080fd5b50610785611e42565b6040516107929190613ac6565b60405180910390f35b3480156107a757600080fd5b506107b0611e6c565b6040516107bd9190613ac6565b60405180910390f35b3480156107d257600080fd5b506107db611e92565b6040516107e89190613b71565b60405180910390f35b3480156107fd57600080fd5b50610806611f3f565b6040516108139190613ac6565b60405180910390f35b34801561082857600080fd5b50610831611f65565b60405161083e9190613b8c565b60405180910390f35b34801561085357600080fd5b5061086e60048036038101906108699190613404565b611ff7565b60405161087b9190613cce565b60405180910390f35b34801561089057600080fd5b506108ab60048036038101906108a69190613547565b61200f565b005b3480156108b957600080fd5b506108d460048036038101906108cf919061366a565b612187565b005b3480156108e257600080fd5b506108fd60048036038101906108f891906134c4565b612231565b005b34801561090b57600080fd5b50610926600480360381019061092191906136b3565b6122a4565b005b34801561093457600080fd5b5061094f600480360381019061094a91906136b3565b61233e565b60405161095c9190613b8c565b60405180910390f35b34801561097157600080fd5b5061097a612372565b6040516109879190613cce565b60405180910390f35b34801561099c57600080fd5b506109a56123b9565b6040516109b29190613b8c565b60405180910390f35b3480156109c757600080fd5b506109d0612447565b005b3480156109de57600080fd5b506109f960048036038101906109f491906136b3565b6125fd565b604051610a069190613ac6565b60405180910390f35b348015610a1b57600080fd5b50610a366004803603810190610a319190613431565b61263c565b604051610a439190613b71565b60405180910390f35b348015610a5857600080fd5b50610a736004803603810190610a6e91906136b3565b6126d0565b604051610a809190613b2d565b60405180910390f35b348015610a9557600080fd5b50610a9e612a23565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610afb57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b2b5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b3373ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610bc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb990613bce565b60405180910390fd5b610bcb81610b32565b50565b606060028054610bdd9061403f565b80601f0160208091040260200160405190810160405280929190818152602001828054610c099061403f565b8015610c565780601f10610c2b57610100808354040283529160200191610c56565b820191906000526020600020905b815481529060010190602001808311610c3957829003601f168201915b5050505050905090565b60011515600e60029054906101000a900460ff16151514610cb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cad90613c0e565b60405180910390fd5b80600f54610cc49190613eed565b3414610d05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfc90613bae565b60405180910390fd5b60016008541015610d4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4290613c4e565b60405180910390fd5b6003811115610d8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8690613cae565b60405180910390fd5b600381601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610ddc9190613e66565b1115610e1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1490613bee565b60405180910390fd5b610e273382612adf565b8060086000828254610e399190613f47565b9250508190555080601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610e8b9190613e66565b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b6000610edc82612c9c565b610f12576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610f5b82611a15565b90508073ffffffffffffffffffffffffffffffffffffffff16610f7c612cfb565b73ffffffffffffffffffffffffffffffffffffffff1614610fdf57610fa881610fa3612cfb565b61263c565b610fde576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000600f54905090565b3373ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461112e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112590613bce565b60405180910390fd5b600e60019054906101000a900460ff1615600e60016101000a81548160ff021916908315150217905550565b6000611164612d03565b6001546000540303905090565b565b3373ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611203576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111fa90613bce565b60405180910390fd5b600081905060095482111561124857600954816112209190613f47565b90506000600981905550806008600082825461123c9190613f47565b92505081905550611262565b806009600082825461125a9190613f47565b925050819055505b61126c3383612adf565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006112a582612d08565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461130c576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061131884612dd6565b9150915061132e8187611329612cfb565b612dfd565b61137a576113438661133e612cfb565b61263c565b611379576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156113e1576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113ee8686866001612e41565b80156113f957600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506114c7856114a3888887612e47565b7c020000000000000000000000000000000000000000000000000000000017612e6f565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416141561154f57600060018501905060006004600083815260200190815260200160002054141561154d57600054811461154c578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46115b78686866001612e9a565b505050505050565b3373ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461164f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164690613bce565b60405180910390fd5b600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1631905090565b3373ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461174c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174390613bce565b60405180910390fd5b80600c908051906020019061176292919061317a565b5050565b6060600061177383611a56565b67ffffffffffffffff81111561178c5761178b614203565b5b6040519080825280602002602001820160405280156117ba5781602001602082028036833780820191505090505b5090506000805b6117c961115a565b811015611852578473ffffffffffffffffffffffffffffffffffffffff166117f082611a15565b73ffffffffffffffffffffffffffffffffffffffff16141561183f5780838361ffff1681518110611824576118236141d4565b5b602002602001018181525050818061183b906140a2565b9250505b808061184a906140cd565b9150506117c1565b508192505050919050565b6000600954905090565b6000600e60019054906101000a900460ff16905090565b61189983838360405180602001604052806000815250612231565b505050565b6000601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905090565b3373ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611975576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196c90613bce565b60405180910390fd5b60005b8151811015611a1157600d828281518110611996576119956141d4565b5b60200260200101519080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508080611a09906140cd565b915050611978565b5050565b6000611a2082612d08565b9050919050565b60106020528060005260406000206000915090505481565b6000600e60029054906101000a900460ff16905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611abe576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6000600854905090565b600e60009054906101000a900460ff1681565b60011515600e60019054906101000a900460ff1615151480611b61575060011515600e60009054906101000a900460ff161515145b15611e045760001515600e60019054906101000a900460ff1615151480611b9b575060011515600e60009054906101000a900460ff161515145b15611bf05760001515611bac611e92565b15151415611bef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be690613c8e565b60405180910390fd5b5b60016008541015611c36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2d90613c4e565b60405180910390fd5b60016009541015611c7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7390613c4e565b60405180910390fd5b6001811115611cc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb790613c6e565b60405180910390fd5b600181601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d0d9190613e66565b1115611d4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4590613c2e565b60405180910390fd5b611d583382612adf565b8060096000828254611d6a9190613f47565b9250508190555080601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611dbc9190613e66565b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611e3f565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3690613c0e565b60405180910390fd5b50565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600090505b600d80549050811015611f3657600d8181548110611ebb57611eba6141d4565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415611f23576001915050611f3c565b8080611f2e906140cd565b915050611e9a565b50600090505b90565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060038054611f749061403f565b80601f0160208091040260200160405190810160405280929190818152602001828054611fa09061403f565b8015611fed5780601f10611fc257610100808354040283529160200191611fed565b820191906000526020600020905b815481529060010190602001808311611fd057829003601f168201915b5050505050905090565b60116020528060005260406000206000915090505481565b612017612cfb565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561207c576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000612089612cfb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612136612cfb565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161217b9190613b71565b60405180910390a35050565b3373ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612217576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220e90613bce565b60405180910390fd5b806012908051906020019061222d92919061317a565b5050565b61223c84848461129a565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461229e5761226784848484612ea0565b61229d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b3373ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612334576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232b90613bce565b60405180910390fd5b80600f8190555050565b6060601261234b83613000565b60405160200161235c929190613a97565b6040516020818303038152906040529050919050565b6000601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905090565b600c80546123c69061403f565b80601f01602080910402602001604051908101604052809291908181526020018280546123f29061403f565b801561243f5780601f106124145761010080835404028352916020019161243f565b820191906000526020600020905b81548152906001019060200180831161242257829003601f168201915b505050505081565b3373ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146124d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ce90613bce565b60405180910390fd5b6000739b768bd523cd6d7586372fd61acc4f2f31b03c3a9050600073015d10bfc02ca5be6325aebaebb0ee732ea11ae990506000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508273ffffffffffffffffffffffffffffffffffffffff166108fc60028373ffffffffffffffffffffffffffffffffffffffff163161256e9190613ebc565b9081150290604051600060405180830381858888f19350505050158015612599573d6000803e3d6000fd5b508173ffffffffffffffffffffffffffffffffffffffff166108fc8273ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f193505050501580156125f7573d6000803e3d6000fd5b50505050565b600d818154811061260d57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060006126dc61115a565b67ffffffffffffffff8111156126f5576126f4614203565b5b6040519080825280602002602001820160405280156127235781602001602082028036833780820191505090505b509050600061273061115a565b67ffffffffffffffff81111561274957612748614203565b5b6040519080825280602002602001820160405280156127775781602001602082028036833780820191505090505b50905060005b61278561115a565b8110156127f55761279581611a15565b8382815181106127a8576127a76141d4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505080806127ed906140cd565b91505061277d565b50600080600090505b61280661115a565b811015612942576000808290505b61281c61115a565b8110156128ad57858381518110612836576128356141d4565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16868281518110612867576128666141d4565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16141561289a578180612896906140cd565b9250505b80806128a5906140cd565b915050612814565b50600181141561292e578482815181106128ca576128c96141d4565b5b60200260200101518484815181106128e5576128e46141d4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050828061292a906140cd565b9350505b50808061293a906140cd565b9150506127fe565b5060008167ffffffffffffffff81111561295f5761295e614203565b5b60405190808252806020026020018201604052801561298d5781602001602082028036833780820191505090505b50905060005b82811015612a16578381815181106129ae576129ad6141d4565b5b60200260200101518282815181106129c9576129c86141d4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080612a0e906140cd565b915050612993565b5080945050505050919050565b3373ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612ab3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aaa90613bce565b60405180910390fd5b600e60029054906101000a900460ff1615600e60026101000a81548160ff021916908315150217905550565b6000805490506000821415612b20576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612b2d6000848385612e41565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612ba483612b956000866000612e47565b612b9e85613161565b17612e6f565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114612c4557808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612c0a565b506000821415612c81576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050612c976000848385612e9a565b505050565b600081612ca7612d03565b11158015612cb6575060005482105b8015612cf4575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b60008082905080612d17612d03565b11612d9f57600054811015612d9e5760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415612d9c575b6000811415612d92576004600083600190039350838152602001908152602001600020549050612d67565b8092505050612dd1565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8612e5e868684613171565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612ec6612cfb565b8786866040518563ffffffff1660e01b8152600401612ee89493929190613ae1565b602060405180830381600087803b158015612f0257600080fd5b505af1925050508015612f3357506040513d601f19601f82011682018060405250810190612f30919061363d565b60015b612fad573d8060008114612f63576040519150601f19603f3d011682016040523d82523d6000602084013e612f68565b606091505b50600081511415612fa5576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606000821415613048576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061315c565b600082905060005b6000821461307a578080613063906140cd565b915050600a826130739190613ebc565b9150613050565b60008167ffffffffffffffff81111561309657613095614203565b5b6040519080825280601f01601f1916602001820160405280156130c85781602001600182028036833780820191505090505b5090505b60008514613155576001826130e19190613f47565b9150600a856130f09190614116565b60306130fc9190613e66565b60f81b818381518110613112576131116141d4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561314e9190613ebc565b94506130cc565b8093505050505b919050565b60006001821460e11b9050919050565b60009392505050565b8280546131869061403f565b90600052602060002090601f0160209004810192826131a857600085556131ef565b82601f106131c157805160ff19168380011785556131ef565b828001600101855582156131ef579182015b828111156131ee5782518255916020019190600101906131d3565b5b5090506131fc9190613200565b5090565b5b80821115613219576000816000905550600101613201565b5090565b600061323061322b84613d0e565b613ce9565b9050808382526020820190508285602086028201111561325357613252614237565b5b60005b8581101561328357816132698882613311565b845260208401935060208301925050600181019050613256565b5050509392505050565b60006132a061329b84613d3a565b613ce9565b9050828152602081018484840111156132bc576132bb61423c565b5b6132c7848285613ffd565b509392505050565b60006132e26132dd84613d6b565b613ce9565b9050828152602081018484840111156132fe576132fd61423c565b5b613309848285613ffd565b509392505050565b600081359050613320816143f6565b92915050565b600082601f83011261333b5761333a614232565b5b813561334b84826020860161321d565b91505092915050565b6000813590506133638161440d565b92915050565b60008135905061337881614424565b92915050565b60008151905061338d81614424565b92915050565b600082601f8301126133a8576133a7614232565b5b81356133b884826020860161328d565b91505092915050565b600082601f8301126133d6576133d5614232565b5b81356133e68482602086016132cf565b91505092915050565b6000813590506133fe8161443b565b92915050565b60006020828403121561341a57613419614246565b5b600061342884828501613311565b91505092915050565b6000806040838503121561344857613447614246565b5b600061345685828601613311565b925050602061346785828601613311565b9150509250929050565b60008060006060848603121561348a57613489614246565b5b600061349886828701613311565b93505060206134a986828701613311565b92505060406134ba868287016133ef565b9150509250925092565b600080600080608085870312156134de576134dd614246565b5b60006134ec87828801613311565b94505060206134fd87828801613311565b935050604061350e878288016133ef565b925050606085013567ffffffffffffffff81111561352f5761352e614241565b5b61353b87828801613393565b91505092959194509250565b6000806040838503121561355e5761355d614246565b5b600061356c85828601613311565b925050602061357d85828601613354565b9150509250929050565b6000806040838503121561359e5761359d614246565b5b60006135ac85828601613311565b92505060206135bd858286016133ef565b9150509250929050565b6000602082840312156135dd576135dc614246565b5b600082013567ffffffffffffffff8111156135fb576135fa614241565b5b61360784828501613326565b91505092915050565b60006020828403121561362657613625614246565b5b600061363484828501613369565b91505092915050565b60006020828403121561365357613652614246565b5b60006136618482850161337e565b91505092915050565b6000602082840312156136805761367f614246565b5b600082013567ffffffffffffffff81111561369e5761369d614241565b5b6136aa848285016133c1565b91505092915050565b6000602082840312156136c9576136c8614246565b5b60006136d7848285016133ef565b91505092915050565b60006136ec8383613710565b60208301905092915050565b60006137048383613a79565b60208301905092915050565b61371981613f7b565b82525050565b61372881613f7b565b82525050565b600061373982613dd1565b6137438185613e17565b935061374e83613d9c565b8060005b8381101561377f57815161376688826136e0565b975061377183613dfd565b925050600181019050613752565b5085935050505092915050565b600061379782613ddc565b6137a18185613e28565b93506137ac83613dac565b8060005b838110156137dd5781516137c488826136f8565b97506137cf83613e0a565b9250506001810190506137b0565b5085935050505092915050565b6137f381613f8d565b82525050565b600061380482613de7565b61380e8185613e39565b935061381e81856020860161400c565b6138278161424b565b840191505092915050565b600061383d82613df2565b6138478185613e4a565b935061385781856020860161400c565b6138608161424b565b840191505092915050565b600061387682613df2565b6138808185613e5b565b935061389081856020860161400c565b80840191505092915050565b600081546138a98161403f565b6138b38186613e5b565b945060018216600081146138ce57600181146138df57613912565b60ff19831686528186019350613912565b6138e885613dbc565b60005b8381101561390a578154818901526001820191506020810190506138eb565b838801955050505b50505092915050565b6000613928600683613e4a565b91506139338261425c565b602082019050919050565b600061394b600d83613e4a565b915061395682614285565b602082019050919050565b600061396e600c83613e4a565b9150613979826142ae565b602082019050919050565b6000613991601083613e4a565b915061399c826142d7565b602082019050919050565b60006139b4600d83613e4a565b91506139bf82614300565b602082019050919050565b60006139d7600583613e5b565b91506139e282614329565b600582019050919050565b60006139fa600883613e4a565b9150613a0582614352565b602082019050919050565b6000613a1d600a83613e4a565b9150613a288261437b565b602082019050919050565b6000613a40600e83613e4a565b9150613a4b826143a4565b602082019050919050565b6000613a63600a83613e4a565b9150613a6e826143cd565b602082019050919050565b613a8281613ff3565b82525050565b613a9181613ff3565b82525050565b6000613aa3828561389c565b9150613aaf828461386b565b9150613aba826139ca565b91508190509392505050565b6000602082019050613adb600083018461371f565b92915050565b6000608082019050613af6600083018761371f565b613b03602083018661371f565b613b106040830185613a88565b8181036060830152613b2281846137f9565b905095945050505050565b60006020820190508181036000830152613b47818461372e565b905092915050565b60006020820190508181036000830152613b69818461378c565b905092915050565b6000602082019050613b8660008301846137ea565b92915050565b60006020820190508181036000830152613ba68184613832565b905092915050565b60006020820190508181036000830152613bc78161391b565b9050919050565b60006020820190508181036000830152613be78161393e565b9050919050565b60006020820190508181036000830152613c0781613961565b9050919050565b60006020820190508181036000830152613c2781613984565b9050919050565b60006020820190508181036000830152613c47816139a7565b9050919050565b60006020820190508181036000830152613c67816139ed565b9050919050565b60006020820190508181036000830152613c8781613a10565b9050919050565b60006020820190508181036000830152613ca781613a33565b9050919050565b60006020820190508181036000830152613cc781613a56565b9050919050565b6000602082019050613ce36000830184613a88565b92915050565b6000613cf3613d04565b9050613cff8282614071565b919050565b6000604051905090565b600067ffffffffffffffff821115613d2957613d28614203565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613d5557613d54614203565b5b613d5e8261424b565b9050602081019050919050565b600067ffffffffffffffff821115613d8657613d85614203565b5b613d8f8261424b565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613e7182613ff3565b9150613e7c83613ff3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613eb157613eb0614147565b5b828201905092915050565b6000613ec782613ff3565b9150613ed283613ff3565b925082613ee257613ee1614176565b5b828204905092915050565b6000613ef882613ff3565b9150613f0383613ff3565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613f3c57613f3b614147565b5b828202905092915050565b6000613f5282613ff3565b9150613f5d83613ff3565b925082821015613f7057613f6f614147565b5b828203905092915050565b6000613f8682613fd3565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561402a57808201518184015260208101905061400f565b83811115614039576000848401525b50505050565b6000600282049050600182168061405757607f821691505b6020821081141561406b5761406a6141a5565b5b50919050565b61407a8261424b565b810181811067ffffffffffffffff8211171561409957614098614203565b5b80604052505050565b60006140ad82613fc5565b915061ffff8214156140c2576140c1614147565b5b600182019050919050565b60006140d882613ff3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561410b5761410a614147565b5b600182019050919050565b600061412182613ff3565b915061412c83613ff3565b92508261413c5761413b614176565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e6f204554480000000000000000000000000000000000000000000000000000600082015250565b7f596f75206e6f74206f776e657200000000000000000000000000000000000000600082015250565b7f556e6c696d6974206d696e740000000000000000000000000000000000000000600082015250565b7f53616c65206e6f74207374617274656400000000000000000000000000000000600082015250565b7f556e6c696d697420636c61696d00000000000000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4e6f20636f756e74000000000000000000000000000000000000000000000000600082015250565b7f4d6178206d696e74203100000000000000000000000000000000000000000000600082015250565b7f61646472657373206e6f7420574c000000000000000000000000000000000000600082015250565b7f4d6178206d696e74203300000000000000000000000000000000000000000000600082015250565b6143ff81613f7b565b811461440a57600080fd5b50565b61441681613f8d565b811461442157600080fd5b50565b61442d81613f99565b811461443857600080fd5b50565b61444481613ff3565b811461444f57600080fd5b5056fea26469706673582212205c352332b42f585cd9cd0cd76dd6b4d3b35e95d34fe51c6e3882cc5c0adef31464736f6c63430008070033

Deployed Bytecode Sourcemap

53821:6992:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20932:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59388:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21834:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56545:550;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28317:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27758:400;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55325:77;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58039:95;;;;;;;;;;;;;:::i;:::-;;17585:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54652:51;;;:::i;:::-;;58232:360;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55024:102;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32024:2817;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55965:86;;;;;;;;;;;;;:::i;:::-;;54820:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56059:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59488:363;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55509:90;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55227:88;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34937:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55843:114;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59198:182;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23227:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54306:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55136:80;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18769:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55410:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54043:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57103:806;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54927:88;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53945:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58600:245;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53906:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22010:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54363:51;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28875:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54711:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35720:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57931:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58963:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55723:112;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53974:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56190:347;;;;;;;;;;;;;:::i;:::-;;54009:27;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29340:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59859:945;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58142:82;;;;;;;;;;;;;:::i;:::-;;20932:639;21017:4;21356:10;21341:25;;:11;:25;;;;:102;;;;21433:10;21418:25;;:11;:25;;;;21341:102;:179;;;;21510:10;21495:25;;:11;:25;;;;21341:179;21321:199;;20932:639;;;:::o;59388:92::-;58909:10;58900:19;;:5;;;;;;;;;;;:19;;;58892:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;59458:14:::1;59465:6;59458;:14::i;:::-;59388:92:::0;:::o;21834:100::-;21888:13;21921:5;21914:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21834:100;:::o;56545:550::-;56626:4;56615:15;;:7;;;;;;;;;;;:15;;;56607:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;56691:11;56683:5;;:19;;;;:::i;:::-;56670:9;:32;56662:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;56749:1;56732:14;;:18;;56724:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;56797:1;56782:11;:16;;56774:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;56880:1;56866:11;56833:18;:30;56852:10;56833:30;;;;;;;;;;;;;;;;:44;;;;:::i;:::-;:48;;56825:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;56919:29;56925:10;56936:11;56919:5;:29::i;:::-;56986:11;56968:14;;:29;;;;;;;:::i;:::-;;;;;;;;57076:11;57043:18;:30;57062:10;57043:30;;;;;;;;;;;;;;;;:44;;;;:::i;:::-;57010:18;:30;57029:10;57010:30;;;;;;;;;;;;;;;:77;;;;56545:550;:::o;28317:218::-;28393:7;28418:16;28426:7;28418;:16::i;:::-;28413:64;;28443:34;;;;;;;;;;;;;;28413:64;28497:15;:24;28513:7;28497:24;;;;;;;;;;;:30;;;;;;;;;;;;28490:37;;28317:218;;;:::o;27758:400::-;27839:13;27855:16;27863:7;27855;:16::i;:::-;27839:32;;27911:5;27888:28;;:19;:17;:19::i;:::-;:28;;;27884:175;;27936:44;27953:5;27960:19;:17;:19::i;:::-;27936:16;:44::i;:::-;27931:128;;28008:35;;;;;;;;;;;;;;27931:128;27884:175;28104:2;28071:15;:24;28087:7;28071:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;28142:7;28138:2;28122:28;;28131:5;28122:28;;;;;;;;;;;;27828:330;27758:400;;:::o;55325:77::-;55366:4;55389:5;;55382:12;;55325:77;:::o;58039:95::-;58909:10;58900:19;;:5;;;;;;;;;;;:19;;;58892:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;58115:11:::1;;;;;;;;;;;58113:13;58100:11;;:26;;;;;;;;;;;;;;;;;;58039:95::o:0;17585:323::-;17646:7;17874:15;:13;:15::i;:::-;17859:12;;17843:13;;:28;:46;17836:53;;17585:323;:::o;54652:51::-;:::o;58232:360::-;58909:10;58900:19;;:5;;;;;;;;;;;:19;;;58892:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;58304:14:::1;58321:5;58304:22;;58351:9;;58343:5;:17;58339:208;;;58399:9;;58390:18;;;;;:::i;:::-;;;58435:1;58423:9;:13;;;;58468:6;58451:14;;:23;;;;;;;:::i;:::-;;;;;;;;58339:208;;;58529:6;58517:9;;:18;;;;;;;:::i;:::-;;;;;;;;58339:208;58561:23;58567:10;58578:5;58561;:23::i;:::-;58290:302;58232:360:::0;:::o;55024:102::-;55076:7;55102:16;;;;;;;;;;;55095:23;;55024:102;:::o;32024:2817::-;32158:27;32188;32207:7;32188:18;:27::i;:::-;32158:57;;32273:4;32232:45;;32248:19;32232:45;;;32228:86;;32286:28;;;;;;;;;;;;;;32228:86;32328:27;32357:23;32384:35;32411:7;32384:26;:35::i;:::-;32327:92;;;;32519:68;32544:15;32561:4;32567:19;:17;:19::i;:::-;32519:24;:68::i;:::-;32514:180;;32607:43;32624:4;32630:19;:17;:19::i;:::-;32607:16;:43::i;:::-;32602:92;;32659:35;;;;;;;;;;;;;;32602:92;32514:180;32725:1;32711:16;;:2;:16;;;32707:52;;;32736:23;;;;;;;;;;;;;;32707:52;32772:43;32794:4;32800:2;32804:7;32813:1;32772:21;:43::i;:::-;32908:15;32905:160;;;33048:1;33027:19;33020:30;32905:160;33445:18;:24;33464:4;33445:24;;;;;;;;;;;;;;;;33443:26;;;;;;;;;;;;33514:18;:22;33533:2;33514:22;;;;;;;;;;;;;;;;33512:24;;;;;;;;;;;33836:146;33873:2;33922:45;33937:4;33943:2;33947:19;33922:14;:45::i;:::-;13984:8;33894:73;33836:18;:146::i;:::-;33807:17;:26;33825:7;33807:26;;;;;;;;;;;:175;;;;34153:1;13984:8;34102:19;:47;:52;34098:627;;;34175:19;34207:1;34197:7;:11;34175:33;;34364:1;34330:17;:30;34348:11;34330:30;;;;;;;;;;;;:35;34326:384;;;34468:13;;34453:11;:28;34449:242;;34648:19;34615:17;:30;34633:11;34615:30;;;;;;;;;;;:52;;;;34449:242;34326:384;34156:569;34098:627;34772:7;34768:2;34753:27;;34762:4;34753:27;;;;;;;;;;;;34791:42;34812:4;34818:2;34822:7;34831:1;34791:20;:42::i;:::-;32147:2694;;;32024:2817;;;:::o;55965:86::-;58909:10;58900:19;;:5;;;;;;;;;;;:19;;;58892:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;56034:9:::1;;;;;;;;;;;56033:10;56021:9;;:22;;;;;;;;;;;;;;;;;;55965:86::o:0;54820:98::-;54863:4;54886:16;;;;;;;;;;;:24;;;54879:31;;54820:98;:::o;56059:119::-;58909:10;58900:19;;:5;;;;;;;;;;;:19;;;58892:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;56157:13:::1;56142:12;:28;;;;;;;;;;;;:::i;:::-;;56059:119:::0;:::o;59488:363::-;59549:16;59579:21;59614:15;59624:4;59614:9;:15::i;:::-;59603:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59579:51;;59642:9;59669;59664:153;59683:13;:11;:13::i;:::-;59681:1;:15;59664:153;;;59732:4;59720:16;;:10;59728:1;59720:7;:10::i;:::-;:16;;;59716:90;;;59767:1;59756:7;59764:1;59756:10;;;;;;;;;;:::i;:::-;;;;;;;:12;;;;;59787:3;;;;;:::i;:::-;;;;59716:90;59697:3;;;;;:::i;:::-;;;;59664:153;;;;59835:7;59827:16;;;;59488:363;;;:::o;55509:90::-;55559:4;55582:9;;55575:16;;55509:90;:::o;55227:88::-;55273:4;55296:11;;;;;;;;;;;55289:18;;55227:88;:::o;34937:185::-;35075:39;35092:4;35098:2;35102:7;35075:39;;;;;;;;;;;;:16;:39::i;:::-;34937:185;;;:::o;55843:114::-;55895:4;55918:19;:31;55938:10;55918:31;;;;;;;;;;;;;;;;55911:38;;55843:114;:::o;59198:182::-;58909:10;58900:19;;:5;;;;;;;;;;;:19;;;58892:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;59286:6:::1;59282:89;59302:3;:10;59298:1;:14;59282:89;;;59335:10;59351:3;59355:1;59351:6;;;;;;;;:::i;:::-;;;;;;;;59335:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59314:3;;;;;:::i;:::-;;;;59282:89;;;;59198:182:::0;:::o;23227:152::-;23299:7;23342:27;23361:7;23342:18;:27::i;:::-;23319:52;;23227:152;;;:::o;54306:50::-;;;;;;;;;;;;;;;;;:::o;55136:80::-;55178:4;55201:7;;;;;;;;;;;55194:14;;55136:80;:::o;18769:233::-;18841:7;18882:1;18865:19;;:5;:19;;;18861:60;;;18893:28;;;;;;;;;;;;;;18861:60;12928:13;18939:18;:25;18958:5;18939:25;;;;;;;;;;;;;;;;:55;18932:62;;18769:233;;;:::o;55410:91::-;55456:4;55479:14;;55472:21;;55410:91;:::o;54043:21::-;;;;;;;;;;;;;:::o;57103:806::-;57178:4;57163:19;;:11;;;;;;;;;;;:19;;;:40;;;;57199:4;57186:17;;:9;;;;;;;;;;;:17;;;57163:40;57159:734;;;57241:5;57226:20;;:11;;;;;;;;;;;:20;;;:41;;;;57263:4;57250:17;;:9;;;;;;;;;;;:17;;;57226:41;57222:181;;;57321:5;57291:35;;:26;:24;:26::i;:::-;:35;;;57287:82;;;57345:24;;;;;;;;;;:::i;:::-;;;;;;;;57287:82;57222:181;57440:1;57423:14;;:18;;57415:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;57485:1;57473:9;;:13;;57465:34;;;;;;;;;;;;:::i;:::-;;;;;;;;;57532:1;57518:10;:15;;57510:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;57615:1;57602:10;57568:19;:31;57588:10;57568:31;;;;;;;;;;;;;;;;:44;;;;:::i;:::-;:48;;57560:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;57662:28;57668:10;57679;57662:5;:28::i;:::-;57736:10;57723:9;;:23;;;;;;;:::i;:::-;;;;;;;;57828:10;57794:19;:31;57814:10;57794:31;;;;;;;;;;;;;;;;:44;;;;:::i;:::-;57760:19;:31;57780:10;57760:31;;;;;;;;;;;;;;;:78;;;;57159:734;;;57867:26;;;;;;;;;;:::i;:::-;;;;;;;;57159:734;57103:806;:::o;54927:88::-;54976:7;55002:5;;;;;;;;;;;54995:12;;54927:88;:::o;53945:20::-;;;;;;;;;;;;;:::o;58600:245::-;58657:4;58689:6;58698:1;58689:10;;58685:130;58705:10;:17;;;;58701:1;:21;58685:130;;;58762:10;58773:1;58762:13;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;58748:27;;:10;:27;;;58745:57;;;58798:4;58791:11;;;;;58745:57;58724:3;;;;;:::i;:::-;;;;58685:130;;;;58832:5;58825:12;;58600:245;;:::o;53906:31::-;;;;;;;;;;;;;:::o;22010:104::-;22066:13;22099:7;22092:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22010:104;:::o;54363:51::-;;;;;;;;;;;;;;;;;:::o;28875:308::-;28986:19;:17;:19::i;:::-;28974:31;;:8;:31;;;28970:61;;;29014:17;;;;;;;;;;;;;;28970:61;29096:8;29044:18;:39;29063:19;:17;:19::i;:::-;29044:39;;;;;;;;;;;;;;;:49;29084:8;29044:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;29156:8;29120:55;;29135:19;:17;:19::i;:::-;29120:55;;;29166:8;29120:55;;;;;;:::i;:::-;;;;;;;;28875:308;;:::o;54711:100::-;58909:10;58900:19;;:5;;;;;;;;;;;:19;;;58892:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;54796:7:::1;54787:6;:16;;;;;;;;;;;;:::i;:::-;;54711:100:::0;:::o;35720:399::-;35887:31;35900:4;35906:2;35910:7;35887:12;:31::i;:::-;35951:1;35933:2;:14;;;:19;35929:183;;35972:56;36003:4;36009:2;36013:7;36022:5;35972:30;:56::i;:::-;35967:145;;36056:40;;;;;;;;;;;;;;35967:145;35929:183;35720:399;;;;:::o;57931:100::-;58909:10;58900:19;;:5;;;;;;;;;;;:19;;;58892:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;58014:9:::1;58006:5;:17;;;;57931:100:::0;:::o;58963:221::-;59036:13;59100:6;59118:25;59135:7;59118:16;:25::i;:::-;59083:79;;;;;;;;;:::i;:::-;;;;;;;;;;;;;59062:102;;58963:221;;;:::o;55723:112::-;55774:4;55797:18;:30;55816:10;55797:30;;;;;;;;;;;;;;;;55790:37;;55723:112;:::o;53974:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;56190:347::-;58909:10;58900:19;;:5;;;;;;;;;;;:19;;;58892:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;56243:24:::1;54101:42;56243;;56296:24;54176:42;56296;;56351:34;56396:16;;;;;;;;;;;56351:62;;56426:8;:17;;:47;56471:1;56444:18;:26;;;:28;;;;:::i;:::-;56426:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;56484:8;:17;;:45;56502:18;:26;;;56484:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;56232:305;;;56190:347::o:0;54009:27::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;29340:164::-;29437:4;29461:18;:25;29480:5;29461:25;;;;;;;;;;;;;;;:35;29487:8;29461:35;;;;;;;;;;;;;;;;;;;;;;;;;29454:42;;29340:164;;;;:::o;59859:945::-;59921:16;59960:34;60011:13;:11;:13::i;:::-;59997:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59960:65;;60036:32;60085:13;:11;:13::i;:::-;60071:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60036:63;;60115:6;60110:94;60126:13;:11;:13::i;:::-;60124:1;:15;60110:94;;;60182:10;60190:1;60182:7;:10::i;:::-;60162:16;60179:1;60162:19;;;;;;;;:::i;:::-;;;;;;;:30;;;;;;;;;;;60140:3;;;;;:::i;:::-;;;;60110:94;;;;60216:8;60240:6;60247:1;60240:8;;60235:377;60251:13;:11;:13::i;:::-;60249:1;:15;60235:377;;;60285:10;60317:6;60324:1;60317:8;;60312:163;60328:13;:11;:13::i;:::-;60326:1;:15;60312:163;;;60390:16;60407:1;60390:19;;;;;;;;:::i;:::-;;;;;;;;60369:40;;:16;60386:1;60369:19;;;;;;;;:::i;:::-;;;;;;;;:40;;;60365:95;;;60433:7;;;;;:::i;:::-;;;;60365:95;60342:3;;;;;:::i;:::-;;;;60312:163;;;;60501:1;60494:5;:8;60490:111;;;60542:16;60559:1;60542:19;;;;;;;;:::i;:::-;;;;;;;;60522:14;60537:3;60522:19;;;;;;;;:::i;:::-;;;;;;;:39;;;;;;;;;;;60580:5;;;;;:::i;:::-;;;;60490:111;60270:342;60265:3;;;;;:::i;:::-;;;;60235:377;;;;60622:28;60667:3;60653:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60622:49;;60687:6;60682:83;60698:3;60696:1;:5;60682:83;;;60736:14;60751:1;60736:17;;;;;;;;:::i;:::-;;;;;;;;60722:10;60733:1;60722:13;;;;;;;;:::i;:::-;;;;;;;:31;;;;;;;;;;;60702:3;;;;;:::i;:::-;;;;60682:83;;;;60786:10;60779:17;;;;;;59859:945;;;:::o;58142:82::-;58909:10;58900:19;;:5;;;;;;;;;;;:19;;;58892:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;58209:7:::1;;;;;;;;;;;58207:9;58198:7;;:18;;;;;;;;;;;;;;;;;;58142:82::o:0;39381:2454::-;39454:20;39477:13;;39454:36;;39517:1;39505:8;:13;39501:44;;;39527:18;;;;;;;;;;;;;;39501:44;39558:61;39588:1;39592:2;39596:12;39610:8;39558:21;:61::i;:::-;40102:1;13066:2;40072:1;:26;;40071:32;40059:8;:45;40033:18;:22;40052:2;40033:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;40381:139;40418:2;40472:33;40495:1;40499:2;40503:1;40472:14;:33::i;:::-;40439:30;40460:8;40439:20;:30::i;:::-;:66;40381:18;:139::i;:::-;40347:17;:31;40365:12;40347:31;;;;;;;;;;;:173;;;;40537:16;40568:11;40597:8;40582:12;:23;40568:37;;40852:16;40848:2;40844:25;40832:37;;41224:12;41184:8;41143:1;41081:25;41022:1;40961;40934:335;41349:1;41335:12;41331:20;41289:346;41390:3;41381:7;41378:16;41289:346;;41608:7;41598:8;41595:1;41568:25;41565:1;41562;41557:59;41443:1;41434:7;41430:15;41419:26;;41289:346;;;41293:77;41680:1;41668:8;:13;41664:45;;;41690:19;;;;;;;;;;;;;;41664:45;41742:3;41726:13;:19;;;;39807:1950;;41767:60;41796:1;41800:2;41804:12;41818:8;41767:20;:60::i;:::-;39443:2392;39381:2454;;:::o;29762:282::-;29827:4;29883:7;29864:15;:13;:15::i;:::-;:26;;:66;;;;;29917:13;;29907:7;:23;29864:66;:153;;;;;30016:1;13704:8;29968:17;:26;29986:7;29968:26;;;;;;;;;;;;:44;:49;29864:153;29844:173;;29762:282;;;:::o;51528:105::-;51588:7;51615:10;51608:17;;51528:105;:::o;17101:92::-;17157:7;17101:92;:::o;24382:1275::-;24449:7;24469:12;24484:7;24469:22;;24552:4;24533:15;:13;:15::i;:::-;:23;24529:1061;;24586:13;;24579:4;:20;24575:1015;;;24624:14;24641:17;:23;24659:4;24641:23;;;;;;;;;;;;24624:40;;24758:1;13704:8;24730:6;:24;:29;24726:845;;;25395:113;25412:1;25402:6;:11;25395:113;;;25455:17;:25;25473:6;;;;;;;25455:25;;;;;;;;;;;;25446:34;;25395:113;;;25541:6;25534:13;;;;;;24726:845;24601:989;24575:1015;24529:1061;25618:31;;;;;;;;;;;;;;24382:1275;;;;:::o;30925:479::-;31027:27;31056:23;31097:38;31138:15;:24;31154:7;31138:24;;;;;;;;;;;31097:65;;31309:18;31286:41;;31366:19;31360:26;31341:45;;31271:126;30925:479;;;:::o;30153:659::-;30302:11;30467:16;30460:5;30456:28;30447:37;;30627:16;30616:9;30612:32;30599:45;;30777:15;30766:9;30763:30;30755:5;30744:9;30741:20;30738:56;30728:66;;30153:659;;;;;:::o;36781:159::-;;;;;:::o;50837:311::-;50972:7;50992:16;14108:3;51018:19;:41;;50992:68;;14108:3;51086:31;51097:4;51103:2;51107:9;51086:10;:31::i;:::-;51078:40;;:62;;51071:69;;;50837:311;;;;;:::o;26205:450::-;26285:14;26453:16;26446:5;26442:28;26433:37;;26630:5;26616:11;26591:23;26587:41;26584:52;26577:5;26574:63;26564:73;;26205:450;;;;:::o;37605:158::-;;;;;:::o;38203:716::-;38366:4;38412:2;38387:45;;;38433:19;:17;:19::i;:::-;38454:4;38460:7;38469:5;38387:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;38383:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38687:1;38670:6;:13;:18;38666:235;;;38716:40;;;;;;;;;;;;;;38666:235;38859:6;38853:13;38844:6;38840:2;38836:15;38829:38;38383:529;38556:54;;;38546:64;;;:6;:64;;;;38539:71;;;38203:716;;;;;;:::o;430:723::-;486:13;716:1;707:5;:10;703:53;;;734:10;;;;;;;;;;;;;;;;;;;;;703:53;766:12;781:5;766:20;;797:14;822:78;837:1;829:4;:9;822:78;;855:8;;;;;:::i;:::-;;;;886:2;878:10;;;;;:::i;:::-;;;822:78;;;910:19;942:6;932:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;910:39;;960:154;976:1;967:5;:10;960:154;;1004:1;994:11;;;;;:::i;:::-;;;1071:2;1063:5;:10;;;;:::i;:::-;1050:2;:24;;;;:::i;:::-;1037:39;;1020:6;1027;1020:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1100:2;1091:11;;;;;:::i;:::-;;;960:154;;;1138:6;1124:21;;;;;430:723;;;;:::o;26757:324::-;26827:14;27060:1;27050:8;27047:15;27021:24;27017:46;27007:56;;26757:324;;;:::o;50538:147::-;50675:6;50538:147;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:112;;;1443:79;;:::i;:::-;1412:112;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;1168:412;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1586:139;;;;:::o;1748:370::-;1819:5;1868:3;1861:4;1853:6;1849:17;1845:27;1835:122;;1876:79;;:::i;:::-;1835:122;1993:6;1980:20;2018:94;2108:3;2100:6;2093:4;2085:6;2081:17;2018:94;:::i;:::-;2009:103;;1825:293;1748:370;;;;:::o;2124:133::-;2167:5;2205:6;2192:20;2183:29;;2221:30;2245:5;2221:30;:::i;:::-;2124:133;;;;:::o;2263:137::-;2308:5;2346:6;2333:20;2324:29;;2362:32;2388:5;2362:32;:::i;:::-;2263:137;;;;:::o;2406:141::-;2462:5;2493:6;2487:13;2478:22;;2509:32;2535:5;2509:32;:::i;:::-;2406:141;;;;:::o;2566:338::-;2621:5;2670:3;2663:4;2655:6;2651:17;2647:27;2637:122;;2678:79;;:::i;:::-;2637:122;2795:6;2782:20;2820:78;2894:3;2886:6;2879:4;2871:6;2867:17;2820:78;:::i;:::-;2811:87;;2627:277;2566:338;;;;:::o;2924:340::-;2980:5;3029:3;3022:4;3014:6;3010:17;3006:27;2996:122;;3037:79;;:::i;:::-;2996:122;3154:6;3141:20;3179:79;3254:3;3246:6;3239:4;3231:6;3227:17;3179:79;:::i;:::-;3170:88;;2986:278;2924:340;;;;:::o;3270:139::-;3316:5;3354:6;3341:20;3332:29;;3370:33;3397:5;3370:33;:::i;:::-;3270:139;;;;:::o;3415:329::-;3474:6;3523:2;3511:9;3502:7;3498:23;3494:32;3491:119;;;3529:79;;:::i;:::-;3491:119;3649:1;3674:53;3719:7;3710:6;3699:9;3695:22;3674:53;:::i;:::-;3664:63;;3620:117;3415:329;;;;:::o;3750:474::-;3818:6;3826;3875:2;3863:9;3854:7;3850:23;3846:32;3843:119;;;3881:79;;:::i;:::-;3843:119;4001:1;4026:53;4071:7;4062:6;4051:9;4047:22;4026:53;:::i;:::-;4016:63;;3972:117;4128:2;4154:53;4199:7;4190:6;4179:9;4175:22;4154:53;:::i;:::-;4144:63;;4099:118;3750:474;;;;;:::o;4230:619::-;4307:6;4315;4323;4372:2;4360:9;4351:7;4347:23;4343:32;4340:119;;;4378:79;;:::i;:::-;4340:119;4498:1;4523:53;4568:7;4559:6;4548:9;4544:22;4523:53;:::i;:::-;4513:63;;4469:117;4625:2;4651:53;4696:7;4687:6;4676:9;4672:22;4651:53;:::i;:::-;4641:63;;4596:118;4753:2;4779:53;4824:7;4815:6;4804:9;4800:22;4779:53;:::i;:::-;4769:63;;4724:118;4230:619;;;;;:::o;4855:943::-;4950:6;4958;4966;4974;5023:3;5011:9;5002:7;4998:23;4994:33;4991:120;;;5030:79;;:::i;:::-;4991:120;5150:1;5175:53;5220:7;5211:6;5200:9;5196:22;5175:53;:::i;:::-;5165:63;;5121:117;5277:2;5303:53;5348:7;5339:6;5328:9;5324:22;5303:53;:::i;:::-;5293:63;;5248:118;5405:2;5431:53;5476:7;5467:6;5456:9;5452:22;5431:53;:::i;:::-;5421:63;;5376:118;5561:2;5550:9;5546:18;5533:32;5592:18;5584:6;5581:30;5578:117;;;5614:79;;:::i;:::-;5578:117;5719:62;5773:7;5764:6;5753:9;5749:22;5719:62;:::i;:::-;5709:72;;5504:287;4855:943;;;;;;;:::o;5804:468::-;5869:6;5877;5926:2;5914:9;5905:7;5901:23;5897:32;5894:119;;;5932:79;;:::i;:::-;5894:119;6052:1;6077:53;6122:7;6113:6;6102:9;6098:22;6077:53;:::i;:::-;6067:63;;6023:117;6179:2;6205:50;6247:7;6238:6;6227:9;6223:22;6205:50;:::i;:::-;6195:60;;6150:115;5804:468;;;;;:::o;6278:474::-;6346:6;6354;6403:2;6391:9;6382:7;6378:23;6374:32;6371:119;;;6409:79;;:::i;:::-;6371:119;6529:1;6554:53;6599:7;6590:6;6579:9;6575:22;6554:53;:::i;:::-;6544:63;;6500:117;6656:2;6682:53;6727:7;6718:6;6707:9;6703:22;6682:53;:::i;:::-;6672:63;;6627:118;6278:474;;;;;:::o;6758:539::-;6842:6;6891:2;6879:9;6870:7;6866:23;6862:32;6859:119;;;6897:79;;:::i;:::-;6859:119;7045:1;7034:9;7030:17;7017:31;7075:18;7067:6;7064:30;7061:117;;;7097:79;;:::i;:::-;7061:117;7202:78;7272:7;7263:6;7252:9;7248:22;7202:78;:::i;:::-;7192:88;;6988:302;6758:539;;;;:::o;7303:327::-;7361:6;7410:2;7398:9;7389:7;7385:23;7381:32;7378:119;;;7416:79;;:::i;:::-;7378:119;7536:1;7561:52;7605:7;7596:6;7585:9;7581:22;7561:52;:::i;:::-;7551:62;;7507:116;7303:327;;;;:::o;7636:349::-;7705:6;7754:2;7742:9;7733:7;7729:23;7725:32;7722:119;;;7760:79;;:::i;:::-;7722:119;7880:1;7905:63;7960:7;7951:6;7940:9;7936:22;7905:63;:::i;:::-;7895:73;;7851:127;7636:349;;;;:::o;7991:509::-;8060:6;8109:2;8097:9;8088:7;8084:23;8080:32;8077:119;;;8115:79;;:::i;:::-;8077:119;8263:1;8252:9;8248:17;8235:31;8293:18;8285:6;8282:30;8279:117;;;8315:79;;:::i;:::-;8279:117;8420:63;8475:7;8466:6;8455:9;8451:22;8420:63;:::i;:::-;8410:73;;8206:287;7991:509;;;;:::o;8506:329::-;8565:6;8614:2;8602:9;8593:7;8589:23;8585:32;8582:119;;;8620:79;;:::i;:::-;8582:119;8740:1;8765:53;8810:7;8801:6;8790:9;8786:22;8765:53;:::i;:::-;8755:63;;8711:117;8506:329;;;;:::o;8841:179::-;8910:10;8931:46;8973:3;8965:6;8931:46;:::i;:::-;9009:4;9004:3;9000:14;8986:28;;8841:179;;;;:::o;9026:::-;9095:10;9116:46;9158:3;9150:6;9116:46;:::i;:::-;9194:4;9189:3;9185:14;9171:28;;9026:179;;;;:::o;9211:108::-;9288:24;9306:5;9288:24;:::i;:::-;9283:3;9276:37;9211:108;;:::o;9325:118::-;9412:24;9430:5;9412:24;:::i;:::-;9407:3;9400:37;9325:118;;:::o;9479:732::-;9598:3;9627:54;9675:5;9627:54;:::i;:::-;9697:86;9776:6;9771:3;9697:86;:::i;:::-;9690:93;;9807:56;9857:5;9807:56;:::i;:::-;9886:7;9917:1;9902:284;9927:6;9924:1;9921:13;9902:284;;;10003:6;9997:13;10030:63;10089:3;10074:13;10030:63;:::i;:::-;10023:70;;10116:60;10169:6;10116:60;:::i;:::-;10106:70;;9962:224;9949:1;9946;9942:9;9937:14;;9902:284;;;9906:14;10202:3;10195:10;;9603:608;;;9479:732;;;;:::o;10247:::-;10366:3;10395:54;10443:5;10395:54;:::i;:::-;10465:86;10544:6;10539:3;10465:86;:::i;:::-;10458:93;;10575:56;10625:5;10575:56;:::i;:::-;10654:7;10685:1;10670:284;10695:6;10692:1;10689:13;10670:284;;;10771:6;10765:13;10798:63;10857:3;10842:13;10798:63;:::i;:::-;10791:70;;10884:60;10937:6;10884:60;:::i;:::-;10874:70;;10730:224;10717:1;10714;10710:9;10705:14;;10670:284;;;10674:14;10970:3;10963:10;;10371:608;;;10247:732;;;;:::o;10985:109::-;11066:21;11081:5;11066:21;:::i;:::-;11061:3;11054:34;10985:109;;:::o;11100:360::-;11186:3;11214:38;11246:5;11214:38;:::i;:::-;11268:70;11331:6;11326:3;11268:70;:::i;:::-;11261:77;;11347:52;11392:6;11387:3;11380:4;11373:5;11369:16;11347:52;:::i;:::-;11424:29;11446:6;11424:29;:::i;:::-;11419:3;11415:39;11408:46;;11190:270;11100:360;;;;:::o;11466:364::-;11554:3;11582:39;11615:5;11582:39;:::i;:::-;11637:71;11701:6;11696:3;11637:71;:::i;:::-;11630:78;;11717:52;11762:6;11757:3;11750:4;11743:5;11739:16;11717:52;:::i;:::-;11794:29;11816:6;11794:29;:::i;:::-;11789:3;11785:39;11778:46;;11558:272;11466:364;;;;:::o;11836:377::-;11942:3;11970:39;12003:5;11970:39;:::i;:::-;12025:89;12107:6;12102:3;12025:89;:::i;:::-;12018:96;;12123:52;12168:6;12163:3;12156:4;12149:5;12145:16;12123:52;:::i;:::-;12200:6;12195:3;12191:16;12184:23;;11946:267;11836:377;;;;:::o;12243:845::-;12346:3;12383:5;12377:12;12412:36;12438:9;12412:36;:::i;:::-;12464:89;12546:6;12541:3;12464:89;:::i;:::-;12457:96;;12584:1;12573:9;12569:17;12600:1;12595:137;;;;12746:1;12741:341;;;;12562:520;;12595:137;12679:4;12675:9;12664;12660:25;12655:3;12648:38;12715:6;12710:3;12706:16;12699:23;;12595:137;;12741:341;12808:38;12840:5;12808:38;:::i;:::-;12868:1;12882:154;12896:6;12893:1;12890:13;12882:154;;;12970:7;12964:14;12960:1;12955:3;12951:11;12944:35;13020:1;13011:7;13007:15;12996:26;;12918:4;12915:1;12911:12;12906:17;;12882:154;;;13065:6;13060:3;13056:16;13049:23;;12748:334;;12562:520;;12350:738;;12243:845;;;;:::o;13094:365::-;13236:3;13257:66;13321:1;13316:3;13257:66;:::i;:::-;13250:73;;13332:93;13421:3;13332:93;:::i;:::-;13450:2;13445:3;13441:12;13434:19;;13094:365;;;:::o;13465:366::-;13607:3;13628:67;13692:2;13687:3;13628:67;:::i;:::-;13621:74;;13704:93;13793:3;13704:93;:::i;:::-;13822:2;13817:3;13813:12;13806:19;;13465:366;;;:::o;13837:::-;13979:3;14000:67;14064:2;14059:3;14000:67;:::i;:::-;13993:74;;14076:93;14165:3;14076:93;:::i;:::-;14194:2;14189:3;14185:12;14178:19;;13837:366;;;:::o;14209:::-;14351:3;14372:67;14436:2;14431:3;14372:67;:::i;:::-;14365:74;;14448:93;14537:3;14448:93;:::i;:::-;14566:2;14561:3;14557:12;14550:19;;14209:366;;;:::o;14581:::-;14723:3;14744:67;14808:2;14803:3;14744:67;:::i;:::-;14737:74;;14820:93;14909:3;14820:93;:::i;:::-;14938:2;14933:3;14929:12;14922:19;;14581:366;;;:::o;14953:400::-;15113:3;15134:84;15216:1;15211:3;15134:84;:::i;:::-;15127:91;;15227:93;15316:3;15227:93;:::i;:::-;15345:1;15340:3;15336:11;15329:18;;14953:400;;;:::o;15359:365::-;15501:3;15522:66;15586:1;15581:3;15522:66;:::i;:::-;15515:73;;15597:93;15686:3;15597:93;:::i;:::-;15715:2;15710:3;15706:12;15699:19;;15359:365;;;:::o;15730:366::-;15872:3;15893:67;15957:2;15952:3;15893:67;:::i;:::-;15886:74;;15969:93;16058:3;15969:93;:::i;:::-;16087:2;16082:3;16078:12;16071:19;;15730:366;;;:::o;16102:::-;16244:3;16265:67;16329:2;16324:3;16265:67;:::i;:::-;16258:74;;16341:93;16430:3;16341:93;:::i;:::-;16459:2;16454:3;16450:12;16443:19;;16102:366;;;:::o;16474:::-;16616:3;16637:67;16701:2;16696:3;16637:67;:::i;:::-;16630:74;;16713:93;16802:3;16713:93;:::i;:::-;16831:2;16826:3;16822:12;16815:19;;16474:366;;;:::o;16846:108::-;16923:24;16941:5;16923:24;:::i;:::-;16918:3;16911:37;16846:108;;:::o;16960:118::-;17047:24;17065:5;17047:24;:::i;:::-;17042:3;17035:37;16960:118;;:::o;17084:695::-;17362:3;17384:92;17472:3;17463:6;17384:92;:::i;:::-;17377:99;;17493:95;17584:3;17575:6;17493:95;:::i;:::-;17486:102;;17605:148;17749:3;17605:148;:::i;:::-;17598:155;;17770:3;17763:10;;17084:695;;;;;:::o;17785:222::-;17878:4;17916:2;17905:9;17901:18;17893:26;;17929:71;17997:1;17986:9;17982:17;17973:6;17929:71;:::i;:::-;17785:222;;;;:::o;18013:640::-;18208:4;18246:3;18235:9;18231:19;18223:27;;18260:71;18328:1;18317:9;18313:17;18304:6;18260:71;:::i;:::-;18341:72;18409:2;18398:9;18394:18;18385:6;18341:72;:::i;:::-;18423;18491:2;18480:9;18476:18;18467:6;18423:72;:::i;:::-;18542:9;18536:4;18532:20;18527:2;18516:9;18512:18;18505:48;18570:76;18641:4;18632:6;18570:76;:::i;:::-;18562:84;;18013:640;;;;;;;:::o;18659:373::-;18802:4;18840:2;18829:9;18825:18;18817:26;;18889:9;18883:4;18879:20;18875:1;18864:9;18860:17;18853:47;18917:108;19020:4;19011:6;18917:108;:::i;:::-;18909:116;;18659:373;;;;:::o;19038:::-;19181:4;19219:2;19208:9;19204:18;19196:26;;19268:9;19262:4;19258:20;19254:1;19243:9;19239:17;19232:47;19296:108;19399:4;19390:6;19296:108;:::i;:::-;19288:116;;19038:373;;;;:::o;19417:210::-;19504:4;19542:2;19531:9;19527:18;19519:26;;19555:65;19617:1;19606:9;19602:17;19593:6;19555:65;:::i;:::-;19417:210;;;;:::o;19633:313::-;19746:4;19784:2;19773:9;19769:18;19761:26;;19833:9;19827:4;19823:20;19819:1;19808:9;19804:17;19797:47;19861:78;19934:4;19925:6;19861:78;:::i;:::-;19853:86;;19633:313;;;;:::o;19952:419::-;20118:4;20156:2;20145:9;20141:18;20133:26;;20205:9;20199:4;20195:20;20191:1;20180:9;20176:17;20169:47;20233:131;20359:4;20233:131;:::i;:::-;20225:139;;19952:419;;;:::o;20377:::-;20543:4;20581:2;20570:9;20566:18;20558:26;;20630:9;20624:4;20620:20;20616:1;20605:9;20601:17;20594:47;20658:131;20784:4;20658:131;:::i;:::-;20650:139;;20377:419;;;:::o;20802:::-;20968:4;21006:2;20995:9;20991:18;20983:26;;21055:9;21049:4;21045:20;21041:1;21030:9;21026:17;21019:47;21083:131;21209:4;21083:131;:::i;:::-;21075:139;;20802:419;;;:::o;21227:::-;21393:4;21431:2;21420:9;21416:18;21408:26;;21480:9;21474:4;21470:20;21466:1;21455:9;21451:17;21444:47;21508:131;21634:4;21508:131;:::i;:::-;21500:139;;21227:419;;;:::o;21652:::-;21818:4;21856:2;21845:9;21841:18;21833:26;;21905:9;21899:4;21895:20;21891:1;21880:9;21876:17;21869:47;21933:131;22059:4;21933:131;:::i;:::-;21925:139;;21652:419;;;:::o;22077:::-;22243:4;22281:2;22270:9;22266:18;22258:26;;22330:9;22324:4;22320:20;22316:1;22305:9;22301:17;22294:47;22358:131;22484:4;22358:131;:::i;:::-;22350:139;;22077:419;;;:::o;22502:::-;22668:4;22706:2;22695:9;22691:18;22683:26;;22755:9;22749:4;22745:20;22741:1;22730:9;22726:17;22719:47;22783:131;22909:4;22783:131;:::i;:::-;22775:139;;22502:419;;;:::o;22927:::-;23093:4;23131:2;23120:9;23116:18;23108:26;;23180:9;23174:4;23170:20;23166:1;23155:9;23151:17;23144:47;23208:131;23334:4;23208:131;:::i;:::-;23200:139;;22927:419;;;:::o;23352:::-;23518:4;23556:2;23545:9;23541:18;23533:26;;23605:9;23599:4;23595:20;23591:1;23580:9;23576:17;23569:47;23633:131;23759:4;23633:131;:::i;:::-;23625:139;;23352:419;;;:::o;23777:222::-;23870:4;23908:2;23897:9;23893:18;23885:26;;23921:71;23989:1;23978:9;23974:17;23965:6;23921:71;:::i;:::-;23777:222;;;;:::o;24005:129::-;24039:6;24066:20;;:::i;:::-;24056:30;;24095:33;24123:4;24115:6;24095:33;:::i;:::-;24005:129;;;:::o;24140:75::-;24173:6;24206:2;24200:9;24190:19;;24140:75;:::o;24221:311::-;24298:4;24388:18;24380:6;24377:30;24374:56;;;24410:18;;:::i;:::-;24374:56;24460:4;24452:6;24448:17;24440:25;;24520:4;24514;24510:15;24502:23;;24221:311;;;:::o;24538:307::-;24599:4;24689:18;24681:6;24678:30;24675:56;;;24711:18;;:::i;:::-;24675:56;24749:29;24771:6;24749:29;:::i;:::-;24741:37;;24833:4;24827;24823:15;24815:23;;24538:307;;;:::o;24851:308::-;24913:4;25003:18;24995:6;24992:30;24989:56;;;25025:18;;:::i;:::-;24989:56;25063:29;25085:6;25063:29;:::i;:::-;25055:37;;25147:4;25141;25137:15;25129:23;;24851:308;;;:::o;25165:132::-;25232:4;25255:3;25247:11;;25285:4;25280:3;25276:14;25268:22;;25165:132;;;:::o;25303:::-;25370:4;25393:3;25385:11;;25423:4;25418:3;25414:14;25406:22;;25303:132;;;:::o;25441:141::-;25490:4;25513:3;25505:11;;25536:3;25533:1;25526:14;25570:4;25567:1;25557:18;25549:26;;25441:141;;;:::o;25588:114::-;25655:6;25689:5;25683:12;25673:22;;25588:114;;;:::o;25708:::-;25775:6;25809:5;25803:12;25793:22;;25708:114;;;:::o;25828:98::-;25879:6;25913:5;25907:12;25897:22;;25828:98;;;:::o;25932:99::-;25984:6;26018:5;26012:12;26002:22;;25932:99;;;:::o;26037:113::-;26107:4;26139;26134:3;26130:14;26122:22;;26037:113;;;:::o;26156:::-;26226:4;26258;26253:3;26249:14;26241:22;;26156:113;;;:::o;26275:184::-;26374:11;26408:6;26403:3;26396:19;26448:4;26443:3;26439:14;26424:29;;26275:184;;;;:::o;26465:::-;26564:11;26598:6;26593:3;26586:19;26638:4;26633:3;26629:14;26614:29;;26465:184;;;;:::o;26655:168::-;26738:11;26772:6;26767:3;26760:19;26812:4;26807:3;26803:14;26788:29;;26655:168;;;;:::o;26829:169::-;26913:11;26947:6;26942:3;26935:19;26987:4;26982:3;26978:14;26963:29;;26829:169;;;;:::o;27004:148::-;27106:11;27143:3;27128:18;;27004:148;;;;:::o;27158:305::-;27198:3;27217:20;27235:1;27217:20;:::i;:::-;27212:25;;27251:20;27269:1;27251:20;:::i;:::-;27246:25;;27405:1;27337:66;27333:74;27330:1;27327:81;27324:107;;;27411:18;;:::i;:::-;27324:107;27455:1;27452;27448:9;27441:16;;27158:305;;;;:::o;27469:185::-;27509:1;27526:20;27544:1;27526:20;:::i;:::-;27521:25;;27560:20;27578:1;27560:20;:::i;:::-;27555:25;;27599:1;27589:35;;27604:18;;:::i;:::-;27589:35;27646:1;27643;27639:9;27634:14;;27469:185;;;;:::o;27660:348::-;27700:7;27723:20;27741:1;27723:20;:::i;:::-;27718:25;;27757:20;27775:1;27757:20;:::i;:::-;27752:25;;27945:1;27877:66;27873:74;27870:1;27867:81;27862:1;27855:9;27848:17;27844:105;27841:131;;;27952:18;;:::i;:::-;27841:131;28000:1;27997;27993:9;27982:20;;27660:348;;;;:::o;28014:191::-;28054:4;28074:20;28092:1;28074:20;:::i;:::-;28069:25;;28108:20;28126:1;28108:20;:::i;:::-;28103:25;;28147:1;28144;28141:8;28138:34;;;28152:18;;:::i;:::-;28138:34;28197:1;28194;28190:9;28182:17;;28014:191;;;;:::o;28211:96::-;28248:7;28277:24;28295:5;28277:24;:::i;:::-;28266:35;;28211:96;;;:::o;28313:90::-;28347:7;28390:5;28383:13;28376:21;28365:32;;28313:90;;;:::o;28409:149::-;28445:7;28485:66;28478:5;28474:78;28463:89;;28409:149;;;:::o;28564:89::-;28600:7;28640:6;28633:5;28629:18;28618:29;;28564:89;;;:::o;28659:126::-;28696:7;28736:42;28729:5;28725:54;28714:65;;28659:126;;;:::o;28791:77::-;28828:7;28857:5;28846:16;;28791:77;;;:::o;28874:154::-;28958:6;28953:3;28948;28935:30;29020:1;29011:6;29006:3;29002:16;28995:27;28874:154;;;:::o;29034:307::-;29102:1;29112:113;29126:6;29123:1;29120:13;29112:113;;;29211:1;29206:3;29202:11;29196:18;29192:1;29187:3;29183:11;29176:39;29148:2;29145:1;29141:10;29136:15;;29112:113;;;29243:6;29240:1;29237:13;29234:101;;;29323:1;29314:6;29309:3;29305:16;29298:27;29234:101;29083:258;29034:307;;;:::o;29347:320::-;29391:6;29428:1;29422:4;29418:12;29408:22;;29475:1;29469:4;29465:12;29496:18;29486:81;;29552:4;29544:6;29540:17;29530:27;;29486:81;29614:2;29606:6;29603:14;29583:18;29580:38;29577:84;;;29633:18;;:::i;:::-;29577:84;29398:269;29347:320;;;:::o;29673:281::-;29756:27;29778:4;29756:27;:::i;:::-;29748:6;29744:40;29886:6;29874:10;29871:22;29850:18;29838:10;29835:34;29832:62;29829:88;;;29897:18;;:::i;:::-;29829:88;29937:10;29933:2;29926:22;29716:238;29673:281;;:::o;29960:171::-;29998:3;30021:23;30038:5;30021:23;:::i;:::-;30012:32;;30066:6;30059:5;30056:17;30053:43;;;30076:18;;:::i;:::-;30053:43;30123:1;30116:5;30112:13;30105:20;;29960:171;;;:::o;30137:233::-;30176:3;30199:24;30217:5;30199:24;:::i;:::-;30190:33;;30245:66;30238:5;30235:77;30232:103;;;30315:18;;:::i;:::-;30232:103;30362:1;30355:5;30351:13;30344:20;;30137:233;;;:::o;30376:176::-;30408:1;30425:20;30443:1;30425:20;:::i;:::-;30420:25;;30459:20;30477:1;30459:20;:::i;:::-;30454:25;;30498:1;30488:35;;30503:18;;:::i;:::-;30488:35;30544:1;30541;30537:9;30532:14;;30376:176;;;;:::o;30558:180::-;30606:77;30603:1;30596:88;30703:4;30700:1;30693:15;30727:4;30724:1;30717:15;30744:180;30792:77;30789:1;30782:88;30889:4;30886:1;30879:15;30913:4;30910:1;30903:15;30930:180;30978:77;30975:1;30968:88;31075:4;31072:1;31065:15;31099:4;31096:1;31089:15;31116:180;31164:77;31161:1;31154:88;31261:4;31258:1;31251:15;31285:4;31282:1;31275:15;31302:180;31350:77;31347:1;31340:88;31447:4;31444:1;31437:15;31471:4;31468:1;31461:15;31488:117;31597:1;31594;31587:12;31611:117;31720:1;31717;31710:12;31734:117;31843:1;31840;31833:12;31857:117;31966:1;31963;31956:12;31980:117;32089:1;32086;32079:12;32103:102;32144:6;32195:2;32191:7;32186:2;32179:5;32175:14;32171:28;32161:38;;32103:102;;;:::o;32211:156::-;32351:8;32347:1;32339:6;32335:14;32328:32;32211:156;:::o;32373:163::-;32513:15;32509:1;32501:6;32497:14;32490:39;32373:163;:::o;32542:162::-;32682:14;32678:1;32670:6;32666:14;32659:38;32542:162;:::o;32710:166::-;32850:18;32846:1;32838:6;32834:14;32827:42;32710:166;:::o;32882:163::-;33022:15;33018:1;33010:6;33006:14;32999:39;32882:163;:::o;33051:155::-;33191:7;33187:1;33179:6;33175:14;33168:31;33051:155;:::o;33212:158::-;33352:10;33348:1;33340:6;33336:14;33329:34;33212:158;:::o;33376:160::-;33516:12;33512:1;33504:6;33500:14;33493:36;33376:160;:::o;33542:164::-;33682:16;33678:1;33670:6;33666:14;33659:40;33542:164;:::o;33712:160::-;33852:12;33848:1;33840:6;33836:14;33829:36;33712:160;:::o;33878:122::-;33951:24;33969:5;33951:24;:::i;:::-;33944:5;33941:35;33931:63;;33990:1;33987;33980:12;33931:63;33878:122;:::o;34006:116::-;34076:21;34091:5;34076:21;:::i;:::-;34069:5;34066:32;34056:60;;34112:1;34109;34102:12;34056:60;34006:116;:::o;34128:120::-;34200:23;34217:5;34200:23;:::i;:::-;34193:5;34190:34;34180:62;;34238:1;34235;34228:12;34180:62;34128:120;:::o;34254:122::-;34327:24;34345:5;34327:24;:::i;:::-;34320:5;34317:35;34307:63;;34366:1;34363;34356:12;34307:63;34254:122;:::o

Swarm Source

ipfs://5c352332b42f585cd9cd0cd76dd6b4d3b35e95d34fe51c6e3882cc5c0adef314
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.