ETH Price: $2,292.33 (+0.19%)

Token

Military Finance NFT (MF)
 

Overview

Max Total Supply

1,075 MF

Holders

84

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 MF
0x6ef959d111b62f0e830efc471d01d47ba77984cc
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:
MilitaryFinanceNFT

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-06-08
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

abstract contract ReentrancyGuard {
    
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

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

        _;

        _status = _NOT_ENTERED;
    }
}

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

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

    /**
     * The caller cannot approve to the current owner.
     */
    error ApprovalToCurrentOwner();

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

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     *
     * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens.
     */
    function totalSupply() external view returns (uint256);

    function supportsInterface(bytes4 interfaceId) external view returns (bool);

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

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    function approve(address to, uint256 tokenId) external;

    function setApprovalForAll(address operator, bool _approved) external;

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

interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

contract ERC721A is IERC721A {
    // 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 tokenId of the next token 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(uint256 => uint256) private _packedOwnerships;

    mapping(address => uint256) private _packedAddressData;

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

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

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

    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

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

    function totalSupply() public view 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 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 returns (uint256) {
        return _burnCounter;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    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: 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.
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view 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 auxillary 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 auxillary 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 {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        assembly { // Cast aux without masking.
            auxCasted := aux
        }
        packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

    /**
     * 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 ownership that has an address and is not burned
                        // before an ownership that does not have an address and is not burned.
                        // Hence, curr will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed is zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

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

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

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

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

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        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, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    /**
     * @dev Casts the address to uint256 without masking.
     */
    function _addressToUint256(address value) private pure returns (uint256 result) {
        assembly {
            result := value
        }
    }

    /**
     * @dev Casts the boolean to uint256 without branching.
     */
    function _boolToUint256(bool value) private pure returns (uint256 result) {
        assembly {
            result := value
        }
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = address(uint160(_packedOwnershipOf(tokenId)));
        if (to == owner) revert ApprovalToCurrentOwner();

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

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

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        if (operator == _msgSenderERC721A()) revert ApproveToCaller();

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

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

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

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned.
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, 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.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _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] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (to.code.length != 0) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex < end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex < end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @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.
     */
    function _mint(address to, uint256 quantity) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _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] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            do {
                emit Transfer(address(0), to, updatedIndex++);
            } while (updatedIndex < end);

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

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

        bool isApprovedOrOwner = (_msgSenderERC721A() == from ||
            isApprovedForAll(from, _msgSenderERC721A()) ||
            getApproved(tokenId) == _msgSenderERC721A());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        delete _tokenApprovals[tokenId];

        // 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] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_NEXT_INITIALIZED;

            // 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 `_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));

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSenderERC721A() == from ||
                isApprovedForAll(from, _msgSenderERC721A()) ||
                getApproved(tokenId) == _msgSenderERC721A());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

        // Clear approvals from the previous owner.
        delete _tokenApprovals[tokenId];

        // 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] =
                _addressToUint256(from) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_BURNED | 
                BITMASK_NEXT_INITIALIZED;

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

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

    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    function _msgSenderERC721A() internal view virtual returns (address) {
        return msg.sender;
    }

   
    function _toString(uint256 value) internal pure 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. 48 is the ASCII index of '0'.
                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)
        }
    }
}

