ETH Price: $3,302.42 (-0.20%)

Token

Strange Times (Strange Times)
 

Overview

Max Total Supply

7,826 Strange Times

Holders

3,103

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
angrygordon.eth
Balance
1 Strange Times
0xa81e9afade5b43419e5adc9eeb8b8325bec5e5bd
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:
Magiotsri

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-05-22
*/

/**
 *Submitted for verification at Etherscan.io on 2022-05-21
*/

/**
 *Submitted for verification at Etherscan.io on 2022-05-19
*/

/**
 *Submitted for verification at polygonscan.com on 2022-04-12
*/

/**
 *Submitted for verification at polygonscan.com on 2022-04-08
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7; 
library MerkleProof {
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }
   function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}
abstract contract ReentrancyGuard { 
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }
    modifier nonReentrant() {
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
   _status = _ENTERED;

        _;
        _status = _NOT_ENTERED;
    }
}

library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
 
    function toString(uint256 value) internal pure returns (string memory) { 
        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }
 
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }
 
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}
 
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);
 
    constructor() {
        _transferOwnership(_msgSender());
    }
 
    function owner() public view virtual returns (address) {
        return _owner;
    } 
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }
 
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }
 
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }
 
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}
 
library Address { 
    function isContract(address account) internal view returns (bool) { 
        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    } 
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }
 
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    } 
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }
 
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }
 
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    } 
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }
 
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }
 
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }
 
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }
 
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else { 
            if (returndata.length > 0) { 

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}
 
interface IERC721Receiver { 
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}
 
interface IERC165 { 
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
 
abstract contract ERC165 is IERC165 { 
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
} 
interface IERC721 is IERC165 { 
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); 
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); 
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved); 
    function balanceOf(address owner) external view returns (uint256 balance); 
    function ownerOf(uint256 tokenId) external view returns (address owner); 
    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 getApproved(uint256 tokenId) external view returns (address operator); 
    function setApprovalForAll(address operator, bool _approved) external; 
    function isApprovedForAll(address owner, address operator) external view returns (bool); 
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}
interface IERC721Metadata is IERC721 { 
    function name() external view returns (string memory); 
    function symbol() external view returns (string memory); 
    function tokenURI(uint256 tokenId) external view returns (string memory);
} 
error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, Ownable {
    using Address for address;
    using Strings for uint256;

    // Compiler will pack this into a single 256bit word.
    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;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

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

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

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * 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 See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberMinted);
    }

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

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return _addressData[owner].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 {
        _addressData[owner].aux = aux;
    }

    /**
     * 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) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr && curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // 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.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

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

    /**
     * @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, tokenId.toString())) : '';
    }

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

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

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

        _approve(to, tokenId, owner);
    }

    /**
     * @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 == _msgSender()) revert ApproveToCaller();

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        _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.isContract() && !_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 && !_ownerships[tokenId].burned;
    }

    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 {
        _mint(to, quantity, _data, true);
    }

    /**
     * @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,
        bytes memory _data,
        bool safe
    ) 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 {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

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

            if (safe && to.isContract()) {
                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 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 {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // 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 {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = to;
            currSlot.startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

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

    /**
     * @dev This is 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 {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        address from = prevOwnership.addr;

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

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

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

        // 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 {
            AddressData storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

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

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

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

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

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

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

contract Magiotsri is Ownable, ERC721A, ReentrancyGuard {
    using Strings for uint256;

  bytes32 public merkleRoot = 0x1856cb03eeee40e9bba0aa075c3ef16ec78a3613685598d2392090290a08ae9c;
  function setMerkleRoot(bytes32 m) public onlyOwner{
    merkleRoot = m;
  }

  uint256 public MAX_PER_Transtion = 40; // maximam amount that user can mint
  uint256 public MAX_PER_Address = 40; // maximam amount that user can mint

  uint256 public  PRICE = 0.04 ether;

  uint256 private constant TotalCollectionSize_ = 7777; // total number of nfts

  string private _baseTokenURI;
  uint private stopat = 7777;
  uint private reserve = 170;

  uint public status = 0; //0-pause 1-whitelist 2-public 

  constructor() ERC721A("Strange Times","Strange Times") {
    _baseTokenURI = "ipfs://QmYqKmNQHbGaRYbHzmH9PyNWLiFTg35nqivdVSi45N6uAe/";
  }

  modifier callerIsUser() {
    require(tx.origin == msg.sender, "The caller is another contract");
    _;
  }
 
  function mint(uint256 quantity) external payable callerIsUser {
    require(status == 3 , "Sale is not Active");
    require(totalSupply() + quantity <= TotalCollectionSize_ - reserve, "reached max supply");
    require(numberMinted(msg.sender) + quantity <= MAX_PER_Address, "Quantity exceeds allowed Mints" );
    require(quantity <= MAX_PER_Transtion,"can not mint this many");
    require(msg.value >= PRICE * quantity, "Need to send more ETH.");
    _safeMint(msg.sender, quantity);   
    if(totalSupply() >= stopat) {status = 0;}
  }
  function phase1mint(uint256 quantity) external payable callerIsUser {
    require( msg.sender == 0xF142D7bAFF0986B50ae24e694419C65e7091f52c , "Unauthorized");
    require( status == 1, "Sale is not Active");
    require(numberMinted(msg.sender) + quantity <= MAX_PER_Address, "Quantity exceeds allowed Mints" );
    require( msg.value == PRICE * quantity, "Need to send more ETH.");
    _safeMint(msg.sender, quantity);
    if(totalSupply() >= stopat) {status = 0;}
  }
  function whitelistMint(uint256 quantity, bytes32[] calldata merkleproof) external payable callerIsUser {
    bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
    require(MerkleProof.verify( merkleproof, merkleRoot, leaf),"Not whitelisted");
    require(status == 2, "Whitelist Sale not started");
    require(totalSupply() + quantity <= TotalCollectionSize_ - reserve, "reached max supply");
    require( ( numberMinted(msg.sender) + quantity <= MAX_PER_Address ) , "Quantity exceeds allowed Mints" );
    require(  quantity <= MAX_PER_Transtion,"can not mint this many");
    require(msg.value >= PRICE * quantity, "Need to send more ETH.");
    _safeMint(msg.sender, quantity);
    if(totalSupply() >= stopat) {status = 0;}
    
  }

   function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
    require(_exists(tokenId),"ERC721Metadata: URI query for nonexistent token");
    string memory baseURI = _baseURI();
    return
      bytes(baseURI).length > 0
        ? string(abi.encodePacked(baseURI, tokenId.toString(),".json"))
        : "";
  }

  function setBaseURI(string memory baseURI) external onlyOwner {
    _baseTokenURI = baseURI;
  }
  function _baseURI() internal view virtual override returns (string memory) {
    return _baseTokenURI;
  }
  function numberMinted(address owner) public view returns (uint256) {
    return _numberMinted(owner);
  }
  function getOwnershipData(uint256 tokenId)
    external
    view
    returns (TokenOwnership memory)
  {
    return _ownershipOf(tokenId);
  }
  function withdraw() external onlyOwner nonReentrant {
    (bool success, ) = msg.sender.call{value: address(this).balance}("");
    require(success, "Transfer failed.");
  }
  function changeMintPrice(uint256 _newPrice) external onlyOwner
  {
      PRICE = _newPrice;
  }
  function changeMAX_PER_Transtion(uint256 q) external onlyOwner
  {
      MAX_PER_Transtion = q;
  }
  function changeMAX_PER_Address(uint256 q) external onlyOwner
  {
      MAX_PER_Address = q;
  }
  function setStatus(uint256 s)external onlyOwner{
      status = s;
  }
  function giveaway(address a, uint q)public onlyOwner{
    _safeMint(a, q);
  }
    function setStop(uint256 s)external onlyOwner{
      stopat = s;
  }
  function setReserve(uint256 r)external onlyOwner{
      reserve = r;
  }
     function configuration(uint256 Status , uint256 MPA , uint256 MPT , uint256 Price, uint256 Stop )external onlyOwner{
      status = Status;
      stopat = Stop;
      PRICE = Price;
      MAX_PER_Address = MPA;
      MAX_PER_Transtion = MPT;
  }
  function _startTokenId() internal view override returns (uint256) {
        return 1;
    }
  
}

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"},{"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":[],"name":"MAX_PER_Address","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_Transtion","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"q","type":"uint256"}],"name":"changeMAX_PER_Address","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"q","type":"uint256"}],"name":"changeMAX_PER_Transtion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"changeMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"Status","type":"uint256"},{"internalType":"uint256","name":"MPA","type":"uint256"},{"internalType":"uint256","name":"MPT","type":"uint256"},{"internalType":"uint256","name":"Price","type":"uint256"},{"internalType":"uint256","name":"Stop","type":"uint256"}],"name":"configuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct ERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"a","type":"address"},{"internalType":"uint256","name":"q","type":"uint256"}],"name":"giveaway","outputs":[],"stateMutability":"nonpayable","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":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"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":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"phase1mint","outputs":[],"stateMutability":"payable","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":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"m","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"r","type":"uint256"}],"name":"setReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"s","type":"uint256"}],"name":"setStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"s","type":"uint256"}],"name":"setStop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"status","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32[]","name":"merkleproof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040527f1856cb03eeee40e9bba0aa075c3ef16ec78a3613685598d2392090290a08ae9c60001b600a556028600b556028600c55668e1bc9bf040000600d55611e61600f5560aa60105560006011553480156200005d57600080fd5b506040518060400160405280600d81526020017f537472616e67652054696d6573000000000000000000000000000000000000008152506040518060400160405280600d81526020017f537472616e67652054696d657300000000000000000000000000000000000000815250620000ea620000de6200017460201b60201c565b6200017c60201b60201c565b81600390805190602001906200010292919062000249565b5080600490805190602001906200011b92919062000249565b506200012c6200024060201b60201c565b6001819055505050600160098190555060405180606001604052806036815260200162004b1660369139600e90805190602001906200016d92919062000249565b506200035e565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006001905090565b8280546200025790620002f9565b90600052602060002090601f0160209004810192826200027b5760008555620002c7565b82601f106200029657805160ff1916838001178555620002c7565b82800160010185558215620002c7579182015b82811115620002c6578251825591602001919060010190620002a9565b5b509050620002d69190620002da565b5090565b5b80821115620002f5576000816000905550600101620002db565b5090565b600060028204905060018216806200031257607f821691505b602082108114156200032957620003286200032f565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6147a8806200036e6000396000f3fe6080604052600436106102255760003560e01c806370a0823111610123578063af7b26e9116100ab578063d2cab0561161006f578063d2cab056146107bf578063dc33e681146107db578063e985e9c514610818578063f2fde38b14610855578063fb7f05401461087e57610225565b8063af7b26e9146106dc578063b88d4fde14610705578063c1f127e21461072e578063c87b56dd14610757578063d04950a11461079457610225565b80638da5cb5b116100f25780638da5cb5b146106045780639231ab2a1461062f57806395d89b411461066c578063a0712d6814610697578063a22cb465146106b357610225565b806370a082311461055c578063715018a6146105995780637cb64759146105b05780638d859f3e146105d957610225565b80632eb4a7ab116101b157806342842e0e1161017557806342842e0e1461048857806355f804b3146104b15780636352211e146104da57806369ba1a75146105175780636c2fe66b1461054057610225565b80632eb4a7ab146103c95780632f2ffc57146103f45780633ccfd60b1461041f5780633fd17366146104365780634256dbe31461045f57610225565b8063081812fc116101f8578063081812fc146102e4578063095ea7b31461032157806318160ddd1461034a578063200d2ed21461037557806323b872dd146103a057610225565b80630199e3471461022a57806301ffc9a714610253578063050225ea1461029057806306fdde03146102b9575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c91906137b2565b6108a7565b005b34801561025f57600080fd5b5061027a6004803603810190610275919061370f565b61092d565b6040516102879190613d15565b60405180910390f35b34801561029c57600080fd5b506102b760048036038101906102b291906136a2565b610a0f565b005b3480156102c557600080fd5b506102ce610a99565b6040516102db9190613d4b565b60405180910390f35b3480156102f057600080fd5b5061030b600480360381019061030691906137b2565b610b2b565b6040516103189190613cae565b60405180910390f35b34801561032d57600080fd5b50610348600480360381019061034391906136a2565b610ba7565b005b34801561035657600080fd5b5061035f610cb2565b60405161036c9190613f48565b60405180910390f35b34801561038157600080fd5b5061038a610cc9565b6040516103979190613f48565b60405180910390f35b3480156103ac57600080fd5b506103c760048036038101906103c2919061358c565b610ccf565b005b3480156103d557600080fd5b506103de610cdf565b6040516103eb9190613d30565b60405180910390f35b34801561040057600080fd5b50610409610ce5565b6040516104169190613f48565b60405180910390f35b34801561042b57600080fd5b50610434610ceb565b005b34801561044257600080fd5b5061045d600480360381019061045891906137b2565b610e6c565b005b34801561046b57600080fd5b50610486600480360381019061048191906137b2565b610ef2565b005b34801561049457600080fd5b506104af60048036038101906104aa919061358c565b610f78565b005b3480156104bd57600080fd5b506104d860048036038101906104d39190613769565b610f98565b005b3480156104e657600080fd5b5061050160048036038101906104fc91906137b2565b61102e565b60405161050e9190613cae565b60405180910390f35b34801561052357600080fd5b5061053e600480360381019061053991906137b2565b611044565b005b61055a600480360381019061055591906137b2565b6110ca565b005b34801561056857600080fd5b50610583600480360381019061057e919061351f565b6112cc565b6040516105909190613f48565b60405180910390f35b3480156105a557600080fd5b506105ae61139c565b005b3480156105bc57600080fd5b506105d760048036038101906105d291906136e2565b611424565b005b3480156105e557600080fd5b506105ee6114aa565b6040516105fb9190613f48565b60405180910390f35b34801561061057600080fd5b506106196114b0565b6040516106269190613cae565b60405180910390f35b34801561063b57600080fd5b50610656600480360381019061065191906137b2565b6114d9565b6040516106639190613f2d565b60405180910390f35b34801561067857600080fd5b506106816114f1565b60405161068e9190613d4b565b60405180910390f35b6106b160048036038101906106ac91906137b2565b611583565b005b3480156106bf57600080fd5b506106da60048036038101906106d59190613662565b6117ad565b005b3480156106e857600080fd5b5061070360048036038101906106fe91906137b2565b611925565b005b34801561071157600080fd5b5061072c600480360381019061072791906135df565b6119ab565b005b34801561073a57600080fd5b50610755600480360381019061075091906137b2565b611a27565b005b34801561076357600080fd5b5061077e600480360381019061077991906137b2565b611aad565b60405161078b9190613d4b565b60405180910390f35b3480156107a057600080fd5b506107a9611b54565b6040516107b69190613f48565b60405180910390f35b6107d960048036038101906107d491906137df565b611b5a565b005b3480156107e757600080fd5b5061080260048036038101906107fd919061351f565b611e3f565b60405161080f9190613f48565b60405180910390f35b34801561082457600080fd5b5061083f600480360381019061083a919061354c565b611e51565b60405161084c9190613d15565b60405180910390f35b34801561086157600080fd5b5061087c6004803603810190610877919061351f565b611ee5565b005b34801561088a57600080fd5b506108a560048036038101906108a0919061383f565b611fdd565b005b6108af612083565b73ffffffffffffffffffffffffffffffffffffffff166108cd6114b0565b73ffffffffffffffffffffffffffffffffffffffff1614610923576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091a90613e4d565b60405180910390fd5b80600c8190555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109f857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a085750610a078261208b565b5b9050919050565b610a17612083565b73ffffffffffffffffffffffffffffffffffffffff16610a356114b0565b73ffffffffffffffffffffffffffffffffffffffff1614610a8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8290613e4d565b60405180910390fd5b610a9582826120f5565b5050565b606060038054610aa890614221565b80601f0160208091040260200160405190810160405280929190818152602001828054610ad490614221565b8015610b215780601f10610af657610100808354040283529160200191610b21565b820191906000526020600020905b815481529060010190602001808311610b0457829003601f168201915b5050505050905090565b6000610b3682612113565b610b6c576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bb28261102e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c1a576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c39612083565b73ffffffffffffffffffffffffffffffffffffffff1614158015610c6b5750610c6981610c64612083565b611e51565b155b15610ca2576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cad838383612161565b505050565b6000610cbc612213565b6002546001540303905090565b60115481565b610cda83838361221c565b505050565b600a5481565b600c5481565b610cf3612083565b73ffffffffffffffffffffffffffffffffffffffff16610d116114b0565b73ffffffffffffffffffffffffffffffffffffffff1614610d67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5e90613e4d565b60405180910390fd5b60026009541415610dad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da490613f0d565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051610ddb90613c99565b60006040518083038185875af1925050503d8060008114610e18576040519150601f19603f3d011682016040523d82523d6000602084013e610e1d565b606091505b5050905080610e61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5890613e8d565b60405180910390fd5b506001600981905550565b610e74612083565b73ffffffffffffffffffffffffffffffffffffffff16610e926114b0565b73ffffffffffffffffffffffffffffffffffffffff1614610ee8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edf90613e4d565b60405180910390fd5b80600d8190555050565b610efa612083565b73ffffffffffffffffffffffffffffffffffffffff16610f186114b0565b73ffffffffffffffffffffffffffffffffffffffff1614610f6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6590613e4d565b60405180910390fd5b8060108190555050565b610f93838383604051806020016040528060008152506119ab565b505050565b610fa0612083565b73ffffffffffffffffffffffffffffffffffffffff16610fbe6114b0565b73ffffffffffffffffffffffffffffffffffffffff1614611014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100b90613e4d565b60405180910390fd5b80600e908051906020019061102a929190613285565b5050565b6000611039826126d2565b600001519050919050565b61104c612083565b73ffffffffffffffffffffffffffffffffffffffff1661106a6114b0565b73ffffffffffffffffffffffffffffffffffffffff16146110c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b790613e4d565b60405180910390fd5b8060118190555050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611138576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112f90613dcd565b60405180910390fd5b73f142d7baff0986b50ae24e694419c65e7091f52c73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146111ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b190613d6d565b60405180910390fd5b6001601154146111ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f690613dad565b60405180910390fd5b600c548161120c33611e3f565b6112169190614038565b1115611257576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124e90613e0d565b60405180910390fd5b80600d5461126591906140bf565b34146112a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129d90613ead565b60405180910390fd5b6112b033826120f5565b600f546112bb610cb2565b106112c95760006011819055505b50565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611334576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6113a4612083565b73ffffffffffffffffffffffffffffffffffffffff166113c26114b0565b73ffffffffffffffffffffffffffffffffffffffff1614611418576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140f90613e4d565b60405180910390fd5b6114226000612961565b565b61142c612083565b73ffffffffffffffffffffffffffffffffffffffff1661144a6114b0565b73ffffffffffffffffffffffffffffffffffffffff16146114a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149790613e4d565b60405180910390fd5b80600a8190555050565b600d5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6114e161330b565b6114ea826126d2565b9050919050565b60606004805461150090614221565b80601f016020809104026020016040519081016040528092919081815260200182805461152c90614221565b80156115795780601f1061154e57610100808354040283529160200191611579565b820191906000526020600020905b81548152906001019060200180831161155c57829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146115f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e890613dcd565b60405180910390fd5b600360115414611636576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162d90613dad565b60405180910390fd5b601054611e616116469190614119565b8161164f610cb2565b6116599190614038565b111561169a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169190613e2d565b60405180910390fd5b600c54816116a733611e3f565b6116b19190614038565b11156116f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e990613e0d565b60405180910390fd5b600b54811115611737576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172e90613eed565b60405180910390fd5b80600d5461174591906140bf565b341015611787576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177e90613ead565b60405180910390fd5b61179133826120f5565b600f5461179c610cb2565b106117aa5760006011819055505b50565b6117b5612083565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561181a576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060086000611827612083565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166118d4612083565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119199190613d15565b60405180910390a35050565b61192d612083565b73ffffffffffffffffffffffffffffffffffffffff1661194b6114b0565b73ffffffffffffffffffffffffffffffffffffffff16146119a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199890613e4d565b60405180910390fd5b80600b8190555050565b6119b684848461221c565b6119d58373ffffffffffffffffffffffffffffffffffffffff16612a25565b80156119ea57506119e884848484612a38565b155b15611a21576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b611a2f612083565b73ffffffffffffffffffffffffffffffffffffffff16611a4d6114b0565b73ffffffffffffffffffffffffffffffffffffffff1614611aa3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9a90613e4d565b60405180910390fd5b80600f8190555050565b6060611ab882612113565b611af7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aee90613e6d565b60405180910390fd5b6000611b01612b98565b90506000815111611b215760405180602001604052806000815250611b4c565b80611b2b84612c2a565b604051602001611b3c929190613c6a565b6040516020818303038152906040525b915050919050565b600b5481565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611bc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbf90613dcd565b60405180910390fd5b600033604051602001611bdb9190613c4f565b604051602081830303815290604052805190602001209050611c41838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600a5483612d8b565b611c80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7790613ded565b60405180910390fd5b600260115414611cc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbc90613ecd565b60405180910390fd5b601054611e61611cd59190614119565b84611cde610cb2565b611ce89190614038565b1115611d29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2090613e2d565b60405180910390fd5b600c5484611d3633611e3f565b611d409190614038565b1115611d81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7890613e0d565b60405180910390fd5b600b54841115611dc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbd90613eed565b60405180910390fd5b83600d54611dd491906140bf565b341015611e16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0d90613ead565b60405180910390fd5b611e2033856120f5565b600f54611e2b610cb2565b10611e395760006011819055505b50505050565b6000611e4a82612da2565b9050919050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611eed612083565b73ffffffffffffffffffffffffffffffffffffffff16611f0b6114b0565b73ffffffffffffffffffffffffffffffffffffffff1614611f61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5890613e4d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611fd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc890613d8d565b60405180910390fd5b611fda81612961565b50565b611fe5612083565b73ffffffffffffffffffffffffffffffffffffffff166120036114b0565b73ffffffffffffffffffffffffffffffffffffffff1614612059576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205090613e4d565b60405180910390fd5b8460118190555080600f8190555081600d8190555083600c8190555082600b819055505050505050565b600033905090565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61210f828260405180602001604052806000815250612e0c565b5050565b60008161211e612213565b1115801561212d575060015482105b801561215a575060056000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b6000612227826126d2565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612292576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166122b3612083565b73ffffffffffffffffffffffffffffffffffffffff1614806122e257506122e1856122dc612083565b611e51565b5b8061232757506122f0612083565b73ffffffffffffffffffffffffffffffffffffffff1661230f84610b2b565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612360576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156123c7576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123d48585856001612e1e565b6123e060008487612161565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561266057600154821461265f57878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46126cb8585856001612e24565b5050505050565b6126da61330b565b6000829050806126e8612213565b111580156126f7575060015481105b1561292a576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161292857600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461280c57809250505061295c565b5b60011561292757818060019003925050600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461292257809250505061295c565b61280d565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080823b905060008111915050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a5e612083565b8786866040518563ffffffff1660e01b8152600401612a809493929190613cc9565b602060405180830381600087803b158015612a9a57600080fd5b505af1925050508015612acb57506040513d601f19601f82011682018060405250810190612ac8919061373c565b60015b612b45573d8060008114612afb576040519150601f19603f3d011682016040523d82523d6000602084013e612b00565b606091505b50600081511415612b3d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600e8054612ba790614221565b80601f0160208091040260200160405190810160405280929190818152602001828054612bd390614221565b8015612c205780601f10612bf557610100808354040283529160200191612c20565b820191906000526020600020905b815481529060010190602001808311612c0357829003601f168201915b5050505050905090565b60606000821415612c72576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612d86565b600082905060005b60008214612ca4578080612c8d90614284565b915050600a82612c9d919061408e565b9150612c7a565b60008167ffffffffffffffff811115612cc057612cbf6143de565b5b6040519080825280601f01601f191660200182016040528015612cf25781602001600182028036833780820191505090505b5090505b60008514612d7f57600182612d0b9190614119565b9150600a85612d1a91906142f1565b6030612d269190614038565b60f81b818381518110612d3c57612d3b6143af565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612d78919061408e565b9450612cf6565b8093505050505b919050565b600082612d988584612e2a565b1490509392505050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b612e198383836001612e9f565b505050565b50505050565b50505050565b60008082905060005b8451811015612e94576000858281518110612e5157612e506143af565b5b60200260200101519050808311612e7357612e6c838261326e565b9250612e80565b612e7d818461326e565b92505b508080612e8c90614284565b915050612e33565b508091505092915050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612f0d576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415612f48576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612f556000868387612e1e565b83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561311f575061311e8773ffffffffffffffffffffffffffffffffffffffff16612a25565b5b156131e5575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46131946000888480600101955088612a38565b6131ca576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808214156131255782600154146131e057600080fd5b613251565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808214156131e6575b8160018190555050506132676000868387612e24565b5050505050565b600082600052816020526040600020905092915050565b82805461329190614221565b90600052602060002090601f0160209004810192826132b357600085556132fa565b82601f106132cc57805160ff19168380011785556132fa565b828001600101855582156132fa579182015b828111156132f95782518255916020019190600101906132de565b5b509050613307919061334e565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b8082111561336757600081600090555060010161334f565b5090565b600061337e61337984613f88565b613f63565b90508281526020810184848401111561339a5761339961441c565b5b6133a58482856141df565b509392505050565b60006133c06133bb84613fb9565b613f63565b9050828152602081018484840111156133dc576133db61441c565b5b6133e78482856141df565b509392505050565b6000813590506133fe816146ff565b92915050565b60008083601f84011261341a57613419614412565b5b8235905067ffffffffffffffff8111156134375761343661440d565b5b60208301915083602082028301111561345357613452614417565b5b9250929050565b60008135905061346981614716565b92915050565b60008135905061347e8161472d565b92915050565b60008135905061349381614744565b92915050565b6000815190506134a881614744565b92915050565b600082601f8301126134c3576134c2614412565b5b81356134d384826020860161336b565b91505092915050565b600082601f8301126134f1576134f0614412565b5b81356135018482602086016133ad565b91505092915050565b6000813590506135198161475b565b92915050565b60006020828403121561353557613534614426565b5b6000613543848285016133ef565b91505092915050565b6000806040838503121561356357613562614426565b5b6000613571858286016133ef565b9250506020613582858286016133ef565b9150509250929050565b6000806000606084860312156135a5576135a4614426565b5b60006135b3868287016133ef565b93505060206135c4868287016133ef565b92505060406135d58682870161350a565b9150509250925092565b600080600080608085870312156135f9576135f8614426565b5b6000613607878288016133ef565b9450506020613618878288016133ef565b93505060406136298782880161350a565b925050606085013567ffffffffffffffff81111561364a57613649614421565b5b613656878288016134ae565b91505092959194509250565b6000806040838503121561367957613678614426565b5b6000613687858286016133ef565b92505060206136988582860161345a565b9150509250929050565b600080604083850312156136b9576136b8614426565b5b60006136c7858286016133ef565b92505060206136d88582860161350a565b9150509250929050565b6000602082840312156136f8576136f7614426565b5b60006137068482850161346f565b91505092915050565b60006020828403121561372557613724614426565b5b600061373384828501613484565b91505092915050565b60006020828403121561375257613751614426565b5b600061376084828501613499565b91505092915050565b60006020828403121561377f5761377e614426565b5b600082013567ffffffffffffffff81111561379d5761379c614421565b5b6137a9848285016134dc565b91505092915050565b6000602082840312156137c8576137c7614426565b5b60006137d68482850161350a565b91505092915050565b6000806000604084860312156137f8576137f7614426565b5b60006138068682870161350a565b935050602084013567ffffffffffffffff81111561382757613826614421565b5b61383386828701613404565b92509250509250925092565b600080600080600060a0868803121561385b5761385a614426565b5b60006138698882890161350a565b955050602061387a8882890161350a565b945050604061388b8882890161350a565b935050606061389c8882890161350a565b92505060806138ad8882890161350a565b9150509295509295909350565b6138c38161414d565b82525050565b6138d28161414d565b82525050565b6138e96138e48261414d565b6142cd565b82525050565b6138f88161415f565b82525050565b6139078161415f565b82525050565b6139168161416b565b82525050565b600061392782613fea565b6139318185614000565b93506139418185602086016141ee565b61394a8161442b565b840191505092915050565b600061396082613ff5565b61396a818561401c565b935061397a8185602086016141ee565b6139838161442b565b840191505092915050565b600061399982613ff5565b6139a3818561402d565b93506139b38185602086016141ee565b80840191505092915050565b60006139cc600c8361401c565b91506139d782614449565b602082019050919050565b60006139ef60268361401c565b91506139fa82614472565b604082019050919050565b6000613a1260128361401c565b9150613a1d826144c1565b602082019050919050565b6000613a35601e8361401c565b9150613a40826144ea565b602082019050919050565b6000613a58600f8361401c565b9150613a6382614513565b602082019050919050565b6000613a7b601e8361401c565b9150613a868261453c565b602082019050919050565b6000613a9e60128361401c565b9150613aa982614565565b602082019050919050565b6000613ac160058361402d565b9150613acc8261458e565b600582019050919050565b6000613ae460208361401c565b9150613aef826145b7565b602082019050919050565b6000613b07602f8361401c565b9150613b12826145e0565b604082019050919050565b6000613b2a600083614011565b9150613b358261462f565b600082019050919050565b6000613b4d60108361401c565b9150613b5882614632565b602082019050919050565b6000613b7060168361401c565b9150613b7b8261465b565b602082019050919050565b6000613b93601a8361401c565b9150613b9e82614684565b602082019050919050565b6000613bb660168361401c565b9150613bc1826146ad565b602082019050919050565b6000613bd9601f8361401c565b9150613be4826146d6565b602082019050919050565b606082016000820151613c0560008501826138ba565b506020820151613c186020850182613c40565b506040820151613c2b60408501826138ef565b50505050565b613c3a816141c1565b82525050565b613c49816141cb565b82525050565b6000613c5b82846138d8565b60148201915081905092915050565b6000613c76828561398e565b9150613c82828461398e565b9150613c8d82613ab4565b91508190509392505050565b6000613ca482613b1d565b9150819050919050565b6000602082019050613cc360008301846138c9565b92915050565b6000608082019050613cde60008301876138c9565b613ceb60208301866138c9565b613cf86040830185613c31565b8181036060830152613d0a818461391c565b905095945050505050565b6000602082019050613d2a60008301846138fe565b92915050565b6000602082019050613d45600083018461390d565b92915050565b60006020820190508181036000830152613d658184613955565b905092915050565b60006020820190508181036000830152613d86816139bf565b9050919050565b60006020820190508181036000830152613da6816139e2565b9050919050565b60006020820190508181036000830152613dc681613a05565b9050919050565b60006020820190508181036000830152613de681613a28565b9050919050565b60006020820190508181036000830152613e0681613a4b565b9050919050565b60006020820190508181036000830152613e2681613a6e565b9050919050565b60006020820190508181036000830152613e4681613a91565b9050919050565b60006020820190508181036000830152613e6681613ad7565b9050919050565b60006020820190508181036000830152613e8681613afa565b9050919050565b60006020820190508181036000830152613ea681613b40565b9050919050565b60006020820190508181036000830152613ec681613b63565b9050919050565b60006020820190508181036000830152613ee681613b86565b9050919050565b60006020820190508181036000830152613f0681613ba9565b9050919050565b60006020820190508181036000830152613f2681613bcc565b9050919050565b6000606082019050613f426000830184613bef565b92915050565b6000602082019050613f5d6000830184613c31565b92915050565b6000613f6d613f7e565b9050613f798282614253565b919050565b6000604051905090565b600067ffffffffffffffff821115613fa357613fa26143de565b5b613fac8261442b565b9050602081019050919050565b600067ffffffffffffffff821115613fd457613fd36143de565b5b613fdd8261442b565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614043826141c1565b915061404e836141c1565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561408357614082614322565b5b828201905092915050565b6000614099826141c1565b91506140a4836141c1565b9250826140b4576140b3614351565b5b828204905092915050565b60006140ca826141c1565b91506140d5836141c1565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561410e5761410d614322565b5b828202905092915050565b6000614124826141c1565b915061412f836141c1565b92508282101561414257614141614322565b5b828203905092915050565b6000614158826141a1565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b8381101561420c5780820151818401526020810190506141f1565b8381111561421b576000848401525b50505050565b6000600282049050600182168061423957607f821691505b6020821081141561424d5761424c614380565b5b50919050565b61425c8261442b565b810181811067ffffffffffffffff8211171561427b5761427a6143de565b5b80604052505050565b600061428f826141c1565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156142c2576142c1614322565b5b600182019050919050565b60006142d8826142df565b9050919050565b60006142ea8261443c565b9050919050565b60006142fc826141c1565b9150614307836141c1565b92508261431757614316614351565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f556e617574686f72697a65640000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f53616c65206973206e6f74204163746976650000000000000000000000000000600082015250565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b7f4e6f742077686974656c69737465640000000000000000000000000000000000600082015250565b7f5175616e74697479206578636565647320616c6c6f776564204d696e74730000600082015250565b7f72656163686564206d617820737570706c790000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4e65656420746f2073656e64206d6f7265204554482e00000000000000000000600082015250565b7f57686974656c6973742053616c65206e6f742073746172746564000000000000600082015250565b7f63616e206e6f74206d696e742074686973206d616e7900000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6147088161414d565b811461471357600080fd5b50565b61471f8161415f565b811461472a57600080fd5b50565b6147368161416b565b811461474157600080fd5b50565b61474d81614175565b811461475857600080fd5b50565b614764816141c1565b811461476f57600080fd5b5056fea2646970667358221220a222946f3ccf6b97a592bc8a2f3708448179108446bfec8be06070fdac2c3a9364736f6c63430008070033697066733a2f2f516d59714b6d4e5148624761525962487a6d483950794e574c6946546733356e7169766456536934354e367541652f

Deployed Bytecode

0x6080604052600436106102255760003560e01c806370a0823111610123578063af7b26e9116100ab578063d2cab0561161006f578063d2cab056146107bf578063dc33e681146107db578063e985e9c514610818578063f2fde38b14610855578063fb7f05401461087e57610225565b8063af7b26e9146106dc578063b88d4fde14610705578063c1f127e21461072e578063c87b56dd14610757578063d04950a11461079457610225565b80638da5cb5b116100f25780638da5cb5b146106045780639231ab2a1461062f57806395d89b411461066c578063a0712d6814610697578063a22cb465146106b357610225565b806370a082311461055c578063715018a6146105995780637cb64759146105b05780638d859f3e146105d957610225565b80632eb4a7ab116101b157806342842e0e1161017557806342842e0e1461048857806355f804b3146104b15780636352211e146104da57806369ba1a75146105175780636c2fe66b1461054057610225565b80632eb4a7ab146103c95780632f2ffc57146103f45780633ccfd60b1461041f5780633fd17366146104365780634256dbe31461045f57610225565b8063081812fc116101f8578063081812fc146102e4578063095ea7b31461032157806318160ddd1461034a578063200d2ed21461037557806323b872dd146103a057610225565b80630199e3471461022a57806301ffc9a714610253578063050225ea1461029057806306fdde03146102b9575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c91906137b2565b6108a7565b005b34801561025f57600080fd5b5061027a6004803603810190610275919061370f565b61092d565b6040516102879190613d15565b60405180910390f35b34801561029c57600080fd5b506102b760048036038101906102b291906136a2565b610a0f565b005b3480156102c557600080fd5b506102ce610a99565b6040516102db9190613d4b565b60405180910390f35b3480156102f057600080fd5b5061030b600480360381019061030691906137b2565b610b2b565b6040516103189190613cae565b60405180910390f35b34801561032d57600080fd5b50610348600480360381019061034391906136a2565b610ba7565b005b34801561035657600080fd5b5061035f610cb2565b60405161036c9190613f48565b60405180910390f35b34801561038157600080fd5b5061038a610cc9565b6040516103979190613f48565b60405180910390f35b3480156103ac57600080fd5b506103c760048036038101906103c2919061358c565b610ccf565b005b3480156103d557600080fd5b506103de610cdf565b6040516103eb9190613d30565b60405180910390f35b34801561040057600080fd5b50610409610ce5565b6040516104169190613f48565b60405180910390f35b34801561042b57600080fd5b50610434610ceb565b005b34801561044257600080fd5b5061045d600480360381019061045891906137b2565b610e6c565b005b34801561046b57600080fd5b50610486600480360381019061048191906137b2565b610ef2565b005b34801561049457600080fd5b506104af60048036038101906104aa919061358c565b610f78565b005b3480156104bd57600080fd5b506104d860048036038101906104d39190613769565b610f98565b005b3480156104e657600080fd5b5061050160048036038101906104fc91906137b2565b61102e565b60405161050e9190613cae565b60405180910390f35b34801561052357600080fd5b5061053e600480360381019061053991906137b2565b611044565b005b61055a600480360381019061055591906137b2565b6110ca565b005b34801561056857600080fd5b50610583600480360381019061057e919061351f565b6112cc565b6040516105909190613f48565b60405180910390f35b3480156105a557600080fd5b506105ae61139c565b005b3480156105bc57600080fd5b506105d760048036038101906105d291906136e2565b611424565b005b3480156105e557600080fd5b506105ee6114aa565b6040516105fb9190613f48565b60405180910390f35b34801561061057600080fd5b506106196114b0565b6040516106269190613cae565b60405180910390f35b34801561063b57600080fd5b50610656600480360381019061065191906137b2565b6114d9565b6040516106639190613f2d565b60405180910390f35b34801561067857600080fd5b506106816114f1565b60405161068e9190613d4b565b60405180910390f35b6106b160048036038101906106ac91906137b2565b611583565b005b3480156106bf57600080fd5b506106da60048036038101906106d59190613662565b6117ad565b005b3480156106e857600080fd5b5061070360048036038101906106fe91906137b2565b611925565b005b34801561071157600080fd5b5061072c600480360381019061072791906135df565b6119ab565b005b34801561073a57600080fd5b50610755600480360381019061075091906137b2565b611a27565b005b34801561076357600080fd5b5061077e600480360381019061077991906137b2565b611aad565b60405161078b9190613d4b565b60405180910390f35b3480156107a057600080fd5b506107a9611b54565b6040516107b69190613f48565b60405180910390f35b6107d960048036038101906107d491906137df565b611b5a565b005b3480156107e757600080fd5b5061080260048036038101906107fd919061351f565b611e3f565b60405161080f9190613f48565b60405180910390f35b34801561082457600080fd5b5061083f600480360381019061083a919061354c565b611e51565b60405161084c9190613d15565b60405180910390f35b34801561086157600080fd5b5061087c6004803603810190610877919061351f565b611ee5565b005b34801561088a57600080fd5b506108a560048036038101906108a0919061383f565b611fdd565b005b6108af612083565b73ffffffffffffffffffffffffffffffffffffffff166108cd6114b0565b73ffffffffffffffffffffffffffffffffffffffff1614610923576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091a90613e4d565b60405180910390fd5b80600c8190555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109f857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a085750610a078261208b565b5b9050919050565b610a17612083565b73ffffffffffffffffffffffffffffffffffffffff16610a356114b0565b73ffffffffffffffffffffffffffffffffffffffff1614610a8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8290613e4d565b60405180910390fd5b610a9582826120f5565b5050565b606060038054610aa890614221565b80601f0160208091040260200160405190810160405280929190818152602001828054610ad490614221565b8015610b215780601f10610af657610100808354040283529160200191610b21565b820191906000526020600020905b815481529060010190602001808311610b0457829003601f168201915b5050505050905090565b6000610b3682612113565b610b6c576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bb28261102e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c1a576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c39612083565b73ffffffffffffffffffffffffffffffffffffffff1614158015610c6b5750610c6981610c64612083565b611e51565b155b15610ca2576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cad838383612161565b505050565b6000610cbc612213565b6002546001540303905090565b60115481565b610cda83838361221c565b505050565b600a5481565b600c5481565b610cf3612083565b73ffffffffffffffffffffffffffffffffffffffff16610d116114b0565b73ffffffffffffffffffffffffffffffffffffffff1614610d67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5e90613e4d565b60405180910390fd5b60026009541415610dad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da490613f0d565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051610ddb90613c99565b60006040518083038185875af1925050503d8060008114610e18576040519150601f19603f3d011682016040523d82523d6000602084013e610e1d565b606091505b5050905080610e61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5890613e8d565b60405180910390fd5b506001600981905550565b610e74612083565b73ffffffffffffffffffffffffffffffffffffffff16610e926114b0565b73ffffffffffffffffffffffffffffffffffffffff1614610ee8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edf90613e4d565b60405180910390fd5b80600d8190555050565b610efa612083565b73ffffffffffffffffffffffffffffffffffffffff16610f186114b0565b73ffffffffffffffffffffffffffffffffffffffff1614610f6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6590613e4d565b60405180910390fd5b8060108190555050565b610f93838383604051806020016040528060008152506119ab565b505050565b610fa0612083565b73ffffffffffffffffffffffffffffffffffffffff16610fbe6114b0565b73ffffffffffffffffffffffffffffffffffffffff1614611014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100b90613e4d565b60405180910390fd5b80600e908051906020019061102a929190613285565b5050565b6000611039826126d2565b600001519050919050565b61104c612083565b73ffffffffffffffffffffffffffffffffffffffff1661106a6114b0565b73ffffffffffffffffffffffffffffffffffffffff16146110c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b790613e4d565b60405180910390fd5b8060118190555050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611138576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112f90613dcd565b60405180910390fd5b73f142d7baff0986b50ae24e694419c65e7091f52c73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146111ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b190613d6d565b60405180910390fd5b6001601154146111ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f690613dad565b60405180910390fd5b600c548161120c33611e3f565b6112169190614038565b1115611257576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124e90613e0d565b60405180910390fd5b80600d5461126591906140bf565b34146112a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129d90613ead565b60405180910390fd5b6112b033826120f5565b600f546112bb610cb2565b106112c95760006011819055505b50565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611334576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6113a4612083565b73ffffffffffffffffffffffffffffffffffffffff166113c26114b0565b73ffffffffffffffffffffffffffffffffffffffff1614611418576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140f90613e4d565b60405180910390fd5b6114226000612961565b565b61142c612083565b73ffffffffffffffffffffffffffffffffffffffff1661144a6114b0565b73ffffffffffffffffffffffffffffffffffffffff16146114a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149790613e4d565b60405180910390fd5b80600a8190555050565b600d5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6114e161330b565b6114ea826126d2565b9050919050565b60606004805461150090614221565b80601f016020809104026020016040519081016040528092919081815260200182805461152c90614221565b80156115795780601f1061154e57610100808354040283529160200191611579565b820191906000526020600020905b81548152906001019060200180831161155c57829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146115f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e890613dcd565b60405180910390fd5b600360115414611636576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162d90613dad565b60405180910390fd5b601054611e616116469190614119565b8161164f610cb2565b6116599190614038565b111561169a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169190613e2d565b60405180910390fd5b600c54816116a733611e3f565b6116b19190614038565b11156116f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e990613e0d565b60405180910390fd5b600b54811115611737576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172e90613eed565b60405180910390fd5b80600d5461174591906140bf565b341015611787576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177e90613ead565b60405180910390fd5b61179133826120f5565b600f5461179c610cb2565b106117aa5760006011819055505b50565b6117b5612083565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561181a576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060086000611827612083565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166118d4612083565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119199190613d15565b60405180910390a35050565b61192d612083565b73ffffffffffffffffffffffffffffffffffffffff1661194b6114b0565b73ffffffffffffffffffffffffffffffffffffffff16146119a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199890613e4d565b60405180910390fd5b80600b8190555050565b6119b684848461221c565b6119d58373ffffffffffffffffffffffffffffffffffffffff16612a25565b80156119ea57506119e884848484612a38565b155b15611a21576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b611a2f612083565b73ffffffffffffffffffffffffffffffffffffffff16611a4d6114b0565b73ffffffffffffffffffffffffffffffffffffffff1614611aa3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9a90613e4d565b60405180910390fd5b80600f8190555050565b6060611ab882612113565b611af7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aee90613e6d565b60405180910390fd5b6000611b01612b98565b90506000815111611b215760405180602001604052806000815250611b4c565b80611b2b84612c2a565b604051602001611b3c929190613c6a565b6040516020818303038152906040525b915050919050565b600b5481565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611bc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbf90613dcd565b60405180910390fd5b600033604051602001611bdb9190613c4f565b604051602081830303815290604052805190602001209050611c41838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600a5483612d8b565b611c80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7790613ded565b60405180910390fd5b600260115414611cc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbc90613ecd565b60405180910390fd5b601054611e61611cd59190614119565b84611cde610cb2565b611ce89190614038565b1115611d29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2090613e2d565b60405180910390fd5b600c5484611d3633611e3f565b611d409190614038565b1115611d81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7890613e0d565b60405180910390fd5b600b54841115611dc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbd90613eed565b60405180910390fd5b83600d54611dd491906140bf565b341015611e16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0d90613ead565b60405180910390fd5b611e2033856120f5565b600f54611e2b610cb2565b10611e395760006011819055505b50505050565b6000611e4a82612da2565b9050919050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611eed612083565b73ffffffffffffffffffffffffffffffffffffffff16611f0b6114b0565b73ffffffffffffffffffffffffffffffffffffffff1614611f61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5890613e4d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611fd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc890613d8d565b60405180910390fd5b611fda81612961565b50565b611fe5612083565b73ffffffffffffffffffffffffffffffffffffffff166120036114b0565b73ffffffffffffffffffffffffffffffffffffffff1614612059576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205090613e4d565b60405180910390fd5b8460118190555080600f8190555081600d8190555083600c8190555082600b819055505050505050565b600033905090565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61210f828260405180602001604052806000815250612e0c565b5050565b60008161211e612213565b1115801561212d575060015482105b801561215a575060056000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b6000612227826126d2565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612292576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166122b3612083565b73ffffffffffffffffffffffffffffffffffffffff1614806122e257506122e1856122dc612083565b611e51565b5b8061232757506122f0612083565b73ffffffffffffffffffffffffffffffffffffffff1661230f84610b2b565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612360576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156123c7576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123d48585856001612e1e565b6123e060008487612161565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561266057600154821461265f57878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46126cb8585856001612e24565b5050505050565b6126da61330b565b6000829050806126e8612213565b111580156126f7575060015481105b1561292a576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161292857600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461280c57809250505061295c565b5b60011561292757818060019003925050600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461292257809250505061295c565b61280d565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080823b905060008111915050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a5e612083565b8786866040518563ffffffff1660e01b8152600401612a809493929190613cc9565b602060405180830381600087803b158015612a9a57600080fd5b505af1925050508015612acb57506040513d601f19601f82011682018060405250810190612ac8919061373c565b60015b612b45573d8060008114612afb576040519150601f19603f3d011682016040523d82523d6000602084013e612b00565b606091505b50600081511415612b3d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600e8054612ba790614221565b80601f0160208091040260200160405190810160405280929190818152602001828054612bd390614221565b8015612c205780601f10612bf557610100808354040283529160200191612c20565b820191906000526020600020905b815481529060010190602001808311612c0357829003601f168201915b5050505050905090565b60606000821415612c72576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612d86565b600082905060005b60008214612ca4578080612c8d90614284565b915050600a82612c9d919061408e565b9150612c7a565b60008167ffffffffffffffff811115612cc057612cbf6143de565b5b6040519080825280601f01601f191660200182016040528015612cf25781602001600182028036833780820191505090505b5090505b60008514612d7f57600182612d0b9190614119565b9150600a85612d1a91906142f1565b6030612d269190614038565b60f81b818381518110612d3c57612d3b6143af565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612d78919061408e565b9450612cf6565b8093505050505b919050565b600082612d988584612e2a565b1490509392505050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b612e198383836001612e9f565b505050565b50505050565b50505050565b60008082905060005b8451811015612e94576000858281518110612e5157612e506143af565b5b60200260200101519050808311612e7357612e6c838261326e565b9250612e80565b612e7d818461326e565b92505b508080612e8c90614284565b915050612e33565b508091505092915050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612f0d576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415612f48576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612f556000868387612e1e565b83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561311f575061311e8773ffffffffffffffffffffffffffffffffffffffff16612a25565b5b156131e5575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46131946000888480600101955088612a38565b6131ca576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808214156131255782600154146131e057600080fd5b613251565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808214156131e6575b8160018190555050506132676000868387612e24565b5050505050565b600082600052816020526040600020905092915050565b82805461329190614221565b90600052602060002090601f0160209004810192826132b357600085556132fa565b82601f106132cc57805160ff19168380011785556132fa565b828001600101855582156132fa579182015b828111156132f95782518255916020019190600101906132de565b5b509050613307919061334e565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b8082111561336757600081600090555060010161334f565b5090565b600061337e61337984613f88565b613f63565b90508281526020810184848401111561339a5761339961441c565b5b6133a58482856141df565b509392505050565b60006133c06133bb84613fb9565b613f63565b9050828152602081018484840111156133dc576133db61441c565b5b6133e78482856141df565b509392505050565b6000813590506133fe816146ff565b92915050565b60008083601f84011261341a57613419614412565b5b8235905067ffffffffffffffff8111156134375761343661440d565b5b60208301915083602082028301111561345357613452614417565b5b9250929050565b60008135905061346981614716565b92915050565b60008135905061347e8161472d565b92915050565b60008135905061349381614744565b92915050565b6000815190506134a881614744565b92915050565b600082601f8301126134c3576134c2614412565b5b81356134d384826020860161336b565b91505092915050565b600082601f8301126134f1576134f0614412565b5b81356135018482602086016133ad565b91505092915050565b6000813590506135198161475b565b92915050565b60006020828403121561353557613534614426565b5b6000613543848285016133ef565b91505092915050565b6000806040838503121561356357613562614426565b5b6000613571858286016133ef565b9250506020613582858286016133ef565b9150509250929050565b6000806000606084860312156135a5576135a4614426565b5b60006135b3868287016133ef565b93505060206135c4868287016133ef565b92505060406135d58682870161350a565b9150509250925092565b600080600080608085870312156135f9576135f8614426565b5b6000613607878288016133ef565b9450506020613618878288016133ef565b93505060406136298782880161350a565b925050606085013567ffffffffffffffff81111561364a57613649614421565b5b613656878288016134ae565b91505092959194509250565b6000806040838503121561367957613678614426565b5b6000613687858286016133ef565b92505060206136988582860161345a565b9150509250929050565b600080604083850312156136b9576136b8614426565b5b60006136c7858286016133ef565b92505060206136d88582860161350a565b9150509250929050565b6000602082840312156136f8576136f7614426565b5b60006137068482850161346f565b91505092915050565b60006020828403121561372557613724614426565b5b600061373384828501613484565b91505092915050565b60006020828403121561375257613751614426565b5b600061376084828501613499565b91505092915050565b60006020828403121561377f5761377e614426565b5b600082013567ffffffffffffffff81111561379d5761379c614421565b5b6137a9848285016134dc565b91505092915050565b6000602082840312156137c8576137c7614426565b5b60006137d68482850161350a565b91505092915050565b6000806000604084860312156137f8576137f7614426565b5b60006138068682870161350a565b935050602084013567ffffffffffffffff81111561382757613826614421565b5b61383386828701613404565b92509250509250925092565b600080600080600060a0868803121561385b5761385a614426565b5b60006138698882890161350a565b955050602061387a8882890161350a565b945050604061388b8882890161350a565b935050606061389c8882890161350a565b92505060806138ad8882890161350a565b9150509295509295909350565b6138c38161414d565b82525050565b6138d28161414d565b82525050565b6138e96138e48261414d565b6142cd565b82525050565b6138f88161415f565b82525050565b6139078161415f565b82525050565b6139168161416b565b82525050565b600061392782613fea565b6139318185614000565b93506139418185602086016141ee565b61394a8161442b565b840191505092915050565b600061396082613ff5565b61396a818561401c565b935061397a8185602086016141ee565b6139838161442b565b840191505092915050565b600061399982613ff5565b6139a3818561402d565b93506139b38185602086016141ee565b80840191505092915050565b60006139cc600c8361401c565b91506139d782614449565b602082019050919050565b60006139ef60268361401c565b91506139fa82614472565b604082019050919050565b6000613a1260128361401c565b9150613a1d826144c1565b602082019050919050565b6000613a35601e8361401c565b9150613a40826144ea565b602082019050919050565b6000613a58600f8361401c565b9150613a6382614513565b602082019050919050565b6000613a7b601e8361401c565b9150613a868261453c565b602082019050919050565b6000613a9e60128361401c565b9150613aa982614565565b602082019050919050565b6000613ac160058361402d565b9150613acc8261458e565b600582019050919050565b6000613ae460208361401c565b9150613aef826145b7565b602082019050919050565b6000613b07602f8361401c565b9150613b12826145e0565b604082019050919050565b6000613b2a600083614011565b9150613b358261462f565b600082019050919050565b6000613b4d60108361401c565b9150613b5882614632565b602082019050919050565b6000613b7060168361401c565b9150613b7b8261465b565b602082019050919050565b6000613b93601a8361401c565b9150613b9e82614684565b602082019050919050565b6000613bb660168361401c565b9150613bc1826146ad565b602082019050919050565b6000613bd9601f8361401c565b9150613be4826146d6565b602082019050919050565b606082016000820151613c0560008501826138ba565b506020820151613c186020850182613c40565b506040820151613c2b60408501826138ef565b50505050565b613c3a816141c1565b82525050565b613c49816141cb565b82525050565b6000613c5b82846138d8565b60148201915081905092915050565b6000613c76828561398e565b9150613c82828461398e565b9150613c8d82613ab4565b91508190509392505050565b6000613ca482613b1d565b9150819050919050565b6000602082019050613cc360008301846138c9565b92915050565b6000608082019050613cde60008301876138c9565b613ceb60208301866138c9565b613cf86040830185613c31565b8181036060830152613d0a818461391c565b905095945050505050565b6000602082019050613d2a60008301846138fe565b92915050565b6000602082019050613d45600083018461390d565b92915050565b60006020820190508181036000830152613d658184613955565b905092915050565b60006020820190508181036000830152613d86816139bf565b9050919050565b60006020820190508181036000830152613da6816139e2565b9050919050565b60006020820190508181036000830152613dc681613a05565b9050919050565b60006020820190508181036000830152613de681613a28565b9050919050565b60006020820190508181036000830152613e0681613a4b565b9050919050565b60006020820190508181036000830152613e2681613a6e565b9050919050565b60006020820190508181036000830152613e4681613a91565b9050919050565b60006020820190508181036000830152613e6681613ad7565b9050919050565b60006020820190508181036000830152613e8681613afa565b9050919050565b60006020820190508181036000830152613ea681613b40565b9050919050565b60006020820190508181036000830152613ec681613b63565b9050919050565b60006020820190508181036000830152613ee681613b86565b9050919050565b60006020820190508181036000830152613f0681613ba9565b9050919050565b60006020820190508181036000830152613f2681613bcc565b9050919050565b6000606082019050613f426000830184613bef565b92915050565b6000602082019050613f5d6000830184613c31565b92915050565b6000613f6d613f7e565b9050613f798282614253565b919050565b6000604051905090565b600067ffffffffffffffff821115613fa357613fa26143de565b5b613fac8261442b565b9050602081019050919050565b600067ffffffffffffffff821115613fd457613fd36143de565b5b613fdd8261442b565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614043826141c1565b915061404e836141c1565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561408357614082614322565b5b828201905092915050565b6000614099826141c1565b91506140a4836141c1565b9250826140b4576140b3614351565b5b828204905092915050565b60006140ca826141c1565b91506140d5836141c1565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561410e5761410d614322565b5b828202905092915050565b6000614124826141c1565b915061412f836141c1565b92508282101561414257614141614322565b5b828203905092915050565b6000614158826141a1565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b8381101561420c5780820151818401526020810190506141f1565b8381111561421b576000848401525b50505050565b6000600282049050600182168061423957607f821691505b6020821081141561424d5761424c614380565b5b50919050565b61425c8261442b565b810181811067ffffffffffffffff8211171561427b5761427a6143de565b5b80604052505050565b600061428f826141c1565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156142c2576142c1614322565b5b600182019050919050565b60006142d8826142df565b9050919050565b60006142ea8261443c565b9050919050565b60006142fc826141c1565b9150614307836141c1565b92508261431757614316614351565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f556e617574686f72697a65640000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f53616c65206973206e6f74204163746976650000000000000000000000000000600082015250565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b7f4e6f742077686974656c69737465640000000000000000000000000000000000600082015250565b7f5175616e74697479206578636565647320616c6c6f776564204d696e74730000600082015250565b7f72656163686564206d617820737570706c790000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4e65656420746f2073656e64206d6f7265204554482e00000000000000000000600082015250565b7f57686974656c6973742053616c65206e6f742073746172746564000000000000600082015250565b7f63616e206e6f74206d696e742074686973206d616e7900000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6147088161414d565b811461471357600080fd5b50565b61471f8161415f565b811461472a57600080fd5b50565b6147368161416b565b811461474157600080fd5b50565b61474d81614175565b811461475857600080fd5b50565b614764816141c1565b811461476f57600080fd5b5056fea2646970667358221220a222946f3ccf6b97a592bc8a2f3708448179108446bfec8be06070fdac2c3a9364736f6c63430008070033

Deployed Bytecode Sourcemap

31823:4767:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35816:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14078:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35994:80;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17191:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18694:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18257:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13327:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32479:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19559:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31918:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32179:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35428:176;;;;;;;;;;;;;:::i;:::-;;35608:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36154:74;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19800:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34951:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16999:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35918:72;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33356:476;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14447:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3892:103;;;;;;;;;;;;;:::i;:::-;;32017:77;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32258:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3669:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35276:148;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17360:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32804:548;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18970:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35710:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20056:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36080:70;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34595:350;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32100:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33836:752;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35165:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19328:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4004:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36235:251;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35816:98;3814:12;:10;:12::i;:::-;3803:23;;:7;:5;:7::i;:::-;:23;;;3795:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35907:1:::1;35889:15;:19;;;;35816:98:::0;:::o;14078:305::-;14180:4;14232:25;14217:40;;;:11;:40;;;;:105;;;;14289:33;14274:48;;;:11;:48;;;;14217:105;:158;;;;14339:36;14363:11;14339:23;:36::i;:::-;14217:158;14197:178;;14078:305;;;:::o;35994:80::-;3814:12;:10;:12::i;:::-;3803:23;;:7;:5;:7::i;:::-;:23;;;3795:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36053:15:::1;36063:1;36066;36053:9;:15::i;:::-;35994:80:::0;;:::o;17191:100::-;17245:13;17278:5;17271:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17191:100;:::o;18694:204::-;18762:7;18787:16;18795:7;18787;:16::i;:::-;18782:64;;18812:34;;;;;;;;;;;;;;18782:64;18866:15;:24;18882:7;18866:24;;;;;;;;;;;;;;;;;;;;;18859:31;;18694:204;;;:::o;18257:371::-;18330:13;18346:24;18362:7;18346:15;:24::i;:::-;18330:40;;18391:5;18385:11;;:2;:11;;;18381:48;;;18405:24;;;;;;;;;;;;;;18381:48;18462:5;18446:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;18472:37;18489:5;18496:12;:10;:12::i;:::-;18472:16;:37::i;:::-;18471:38;18446:63;18442:138;;;18533:35;;;;;;;;;;;;;;18442:138;18592:28;18601:2;18605:7;18614:5;18592:8;:28::i;:::-;18319:309;18257:371;;:::o;13327:303::-;13371:7;13596:15;:13;:15::i;:::-;13581:12;;13565:13;;:28;:46;13558:53;;13327:303;:::o;32479:22::-;;;;:::o;19559:170::-;19693:28;19703:4;19709:2;19713:7;19693:9;:28::i;:::-;19559:170;;;:::o;31918:94::-;;;;:::o;32179:35::-;;;;:::o;35428:176::-;3814:12;:10;:12::i;:::-;3803:23;;:7;:5;:7::i;:::-;:23;;;3795:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1451:1:::1;1597:7;;:19;;1589:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1451:1;1658:7;:18;;;;35488:12:::2;35506:10;:15;;35529:21;35506:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35487:68;;;35570:7;35562:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;35480:124;1407:1:::1;1701:7;:22;;;;35428:176::o:0;35608:98::-;3814:12;:10;:12::i;:::-;3803:23;;:7;:5;:7::i;:::-;:23;;;3795:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35691:9:::1;35683:5;:17;;;;35608:98:::0;:::o;36154:74::-;3814:12;:10;:12::i;:::-;3803:23;;:7;:5;:7::i;:::-;:23;;;3795:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36221:1:::1;36211:7;:11;;;;36154:74:::0;:::o;19800:185::-;19938:39;19955:4;19961:2;19965:7;19938:39;;;;;;;;;;;;:16;:39::i;:::-;19800:185;;;:::o;34951:98::-;3814:12;:10;:12::i;:::-;3803:23;;:7;:5;:7::i;:::-;:23;;;3795:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35036:7:::1;35020:13;:23;;;;;;;;;;;;:::i;:::-;;34951:98:::0;:::o;16999:125::-;17063:7;17090:21;17103:7;17090:12;:21::i;:::-;:26;;;17083:33;;16999:125;;;:::o;35918:72::-;3814:12;:10;:12::i;:::-;3803:23;;:7;:5;:7::i;:::-;:23;;;3795:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35983:1:::1;35974:6;:10;;;;35918:72:::0;:::o;33356:476::-;32738:10;32725:23;;:9;:23;;;32717:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;33454:42:::1;33440:56;;:10;:56;;;33431:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;33540:1;33530:6;;:11;33521:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;33618:15;;33606:8;33579:24;33592:10;33579:12;:24::i;:::-;:35;;;;:::i;:::-;:54;;33571:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;33706:8;33698:5;;:16;;;;:::i;:::-;33685:9;:29;33676:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;33748:31;33758:10;33770:8;33748:9;:31::i;:::-;33806:6;;33789:13;:11;:13::i;:::-;:23;33786:41;;33824:1;33815:6;:10;;;;33786:41;33356:476:::0;:::o;14447:206::-;14511:7;14552:1;14535:19;;:5;:19;;;14531:60;;;14563:28;;;;;;;;;;;;;;14531:60;14617:12;:19;14630:5;14617:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;14609:36;;14602:43;;14447:206;;;:::o;3892:103::-;3814:12;:10;:12::i;:::-;3803:23;;:7;:5;:7::i;:::-;:23;;;3795:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3957:30:::1;3984:1;3957:18;:30::i;:::-;3892:103::o:0;32017:77::-;3814:12;:10;:12::i;:::-;3803:23;;:7;:5;:7::i;:::-;:23;;;3795:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;32087:1:::1;32074:10;:14;;;;32017:77:::0;:::o;32258:34::-;;;;:::o;3669:87::-;3715:7;3742:6;;;;;;;;;;;3735:13;;3669:87;:::o;35276:148::-;35357:21;;:::i;:::-;35397;35410:7;35397:12;:21::i;:::-;35390:28;;35276:148;;;:::o;17360:104::-;17416:13;17449:7;17442:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17360:104;:::o;32804:548::-;32738:10;32725:23;;:9;:23;;;32717:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;32891:1:::1;32881:6;;:11;32873:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;32982:7;;32347:4;32959:30;;;;:::i;:::-;32947:8;32931:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:58;;32923:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;33066:15;;33054:8;33027:24;33040:10;33027:12;:24::i;:::-;:35;;;;:::i;:::-;:54;;33019:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;33144:17;;33132:8;:29;;33124:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;33223:8;33215:5;;:16;;;;:::i;:::-;33202:9;:29;;33194:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;33265:31;33275:10;33287:8;33265:9;:31::i;:::-;33326:6;;33309:13;:11;:13::i;:::-;:23;33306:41;;33344:1;33335:6;:10;;;;33306:41;32804:548:::0;:::o;18970:287::-;19081:12;:10;:12::i;:::-;19069:24;;:8;:24;;;19065:54;;;19102:17;;;;;;;;;;;;;;19065:54;19177:8;19132:18;:32;19151:12;:10;:12::i;:::-;19132:32;;;;;;;;;;;;;;;:42;19165:8;19132:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;19230:8;19201:48;;19216:12;:10;:12::i;:::-;19201:48;;;19240:8;19201:48;;;;;;:::i;:::-;;;;;;;;18970:287;;:::o;35710:102::-;3814:12;:10;:12::i;:::-;3803:23;;:7;:5;:7::i;:::-;:23;;;3795:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35805:1:::1;35785:17;:21;;;;35710:102:::0;:::o;20056:369::-;20223:28;20233:4;20239:2;20243:7;20223:9;:28::i;:::-;20266:15;:2;:13;;;:15::i;:::-;:76;;;;;20286:56;20317:4;20323:2;20327:7;20336:5;20286:30;:56::i;:::-;20285:57;20266:76;20262:156;;;20366:40;;;;;;;;;;;;;;20262:156;20056:369;;;;:::o;36080:70::-;3814:12;:10;:12::i;:::-;3803:23;;:7;:5;:7::i;:::-;:23;;;3795:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36143:1:::1;36134:6;:10;;;;36080:70:::0;:::o;34595:350::-;34668:13;34698:16;34706:7;34698;:16::i;:::-;34690:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;34772:21;34796:10;:8;:10::i;:::-;34772:34;;34851:1;34833:7;34827:21;:25;:112;;;;;;;;;;;;;;;;;34888:7;34897:18;:7;:16;:18::i;:::-;34871:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;34827:112;34813:126;;;34595:350;;;:::o;32100:37::-;;;;:::o;33836:752::-;32738:10;32725:23;;:9;:23;;;32717:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;33946:12:::1;33988:10;33971:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;33961:39;;;;;;33946:54;;34015:50;34035:11;;34015:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34048:10;;34060:4;34015:18;:50::i;:::-;34007:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;34109:1;34099:6;;:11;34091:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;34207:7;;32347:4;34184:30;;;;:::i;:::-;34172:8;34156:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:58;;34148:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;34294:15;;34282:8;34255:24;34268:10;34255:12;:24::i;:::-;:35;;;;:::i;:::-;:54;;34244:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;34377:17;;34365:8;:29;;34355:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;34456:8;34448:5;;:16;;;;:::i;:::-;34435:9;:29;;34427:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;34498:31;34508:10;34520:8;34498:9;:31::i;:::-;34556:6;;34539:13;:11;:13::i;:::-;:23;34536:41;;34574:1;34565:6;:10;;;;34536:41;33939:649;33836:752:::0;;;:::o;35165:107::-;35223:7;35246:20;35260:5;35246:13;:20::i;:::-;35239:27;;35165:107;;;:::o;19328:164::-;19425:4;19449:18;:25;19468:5;19449:25;;;;;;;;;;;;;;;:35;19475:8;19449:35;;;;;;;;;;;;;;;;;;;;;;;;;19442:42;;19328:164;;;;:::o;4004:201::-;3814:12;:10;:12::i;:::-;3803:23;;:7;:5;:7::i;:::-;:23;;;3795:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4113:1:::1;4093:22;;:8;:22;;;;4085:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4169:28;4188:8;4169:18;:28::i;:::-;4004:201:::0;:::o;36235:251::-;3814:12;:10;:12::i;:::-;3803:23;;:7;:5;:7::i;:::-;:23;;;3795:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36368:6:::1;36359;:15;;;;36392:4;36383:6;:13;;;;36413:5;36405;:13;;;;36445:3;36427:15;:21;;;;36477:3;36457:17;:23;;;;36235:251:::0;;;;;:::o;3212:98::-;3265:7;3292:10;3285:17;;3212:98;:::o;8322:157::-;8407:4;8446:25;8431:40;;;:11;:40;;;;8424:47;;8322:157;;;:::o;20862:104::-;20931:27;20941:2;20945:8;20931:27;;;;;;;;;;;;:9;:27::i;:::-;20862:104;;:::o;20680:174::-;20737:4;20780:7;20761:15;:13;:15::i;:::-;:26;;:53;;;;;20801:13;;20791:7;:23;20761:53;:85;;;;;20819:11;:20;20831:7;20819:20;;;;;;;;;;;:27;;;;;;;;;;;;20818:28;20761:85;20754:92;;20680:174;;;:::o;28837:196::-;28979:2;28952:15;:24;28968:7;28952:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;29017:7;29013:2;28997:28;;29006:5;28997:28;;;;;;;;;;;;28837:196;;;:::o;36490:93::-;36547:7;36574:1;36567:8;;36490:93;:::o;23780:2130::-;23895:35;23933:21;23946:7;23933:12;:21::i;:::-;23895:59;;23993:4;23971:26;;:13;:18;;;:26;;;23967:67;;24006:28;;;;;;;;;;;;;;23967:67;24047:22;24089:4;24073:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;24110:36;24127:4;24133:12;:10;:12::i;:::-;24110:16;:36::i;:::-;24073:73;:126;;;;24187:12;:10;:12::i;:::-;24163:36;;:20;24175:7;24163:11;:20::i;:::-;:36;;;24073:126;24047:153;;24218:17;24213:66;;24244:35;;;;;;;;;;;;;;24213:66;24308:1;24294:16;;:2;:16;;;24290:52;;;24319:23;;;;;;;;;;;;;;24290:52;24355:43;24377:4;24383:2;24387:7;24396:1;24355:21;:43::i;:::-;24463:35;24480:1;24484:7;24493:4;24463:8;:35::i;:::-;24824:1;24794:12;:18;24807:4;24794:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24868:1;24840:12;:16;24853:2;24840:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24886:31;24920:11;:20;24932:7;24920:20;;;;;;;;;;;24886:54;;24971:2;24955:8;:13;;;:18;;;;;;;;;;;;;;;;;;25021:15;24988:8;:23;;;:49;;;;;;;;;;;;;;;;;;25289:19;25321:1;25311:7;:11;25289:33;;25337:31;25371:11;:24;25383:11;25371:24;;;;;;;;;;;25337:58;;25439:1;25414:27;;:8;:13;;;;;;;;;;;;:27;;;25410:384;;;25624:13;;25609:11;:28;25605:174;;25678:4;25662:8;:13;;;:20;;;;;;;;;;;;;;;;;;25731:13;:28;;;25705:8;:23;;;:54;;;;;;;;;;;;;;;;;;25605:174;25410:384;24769:1036;;;25841:7;25837:2;25822:27;;25831:4;25822:27;;;;;;;;;;;;25860:42;25881:4;25887:2;25891:7;25900:1;25860:20;:42::i;:::-;23884:2026;;23780:2130;;;:::o;15828:1109::-;15890:21;;:::i;:::-;15924:12;15939:7;15924:22;;16007:4;15988:15;:13;:15::i;:::-;:23;;:47;;;;;16022:13;;16015:4;:20;15988:47;15984:886;;;16056:31;16090:11;:17;16102:4;16090:17;;;;;;;;;;;16056:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16131:9;:16;;;16126:729;;16202:1;16176:28;;:9;:14;;;:28;;;16172:101;;16240:9;16233:16;;;;;;16172:101;16575:261;16582:4;16575:261;;;16615:6;;;;;;;;16660:11;:17;16672:4;16660:17;;;;;;;;;;;16648:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16734:1;16708:28;;:9;:14;;;:28;;;16704:109;;16776:9;16769:16;;;;;;16704:109;16575:261;;;16126:729;16037:833;15984:886;16898:31;;;;;;;;;;;;;;15828:1109;;;;:::o;4214:191::-;4288:16;4307:6;;;;;;;;;;;4288:25;;4333:8;4324:6;;:17;;;;;;;;;;;;;;;;;;4388:8;4357:40;;4378:8;4357:40;;;;;;;;;;;;4277:128;4214:191;:::o;4437:197::-;4497:4;4515:12;4582:7;4570:20;4562:28;;4625:1;4618:4;:8;4611:15;;;4437:197;;;:::o;29525:667::-;29688:4;29725:2;29709:36;;;29746:12;:10;:12::i;:::-;29760:4;29766:7;29775:5;29709:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;29705:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29960:1;29943:6;:13;:18;29939:235;;;29989:40;;;;;;;;;;;;;;29939:235;30132:6;30126:13;30117:6;30113:2;30109:15;30102:38;29705:480;29838:45;;;29828:55;;;:6;:55;;;;29821:62;;;29525:667;;;;;;:::o;35053:108::-;35113:13;35142;35135:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35053:108;:::o;1829:533::-;1885:13;1925:1;1916:5;:10;1912:53;;;1943:10;;;;;;;;;;;;;;;;;;;;;1912:53;1975:12;1990:5;1975:20;;2006:14;2031:78;2046:1;2038:4;:9;2031:78;;2064:8;;;;;:::i;:::-;;;;2095:2;2087:10;;;;;:::i;:::-;;;2031:78;;;2119:19;2151:6;2141:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2119:39;;2169:154;2185:1;2176:5;:10;2169:154;;2213:1;2203:11;;;;;:::i;:::-;;;2280:2;2272:5;:10;;;;:::i;:::-;2259:2;:24;;;;:::i;:::-;2246:39;;2229:6;2236;2229:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;2309:2;2300:11;;;;;:::i;:::-;;;2169:154;;;2347:6;2333:21;;;;;1829:533;;;;:::o;376:190::-;501:4;554;525:25;538:5;545:4;525:12;:25::i;:::-;:33;518:40;;376:190;;;;;:::o;14735:137::-;14796:7;14831:12;:19;14844:5;14831:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;14823:41;;14816:48;;14735:137;;;:::o;21329:163::-;21452:32;21458:2;21462:8;21472:5;21479:4;21452:5;:32::i;:::-;21329:163;;;:::o;30840:159::-;;;;;:::o;31658:158::-;;;;;:::o;571:517::-;654:7;674:20;697:4;674:27;;717:9;712:339;736:5;:12;732:1;:16;712:339;;;770:20;793:5;799:1;793:8;;;;;;;;:::i;:::-;;;;;;;;770:31;;836:12;820;:28;816:224;;884:42;899:12;913;884:14;:42::i;:::-;869:57;;816:224;;;982:42;997:12;1011;982:14;:42::i;:::-;967:57;;816:224;755:296;750:3;;;;;:::i;:::-;;;;712:339;;;;1068:12;1061:19;;;571:517;;;;:::o;21751:1775::-;21890:20;21913:13;;21890:36;;21955:1;21941:16;;:2;:16;;;21937:48;;;21966:19;;;;;;;;;;;;;;21937:48;22012:1;22000:8;:13;21996:44;;;22022:18;;;;;;;;;;;;;;21996:44;22053:61;22083:1;22087:2;22091:12;22105:8;22053:21;:61::i;:::-;22426:8;22391:12;:16;22404:2;22391:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22490:8;22450:12;:16;22463:2;22450:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22549:2;22516:11;:25;22528:12;22516:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;22616:15;22566:11;:25;22578:12;22566:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;22649:20;22672:12;22649:35;;22699:11;22728:8;22713:12;:23;22699:37;;22757:4;:23;;;;;22765:15;:2;:13;;;:15::i;:::-;22757:23;22753:641;;;22801:314;22857:12;22853:2;22832:38;;22849:1;22832:38;;;;;;;;;;;;22898:69;22937:1;22941:2;22945:14;;;;;;22961:5;22898:30;:69::i;:::-;22893:174;;23003:40;;;;;;;;;;;;;;22893:174;23110:3;23094:12;:19;;22801:314;;23196:12;23179:13;;:29;23175:43;;23210:8;;;23175:43;22753:641;;;23259:120;23315:14;;;;;;23311:2;23290:40;;23307:1;23290:40;;;;;;;;;;;;23374:3;23358:12;:19;;23259:120;;22753:641;23424:12;23408:13;:28;;;;22366:1082;;23458:60;23487:1;23491:2;23495:12;23509:8;23458:20;:60::i;:::-;21879:1647;21751:1775;;;;:::o;1096:224::-;1164:13;1227:1;1221:4;1214:15;1256:1;1250:4;1243:15;1297:4;1291;1281:21;1272:30;;1096:224;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1577:133::-;1620:5;1658:6;1645:20;1636:29;;1674:30;1698:5;1674:30;:::i;:::-;1577:133;;;;:::o;1716:139::-;1762:5;1800:6;1787:20;1778:29;;1816:33;1843:5;1816:33;:::i;:::-;1716:139;;;;:::o;1861:137::-;1906:5;1944:6;1931:20;1922:29;;1960:32;1986:5;1960:32;:::i;:::-;1861:137;;;;:::o;2004:141::-;2060:5;2091:6;2085:13;2076:22;;2107:32;2133:5;2107:32;:::i;:::-;2004:141;;;;:::o;2164:338::-;2219:5;2268:3;2261:4;2253:6;2249:17;2245:27;2235:122;;2276:79;;:::i;:::-;2235:122;2393:6;2380:20;2418:78;2492:3;2484:6;2477:4;2469:6;2465:17;2418:78;:::i;:::-;2409:87;;2225:277;2164:338;;;;:::o;2522:340::-;2578:5;2627:3;2620:4;2612:6;2608:17;2604:27;2594:122;;2635:79;;:::i;:::-;2594:122;2752:6;2739:20;2777:79;2852:3;2844:6;2837:4;2829:6;2825:17;2777:79;:::i;:::-;2768:88;;2584:278;2522:340;;;;:::o;2868:139::-;2914:5;2952:6;2939:20;2930:29;;2968:33;2995:5;2968:33;:::i;:::-;2868:139;;;;:::o;3013:329::-;3072:6;3121:2;3109:9;3100:7;3096:23;3092:32;3089:119;;;3127:79;;:::i;:::-;3089:119;3247:1;3272:53;3317:7;3308:6;3297:9;3293:22;3272:53;:::i;:::-;3262:63;;3218:117;3013:329;;;;:::o;3348:474::-;3416:6;3424;3473:2;3461:9;3452:7;3448:23;3444:32;3441:119;;;3479:79;;:::i;:::-;3441:119;3599:1;3624:53;3669:7;3660:6;3649:9;3645:22;3624:53;:::i;:::-;3614:63;;3570:117;3726:2;3752:53;3797:7;3788:6;3777:9;3773:22;3752:53;:::i;:::-;3742:63;;3697:118;3348:474;;;;;:::o;3828:619::-;3905:6;3913;3921;3970:2;3958:9;3949:7;3945:23;3941:32;3938:119;;;3976:79;;:::i;:::-;3938:119;4096:1;4121:53;4166:7;4157:6;4146:9;4142:22;4121:53;:::i;:::-;4111:63;;4067:117;4223:2;4249:53;4294:7;4285:6;4274:9;4270:22;4249:53;:::i;:::-;4239:63;;4194:118;4351:2;4377:53;4422:7;4413:6;4402:9;4398:22;4377:53;:::i;:::-;4367:63;;4322:118;3828:619;;;;;:::o;4453:943::-;4548:6;4556;4564;4572;4621:3;4609:9;4600:7;4596:23;4592:33;4589:120;;;4628:79;;:::i;:::-;4589:120;4748:1;4773:53;4818:7;4809:6;4798:9;4794:22;4773:53;:::i;:::-;4763:63;;4719:117;4875:2;4901:53;4946:7;4937:6;4926:9;4922:22;4901:53;:::i;:::-;4891:63;;4846:118;5003:2;5029:53;5074:7;5065:6;5054:9;5050:22;5029:53;:::i;:::-;5019:63;;4974:118;5159:2;5148:9;5144:18;5131:32;5190:18;5182:6;5179:30;5176:117;;;5212:79;;:::i;:::-;5176:117;5317:62;5371:7;5362:6;5351:9;5347:22;5317:62;:::i;:::-;5307:72;;5102:287;4453:943;;;;;;;:::o;5402:468::-;5467:6;5475;5524:2;5512:9;5503:7;5499:23;5495:32;5492:119;;;5530:79;;:::i;:::-;5492:119;5650:1;5675:53;5720:7;5711:6;5700:9;5696:22;5675:53;:::i;:::-;5665:63;;5621:117;5777:2;5803:50;5845:7;5836:6;5825:9;5821:22;5803:50;:::i;:::-;5793:60;;5748:115;5402:468;;;;;:::o;5876:474::-;5944:6;5952;6001:2;5989:9;5980:7;5976:23;5972:32;5969:119;;;6007:79;;:::i;:::-;5969:119;6127:1;6152:53;6197:7;6188:6;6177:9;6173:22;6152:53;:::i;:::-;6142:63;;6098:117;6254:2;6280:53;6325:7;6316:6;6305:9;6301:22;6280:53;:::i;:::-;6270:63;;6225:118;5876:474;;;;;:::o;6356:329::-;6415:6;6464:2;6452:9;6443:7;6439:23;6435:32;6432:119;;;6470:79;;:::i;:::-;6432:119;6590:1;6615:53;6660:7;6651:6;6640:9;6636:22;6615:53;:::i;:::-;6605:63;;6561:117;6356:329;;;;:::o;6691:327::-;6749:6;6798:2;6786:9;6777:7;6773:23;6769:32;6766:119;;;6804:79;;:::i;:::-;6766:119;6924:1;6949:52;6993:7;6984:6;6973:9;6969:22;6949:52;:::i;:::-;6939:62;;6895:116;6691:327;;;;:::o;7024:349::-;7093:6;7142:2;7130:9;7121:7;7117:23;7113:32;7110:119;;;7148:79;;:::i;:::-;7110:119;7268:1;7293:63;7348:7;7339:6;7328:9;7324:22;7293:63;:::i;:::-;7283:73;;7239:127;7024:349;;;;:::o;7379:509::-;7448:6;7497:2;7485:9;7476:7;7472:23;7468:32;7465:119;;;7503:79;;:::i;:::-;7465:119;7651:1;7640:9;7636:17;7623:31;7681:18;7673:6;7670:30;7667:117;;;7703:79;;:::i;:::-;7667:117;7808:63;7863:7;7854:6;7843:9;7839:22;7808:63;:::i;:::-;7798:73;;7594:287;7379:509;;;;:::o;7894:329::-;7953:6;8002:2;7990:9;7981:7;7977:23;7973:32;7970:119;;;8008:79;;:::i;:::-;7970:119;8128:1;8153:53;8198:7;8189:6;8178:9;8174:22;8153:53;:::i;:::-;8143:63;;8099:117;7894:329;;;;:::o;8229:704::-;8324:6;8332;8340;8389:2;8377:9;8368:7;8364:23;8360:32;8357:119;;;8395:79;;:::i;:::-;8357:119;8515:1;8540:53;8585:7;8576:6;8565:9;8561:22;8540:53;:::i;:::-;8530:63;;8486:117;8670:2;8659:9;8655:18;8642:32;8701:18;8693:6;8690:30;8687:117;;;8723:79;;:::i;:::-;8687:117;8836:80;8908:7;8899:6;8888:9;8884:22;8836:80;:::i;:::-;8818:98;;;;8613:313;8229:704;;;;;:::o;8939:911::-;9034:6;9042;9050;9058;9066;9115:3;9103:9;9094:7;9090:23;9086:33;9083:120;;;9122:79;;:::i;:::-;9083:120;9242:1;9267:53;9312:7;9303:6;9292:9;9288:22;9267:53;:::i;:::-;9257:63;;9213:117;9369:2;9395:53;9440:7;9431:6;9420:9;9416:22;9395:53;:::i;:::-;9385:63;;9340:118;9497:2;9523:53;9568:7;9559:6;9548:9;9544:22;9523:53;:::i;:::-;9513:63;;9468:118;9625:2;9651:53;9696:7;9687:6;9676:9;9672:22;9651:53;:::i;:::-;9641:63;;9596:118;9753:3;9780:53;9825:7;9816:6;9805:9;9801:22;9780:53;:::i;:::-;9770:63;;9724:119;8939:911;;;;;;;;:::o;9856:108::-;9933:24;9951:5;9933:24;:::i;:::-;9928:3;9921:37;9856:108;;:::o;9970:118::-;10057:24;10075:5;10057:24;:::i;:::-;10052:3;10045:37;9970:118;;:::o;10094:157::-;10199:45;10219:24;10237:5;10219:24;:::i;:::-;10199:45;:::i;:::-;10194:3;10187:58;10094:157;;:::o;10257:99::-;10328:21;10343:5;10328:21;:::i;:::-;10323:3;10316:34;10257:99;;:::o;10362:109::-;10443:21;10458:5;10443:21;:::i;:::-;10438:3;10431:34;10362:109;;:::o;10477:118::-;10564:24;10582:5;10564:24;:::i;:::-;10559:3;10552:37;10477:118;;:::o;10601:360::-;10687:3;10715:38;10747:5;10715:38;:::i;:::-;10769:70;10832:6;10827:3;10769:70;:::i;:::-;10762:77;;10848:52;10893:6;10888:3;10881:4;10874:5;10870:16;10848:52;:::i;:::-;10925:29;10947:6;10925:29;:::i;:::-;10920:3;10916:39;10909:46;;10691:270;10601:360;;;;:::o;10967:364::-;11055:3;11083:39;11116:5;11083:39;:::i;:::-;11138:71;11202:6;11197:3;11138:71;:::i;:::-;11131:78;;11218:52;11263:6;11258:3;11251:4;11244:5;11240:16;11218:52;:::i;:::-;11295:29;11317:6;11295:29;:::i;:::-;11290:3;11286:39;11279:46;;11059:272;10967:364;;;;:::o;11337:377::-;11443:3;11471:39;11504:5;11471:39;:::i;:::-;11526:89;11608:6;11603:3;11526:89;:::i;:::-;11519:96;;11624:52;11669:6;11664:3;11657:4;11650:5;11646:16;11624:52;:::i;:::-;11701:6;11696:3;11692:16;11685:23;;11447:267;11337:377;;;;:::o;11720:366::-;11862:3;11883:67;11947:2;11942:3;11883:67;:::i;:::-;11876:74;;11959:93;12048:3;11959:93;:::i;:::-;12077:2;12072:3;12068:12;12061:19;;11720:366;;;:::o;12092:::-;12234:3;12255:67;12319:2;12314:3;12255:67;:::i;:::-;12248:74;;12331:93;12420:3;12331:93;:::i;:::-;12449:2;12444:3;12440:12;12433:19;;12092:366;;;:::o;12464:::-;12606:3;12627:67;12691:2;12686:3;12627:67;:::i;:::-;12620:74;;12703:93;12792:3;12703:93;:::i;:::-;12821:2;12816:3;12812:12;12805:19;;12464:366;;;:::o;12836:::-;12978:3;12999:67;13063:2;13058:3;12999:67;:::i;:::-;12992:74;;13075:93;13164:3;13075:93;:::i;:::-;13193:2;13188:3;13184:12;13177:19;;12836:366;;;:::o;13208:::-;13350:3;13371:67;13435:2;13430:3;13371:67;:::i;:::-;13364:74;;13447:93;13536:3;13447:93;:::i;:::-;13565:2;13560:3;13556:12;13549:19;;13208:366;;;:::o;13580:::-;13722:3;13743:67;13807:2;13802:3;13743:67;:::i;:::-;13736:74;;13819:93;13908:3;13819:93;:::i;:::-;13937:2;13932:3;13928:12;13921:19;;13580:366;;;:::o;13952:::-;14094:3;14115:67;14179:2;14174:3;14115:67;:::i;:::-;14108:74;;14191:93;14280:3;14191:93;:::i;:::-;14309:2;14304:3;14300:12;14293:19;;13952:366;;;:::o;14324:400::-;14484:3;14505:84;14587:1;14582:3;14505:84;:::i;:::-;14498:91;;14598:93;14687:3;14598:93;:::i;:::-;14716:1;14711:3;14707:11;14700:18;;14324:400;;;:::o;14730:366::-;14872:3;14893:67;14957:2;14952:3;14893:67;:::i;:::-;14886:74;;14969:93;15058:3;14969:93;:::i;:::-;15087:2;15082:3;15078:12;15071:19;;14730:366;;;:::o;15102:::-;15244:3;15265:67;15329:2;15324:3;15265:67;:::i;:::-;15258:74;;15341:93;15430:3;15341:93;:::i;:::-;15459:2;15454:3;15450:12;15443:19;;15102:366;;;:::o;15474:398::-;15633:3;15654:83;15735:1;15730:3;15654:83;:::i;:::-;15647:90;;15746:93;15835:3;15746:93;:::i;:::-;15864:1;15859:3;15855:11;15848:18;;15474:398;;;:::o;15878:366::-;16020:3;16041:67;16105:2;16100:3;16041:67;:::i;:::-;16034:74;;16117:93;16206:3;16117:93;:::i;:::-;16235:2;16230:3;16226:12;16219:19;;15878:366;;;:::o;16250:::-;16392:3;16413:67;16477:2;16472:3;16413:67;:::i;:::-;16406:74;;16489:93;16578:3;16489:93;:::i;:::-;16607:2;16602:3;16598:12;16591:19;;16250:366;;;:::o;16622:::-;16764:3;16785:67;16849:2;16844:3;16785:67;:::i;:::-;16778:74;;16861:93;16950:3;16861:93;:::i;:::-;16979:2;16974:3;16970:12;16963:19;;16622:366;;;:::o;16994:::-;17136:3;17157:67;17221:2;17216:3;17157:67;:::i;:::-;17150:74;;17233:93;17322:3;17233:93;:::i;:::-;17351:2;17346:3;17342:12;17335:19;;16994:366;;;:::o;17366:::-;17508:3;17529:67;17593:2;17588:3;17529:67;:::i;:::-;17522:74;;17605:93;17694:3;17605:93;:::i;:::-;17723:2;17718:3;17714:12;17707:19;;17366:366;;;:::o;17808:697::-;17967:4;17962:3;17958:14;18054:4;18047:5;18043:16;18037:23;18073:63;18130:4;18125:3;18121:14;18107:12;18073:63;:::i;:::-;17982:164;18238:4;18231:5;18227:16;18221:23;18257:61;18312:4;18307:3;18303:14;18289:12;18257:61;:::i;:::-;18156:172;18412:4;18405:5;18401:16;18395:23;18431:57;18482:4;18477:3;18473:14;18459:12;18431:57;:::i;:::-;18338:160;17936:569;17808:697;;:::o;18511:118::-;18598:24;18616:5;18598:24;:::i;:::-;18593:3;18586:37;18511:118;;:::o;18635:105::-;18710:23;18727:5;18710:23;:::i;:::-;18705:3;18698:36;18635:105;;:::o;18746:256::-;18858:3;18873:75;18944:3;18935:6;18873:75;:::i;:::-;18973:2;18968:3;18964:12;18957:19;;18993:3;18986:10;;18746:256;;;;:::o;19008:701::-;19289:3;19311:95;19402:3;19393:6;19311:95;:::i;:::-;19304:102;;19423:95;19514:3;19505:6;19423:95;:::i;:::-;19416:102;;19535:148;19679:3;19535:148;:::i;:::-;19528:155;;19700:3;19693:10;;19008:701;;;;;:::o;19715:379::-;19899:3;19921:147;20064:3;19921:147;:::i;:::-;19914:154;;20085:3;20078:10;;19715:379;;;:::o;20100:222::-;20193:4;20231:2;20220:9;20216:18;20208:26;;20244:71;20312:1;20301:9;20297:17;20288:6;20244:71;:::i;:::-;20100:222;;;;:::o;20328:640::-;20523:4;20561:3;20550:9;20546:19;20538:27;;20575:71;20643:1;20632:9;20628:17;20619:6;20575:71;:::i;:::-;20656:72;20724:2;20713:9;20709:18;20700:6;20656:72;:::i;:::-;20738;20806:2;20795:9;20791:18;20782:6;20738:72;:::i;:::-;20857:9;20851:4;20847:20;20842:2;20831:9;20827:18;20820:48;20885:76;20956:4;20947:6;20885:76;:::i;:::-;20877:84;;20328:640;;;;;;;:::o;20974:210::-;21061:4;21099:2;21088:9;21084:18;21076:26;;21112:65;21174:1;21163:9;21159:17;21150:6;21112:65;:::i;:::-;20974:210;;;;:::o;21190:222::-;21283:4;21321:2;21310:9;21306:18;21298:26;;21334:71;21402:1;21391:9;21387:17;21378:6;21334:71;:::i;:::-;21190:222;;;;:::o;21418:313::-;21531:4;21569:2;21558:9;21554:18;21546:26;;21618:9;21612:4;21608:20;21604:1;21593:9;21589:17;21582:47;21646:78;21719:4;21710:6;21646:78;:::i;:::-;21638:86;;21418:313;;;;:::o;21737:419::-;21903:4;21941:2;21930:9;21926:18;21918:26;;21990:9;21984:4;21980:20;21976:1;21965:9;21961:17;21954:47;22018:131;22144:4;22018:131;:::i;:::-;22010:139;;21737:419;;;:::o;22162:::-;22328:4;22366:2;22355:9;22351:18;22343:26;;22415:9;22409:4;22405:20;22401:1;22390:9;22386:17;22379:47;22443:131;22569:4;22443:131;:::i;:::-;22435:139;;22162:419;;;:::o;22587:::-;22753:4;22791:2;22780:9;22776:18;22768:26;;22840:9;22834:4;22830:20;22826:1;22815:9;22811:17;22804:47;22868:131;22994:4;22868:131;:::i;:::-;22860:139;;22587:419;;;:::o;23012:::-;23178:4;23216:2;23205:9;23201:18;23193:26;;23265:9;23259:4;23255:20;23251:1;23240:9;23236:17;23229:47;23293:131;23419:4;23293:131;:::i;:::-;23285:139;;23012:419;;;:::o;23437:::-;23603:4;23641:2;23630:9;23626:18;23618:26;;23690:9;23684:4;23680:20;23676:1;23665:9;23661:17;23654:47;23718:131;23844:4;23718:131;:::i;:::-;23710:139;;23437:419;;;:::o;23862:::-;24028:4;24066:2;24055:9;24051:18;24043:26;;24115:9;24109:4;24105:20;24101:1;24090:9;24086:17;24079:47;24143:131;24269:4;24143:131;:::i;:::-;24135:139;;23862:419;;;:::o;24287:::-;24453:4;24491:2;24480:9;24476:18;24468:26;;24540:9;24534:4;24530:20;24526:1;24515:9;24511:17;24504:47;24568:131;24694:4;24568:131;:::i;:::-;24560:139;;24287:419;;;:::o;24712:::-;24878:4;24916:2;24905:9;24901:18;24893:26;;24965:9;24959:4;24955:20;24951:1;24940:9;24936:17;24929:47;24993:131;25119:4;24993:131;:::i;:::-;24985:139;;24712:419;;;:::o;25137:::-;25303:4;25341:2;25330:9;25326:18;25318:26;;25390:9;25384:4;25380:20;25376:1;25365:9;25361:17;25354:47;25418:131;25544:4;25418:131;:::i;:::-;25410:139;;25137:419;;;:::o;25562:::-;25728:4;25766:2;25755:9;25751:18;25743:26;;25815:9;25809:4;25805:20;25801:1;25790:9;25786:17;25779:47;25843:131;25969:4;25843:131;:::i;:::-;25835:139;;25562:419;;;:::o;25987:::-;26153:4;26191:2;26180:9;26176:18;26168:26;;26240:9;26234:4;26230:20;26226:1;26215:9;26211:17;26204:47;26268:131;26394:4;26268:131;:::i;:::-;26260:139;;25987:419;;;:::o;26412:::-;26578:4;26616:2;26605:9;26601:18;26593:26;;26665:9;26659:4;26655:20;26651:1;26640:9;26636:17;26629:47;26693:131;26819:4;26693:131;:::i;:::-;26685:139;;26412:419;;;:::o;26837:::-;27003:4;27041:2;27030:9;27026:18;27018:26;;27090:9;27084:4;27080:20;27076:1;27065:9;27061:17;27054:47;27118:131;27244:4;27118:131;:::i;:::-;27110:139;;26837:419;;;:::o;27262:::-;27428:4;27466:2;27455:9;27451:18;27443:26;;27515:9;27509:4;27505:20;27501:1;27490:9;27486:17;27479:47;27543:131;27669:4;27543:131;:::i;:::-;27535:139;;27262:419;;;:::o;27687:346::-;27842:4;27880:2;27869:9;27865:18;27857:26;;27893:133;28023:1;28012:9;28008:17;27999:6;27893:133;:::i;:::-;27687:346;;;;:::o;28039:222::-;28132:4;28170:2;28159:9;28155:18;28147:26;;28183:71;28251:1;28240:9;28236:17;28227:6;28183:71;:::i;:::-;28039:222;;;;:::o;28267:129::-;28301:6;28328:20;;:::i;:::-;28318:30;;28357:33;28385:4;28377:6;28357:33;:::i;:::-;28267:129;;;:::o;28402:75::-;28435:6;28468:2;28462:9;28452:19;;28402:75;:::o;28483:307::-;28544:4;28634:18;28626:6;28623:30;28620:56;;;28656:18;;:::i;:::-;28620:56;28694:29;28716:6;28694:29;:::i;:::-;28686:37;;28778:4;28772;28768:15;28760:23;;28483:307;;;:::o;28796:308::-;28858:4;28948:18;28940:6;28937:30;28934:56;;;28970:18;;:::i;:::-;28934:56;29008:29;29030:6;29008:29;:::i;:::-;29000:37;;29092:4;29086;29082:15;29074:23;;28796:308;;;:::o;29110:98::-;29161:6;29195:5;29189:12;29179:22;;29110:98;;;:::o;29214:99::-;29266:6;29300:5;29294:12;29284:22;;29214:99;;;:::o;29319:168::-;29402:11;29436:6;29431:3;29424:19;29476:4;29471:3;29467:14;29452:29;;29319:168;;;;:::o;29493:147::-;29594:11;29631:3;29616:18;;29493:147;;;;:::o;29646:169::-;29730:11;29764:6;29759:3;29752:19;29804:4;29799:3;29795:14;29780:29;;29646:169;;;;:::o;29821:148::-;29923:11;29960:3;29945:18;;29821:148;;;;:::o;29975:305::-;30015:3;30034:20;30052:1;30034:20;:::i;:::-;30029:25;;30068:20;30086:1;30068:20;:::i;:::-;30063:25;;30222:1;30154:66;30150:74;30147:1;30144:81;30141:107;;;30228:18;;:::i;:::-;30141:107;30272:1;30269;30265:9;30258:16;;29975:305;;;;:::o;30286:185::-;30326:1;30343:20;30361:1;30343:20;:::i;:::-;30338:25;;30377:20;30395:1;30377:20;:::i;:::-;30372:25;;30416:1;30406:35;;30421:18;;:::i;:::-;30406:35;30463:1;30460;30456:9;30451:14;;30286:185;;;;:::o;30477:348::-;30517:7;30540:20;30558:1;30540:20;:::i;:::-;30535:25;;30574:20;30592:1;30574:20;:::i;:::-;30569:25;;30762:1;30694:66;30690:74;30687:1;30684:81;30679:1;30672:9;30665:17;30661:105;30658:131;;;30769:18;;:::i;:::-;30658:131;30817:1;30814;30810:9;30799:20;;30477:348;;;;:::o;30831:191::-;30871:4;30891:20;30909:1;30891:20;:::i;:::-;30886:25;;30925:20;30943:1;30925:20;:::i;:::-;30920:25;;30964:1;30961;30958:8;30955:34;;;30969:18;;:::i;:::-;30955:34;31014:1;31011;31007:9;30999:17;;30831:191;;;;:::o;31028:96::-;31065:7;31094:24;31112:5;31094:24;:::i;:::-;31083:35;;31028:96;;;:::o;31130:90::-;31164:7;31207:5;31200:13;31193:21;31182:32;;31130:90;;;:::o;31226:77::-;31263:7;31292:5;31281:16;;31226:77;;;:::o;31309:149::-;31345:7;31385:66;31378:5;31374:78;31363:89;;31309:149;;;:::o;31464:126::-;31501:7;31541:42;31534:5;31530:54;31519:65;;31464:126;;;:::o;31596:77::-;31633:7;31662:5;31651:16;;31596:77;;;:::o;31679:101::-;31715:7;31755:18;31748:5;31744:30;31733:41;;31679:101;;;:::o;31786:154::-;31870:6;31865:3;31860;31847:30;31932:1;31923:6;31918:3;31914:16;31907:27;31786:154;;;:::o;31946:307::-;32014:1;32024:113;32038:6;32035:1;32032:13;32024:113;;;32123:1;32118:3;32114:11;32108:18;32104:1;32099:3;32095:11;32088:39;32060:2;32057:1;32053:10;32048:15;;32024:113;;;32155:6;32152:1;32149:13;32146:101;;;32235:1;32226:6;32221:3;32217:16;32210:27;32146:101;31995:258;31946:307;;;:::o;32259:320::-;32303:6;32340:1;32334:4;32330:12;32320:22;;32387:1;32381:4;32377:12;32408:18;32398:81;;32464:4;32456:6;32452:17;32442:27;;32398:81;32526:2;32518:6;32515:14;32495:18;32492:38;32489:84;;;32545:18;;:::i;:::-;32489:84;32310:269;32259:320;;;:::o;32585:281::-;32668:27;32690:4;32668:27;:::i;:::-;32660:6;32656:40;32798:6;32786:10;32783:22;32762:18;32750:10;32747:34;32744:62;32741:88;;;32809:18;;:::i;:::-;32741:88;32849:10;32845:2;32838:22;32628:238;32585:281;;:::o;32872:233::-;32911:3;32934:24;32952:5;32934:24;:::i;:::-;32925:33;;32980:66;32973:5;32970:77;32967:103;;;33050:18;;:::i;:::-;32967:103;33097:1;33090:5;33086:13;33079:20;;32872:233;;;:::o;33111:100::-;33150:7;33179:26;33199:5;33179:26;:::i;:::-;33168:37;;33111:100;;;:::o;33217:94::-;33256:7;33285:20;33299:5;33285:20;:::i;:::-;33274:31;;33217:94;;;:::o;33317:176::-;33349:1;33366:20;33384:1;33366:20;:::i;:::-;33361:25;;33400:20;33418:1;33400:20;:::i;:::-;33395:25;;33439:1;33429:35;;33444:18;;:::i;:::-;33429:35;33485:1;33482;33478:9;33473:14;;33317:176;;;;:::o;33499:180::-;33547:77;33544:1;33537:88;33644:4;33641:1;33634:15;33668:4;33665:1;33658:15;33685:180;33733:77;33730:1;33723:88;33830:4;33827:1;33820:15;33854:4;33851:1;33844:15;33871:180;33919:77;33916:1;33909:88;34016:4;34013:1;34006:15;34040:4;34037:1;34030:15;34057:180;34105:77;34102:1;34095:88;34202:4;34199:1;34192:15;34226:4;34223:1;34216:15;34243:180;34291:77;34288:1;34281:88;34388:4;34385:1;34378:15;34412:4;34409:1;34402:15;34429:117;34538:1;34535;34528:12;34552:117;34661:1;34658;34651:12;34675:117;34784:1;34781;34774:12;34798:117;34907:1;34904;34897:12;34921:117;35030:1;35027;35020:12;35044:117;35153:1;35150;35143:12;35167:102;35208:6;35259:2;35255:7;35250:2;35243:5;35239:14;35235:28;35225:38;;35167:102;;;:::o;35275:94::-;35308:8;35356:5;35352:2;35348:14;35327:35;;35275:94;;;:::o;35375:162::-;35515:14;35511:1;35503:6;35499:14;35492:38;35375:162;:::o;35543:225::-;35683:34;35679:1;35671:6;35667:14;35660:58;35752:8;35747:2;35739:6;35735:15;35728:33;35543:225;:::o;35774:168::-;35914:20;35910:1;35902:6;35898:14;35891:44;35774:168;:::o;35948:180::-;36088:32;36084:1;36076:6;36072:14;36065:56;35948:180;:::o;36134:165::-;36274:17;36270:1;36262:6;36258:14;36251:41;36134:165;:::o;36305:180::-;36445:32;36441:1;36433:6;36429:14;36422:56;36305:180;:::o;36491:168::-;36631:20;36627:1;36619:6;36615:14;36608:44;36491:168;:::o;36665:155::-;36805:7;36801:1;36793:6;36789:14;36782:31;36665:155;:::o;36826:182::-;36966:34;36962:1;36954:6;36950:14;36943:58;36826:182;:::o;37014:234::-;37154:34;37150:1;37142:6;37138:14;37131:58;37223:17;37218:2;37210:6;37206:15;37199:42;37014:234;:::o;37254:114::-;;:::o;37374:166::-;37514:18;37510:1;37502:6;37498:14;37491:42;37374:166;:::o;37546:172::-;37686:24;37682:1;37674:6;37670:14;37663:48;37546:172;:::o;37724:176::-;37864:28;37860:1;37852:6;37848:14;37841:52;37724:176;:::o;37906:172::-;38046:24;38042:1;38034:6;38030:14;38023:48;37906:172;:::o;38084:181::-;38224:33;38220:1;38212:6;38208:14;38201:57;38084:181;:::o;38271:122::-;38344:24;38362:5;38344:24;:::i;:::-;38337:5;38334:35;38324:63;;38383:1;38380;38373:12;38324:63;38271:122;:::o;38399:116::-;38469:21;38484:5;38469:21;:::i;:::-;38462:5;38459:32;38449:60;;38505:1;38502;38495:12;38449:60;38399:116;:::o;38521:122::-;38594:24;38612:5;38594:24;:::i;:::-;38587:5;38584:35;38574:63;;38633:1;38630;38623:12;38574:63;38521:122;:::o;38649:120::-;38721:23;38738:5;38721:23;:::i;:::-;38714:5;38711:34;38701:62;;38759:1;38756;38749:12;38701:62;38649:120;:::o;38775:122::-;38848:24;38866:5;38848:24;:::i;:::-;38841:5;38838:35;38828:63;;38887:1;38884;38877:12;38828:63;38775:122;:::o

Swarm Source

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