contract MilitaryFinanceNFT is ERC721A, Ownable,ReentrancyGuard {
  
    mapping(address=>uint256) public nftPerAddress;
    bool public isMintActive = false;
    
    string public baseURI = "ipfs://QmTCbup7X7G9jKUnay1odzVTyM3gndgApgapuySywHYpAg/mil.json";

    constructor() ERC721A("Military Finance NFT", "MF") {
        setBaseURI(baseURI);
        assignNFT([0x0F02c84F0f4dde605B8F79A0f906189Fe3D6563b,0x4cf8b424df061DebF876a4B930D83A1c6999e41F,0xd5a5E3e8d783198E296418a0c372B6840a1d7908,0xCb7c988DCf1bd9798adad8C1f0fde85E301884BA,0x7b8575a65320fC220D75290123f13906B512B2B3,0x74D6400F9480df5e5ffc76283147836bcE8D3c95,0x42480b336ad6246Cfde0ADc3b5C0F987621301bF,0x04cD0F07C5dfB0Fd97E2D6D4dCF51Fc4bf6902b8,0x2515388f9135c6e554950a13f27A2D311a695005,0xdB379e9D031b31A339e1FA38ac14859987379f85,0x49410e0986Bf3DAe2099f6CF159c3a428775BaCD,0xE6ac31c0eBFBdC40C0d37F00b22D7798810CA534,0xfC283d4DB5FcbC9C1f121E6F7aE98279d2DCE7dd,0x4E5D191DFFb8d3DFe7790F91ACe6f9B80F04Ef0f,0x3cbF94db8624F711e43429bb35eac970fd787cF7,0x6aE85Eaade22A37bD8f82755946307C869300317,0xC83DCD8509559A81250A62Ab5bfA02fC377E0472,0xd73f155CbdE8904E378f23b7cF03e85422045fCe,0x89147c5005230ef53629C9C6B1EA98994E626Eb2,0xa665daa4CF74F388b5BA71921B399Ad8d6c246e8,0x18Ec26AB28fE3f01675da12D6bD9AE9BcE560cEb,0xa69EeE71308C9Ae74eBA62c369ee77E306906c0f,0x38EEad1e98dfB2FD75fA6D10FE9b6fAB59f5893E,0x4aa0e35DC8A91193BE87592e19a84Bd7051D4ce6,0x45Aa70E782Aa969AEacB0Bc0570D014ccC66b588,0xC27be6F5e9640cEF25F98217Ca10f3FD51CE8277,0xB7A7c45562Cef752cB695DbB37F721ac82589bfe,0x8419b7BFF5F0a028062812993b77CA1b4fa5D05F,0x1dde6B5963536D241Fd50afD28c062cE0C94Bb36,0xd4E17a7851EC93DE08eCb25638a9E09D457f93Cb,0xF21d95281337D1D7d6086bb03ddA4699d36B8568,0xe8e3451b15EB5e6d4c4092Ff7d4e6a328b8B1C49,0xcf9B51D3E910E3910e29eD54480dC4308F69096E,0xDa6db76eAed161d422D8BEB670d7056Ec75b7914,0xD3041A2d0A087818CbF164EfBC0C481bBA0Fba52,0xb8343637ddEEBA2b30a57e486390645960299A65,0x458BE92AdceaAA7ef850B9feB8DBAB7D59435831,0x5743Ce317A6f7155D5681701F935082c04255c97,0x8C3c67f6e2E4FBD181F9c0fE4030aFbeE732C864,0x25585f2c5E89BF0C0A6E56e13Cb4Db35Aa36450e,0x70887FC71a498A983A3d0dE9D0b1dD8fF3414515,0xe10fd8f09A586d3740ace93d2BB44018fbBe1E78,0x7c727fCaFC90D47AD11f4bf5f47a8f116eC1b697,0x2f365624c31cDb9aEc9ACC6B395deB155601BfeE,0x6EF959D111b62F0e830eFc471D01D47BA77984CC,0xeFC8C6986fA3a8A6E6bc4bFc1Cb42985B1d1E576,0xC501A034678F7a0ba939d02C4fA5F7F138565561,0x77Df96e69aD2Aaf27766B72FE9b15Fe17Be7F9Fa,0x3A93E420f88776eD82890735b1CF0362cFb4524b,0x297557bf0aEc3EEb9Da85c72d59bfe5D8f7C4C48,0x492D24C7C5370f55aB667605DEEeFAC0962DB69A,0x03f44A591DE8Db070Ab2Ba753fab753b5142d54c,0x713f78655336b56E88B71d18D6deC48Eb141fBD4,0x396162B335BFeAf590c548162aC844aD670BFe93,0xe8F7dA81CA885f1F97bcD129bd8d240cA7063e7A,0x4F051a38BF4795677bcfBb3b02f3C65580C4F920,0x5f0Ba33ad38EcB093A8F3aB08C8B5dA55Ca33947,0x9F56A5b7236c2F2440aD5a4C201938C1780176C0,0xcd15DBA1E6E6C7ad6477C253627Aad3F6397366a,0x849DFB80c24E83a623889426e17D3a452012b3e8,0x3967610e525aB2c2D19D7B6a896A9ab81E90d031,0x7ed63716911c13a56c55D43E1079679461BC929c,0x1DD9438351562A095e8c8A76EAb11F8321AbB3d9,0xa9EB742D925B248d3EaF6a8d57Fb1e9de9fe2952,0xcA0cdD507C949AE0c8575238DC16da1dd876b621,0x2083AfCce65cb7B90bB5F674ebbb6d3DD6faE530,0xd8d415806d20a7D1d28758C6BD73285ef2657888,0x6851ea3FB6abaEDBAA46eD92dd437173972b9E74,0x71D744165eC5f61598D192728E23A71D5D4983c8,0xe8A35d12B2Eb667A40063A048F143d61696c6BDd,0xe7EAc73B3076b3ce4889Ff294d736A0B03733cD0,0x8d1360FC5d845CfB438023bA89b4F30C66cfFDEf,0x68517c3aC4e9836605CEf894c2ee54D34084385c,0x2728BD850d20e0d588A7b0d51b9fD4d82f98D94A,0x97d8f0450352e366e96f7F76c290324C2b3627CE,0xb0c3930Ab043540A61E11B080EF9B076d86e760D,0xccf4Ed95207b4be79BE5494Df0d95eb7168E83Ad,0x62706e185595dBd747EAC3A0046b166d7EAa334c,0xbac0Ab0cFB622aBBEe48907bFa21Ba5aBe4deDaE,0x185F0b084cf273535F09a1d9b0b7534F16773d3C,0x1358a36E4f231FFee9be67A6d544e79129eA34F2,0x529BdDE496249E5b3462092Ef84b84315CD3e368],[2,2,1,1,1,2,20,20,2,4,10,21,4,10,1,1,2,2,2,4,4,5,10,10,10,10,10,10,10,10,10,10,10,15,20,20,20,50,50,100,1,8,1,8,1,2,2,10,10,24,1,1,4,4,20,2,2,4,4,8,10,16,4,1,2,10,4,10,13,1,5,120,1,50,1,18,1,2,5,2,1,100]);
    }

    function mint(uint256 _mintAmount) public nonReentrant {
        require(isMintActive, "Minting not started yet!");
        require(nftPerAddress[msg.sender] > 0, "You can not mint now!");
        require(_mintAmount == nftPerAddress[msg.sender], "You're Not authorized to mint!");
        _safeMint(msg.sender, _mintAmount);
        nftPerAddress[msg.sender] = 0;
    }

    function assignNFT(address[82] memory _addresses, uint8[82] memory _amountOfNFT) public onlyOwner {
        require(_addresses.length == _amountOfNFT.length, "No. of Addresses not equal to No. of NFTs!");
        for(uint i = 0; i < _addresses.length; i++) {
            nftPerAddress[_addresses[i]] = _amountOfNFT[i];
        }
    }

    function setPerAddressNFT(address _address, uint256 _amountOfNFT) public onlyOwner{
        nftPerAddress[_address] = _amountOfNFT;
    }

    function setMintStatus(bool _status) public onlyOwner{
        isMintActive = _status;
    }

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

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

    function numberMinted(address owner) public view returns (uint256) {
    return _numberMinted(owner);
    }

    function tokenURI(uint256 _tokenId) public view virtual override returns (string memory){
        require(
        _exists(_tokenId),
        "ERC721Metadata: URI query for nonexistent token"
        );
        return baseURI;
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","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":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[82]","name":"_addresses","type":"address[82]"},{"internalType":"uint8[82]","name":"_amountOfNFT","type":"uint8[82]"}],"name":"assignNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isMintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nftPerAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"setMintStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_amountOfNFT","type":"uint256"}],"name":"setPerAddressNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600b60006101000a81548160ff0219169083151502179055506040518060600160405280603e815260200162005081603e9139600c90805190602001906200005092919062001eca565b503480156200005e57600080fd5b506040518060400160405280601481526020017f4d696c69746172792046696e616e6365204e46540000000000000000000000008152506040518060400160405280600281526020017f4d460000000000000000000000000000000000000000000000000000000000008152508160029080519060200190620000e392919062001eca565b508060039080519060200190620000fc92919062001eca565b506200010d62001baa60201b60201c565b6000819055505050620001356200012962001baf60201b60201c565b62001bb760201b60201c565b6001600981905550620001e0600c8054620001509062002027565b80601f01602080910402602001604051908101604052809291908181526020018280546200017e9062002027565b8015620001cf5780601f10620001a357610100808354040283529160200191620001cf565b820191906000526020600020905b815481529060010190602001808311620001b157829003601f168201915b505050505062001c7d60201b60201c565b62001ba460405180610a400160405280730f02c84f0f4dde605b8f79a0f906189fe3d6563b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001734cf8b424df061debf876a4b930d83a1c6999e41f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173d5a5e3e8d783198e296418a0c372b6840a1d790873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173cb7c988dcf1bd9798adad8c1f0fde85e301884ba73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001737b8575a65320fc220d75290123f13906b512b2b373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020017374d6400f9480df5e5ffc76283147836bce8d3c9573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020017342480b336ad6246cfde0adc3b5c0f987621301bf73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020017304cd0f07c5dfb0fd97e2d6d4dcf51fc4bf6902b873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001732515388f9135c6e554950a13f27a2d311a69500573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173db379e9d031b31a339e1fa38ac14859987379f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020017349410e0986bf3dae2099f6cf159c3a428775bacd73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173e6ac31c0ebfbdc40c0d37f00b22d7798810ca53473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173fc283d4db5fcbc9c1f121e6f7ae98279d2dce7dd73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001734e5d191dffb8d3dfe7790f91ace6f9b80f04ef0f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001733cbf94db8624f711e43429bb35eac970fd787cf773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001736ae85eaade22a37bd8f82755946307c86930031773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173c83dcd8509559a81250a62ab5bfa02fc377e047273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173d73f155cbde8904e378f23b7cf03e85422045fce73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020017389147c5005230ef53629c9c6b1ea98994e626eb273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173a665daa4cf74f388b5ba71921b399ad8d6c246e873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020017318ec26ab28fe3f01675da12d6bd9ae9bce560ceb73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173a69eee71308c9ae74eba62c369ee77e306906c0f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020017338eead1e98dfb2fd75fa6d10fe9b6fab59f5893e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001734aa0e35dc8a91193be87592e19a84bd7051d4ce673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020017345aa70e782aa969aeacb0bc0570d014ccc66b58873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173c27be6f5e9640cef25f98217ca10f3fd51ce827773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173b7a7c45562cef752cb695dbb37f721ac82589bfe73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001738419b7bff5f0a028062812993b77ca1b4fa5d05f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001731dde6b5963536d241fd50afd28c062ce0c94bb3673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173d4e17a7851ec93de08ecb25638a9e09d457f93cb73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173f21d95281337d1d7d6086bb03dda4699d36b856873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173e8e3451b15eb5e6d4c4092ff7d4e6a328b8b1c4973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173cf9b51d3e910e3910e29ed54480dc4308f69096e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173da6db76eaed161d422d8beb670d7056ec75b791473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173d3041a2d0a087818cbf164efbc0c481bba0fba5273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173b8343637ddeeba2b30a57e486390645960299a6573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173458be92adceaaa7ef850b9feb8dbab7d5943583173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001735743ce317a6f7155d5681701f935082c04255c9773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001738c3c67f6e2e4fbd181f9c0fe4030afbee732c86473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020017325585f2c5e89bf0c0a6e56e13cb4db35aa36450e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020017370887fc71a498a983a3d0de9d0b1dd8ff341451573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173e10fd8f09a586d3740ace93d2bb44018fbbe1e7873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001737c727fcafc90d47ad11f4bf5f47a8f116ec1b69773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001732f365624c31cdb9aec9acc6b395deb155601bfee73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001736ef959d111b62f0e830efc471d01d47ba77984cc73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173efc8c6986fa3a8a6e6bc4bfc1cb42985b1d1e57673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173c501a034678f7a0ba939d02c4fa5f7f13856556173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020017377df96e69ad2aaf27766b72fe9b15fe17be7f9fa73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001733a93e420f88776ed82890735b1cf0362cfb4524b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173297557bf0aec3eeb9da85c72d59bfe5d8f7c4c4873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173492d24c7c5370f55ab667605deeefac0962db69a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020017303f44a591de8db070ab2ba753fab753b5142d54c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173713f78655336b56e88b71d18d6dec48eb141fbd473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173396162b335bfeaf590c548162ac844ad670bfe9373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173e8f7da81ca885f1f97bcd129bd8d240ca7063e7a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001734f051a38bf4795677bcfbb3b02f3c65580c4f92073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001735f0ba33ad38ecb093a8f3ab08c8b5da55ca3394773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001739f56a5b7236c2f2440ad5a4c201938c1780176c073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173cd15dba1e6e6c7ad6477c253627aad3f6397366a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173849dfb80c24e83a623889426e17d3a452012b3e873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001733967610e525ab2c2d19d7b6a896a9ab81e90d03173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001737ed63716911c13a56c55d43e1079679461bc929c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001731dd9438351562a095e8c8a76eab11f8321abb3d973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173a9eb742d925b248d3eaf6a8d57fb1e9de9fe295273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173ca0cdd507c949ae0c8575238dc16da1dd876b62173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001732083afcce65cb7b90bb5f674ebbb6d3dd6fae53073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173d8d415806d20a7d1d28758c6bd73285ef265788873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001736851ea3fb6abaedbaa46ed92dd437173972b9e7473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020017371d744165ec5f61598d192728e23a71d5d4983c873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173e8a35d12b2eb667a40063a048f143d61696c6bdd73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173e7eac73b3076b3ce4889ff294d736a0b03733cd073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001738d1360fc5d845cfb438023ba89b4f30c66cffdef73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020017368517c3ac4e9836605cef894c2ee54d34084385c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001732728bd850d20e0d588a7b0d51b9fd4d82f98d94a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020017397d8f0450352e366e96f7f76c290324c2b3627ce73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173b0c3930ab043540a61e11b080ef9b076d86e760d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173ccf4ed95207b4be79be5494df0d95eb7168e83ad73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020017362706e185595dbd747eac3a0046b166d7eaa334c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173bac0ab0cfb622abbee48907bfa21ba5abe4dedae73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173185f0b084cf273535f09a1d9b0b7534f16773d3c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001731358a36e4f231ffee9be67a6d544e79129ea34f273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173529bdde496249e5b3462092ef84b84315cd3e36873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525060405180610a400160405280600260ff168152602001600260ff168152602001600160ff168152602001600160ff168152602001600160ff168152602001600260ff168152602001601460ff168152602001601460ff168152602001600260ff168152602001600460ff168152602001600a60ff168152602001601560ff168152602001600460ff168152602001600a60ff168152602001600160ff168152602001600160ff168152602001600260ff168152602001600260ff168152602001600260ff168152602001600460ff168152602001600460ff168152602001600560ff168152602001600a60ff168152602001600a60ff168152602001600a60ff168152602001600a60ff168152602001600a60ff168152602001600a60ff168152602001600a60ff168152602001600a60ff168152602001600a60ff168152602001600a60ff168152602001600a60ff168152602001600f60ff168152602001601460ff168152602001601460ff168152602001601460ff168152602001603260ff168152602001603260ff168152602001606460ff168152602001600160ff168152602001600860ff168152602001600160ff168152602001600860ff168152602001600160ff168152602001600260ff168152602001600260ff168152602001600a60ff168152602001600a60ff168152602001601860ff168152602001600160ff168152602001600160ff168152602001600460ff168152602001600460ff168152602001601460ff168152602001600260ff168152602001600260ff168152602001600460ff168152602001600460ff168152602001600860ff168152602001600a60ff168152602001601060ff168152602001600460ff168152602001600160ff168152602001600260ff168152602001600a60ff168152602001600460ff168152602001600a60ff168152602001600d60ff168152602001600160ff168152602001600560ff168152602001607860ff168152602001600160ff168152602001603260ff168152602001600160ff168152602001601260ff168152602001600160ff168152602001600260ff168152602001600560ff168152602001600260ff168152602001600160ff168152602001606460ff1681525062001d2860201b60201c565b620021b0565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b62001c8d62001baf60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662001cb362001ea060201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462001d0c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001d039062001fea565b60405180910390fd5b80600c908051906020019062001d2492919062001eca565b5050565b62001d3862001baf60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662001d5e62001ea060201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462001db7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001dae9062001fea565b60405180910390fd5b6052801462001dfd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001df49062001fc8565b60405180910390fd5b60005b605281101562001e9b5781816052811062001e205762001e1f62002109565b5b602002015160ff16600a600085846052811062001e425762001e4162002109565b5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550808062001e92906200205d565b91505062001e00565b505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b82805462001ed89062002027565b90600052602060002090601f01602090048101928262001efc576000855562001f48565b82601f1062001f1757805160ff191683800117855562001f48565b8280016001018555821562001f48579182015b8281111562001f4757825182559160200191906001019062001f2a565b5b50905062001f57919062001f5b565b5090565b5b8082111562001f7657600081600090555060010162001f5c565b5090565b600062001f89602a836200200c565b915062001f968262002138565b604082019050919050565b600062001fb06020836200200c565b915062001fbd8262002187565b602082019050919050565b6000602082019050818103600083015262001fe38162001f7a565b9050919050565b60006020820190508181036000830152620020058162001fa1565b9050919050565b600082825260208201905092915050565b6000819050919050565b600060028204905060018216806200204057607f821691505b60208210811415620020575762002056620020da565b5b50919050565b60006200206a826200201d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415620020a0576200209f620020ab565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e6f2e206f6620416464726573736573206e6f7420657175616c20746f204e6f60008201527f2e206f66204e4654732100000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b612ec180620021c06000396000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c80636c0360eb116100de578063a0712d6811610097578063c87b56dd11610071578063c87b56dd14610459578063dc33e68114610489578063e985e9c5146104b9578063f2fde38b146104e95761018e565b8063a0712d6814610405578063a22cb46514610421578063b88d4fde1461043d5761018e565b80636c0360eb1461035557806370a0823114610373578063715018a6146103a35780638da5cb5b146103ad5780639412adb6146103cb57806395d89b41146103e75761018e565b806323b872dd1161014b57806355f804b31161012557806355f804b3146102bb5780635afcf900146102d75780635b92ac0d146103075780636352211e146103255761018e565b806323b872dd14610267578063374012c71461028357806342842e0e1461029f5761018e565b806301ffc9a71461019357806306fdde03146101c3578063081812fc146101e1578063095ea7b31461021157806318160ddd1461022d5780631f85e3ca1461024b575b600080fd5b6101ad60048036038101906101a891906124b8565b610505565b6040516101ba91906127a6565b60405180910390f35b6101cb610597565b6040516101d891906127c1565b60405180910390f35b6101fb60048036038101906101f6919061255b565b610629565b604051610208919061273f565b60405180910390f35b61022b60048036038101906102269190612409565b6106a5565b005b61023561084c565b60405161024291906128e3565b60405180910390f35b6102656004803603810190610260919061248b565b610863565b005b610281600480360381019061027c91906122f3565b6108fc565b005b61029d60048036038101906102989190612409565b61090c565b005b6102b960048036038101906102b491906122f3565b6109d0565b005b6102d560048036038101906102d09190612512565b6109f0565b005b6102f160048036038101906102ec9190612286565b610a86565b6040516102fe91906128e3565b60405180910390f35b61030f610a9e565b60405161031c91906127a6565b60405180910390f35b61033f600480360381019061033a919061255b565b610ab1565b60405161034c919061273f565b60405180910390f35b61035d610ac3565b60405161036a91906127c1565b60405180910390f35b61038d60048036038101906103889190612286565b610b51565b60405161039a91906128e3565b60405180910390f35b6103ab610c0a565b005b6103b5610c92565b6040516103c2919061273f565b60405180910390f35b6103e560048036038101906103e09190612449565b610cbc565b005b6103ef610e14565b6040516103fc91906127c1565b60405180910390f35b61041f600480360381019061041a919061255b565b610ea6565b005b61043b600480360381019061043691906123c9565b6110a0565b005b61045760048036038101906104529190612346565b611218565b005b610473600480360381019061046e919061255b565b61128b565b60405161048091906127c1565b60405180910390f35b6104a3600480360381019061049e9190612286565b611367565b6040516104b091906128e3565b60405180910390f35b6104d360048036038101906104ce91906122b3565b611379565b6040516104e091906127a6565b60405180910390f35b61050360048036038101906104fe9190612286565b61140d565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061056057506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806105905750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546105a690612acc565b80601f01602080910402602001604051908101604052809291908181526020018280546105d290612acc565b801561061f5780601f106105f45761010080835404028352916020019161061f565b820191906000526020600020905b81548152906001019060200180831161060257829003601f168201915b5050505050905090565b600061063482611505565b61066a576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006106b082611564565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610718576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610737611632565b73ffffffffffffffffffffffffffffffffffffffff161461079a576107638161075e611632565b611379565b610799576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061085661163a565b6001546000540303905090565b61086b61163f565b73ffffffffffffffffffffffffffffffffffffffff16610889610c92565b73ffffffffffffffffffffffffffffffffffffffff16146108df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d690612863565b60405180910390fd5b80600b60006101000a81548160ff02191690831515021790555050565b610907838383611647565b505050565b61091461163f565b73ffffffffffffffffffffffffffffffffffffffff16610932610c92565b73ffffffffffffffffffffffffffffffffffffffff1614610988576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097f90612863565b60405180910390fd5b80600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b6109eb83838360405180602001604052806000815250611218565b505050565b6109f861163f565b73ffffffffffffffffffffffffffffffffffffffff16610a16610c92565b73ffffffffffffffffffffffffffffffffffffffff1614610a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6390612863565b60405180910390fd5b80600c9080519060200190610a82929190611f61565b5050565b600a6020528060005260406000206000915090505481565b600b60009054906101000a900460ff1681565b6000610abc82611564565b9050919050565b600c8054610ad090612acc565b80601f0160208091040260200160405190810160405280929190818152602001828054610afc90612acc565b8015610b495780601f10610b1e57610100808354040283529160200191610b49565b820191906000526020600020905b815481529060010190602001808311610b2c57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610bb9576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610c1261163f565b73ffffffffffffffffffffffffffffffffffffffff16610c30610c92565b73ffffffffffffffffffffffffffffffffffffffff1614610c86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7d90612863565b60405180910390fd5b610c9060006119f1565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610cc461163f565b73ffffffffffffffffffffffffffffffffffffffff16610ce2610c92565b73ffffffffffffffffffffffffffffffffffffffff1614610d38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2f90612863565b60405180910390fd5b60528014610d7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7290612823565b60405180910390fd5b60005b6052811015610e0f57818160528110610d9a57610d99612bd6565b5b602002015160ff16600a6000858460528110610db957610db8612bd6565b5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508080610e0790612b2f565b915050610d7e565b505050565b606060038054610e2390612acc565b80601f0160208091040260200160405190810160405280929190818152602001828054610e4f90612acc565b8015610e9c5780601f10610e7157610100808354040283529160200191610e9c565b820191906000526020600020905b815481529060010190602001808311610e7f57829003601f168201915b5050505050905090565b60026009541415610eec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee3906128c3565b60405180910390fd5b6002600981905550600b60009054906101000a900460ff16610f43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3a906128a3565b60405180910390fd5b6000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610fc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbc90612803565b60405180910390fd5b600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548114611046576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103d90612843565b60405180910390fd5b6110503382611ab7565b6000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600160098190555050565b6110a8611632565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561110d576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061111a611632565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166111c7611632565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161120c91906127a6565b60405180910390a35050565b611223848484611647565b60008373ffffffffffffffffffffffffffffffffffffffff163b146112855761124e84848484611ad5565b611284576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606061129682611505565b6112d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112cc90612883565b60405180910390fd5b600c80546112e290612acc565b80601f016020809104026020016040519081016040528092919081815260200182805461130e90612acc565b801561135b5780601f106113305761010080835404028352916020019161135b565b820191906000526020600020905b81548152906001019060200180831161133e57829003601f168201915b50505050509050919050565b600061137282611c35565b9050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61141561163f565b73ffffffffffffffffffffffffffffffffffffffff16611433610c92565b73ffffffffffffffffffffffffffffffffffffffff1614611489576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148090612863565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f0906127e3565b60405180910390fd5b611502816119f1565b50565b60008161151061163a565b1115801561151f575060005482105b801561155d575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b6000808290508061157361163a565b116115fb576000548110156115fa5760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821614156115f8575b60008114156115ee5760046000836001900393508381526020019081526020016000205490506115c3565b809250505061162d565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600090565b600033905090565b600061165282611564565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146116b9576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166116da611632565b73ffffffffffffffffffffffffffffffffffffffff161480611709575061170885611703611632565b611379565b5b8061174e5750611717611632565b73ffffffffffffffffffffffffffffffffffffffff1661173684610629565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611787576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156117ee576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6117fb8585856001611c8c565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b6118f886611c92565b1717600460008581526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008316141561198257600060018401905060006004600083815260200190815260200160002054141561198057600054811461197f578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46119ea8585856001611c9c565b5050505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611ad1828260405180602001604052806000815250611ca2565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611afb611632565b8786866040518563ffffffff1660e01b8152600401611b1d949392919061275a565b602060405180830381600087803b158015611b3757600080fd5b505af1925050508015611b6857506040513d601f19601f82011682018060405250810190611b6591906124e5565b60015b611be2573d8060008114611b98576040519150601f19603f3d011682016040523d82523d6000602084013e611b9d565b606091505b50600081511415611bda576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b50505050565b6000819050919050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611d0f576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000831415611d4a576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d576000858386611c8c565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e1611dbc60018514611f57565b901b60a042901b611dcc86611c92565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14611ed0575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611e806000878480600101955087611ad5565b611eb6576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808210611e11578260005414611ecb57600080fd5b611f3b565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210611ed1575b816000819055505050611f516000858386611c9c565b50505050565b6000819050919050565b828054611f6d90612acc565b90600052602060002090601f016020900481019282611f8f5760008555611fd6565b82601f10611fa857805160ff1916838001178555611fd6565b82800160010185558215611fd6579182015b82811115611fd5578251825591602001919060010190611fba565b5b509050611fe39190611fe7565b5090565b5b80821115612000576000816000905550600101611fe8565b5090565b600061201761201284612923565b6128fe565b9050808285602086028201111561203157612030612c39565b5b60005b8581101561206157816120478882612156565b845260208401935060208301925050600181019050612034565b5050509392505050565b600061207e61207984612949565b6128fe565b9050808285602086028201111561209857612097612c39565b5b60005b858110156120c857816120ae8882612271565b84526020840193506020830192505060018101905061209b565b5050509392505050565b60006120e56120e08461296f565b6128fe565b90508281526020810184848401111561210157612100612c3e565b5b61210c848285612a8a565b509392505050565b6000612127612122846129a0565b6128fe565b90508281526020810184848401111561214357612142612c3e565b5b61214e848285612a8a565b509392505050565b60008135905061216581612e18565b92915050565b600082601f8301126121805761217f612c34565b5b605261218d848285612004565b91505092915050565b600082601f8301126121ab576121aa612c34565b5b60526121b884828561206b565b91505092915050565b6000813590506121d081612e2f565b92915050565b6000813590506121e581612e46565b92915050565b6000815190506121fa81612e46565b92915050565b600082601f83011261221557612214612c34565b5b81356122258482602086016120d2565b91505092915050565b600082601f83011261224357612242612c34565b5b8135612253848260208601612114565b91505092915050565b60008135905061226b81612e5d565b92915050565b60008135905061228081612e74565b92915050565b60006020828403121561229c5761229b612c48565b5b60006122aa84828501612156565b91505092915050565b600080604083850312156122ca576122c9612c48565b5b60006122d885828601612156565b92505060206122e985828601612156565b9150509250929050565b60008060006060848603121561230c5761230b612c48565b5b600061231a86828701612156565b935050602061232b86828701612156565b925050604061233c8682870161225c565b9150509250925092565b600080600080608085870312156123605761235f612c48565b5b600061236e87828801612156565b945050602061237f87828801612156565b93505060406123908782880161225c565b925050606085013567ffffffffffffffff8111156123b1576123b0612c43565b5b6123bd87828801612200565b91505092959194509250565b600080604083850312156123e0576123df612c48565b5b60006123ee85828601612156565b92505060206123ff858286016121c1565b9150509250929050565b600080604083850312156124205761241f612c48565b5b600061242e85828601612156565b925050602061243f8582860161225c565b9150509250929050565b600080611480838503121561246157612460612c48565b5b600061246f8582860161216b565b925050610a4061248185828601612196565b9150509250929050565b6000602082840312156124a1576124a0612c48565b5b60006124af848285016121c1565b91505092915050565b6000602082840312156124ce576124cd612c48565b5b60006124dc848285016121d6565b91505092915050565b6000602082840312156124fb576124fa612c48565b5b6000612509848285016121eb565b91505092915050565b60006020828403121561252857612527612c48565b5b600082013567ffffffffffffffff81111561254657612545612c43565b5b6125528482850161222e565b91505092915050565b60006020828403121561257157612570612c48565b5b600061257f8482850161225c565b91505092915050565b61259181612a09565b82525050565b6125a081612a1b565b82525050565b60006125b1826129d1565b6125bb81856129e7565b93506125cb818560208601612a99565b6125d481612c4d565b840191505092915050565b60006125ea826129dc565b6125f481856129f8565b9350612604818560208601612a99565b61260d81612c4d565b840191505092915050565b60006126256026836129f8565b915061263082612c5e565b604082019050919050565b60006126486015836129f8565b915061265382612cad565b602082019050919050565b600061266b602a836129f8565b915061267682612cd6565b604082019050919050565b600061268e601e836129f8565b915061269982612d25565b602082019050919050565b60006126b16020836129f8565b91506126bc82612d4e565b602082019050919050565b60006126d4602f836129f8565b91506126df82612d77565b604082019050919050565b60006126f76018836129f8565b915061270282612dc6565b602082019050919050565b600061271a601f836129f8565b915061272582612def565b602082019050919050565b61273981612a73565b82525050565b60006020820190506127546000830184612588565b92915050565b600060808201905061276f6000830187612588565b61277c6020830186612588565b6127896040830185612730565b818103606083015261279b81846125a6565b905095945050505050565b60006020820190506127bb6000830184612597565b92915050565b600060208201905081810360008301526127db81846125df565b905092915050565b600060208201905081810360008301526127fc81612618565b9050919050565b6000602082019050818103600083015261281c8161263b565b9050919050565b6000602082019050818103600083015261283c8161265e565b9050919050565b6000602082019050818103600083015261285c81612681565b9050919050565b6000602082019050818103600083015261287c816126a4565b9050919050565b6000602082019050818103600083015261289c816126c7565b9050919050565b600060208201905081810360008301526128bc816126ea565b9050919050565b600060208201905081810360008301526128dc8161270d565b9050919050565b60006020820190506128f86000830184612730565b92915050565b6000612908612919565b90506129148282612afe565b919050565b6000604051905090565b600067ffffffffffffffff82111561293e5761293d612c05565b5b602082029050919050565b600067ffffffffffffffff82111561296457612963612c05565b5b602082029050919050565b600067ffffffffffffffff82111561298a57612989612c05565b5b61299382612c4d565b9050602081019050919050565b600067ffffffffffffffff8211156129bb576129ba612c05565b5b6129c482612c4d565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b6000612a1482612a53565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015612ab7578082015181840152602081019050612a9c565b83811115612ac6576000848401525b50505050565b60006002820490506001821680612ae457607f821691505b60208210811415612af857612af7612ba7565b5b50919050565b612b0782612c4d565b810181811067ffffffffffffffff82111715612b2657612b25612c05565b5b80604052505050565b6000612b3a82612a73565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612b6d57612b6c612b78565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f596f752063616e206e6f74206d696e74206e6f77210000000000000000000000600082015250565b7f4e6f2e206f6620416464726573736573206e6f7420657175616c20746f204e6f60008201527f2e206f66204e4654732100000000000000000000000000000000000000000000602082015250565b7f596f75277265204e6f7420617574686f72697a656420746f206d696e74210000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4d696e74696e67206e6f74207374617274656420796574210000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b612e2181612a09565b8114612e2c57600080fd5b50565b612e3881612a1b565b8114612e4357600080fd5b50565b612e4f81612a27565b8114612e5a57600080fd5b50565b612e6681612a73565b8114612e7157600080fd5b50565b612e7d81612a7d565b8114612e8857600080fd5b5056fea264697066735822122022d4427aa04543b34c32b086e74780d9103c739853292c8150a5e12ff325e37164736f6c63430008070033697066733a2f2f516d544362757037583747396a4b556e6179316f647a5654794d33676e64674170676170757953797748597041672f6d696c2e6a736f6e

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061018e5760003560e01c80636c0360eb116100de578063a0712d6811610097578063c87b56dd11610071578063c87b56dd14610459578063dc33e68114610489578063e985e9c5146104b9578063f2fde38b146104e95761018e565b8063a0712d6814610405578063a22cb46514610421578063b88d4fde1461043d5761018e565b80636c0360eb1461035557806370a0823114610373578063715018a6146103a35780638da5cb5b146103ad5780639412adb6146103cb57806395d89b41146103e75761018e565b806323b872dd1161014b57806355f804b31161012557806355f804b3146102bb5780635afcf900146102d75780635b92ac0d146103075780636352211e146103255761018e565b806323b872dd14610267578063374012c71461028357806342842e0e1461029f5761018e565b806301ffc9a71461019357806306fdde03146101c3578063081812fc146101e1578063095ea7b31461021157806318160ddd1461022d5780631f85e3ca1461024b575b600080fd5b6101ad60048036038101906101a891906124b8565b610505565b6040516101ba91906127a6565b60405180910390f35b6101cb610597565b6040516101d891906127c1565b60405180910390f35b6101fb60048036038101906101f6919061255b565b610629565b604051610208919061273f565b60405180910390f35b61022b60048036038101906102269190612409565b6106a5565b005b61023561084c565b60405161024291906128e3565b60405180910390f35b6102656004803603810190610260919061248b565b610863565b005b610281600480360381019061027c91906122f3565b6108fc565b005b61029d60048036038101906102989190612409565b61090c565b005b6102b960048036038101906102b491906122f3565b6109d0565b005b6102d560048036038101906102d09190612512565b6109f0565b005b6102f160048036038101906102ec9190612286565b610a86565b6040516102fe91906128e3565b60405180910390f35b61030f610a9e565b60405161031c91906127a6565b60405180910390f35b61033f600480360381019061033a919061255b565b610ab1565b60405161034c919061273f565b60405180910390f35b61035d610ac3565b60405161036a91906127c1565b60405180910390f35b61038d60048036038101906103889190612286565b610b51565b60405161039a91906128e3565b60405180910390f35b6103ab610c0a565b005b6103b5610c92565b6040516103c2919061273f565b60405180910390f35b6103e560048036038101906103e09190612449565b610cbc565b005b6103ef610e14565b6040516103fc91906127c1565b60405180910390f35b61041f600480360381019061041a919061255b565b610ea6565b005b61043b600480360381019061043691906123c9565b6110a0565b005b61045760048036038101906104529190612346565b611218565b005b610473600480360381019061046e919061255b565b61128b565b60405161048091906127c1565b60405180910390f35b6104a3600480360381019061049e9190612286565b611367565b6040516104b091906128e3565b60405180910390f35b6104d360048036038101906104ce91906122b3565b611379565b6040516104e091906127a6565b60405180910390f35b61050360048036038101906104fe9190612286565b61140d565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061056057506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806105905750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546105a690612acc565b80601f01602080910402602001604051908101604052809291908181526020018280546105d290612acc565b801561061f5780601f106105f45761010080835404028352916020019161061f565b820191906000526020600020905b81548152906001019060200180831161060257829003601f168201915b5050505050905090565b600061063482611505565b61066a576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006106b082611564565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610718576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610737611632565b73ffffffffffffffffffffffffffffffffffffffff161461079a576107638161075e611632565b611379565b610799576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061085661163a565b6001546000540303905090565b61086b61163f565b73ffffffffffffffffffffffffffffffffffffffff16610889610c92565b73ffffffffffffffffffffffffffffffffffffffff16146108df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d690612863565b60405180910390fd5b80600b60006101000a81548160ff02191690831515021790555050565b610907838383611647565b505050565b61091461163f565b73ffffffffffffffffffffffffffffffffffffffff16610932610c92565b73ffffffffffffffffffffffffffffffffffffffff1614610988576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097f90612863565b60405180910390fd5b80600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b6109eb83838360405180602001604052806000815250611218565b505050565b6109f861163f565b73ffffffffffffffffffffffffffffffffffffffff16610a16610c92565b73ffffffffffffffffffffffffffffffffffffffff1614610a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6390612863565b60405180910390fd5b80600c9080519060200190610a82929190611f61565b5050565b600a6020528060005260406000206000915090505481565b600b60009054906101000a900460ff1681565b6000610abc82611564565b9050919050565b600c8054610ad090612acc565b80601f0160208091040260200160405190810160405280929190818152602001828054610afc90612acc565b8015610b495780601f10610b1e57610100808354040283529160200191610b49565b820191906000526020600020905b815481529060010190602001808311610b2c57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610bb9576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610c1261163f565b73ffffffffffffffffffffffffffffffffffffffff16610c30610c92565b73ffffffffffffffffffffffffffffffffffffffff1614610c86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7d90612863565b60405180910390fd5b610c9060006119f1565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610cc461163f565b73ffffffffffffffffffffffffffffffffffffffff16610ce2610c92565b73ffffffffffffffffffffffffffffffffffffffff1614610d38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2f90612863565b60405180910390fd5b60528014610d7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7290612823565b60405180910390fd5b60005b6052811015610e0f57818160528110610d9a57610d99612bd6565b5b602002015160ff16600a6000858460528110610db957610db8612bd6565b5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508080610e0790612b2f565b915050610d7e565b505050565b606060038054610e2390612acc565b80601f0160208091040260200160405190810160405280929190818152602001828054610e4f90612acc565b8015610e9c5780601f10610e7157610100808354040283529160200191610e9c565b820191906000526020600020905b815481529060010190602001808311610e7f57829003601f168201915b5050505050905090565b60026009541415610eec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee3906128c3565b60405180910390fd5b6002600981905550600b60009054906101000a900460ff16610f43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3a906128a3565b60405180910390fd5b6000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610fc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbc90612803565b60405180910390fd5b600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548114611046576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103d90612843565b60405180910390fd5b6110503382611ab7565b6000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600160098190555050565b6110a8611632565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561110d576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061111a611632565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166111c7611632565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161120c91906127a6565b60405180910390a35050565b611223848484611647565b60008373ffffffffffffffffffffffffffffffffffffffff163b146112855761124e84848484611ad5565b611284576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606061129682611505565b6112d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112cc90612883565b60405180910390fd5b600c80546112e290612acc565b80601f016020809104026020016040519081016040528092919081815260200182805461130e90612acc565b801561135b5780601f106113305761010080835404028352916020019161135b565b820191906000526020600020905b81548152906001019060200180831161133e57829003601f168201915b50505050509050919050565b600061137282611c35565b9050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61141561163f565b73ffffffffffffffffffffffffffffffffffffffff16611433610c92565b73ffffffffffffffffffffffffffffffffffffffff1614611489576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148090612863565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f0906127e3565b60405180910390fd5b611502816119f1565b50565b60008161151061163a565b1115801561151f575060005482105b801561155d575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b6000808290508061157361163a565b116115fb576000548110156115fa5760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821614156115f8575b60008114156115ee5760046000836001900393508381526020019081526020016000205490506115c3565b809250505061162d565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600090565b600033905090565b600061165282611564565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146116b9576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166116da611632565b73ffffffffffffffffffffffffffffffffffffffff161480611709575061170885611703611632565b611379565b5b8061174e5750611717611632565b73ffffffffffffffffffffffffffffffffffffffff1661173684610629565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611787576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156117ee576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6117fb8585856001611c8c565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b6118f886611c92565b1717600460008581526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008316141561198257600060018401905060006004600083815260200190815260200160002054141561198057600054811461197f578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46119ea8585856001611c9c565b5050505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611ad1828260405180602001604052806000815250611ca2565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611afb611632565b8786866040518563ffffffff1660e01b8152600401611b1d949392919061275a565b602060405180830381600087803b158015611b3757600080fd5b505af1925050508015611b6857506040513d601f19601f82011682018060405250810190611b6591906124e5565b60015b611be2573d8060008114611b98576040519150601f19603f3d011682016040523d82523d6000602084013e611b9d565b606091505b50600081511415611bda576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b50505050565b6000819050919050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611d0f576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000831415611d4a576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d576000858386611c8c565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e1611dbc60018514611f57565b901b60a042901b611dcc86611c92565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14611ed0575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611e806000878480600101955087611ad5565b611eb6576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808210611e11578260005414611ecb57600080fd5b611f3b565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210611ed1575b816000819055505050611f516000858386611c9c565b50505050565b6000819050919050565b828054611f6d90612acc565b90600052602060002090601f016020900481019282611f8f5760008555611fd6565b82601f10611fa857805160ff1916838001178555611fd6565b82800160010185558215611fd6579182015b82811115611fd5578251825591602001919060010190611fba565b5b509050611fe39190611fe7565b5090565b5b80821115612000576000816000905550600101611fe8565b5090565b600061201761201284612923565b6128fe565b9050808285602086028201111561203157612030612c39565b5b60005b8581101561206157816120478882612156565b845260208401935060208301925050600181019050612034565b5050509392505050565b600061207e61207984612949565b6128fe565b9050808285602086028201111561209857612097612c39565b5b60005b858110156120c857816120ae8882612271565b84526020840193506020830192505060018101905061209b565b5050509392505050565b60006120e56120e08461296f565b6128fe565b90508281526020810184848401111561210157612100612c3e565b5b61210c848285612a8a565b509392505050565b6000612127612122846129a0565b6128fe565b90508281526020810184848401111561214357612142612c3e565b5b61214e848285612a8a565b509392505050565b60008135905061216581612e18565b92915050565b600082601f8301126121805761217f612c34565b5b605261218d848285612004565b91505092915050565b600082601f8301126121ab576121aa612c34565b5b60526121b884828561206b565b91505092915050565b6000813590506121d081612e2f565b92915050565b6000813590506121e581612e46565b92915050565b6000815190506121fa81612e46565b92915050565b600082601f83011261221557612214612c34565b5b81356122258482602086016120d2565b91505092915050565b600082601f83011261224357612242612c34565b5b8135612253848260208601612114565b91505092915050565b60008135905061226b81612e5d565b92915050565b60008135905061228081612e74565b92915050565b60006020828403121561229c5761229b612c48565b5b60006122aa84828501612156565b91505092915050565b600080604083850312156122ca576122c9612c48565b5b60006122d885828601612156565b92505060206122e985828601612156565b9150509250929050565b60008060006060848603121561230c5761230b612c48565b5b600061231a86828701612156565b935050602061232b86828701612156565b925050604061233c8682870161225c565b9150509250925092565b600080600080608085870312156123605761235f612c48565b5b600061236e87828801612156565b945050602061237f87828801612156565b93505060406123908782880161225c565b925050606085013567ffffffffffffffff8111156123b1576123b0612c43565b5b6123bd87828801612200565b91505092959194509250565b600080604083850312156123e0576123df612c48565b5b60006123ee85828601612156565b92505060206123ff858286016121c1565b9150509250929050565b600080604083850312156124205761241f612c48565b5b600061242e85828601612156565b925050602061243f8582860161225c565b9150509250929050565b600080611480838503121561246157612460612c48565b5b600061246f8582860161216b565b925050610a4061248185828601612196565b9150509250929050565b6000602082840312156124a1576124a0612c48565b5b60006124af848285016121c1565b91505092915050565b6000602082840312156124ce576124cd612c48565b5b60006124dc848285016121d6565b91505092915050565b6000602082840312156124fb576124fa612c48565b5b6000612509848285016121eb565b91505092915050565b60006020828403121561252857612527612c48565b5b600082013567ffffffffffffffff81111561254657612545612c43565b5b6125528482850161222e565b91505092915050565b60006020828403121561257157612570612c48565b5b600061257f8482850161225c565b91505092915050565b61259181612a09565b82525050565b6125a081612a1b565b82525050565b60006125b1826129d1565b6125bb81856129e7565b93506125cb818560208601612a99565b6125d481612c4d565b840191505092915050565b60006125ea826129dc565b6125f481856129f8565b9350612604818560208601612a99565b61260d81612c4d565b840191505092915050565b60006126256026836129f8565b915061263082612c5e565b604082019050919050565b60006126486015836129f8565b915061265382612cad565b602082019050919050565b600061266b602a836129f8565b915061267682612cd6565b604082019050919050565b600061268e601e836129f8565b915061269982612d25565b602082019050919050565b60006126b16020836129f8565b91506126bc82612d4e565b602082019050919050565b60006126d4602f836129f8565b91506126df82612d77565b604082019050919050565b60006126f76018836129f8565b915061270282612dc6565b602082019050919050565b600061271a601f836129f8565b915061272582612def565b602082019050919050565b61273981612a73565b82525050565b60006020820190506127546000830184612588565b92915050565b600060808201905061276f6000830187612588565b61277c6020830186612588565b6127896040830185612730565b818103606083015261279b81846125a6565b905095945050505050565b60006020820190506127bb6000830184612597565b92915050565b600060208201905081810360008301526127db81846125df565b905092915050565b600060208201905081810360008301526127fc81612618565b9050919050565b6000602082019050818103600083015261281c8161263b565b9050919050565b6000602082019050818103600083015261283c8161265e565b9050919050565b6000602082019050818103600083015261285c81612681565b9050919050565b6000602082019050818103600083015261287c816126a4565b9050919050565b6000602082019050818103600083015261289c816126c7565b9050919050565b600060208201905081810360008301526128bc816126ea565b9050919050565b600060208201905081810360008301526128dc8161270d565b9050919050565b60006020820190506128f86000830184612730565b92915050565b6000612908612919565b90506129148282612afe565b919050565b6000604051905090565b600067ffffffffffffffff82111561293e5761293d612c05565b5b602082029050919050565b600067ffffffffffffffff82111561296457612963612c05565b5b602082029050919050565b600067ffffffffffffffff82111561298a57612989612c05565b5b61299382612c4d565b9050602081019050919050565b600067ffffffffffffffff8211156129bb576129ba612c05565b5b6129c482612c4d565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b6000612a1482612a53565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015612ab7578082015181840152602081019050612a9c565b83811115612ac6576000848401525b50505050565b60006002820490506001821680612ae457607f821691505b60208210811415612af857612af7612ba7565b5b50919050565b612b0782612c4d565b810181811067ffffffffffffffff82111715612b2657612b25612c05565b5b80604052505050565b6000612b3a82612a73565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612b6d57612b6c612b78565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f596f752063616e206e6f74206d696e74206e6f77210000000000000000000000600082015250565b7f4e6f2e206f6620416464726573736573206e6f7420657175616c20746f204e6f60008201527f2e206f66204e4654732100000000000000000000000000000000000000000000602082015250565b7f596f75277265204e6f7420617574686f72697a656420746f206d696e74210000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4d696e74696e67206e6f74207374617274656420796574210000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b612e2181612a09565b8114612e2c57600080fd5b50565b612e3881612a1b565b8114612e4357600080fd5b50565b612e4f81612a27565b8114612e5a57600080fd5b50565b612e6681612a73565b8114612e7157600080fd5b50565b612e7d81612a7d565b8114612e8857600080fd5b5056fea264697066735822122022d4427aa04543b34c32b086e74780d9103c739853292c8150a5e12ff325e37164736f6c63430008070033

Deployed Bytecode Sourcemap

33530:5690:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10307:615;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15320:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17388:204;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16848:474;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9361:315;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38530:94;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18274:170;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38383:139;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18515:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38632:104;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33605:46;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33658:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15109:144;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33703:88;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10986:224;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1595:103;;;:::i;:::-;;1287:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38036:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15489:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37652:376;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17664:308;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18771:396;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38977:238;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38860:109;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18043:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1853:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10307:615;10392:4;10707:10;10692:25;;:11;:25;;;;:102;;;;10784:10;10769:25;;:11;:25;;;;10692:102;:179;;;;10861:10;10846:25;;:11;:25;;;;10692:179;10672:199;;10307:615;;;:::o;15320:100::-;15374:13;15407:5;15400:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15320:100;:::o;17388:204::-;17456:7;17481:16;17489:7;17481;:16::i;:::-;17476:64;;17506:34;;;;;;;;;;;;;;17476:64;17560:15;:24;17576:7;17560:24;;;;;;;;;;;;;;;;;;;;;17553:31;;17388:204;;;:::o;16848:474::-;16921:13;16953:27;16972:7;16953:18;:27::i;:::-;16921:61;;17003:5;16997:11;;:2;:11;;;16993:48;;;17017:24;;;;;;;;;;;;;;16993:48;17081:5;17058:28;;:19;:17;:19::i;:::-;:28;;;17054:175;;17106:44;17123:5;17130:19;:17;:19::i;:::-;17106:16;:44::i;:::-;17101:128;;17178:35;;;;;;;;;;;;;;17101:128;17054:175;17268:2;17241:15;:24;17257:7;17241:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;17306:7;17302:2;17286:28;;17295:5;17286:28;;;;;;;;;;;;16910:412;16848:474;;:::o;9361:315::-;9414:7;9642:15;:13;:15::i;:::-;9627:12;;9611:13;;:28;:46;9604:53;;9361:315;:::o;38530:94::-;1518:12;:10;:12::i;:::-;1507:23;;:7;:5;:7::i;:::-;:23;;;1499:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38609:7:::1;38594:12;;:22;;;;;;;;;;;;;;;;;;38530:94:::0;:::o;18274:170::-;18408:28;18418:4;18424:2;18428:7;18408:9;:28::i;:::-;18274:170;;;:::o;38383:139::-;1518:12;:10;:12::i;:::-;1507:23;;:7;:5;:7::i;:::-;:23;;;1499:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38502:12:::1;38476:13;:23;38490:8;38476:23;;;;;;;;;;;;;;;:38;;;;38383:139:::0;;:::o;18515:185::-;18653:39;18670:4;18676:2;18680:7;18653:39;;;;;;;;;;;;:16;:39::i;:::-;18515:185;;;:::o;38632:104::-;1518:12;:10;:12::i;:::-;1507:23;;:7;:5;:7::i;:::-;:23;;;1499:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38717:11:::1;38707:7;:21;;;;;;;;;;;;:::i;:::-;;38632:104:::0;:::o;33605:46::-;;;;;;;;;;;;;;;;;:::o;33658:32::-;;;;;;;;;;;;;:::o;15109:144::-;15173:7;15216:27;15235:7;15216:18;:27::i;:::-;15193:52;;15109:144;;;:::o;33703:88::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;10986:224::-;11050:7;11091:1;11074:19;;:5;:19;;;11070:60;;;11102:28;;;;;;;;;;;;;;11070:60;7218:13;11148:18;:25;11167:5;11148:25;;;;;;;;;;;;;;;;:54;11141:61;;10986:224;;;:::o;1595:103::-;1518:12;:10;:12::i;:::-;1507:23;;:7;:5;:7::i;:::-;:23;;;1499:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1660:30:::1;1687:1;1660:18;:30::i;:::-;1595:103::o:0;1287:87::-;1333:7;1360:6;;;;;;;;;;;1353:13;;1287:87;:::o;38036:339::-;1518:12;:10;:12::i;:::-;1507:23;;:7;:5;:7::i;:::-;:23;;;1499:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38174:19:::1;38153:17:::0;:40:::1;38145:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;38255:6;38251:117;38271:17;38267:1;:21;38251:117;;;38341:12;38354:1;38341:15;;;;;;;:::i;:::-;;;;;;38310:46;;:13;:28;38324:10;38335:1;38324:13;;;;;;;:::i;:::-;;;;;;38310:28;;;;;;;;;;;;;;;:46;;;;38290:3;;;;;:::i;:::-;;;;38251:117;;;;38036:339:::0;;:::o;15489:104::-;15545:13;15578:7;15571:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15489:104;:::o;37652:376::-;193:1;413:7;;:19;;405:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;193:1;546:7;:18;;;;37726:12:::1;;;;;;;;;;;37718:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;37814:1;37786:13;:25;37800:10;37786:25;;;;;;;;;;;;;;;;:29;37778:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;37875:13;:25;37889:10;37875:25;;;;;;;;;;;;;;;;37860:11;:40;37852:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;37946:34;37956:10;37968:11;37946:9;:34::i;:::-;38019:1;37991:13;:25;38005:10;37991:25;;;;;;;;;;;;;;;:29;;;;149:1:::0;591:7;:22;;;;37652:376;:::o;17664:308::-;17775:19;:17;:19::i;:::-;17763:31;;:8;:31;;;17759:61;;;17803:17;;;;;;;;;;;;;;17759:61;17885:8;17833:18;:39;17852:19;:17;:19::i;:::-;17833:39;;;;;;;;;;;;;;;:49;17873:8;17833:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;17945:8;17909:55;;17924:19;:17;:19::i;:::-;17909:55;;;17955:8;17909:55;;;;;;:::i;:::-;;;;;;;;17664:308;;:::o;18771:396::-;18938:28;18948:4;18954:2;18958:7;18938:9;:28::i;:::-;18999:1;18981:2;:14;;;:19;18977:183;;19020:56;19051:4;19057:2;19061:7;19070:5;19020:30;:56::i;:::-;19015:145;;19104:40;;;;;;;;;;;;;;19015:145;18977:183;18771:396;;;;:::o;38977:238::-;39051:13;39094:17;39102:8;39094:7;:17::i;:::-;39076:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;39200:7;39193:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38977:238;;;:::o;38860:109::-;38918:7;38941:20;38955:5;38941:13;:20::i;:::-;38934:27;;38860:109;;;:::o;18043:164::-;18140:4;18164:18;:25;18183:5;18164:25;;;;;;;;;;;;;;;:35;18190:8;18164:35;;;;;;;;;;;;;;;;;;;;;;;;;18157:42;;18043:164;;;;:::o;1853:201::-;1518:12;:10;:12::i;:::-;1507:23;;:7;:5;:7::i;:::-;:23;;;1499:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1962:1:::1;1942:22;;:8;:22;;;;1934:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2018:28;2037:8;2018:18;:28::i;:::-;1853:201:::0;:::o;19422:273::-;19479:4;19535:7;19516:15;:13;:15::i;:::-;:26;;:66;;;;;19569:13;;19559:7;:23;19516:66;:152;;;;;19667:1;7988:8;19620:17;:26;19638:7;19620:26;;;;;;;;;;;;:43;:48;19516:152;19496:172;;19422:273;;;:::o;12624:1129::-;12691:7;12711:12;12726:7;12711:22;;12794:4;12775:15;:13;:15::i;:::-;:23;12771:915;;12828:13;;12821:4;:20;12817:869;;;12866:14;12883:17;:23;12901:4;12883:23;;;;;;;;;;;;12866:40;;12999:1;7988:8;12972:6;:23;:28;12968:699;;;13491:113;13508:1;13498:6;:11;13491:113;;;13551:17;:25;13569:6;;;;;;;13551:25;;;;;;;;;;;;13542:34;;13491:113;;;13637:6;13630:13;;;;;;12968:699;12843:843;12817:869;12771:915;13714:31;;;;;;;;;;;;;;12624:1129;;;;:::o;31446:105::-;31506:7;31533:10;31526:17;;31446:105;:::o;9087:92::-;9143:7;9087:92;:::o;661:98::-;714:7;741:10;734:17;;661:98;:::o;24661:2515::-;24776:27;24806;24825:7;24806:18;:27::i;:::-;24776:57;;24891:4;24850:45;;24866:19;24850:45;;;24846:86;;24904:28;;;;;;;;;;;;;;24846:86;24945:22;24994:4;24971:27;;:19;:17;:19::i;:::-;:27;;;:87;;;;25015:43;25032:4;25038:19;:17;:19::i;:::-;25015:16;:43::i;:::-;24971:87;:147;;;;25099:19;:17;:19::i;:::-;25075:43;;:20;25087:7;25075:11;:20::i;:::-;:43;;;24971:147;24945:174;;25137:17;25132:66;;25163:35;;;;;;;;;;;;;;25132:66;25227:1;25213:16;;:2;:16;;;25209:52;;;25238:23;;;;;;;;;;;;;;25209:52;25274:43;25296:4;25302:2;25306:7;25315:1;25274:21;:43::i;:::-;25390:15;:24;25406:7;25390:24;;;;;;;;;;;;25383:31;;;;;;;;;;;25782:18;:24;25801:4;25782:24;;;;;;;;;;;;;;;;25780:26;;;;;;;;;;;;25851:18;:22;25870:2;25851:22;;;;;;;;;;;;;;;;25849:24;;;;;;;;;;;8270:8;7872:3;26232:15;:41;;26190:21;26208:2;26190:17;:21::i;:::-;:84;:128;26144:17;:26;26162:7;26144:26;;;;;;;;;;;:174;;;;26488:1;8270:8;26438:19;:46;:51;26434:626;;;26510:19;26542:1;26532:7;:11;26510:33;;26699:1;26665:17;:30;26683:11;26665:30;;;;;;;;;;;;:35;26661:384;;;26803:13;;26788:11;:28;26784:242;;26983:19;26950:17;:30;26968:11;26950:30;;;;;;;;;;;:52;;;;26784:242;26661:384;26491:569;26434:626;27107:7;27103:2;27088:27;;27097:4;27088:27;;;;;;;;;;;;27126:42;27147:4;27153:2;27157:7;27166:1;27126:20;:42::i;:::-;24765:2411;;24661:2515;;;:::o;2214:191::-;2288:16;2307:6;;;;;;;;;;;2288:25;;2333:8;2324:6;;:17;;;;;;;;;;;;;;;;;;2388:8;2357:40;;2378:8;2357:40;;;;;;;;;;;;2277:128;2214:191;:::o;19779:104::-;19848:27;19858:2;19862:8;19848:27;;;;;;;;;;;;:9;:27::i;:::-;19779:104;;:::o;30389:716::-;30552:4;30598:2;30573:45;;;30619:19;:17;:19::i;:::-;30640:4;30646:7;30655:5;30573:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;30569:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30873:1;30856:6;:13;:18;30852:235;;;30902:40;;;;;;;;;;;;;;30852:235;31045:6;31039:13;31030:6;31026:2;31022:15;31015:38;30569:529;30742:54;;;30732:64;;;:6;:64;;;;30725:71;;;30389:716;;;;;;:::o;11292:176::-;11353:7;7218:13;7355:2;11381:18;:25;11400:5;11381:25;;;;;;;;;;;;;;;;:49;;11380:80;11373:87;;11292:176;;;:::o;31113:159::-;;;;;:::o;16409:148::-;16473:14;16534:5;16524:15;;16409:148;;;:::o;31280:158::-;;;;;:::o;20256:2236::-;20379:20;20402:13;;20379:36;;20444:1;20430:16;;:2;:16;;;20426:48;;;20455:19;;;;;;;;;;;;;;20426:48;20501:1;20489:8;:13;20485:44;;;20511:18;;;;;;;;;;;;;;20485:44;20542:61;20572:1;20576:2;20580:12;20594:8;20542:21;:61::i;:::-;21146:1;7355:2;21117:1;:25;;21116:31;21104:8;:44;21078:18;:22;21097:2;21078:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;8135:3;21547:29;21574:1;21562:8;:13;21547:14;:29::i;:::-;:56;;7872:3;21484:15;:41;;21442:21;21460:2;21442:17;:21::i;:::-;:84;:162;21391:17;:31;21409:12;21391:31;;;;;;;;;;;:213;;;;21621:20;21644:12;21621:35;;21671:11;21700:8;21685:12;:23;21671:37;;21747:1;21729:2;:14;;;:19;21725:635;;21769:313;21825:12;21821:2;21800:38;;21817:1;21800:38;;;;;;;;;;;;21866:69;21905:1;21909:2;21913:14;;;;;;21929:5;21866:30;:69::i;:::-;21861:174;;21971:40;;;;;;;;;;;;;;21861:174;22077:3;22062:12;:18;21769:313;;22163:12;22146:13;;:29;22142:43;;22177:8;;;22142:43;21725:635;;;22226:119;22282:14;;;;;;22278:2;22257:40;;22274:1;22257:40;;;;;;;;;;;;22340:3;22325:12;:18;22226:119;;21725:635;22390:12;22374:13;:28;;;;20855:1559;;22424:60;22453:1;22457:2;22461:12;22475:8;22424:20;:60::i;:::-;20368:2124;20256:2236;;;:::o;16644:142::-;16702:14;16763:5;16753:15;;16644:142;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;26:657:1:-;121:5;146:80;162:63;218:6;162:63;:::i;:::-;146:80;:::i;:::-;137:89;;246:5;272:6;322:3;314:4;306:6;302:17;297:3;293:27;290:36;287:143;;;341:79;;:::i;:::-;287:143;454:1;439:238;464:6;461:1;458:13;439:238;;;532:3;561:37;594:3;582:10;561:37;:::i;:::-;556:3;549:50;628:4;623:3;619:14;612:21;;662:4;657:3;653:14;646:21;;499:178;486:1;483;479:9;474:14;;439:238;;;443:14;127:556;;26:657;;;;;:::o;706:651::-;799:5;824:78;840:61;894:6;840:61;:::i;:::-;824:78;:::i;:::-;815:87;;922:5;948:6;998:3;990:4;982:6;978:17;973:3;969:27;966:36;963:143;;;1017:79;;:::i;:::-;963:143;1130:1;1115:236;1140:6;1137:1;1134:13;1115:236;;;1208:3;1237:35;1268:3;1256:10;1237:35;:::i;:::-;1232:3;1225:48;1302:4;1297:3;1293:14;1286:21;;1336:4;1331:3;1327:14;1320:21;;1175:176;1162:1;1159;1155:9;1150:14;;1115:236;;;1119:14;805:552;;706:651;;;;;:::o;1363:410::-;1440:5;1465:65;1481:48;1522:6;1481:48;:::i;:::-;1465:65;:::i;:::-;1456:74;;1553:6;1546:5;1539:21;1591:4;1584:5;1580:16;1629:3;1620:6;1615:3;1611:16;1608:25;1605:112;;;1636:79;;:::i;:::-;1605:112;1726:41;1760:6;1755:3;1750;1726:41;:::i;:::-;1446:327;1363:410;;;;;:::o;1779:412::-;1857:5;1882:66;1898:49;1940:6;1898:49;:::i;:::-;1882:66;:::i;:::-;1873:75;;1971:6;1964:5;1957:21;2009:4;2002:5;1998:16;2047:3;2038:6;2033:3;2029:16;2026:25;2023:112;;;2054:79;;:::i;:::-;2023:112;2144:41;2178:6;2173:3;2168;2144:41;:::i;:::-;1863:328;1779:412;;;;;:::o;2197:139::-;2243:5;2281:6;2268:20;2259:29;;2297:33;2324:5;2297:33;:::i;:::-;2197:139;;;;:::o;2361:341::-;2431:5;2480:3;2473:4;2465:6;2461:17;2457:27;2447:122;;2488:79;;:::i;:::-;2447:122;2592:4;2614:82;2692:3;2684:6;2676;2614:82;:::i;:::-;2605:91;;2437:265;2361:341;;;;:::o;2725:337::-;2793:5;2842:3;2835:4;2827:6;2823:17;2819:27;2809:122;;2850:79;;:::i;:::-;2809:122;2954:4;2976:80;3052:3;3044:6;3036;2976:80;:::i;:::-;2967:89;;2799:263;2725:337;;;;:::o;3068:133::-;3111:5;3149:6;3136:20;3127:29;;3165:30;3189:5;3165:30;:::i;:::-;3068:133;;;;:::o;3207:137::-;3252:5;3290:6;3277:20;3268:29;;3306:32;3332:5;3306:32;:::i;:::-;3207:137;;;;:::o;3350:141::-;3406:5;3437:6;3431:13;3422:22;;3453:32;3479:5;3453:32;:::i;:::-;3350:141;;;;:::o;3510:338::-;3565:5;3614:3;3607:4;3599:6;3595:17;3591:27;3581:122;;3622:79;;:::i;:::-;3581:122;3739:6;3726:20;3764:78;3838:3;3830:6;3823:4;3815:6;3811:17;3764:78;:::i;:::-;3755:87;;3571:277;3510:338;;;;:::o;3868:340::-;3924:5;3973:3;3966:4;3958:6;3954:17;3950:27;3940:122;;3981:79;;:::i;:::-;3940:122;4098:6;4085:20;4123:79;4198:3;4190:6;4183:4;4175:6;4171:17;4123:79;:::i;:::-;4114:88;;3930:278;3868:340;;;;:::o;4214:139::-;4260:5;4298:6;4285:20;4276:29;;4314:33;4341:5;4314:33;:::i;:::-;4214:139;;;;:::o;4359:135::-;4403:5;4441:6;4428:20;4419:29;;4457:31;4482:5;4457:31;:::i;:::-;4359:135;;;;:::o;4500:329::-;4559:6;4608:2;4596:9;4587:7;4583:23;4579:32;4576:119;;;4614:79;;:::i;:::-;4576:119;4734:1;4759:53;4804:7;4795:6;4784:9;4780:22;4759:53;:::i;:::-;4749:63;;4705:117;4500:329;;;;:::o;4835:474::-;4903:6;4911;4960:2;4948:9;4939:7;4935:23;4931:32;4928:119;;;4966:79;;:::i;:::-;4928:119;5086:1;5111:53;5156:7;5147:6;5136:9;5132:22;5111:53;:::i;:::-;5101:63;;5057:117;5213:2;5239:53;5284:7;5275:6;5264:9;5260:22;5239:53;:::i;:::-;5229:63;;5184:118;4835:474;;;;;:::o;5315:619::-;5392:6;5400;5408;5457:2;5445:9;5436:7;5432:23;5428:32;5425:119;;;5463:79;;:::i;:::-;5425:119;5583:1;5608:53;5653:7;5644:6;5633:9;5629:22;5608:53;:::i;:::-;5598:63;;5554:117;5710:2;5736:53;5781:7;5772:6;5761:9;5757:22;5736:53;:::i;:::-;5726:63;;5681:118;5838:2;5864:53;5909:7;5900:6;5889:9;5885:22;5864:53;:::i;:::-;5854:63;;5809:118;5315:619;;;;;:::o;5940:943::-;6035:6;6043;6051;6059;6108:3;6096:9;6087:7;6083:23;6079:33;6076:120;;;6115:79;;:::i;:::-;6076:120;6235:1;6260:53;6305:7;6296:6;6285:9;6281:22;6260:53;:::i;:::-;6250:63;;6206:117;6362:2;6388:53;6433:7;6424:6;6413:9;6409:22;6388:53;:::i;:::-;6378:63;;6333:118;6490:2;6516:53;6561:7;6552:6;6541:9;6537:22;6516:53;:::i;:::-;6506:63;;6461:118;6646:2;6635:9;6631:18;6618:32;6677:18;6669:6;6666:30;6663:117;;;6699:79;;:::i;:::-;6663:117;6804:62;6858:7;6849:6;6838:9;6834:22;6804:62;:::i;:::-;6794:72;;6589:287;5940:943;;;;;;;:::o;6889:468::-;6954:6;6962;7011:2;6999:9;6990:7;6986:23;6982:32;6979:119;;;7017:79;;:::i;:::-;6979:119;7137:1;7162:53;7207:7;7198:6;7187:9;7183:22;7162:53;:::i;:::-;7152:63;;7108:117;7264:2;7290:50;7332:7;7323:6;7312:9;7308:22;7290:50;:::i;:::-;7280:60;;7235:115;6889:468;;;;;:::o;7363:474::-;7431:6;7439;7488:2;7476:9;7467:7;7463:23;7459:32;7456:119;;;7494:79;;:::i;:::-;7456:119;7614:1;7639:53;7684:7;7675:6;7664:9;7660:22;7639:53;:::i;:::-;7629:63;;7585:117;7741:2;7767:53;7812:7;7803:6;7792:9;7788:22;7767:53;:::i;:::-;7757:63;;7712:118;7363:474;;;;;:::o;7843:570::-;7957:6;7965;8014:4;8002:9;7993:7;7989:23;7985:34;7982:121;;;8022:79;;:::i;:::-;7982:121;8142:1;8167:77;8236:7;8227:6;8216:9;8212:22;8167:77;:::i;:::-;8157:87;;8113:141;8293:4;8321:75;8388:7;8379:6;8368:9;8364:22;8321:75;:::i;:::-;8311:85;;8264:142;7843:570;;;;;:::o;8419:323::-;8475:6;8524:2;8512:9;8503:7;8499:23;8495:32;8492:119;;;8530:79;;:::i;:::-;8492:119;8650:1;8675:50;8717:7;8708:6;8697:9;8693:22;8675:50;:::i;:::-;8665:60;;8621:114;8419:323;;;;:::o;8748:327::-;8806:6;8855:2;8843:9;8834:7;8830:23;8826:32;8823:119;;;8861:79;;:::i;:::-;8823:119;8981:1;9006:52;9050:7;9041:6;9030:9;9026:22;9006:52;:::i;:::-;8996:62;;8952:116;8748:327;;;;:::o;9081:349::-;9150:6;9199:2;9187:9;9178:7;9174:23;9170:32;9167:119;;;9205:79;;:::i;:::-;9167:119;9325:1;9350:63;9405:7;9396:6;9385:9;9381:22;9350:63;:::i;:::-;9340:73;;9296:127;9081:349;;;;:::o;9436:509::-;9505:6;9554:2;9542:9;9533:7;9529:23;9525:32;9522:119;;;9560:79;;:::i;:::-;9522:119;9708:1;9697:9;9693:17;9680:31;9738:18;9730:6;9727:30;9724:117;;;9760:79;;:::i;:::-;9724:117;9865:63;9920:7;9911:6;9900:9;9896:22;9865:63;:::i;:::-;9855:73;;9651:287;9436:509;;;;:::o;9951:329::-;10010:6;10059:2;10047:9;10038:7;10034:23;10030:32;10027:119;;;10065:79;;:::i;:::-;10027:119;10185:1;10210:53;10255:7;10246:6;10235:9;10231:22;10210:53;:::i;:::-;10200:63;;10156:117;9951:329;;;;:::o;10286:118::-;10373:24;10391:5;10373:24;:::i;:::-;10368:3;10361:37;10286:118;;:::o;10410:109::-;10491:21;10506:5;10491:21;:::i;:::-;10486:3;10479:34;10410:109;;:::o;10525:360::-;10611:3;10639:38;10671:5;10639:38;:::i;:::-;10693:70;10756:6;10751:3;10693:70;:::i;:::-;10686:77;;10772:52;10817:6;10812:3;10805:4;10798:5;10794:16;10772:52;:::i;:::-;10849:29;10871:6;10849:29;:::i;:::-;10844:3;10840:39;10833:46;;10615:270;10525:360;;;;:::o;10891:364::-;10979:3;11007:39;11040:5;11007:39;:::i;:::-;11062:71;11126:6;11121:3;11062:71;:::i;:::-;11055:78;;11142:52;11187:6;11182:3;11175:4;11168:5;11164:16;11142:52;:::i;:::-;11219:29;11241:6;11219:29;:::i;:::-;11214:3;11210:39;11203:46;;10983:272;10891:364;;;;:::o;11261:366::-;11403:3;11424:67;11488:2;11483:3;11424:67;:::i;:::-;11417:74;;11500:93;11589:3;11500:93;:::i;:::-;11618:2;11613:3;11609:12;11602:19;;11261:366;;;:::o;11633:::-;11775:3;11796:67;11860:2;11855:3;11796:67;:::i;:::-;11789:74;;11872:93;11961:3;11872:93;:::i;:::-;11990:2;11985:3;11981:12;11974:19;;11633:366;;;:::o;12005:::-;12147:3;12168:67;12232:2;12227:3;12168:67;:::i;:::-;12161:74;;12244:93;12333:3;12244:93;:::i;:::-;12362:2;12357:3;12353:12;12346:19;;12005:366;;;:::o;12377:::-;12519:3;12540:67;12604:2;12599:3;12540:67;:::i;:::-;12533:74;;12616:93;12705:3;12616:93;:::i;:::-;12734:2;12729:3;12725:12;12718:19;;12377:366;;;:::o;12749:::-;12891:3;12912:67;12976:2;12971:3;12912:67;:::i;:::-;12905:74;;12988:93;13077:3;12988:93;:::i;:::-;13106:2;13101:3;13097:12;13090:19;;12749:366;;;:::o;13121:::-;13263:3;13284:67;13348:2;13343:3;13284:67;:::i;:::-;13277:74;;13360:93;13449:3;13360:93;:::i;:::-;13478:2;13473:3;13469:12;13462:19;;13121:366;;;:::o;13493:::-;13635:3;13656:67;13720:2;13715:3;13656:67;:::i;:::-;13649:74;;13732:93;13821:3;13732:93;:::i;:::-;13850:2;13845:3;13841:12;13834:19;;13493:366;;;:::o;13865:::-;14007:3;14028:67;14092:2;14087:3;14028:67;:::i;:::-;14021:74;;14104:93;14193:3;14104:93;:::i;:::-;14222:2;14217:3;14213:12;14206:19;;13865:366;;;:::o;14237:118::-;14324:24;14342:5;14324:24;:::i;:::-;14319:3;14312:37;14237:118;;:::o;14361:222::-;14454:4;14492:2;14481:9;14477:18;14469:26;;14505:71;14573:1;14562:9;14558:17;14549:6;14505:71;:::i;:::-;14361:222;;;;:::o;14589:640::-;14784:4;14822:3;14811:9;14807:19;14799:27;;14836:71;14904:1;14893:9;14889:17;14880:6;14836:71;:::i;:::-;14917:72;14985:2;14974:9;14970:18;14961:6;14917:72;:::i;:::-;14999;15067:2;15056:9;15052:18;15043:6;14999:72;:::i;:::-;15118:9;15112:4;15108:20;15103:2;15092:9;15088:18;15081:48;15146:76;15217:4;15208:6;15146:76;:::i;:::-;15138:84;;14589:640;;;;;;;:::o;15235:210::-;15322:4;15360:2;15349:9;15345:18;15337:26;;15373:65;15435:1;15424:9;15420:17;15411:6;15373:65;:::i;:::-;15235:210;;;;:::o;15451:313::-;15564:4;15602:2;15591:9;15587:18;15579:26;;15651:9;15645:4;15641:20;15637:1;15626:9;15622:17;15615:47;15679:78;15752:4;15743:6;15679:78;:::i;:::-;15671:86;;15451:313;;;;:::o;15770:419::-;15936:4;15974:2;15963:9;15959:18;15951:26;;16023:9;16017:4;16013:20;16009:1;15998:9;15994:17;15987:47;16051:131;16177:4;16051:131;:::i;:::-;16043:139;;15770:419;;;:::o;16195:::-;16361:4;16399:2;16388:9;16384:18;16376:26;;16448:9;16442:4;16438:20;16434:1;16423:9;16419:17;16412:47;16476:131;16602:4;16476:131;:::i;:::-;16468:139;;16195:419;;;:::o;16620:::-;16786:4;16824:2;16813:9;16809:18;16801:26;;16873:9;16867:4;16863:20;16859:1;16848:9;16844:17;16837:47;16901:131;17027:4;16901:131;:::i;:::-;16893:139;;16620:419;;;:::o;17045:::-;17211:4;17249:2;17238:9;17234:18;17226:26;;17298:9;17292:4;17288:20;17284:1;17273:9;17269:17;17262:47;17326:131;17452:4;17326:131;:::i;:::-;17318:139;;17045:419;;;:::o;17470:::-;17636:4;17674:2;17663:9;17659:18;17651:26;;17723:9;17717:4;17713:20;17709:1;17698:9;17694:17;17687:47;17751:131;17877:4;17751:131;:::i;:::-;17743:139;;17470:419;;;:::o;17895:::-;18061:4;18099:2;18088:9;18084:18;18076:26;;18148:9;18142:4;18138:20;18134:1;18123:9;18119:17;18112:47;18176:131;18302:4;18176:131;:::i;:::-;18168:139;;17895:419;;;:::o;18320:::-;18486:4;18524:2;18513:9;18509:18;18501:26;;18573:9;18567:4;18563:20;18559:1;18548:9;18544:17;18537:47;18601:131;18727:4;18601:131;:::i;:::-;18593:139;;18320:419;;;:::o;18745:::-;18911:4;18949:2;18938:9;18934:18;18926:26;;18998:9;18992:4;18988:20;18984:1;18973:9;18969:17;18962:47;19026:131;19152:4;19026:131;:::i;:::-;19018:139;;18745:419;;;:::o;19170:222::-;19263:4;19301:2;19290:9;19286:18;19278:26;;19314:71;19382:1;19371:9;19367:17;19358:6;19314:71;:::i;:::-;19170:222;;;;:::o;19398:129::-;19432:6;19459:20;;:::i;:::-;19449:30;;19488:33;19516:4;19508:6;19488:33;:::i;:::-;19398:129;;;:::o;19533:75::-;19566:6;19599:2;19593:9;19583:19;;19533:75;:::o;19614:250::-;19690:4;19780:18;19772:6;19769:30;19766:56;;;19802:18;;:::i;:::-;19766:56;19852:4;19844:6;19840:17;19832:25;;19614:250;;;:::o;19870:248::-;19944:4;20034:18;20026:6;20023:30;20020:56;;;20056:18;;:::i;:::-;20020:56;20106:4;20098:6;20094:17;20086:25;;19870:248;;;:::o;20124:307::-;20185:4;20275:18;20267:6;20264:30;20261:56;;;20297:18;;:::i;:::-;20261:56;20335:29;20357:6;20335:29;:::i;:::-;20327:37;;20419:4;20413;20409:15;20401:23;;20124:307;;;:::o;20437:308::-;20499:4;20589:18;20581:6;20578:30;20575:56;;;20611:18;;:::i;:::-;20575:56;20649:29;20671:6;20649:29;:::i;:::-;20641:37;;20733:4;20727;20723:15;20715:23;;20437:308;;;:::o;20751:98::-;20802:6;20836:5;20830:12;20820:22;;20751:98;;;:::o;20855:99::-;20907:6;20941:5;20935:12;20925:22;;20855:99;;;:::o;20960:168::-;21043:11;21077:6;21072:3;21065:19;21117:4;21112:3;21108:14;21093:29;;20960:168;;;;:::o;21134:169::-;21218:11;21252:6;21247:3;21240:19;21292:4;21287:3;21283:14;21268:29;;21134:169;;;;:::o;21309:96::-;21346:7;21375:24;21393:5;21375:24;:::i;:::-;21364:35;;21309:96;;;:::o;21411:90::-;21445:7;21488:5;21481:13;21474:21;21463:32;;21411:90;;;:::o;21507:149::-;21543:7;21583:66;21576:5;21572:78;21561:89;;21507:149;;;:::o;21662:126::-;21699:7;21739:42;21732:5;21728:54;21717:65;;21662:126;;;:::o;21794:77::-;21831:7;21860:5;21849:16;;21794:77;;;:::o;21877:86::-;21912:7;21952:4;21945:5;21941:16;21930:27;;21877:86;;;:::o;21969:154::-;22053:6;22048:3;22043;22030:30;22115:1;22106:6;22101:3;22097:16;22090:27;21969:154;;;:::o;22129:307::-;22197:1;22207:113;22221:6;22218:1;22215:13;22207:113;;;22306:1;22301:3;22297:11;22291:18;22287:1;22282:3;22278:11;22271:39;22243:2;22240:1;22236:10;22231:15;;22207:113;;;22338:6;22335:1;22332:13;22329:101;;;22418:1;22409:6;22404:3;22400:16;22393:27;22329:101;22178:258;22129:307;;;:::o;22442:320::-;22486:6;22523:1;22517:4;22513:12;22503:22;;22570:1;22564:4;22560:12;22591:18;22581:81;;22647:4;22639:6;22635:17;22625:27;;22581:81;22709:2;22701:6;22698:14;22678:18;22675:38;22672:84;;;22728:18;;:::i;:::-;22672:84;22493:269;22442:320;;;:::o;22768:281::-;22851:27;22873:4;22851:27;:::i;:::-;22843:6;22839:40;22981:6;22969:10;22966:22;22945:18;22933:10;22930:34;22927:62;22924:88;;;22992:18;;:::i;:::-;22924:88;23032:10;23028:2;23021:22;22811:238;22768:281;;:::o;23055:233::-;23094:3;23117:24;23135:5;23117:24;:::i;:::-;23108:33;;23163:66;23156:5;23153:77;23150:103;;;23233:18;;:::i;:::-;23150:103;23280:1;23273:5;23269:13;23262:20;;23055:233;;;:::o;23294:180::-;23342:77;23339:1;23332:88;23439:4;23436:1;23429:15;23463:4;23460:1;23453:15;23480:180;23528:77;23525:1;23518:88;23625:4;23622:1;23615:15;23649:4;23646:1;23639:15;23666:180;23714:77;23711:1;23704:88;23811:4;23808:1;23801:15;23835:4;23832:1;23825:15;23852:180;23900:77;23897:1;23890:88;23997:4;23994:1;23987:15;24021:4;24018:1;24011:15;24038:117;24147:1;24144;24137:12;24161:117;24270:1;24267;24260:12;24284:117;24393:1;24390;24383:12;24407:117;24516:1;24513;24506:12;24530:117;24639:1;24636;24629:12;24653:102;24694:6;24745:2;24741:7;24736:2;24729:5;24725:14;24721:28;24711:38;;24653:102;;;:::o;24761:225::-;24901:34;24897:1;24889:6;24885:14;24878:58;24970:8;24965:2;24957:6;24953:15;24946:33;24761:225;:::o;24992:171::-;25132:23;25128:1;25120:6;25116:14;25109:47;24992:171;:::o;25169:229::-;25309:34;25305:1;25297:6;25293:14;25286:58;25378:12;25373:2;25365:6;25361:15;25354:37;25169:229;:::o;25404:180::-;25544:32;25540:1;25532:6;25528:14;25521:56;25404:180;:::o;25590:182::-;25730:34;25726:1;25718:6;25714:14;25707:58;25590:182;:::o;25778:234::-;25918:34;25914:1;25906:6;25902:14;25895:58;25987:17;25982:2;25974:6;25970:15;25963:42;25778:234;:::o;26018:174::-;26158:26;26154:1;26146:6;26142:14;26135:50;26018:174;:::o;26198:181::-;26338:33;26334:1;26326:6;26322:14;26315:57;26198:181;:::o;26385:122::-;26458:24;26476:5;26458:24;:::i;:::-;26451:5;26448:35;26438:63;;26497:1;26494;26487:12;26438:63;26385:122;:::o;26513:116::-;26583:21;26598:5;26583:21;:::i;:::-;26576:5;26573:32;26563:60;;26619:1;26616;26609:12;26563:60;26513:116;:::o;26635:120::-;26707:23;26724:5;26707:23;:::i;:::-;26700:5;26697:34;26687:62;;26745:1;26742;26735:12;26687:62;26635:120;:::o;26761:122::-;26834:24;26852:5;26834:24;:::i;:::-;26827:5;26824:35;26814:63;;26873:1;26870;26863:12;26814:63;26761:122;:::o;26889:118::-;26960:22;26976:5;26960:22;:::i;:::-;26953:5;26950:33;26940:61;;26997:1;26994;26987:12;26940:61;26889:118;:::o

Swarm Source

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