APE Price: $1.32 (+3.00%)

APERILLAS (APRLA)

Overview

TokenID

4038

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
Aperillas

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at apescan.io on 2024-10-26
*/

//https://aperillas.xyz

//https://x.com/aperillasnft

// SPDX-License-Identifier: MIT     



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

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

pragma solidity ^0.8.0;
abstract contract Ownable is Context {
    address private _owner;

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

    constructor() {
        _transferOwnership(_msgSender());
    }

    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    function _checkOwner() internal view virtual {
        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);
    }
}

pragma solidity ^0.8.0;

abstract contract ReentrancyGuard {

    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

        _status = _ENTERED;

        _;

        _status = _NOT_ENTERED;
    }
}

pragma solidity ^0.8.0;

library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

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

    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

pragma solidity ^0.8.0;


library EnumerableSet {


    struct Set {
        // Storage of set values
        bytes32[] _values;

        mapping(bytes32 => uint256) _indexes;
    }

    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);

            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    function _remove(Set storage set, bytes32 value) private returns (bool) {

        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) {

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            if (lastIndex != toDeleteIndex) {
                bytes32 lastValue = set._values[lastIndex];

                set._values[toDeleteIndex] = lastValue;
                
                set._indexes[lastValue] = valueIndex; 
            }

            set._values.pop();

            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        return set._values[index];
    }

    function _values(Set storage set) private view returns (bytes32[] memory) {
        return set._values;
    }

    struct Bytes32Set {
        Set _inner;
    }

    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
        return _values(set._inner);
    }

    struct AddressSet {
        Set _inner;
    }

    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    function values(AddressSet storage set) internal view returns (address[] memory) {
        bytes32[] memory store = _values(set._inner);
        address[] memory result;

        assembly {
            result := store
        }

        return result;
    }

    struct UintSet {
        Set _inner;
    }

    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }

    function values(UintSet storage set) internal view returns (uint256[] memory) {
        bytes32[] memory store = _values(set._inner);
        uint256[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }
}

pragma solidity ^0.8.4;

interface IERC721A {

    error ApprovalCallerNotOwnerNorApproved();

    error ApprovalQueryForNonexistentToken();

    error BalanceQueryForZeroAddress();

    error MintToZeroAddress();

    error MintZeroQuantity();

    error OwnerQueryForNonexistentToken();

    error TransferCallerNotOwnerNorApproved();

    error TransferFromIncorrectOwner();

    error TransferToNonERC721ReceiverImplementer();

    error TransferToZeroAddress();

    error URIQueryForNonexistentToken();

    error MintERC2309QuantityExceedsLimit();

    error OwnershipNotInitializedForExtraData();

    struct TokenOwnership {

        address addr;

        uint64 startTimestamp;

        bool burned;

        uint24 extraData;
    }

    function totalSupply() external view returns (uint256);

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

    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    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,
        bytes calldata data
    ) external payable;

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

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

    function approve(address to, uint256 tokenId) external payable;

    function setApprovalForAll(address operator, bool _approved) external;

    function getApproved(uint256 tokenId) external view returns (address operator);

    function isApprovedForAll(address owner, address operator) external view returns (bool);

    function name() external view returns (string memory);

    function symbol() external view returns (string memory);

    function tokenURI(uint256 tokenId) external view returns (string memory);

    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}

pragma solidity ^0.8.4;

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

contract ERC721A is IERC721A {

    struct TokenApprovalRef {
        address value;
    }

    uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

    uint256 private constant _BITPOS_NUMBER_MINTED = 64;

    uint256 private constant _BITPOS_NUMBER_BURNED = 128;

    uint256 private constant _BITPOS_AUX = 192;

    uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;

    uint256 private constant _BITPOS_START_TIMESTAMP = 160;

    uint256 private constant _BITMASK_BURNED = 1 << 224;

    uint256 private constant _BITPOS_NEXT_INITIALIZED = 225;

    uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225;

    uint256 private constant _BITPOS_EXTRA_DATA = 232;

    uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;

    uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1;

    uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;

    bytes32 private constant _TRANSFER_EVENT_SIGNATURE =
        0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;

    uint256 private _currentIndex;

    uint256 private _burnCounter;

    string private _name;

    string private _symbol;

    mapping(uint256 => uint256) private _packedOwnerships;

    mapping(address => uint256) private _packedAddressData;

    mapping(uint256 => TokenApprovalRef) private _tokenApprovals;

    mapping(address => mapping(address => bool)) private _operatorApprovals;

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

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

    function _nextTokenId() internal view virtual returns (uint256) {
        return _currentIndex;
    }

    function totalSupply() public view virtual override returns (uint256) {

        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    function _totalMinted() internal view virtual returns (uint256) {

        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    function _totalBurned() internal view virtual returns (uint256) {
        return _burnCounter;
    }

    function balanceOf(address owner) public view virtual override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    function _numberMinted(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    function _numberBurned(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    function _getAux(address owner) internal view returns (uint64) {
        return uint64(_packedAddressData[owner] >> _BITPOS_AUX);
    }

    function _setAux(address owner, uint64 aux) internal virtual {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        // Cast `aux` with assembly to avoid redundant masking.
        assembly {
            auxCasted := aux
        }
        packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }


    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {

        return
            interfaceId == 0x01ffc9a7 || 
            interfaceId == 0x80ac58cd || 
            interfaceId == 0x5b5e139f; 
    }

    function name() public view virtual override returns (string memory) {
        return _name;
    }

    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

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

    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

    function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }

    function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnerships[index]);
    }

    function _initializeOwnershipAt(uint256 index) internal virtual {
        if (_packedOwnerships[index] == 0) {
            _packedOwnerships[index] = _packedOwnershipOf(index);
        }
    }

    function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];

                    if (packed & _BITMASK_BURNED == 0) {

                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP);
        ownership.burned = packed & _BITMASK_BURNED != 0;
        ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA);
    }

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

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

    function approve(address to, uint256 tokenId) public payable virtual override {
        address owner = ownerOf(tokenId);

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

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

    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId].value;
    }

    function setApprovalForAll(address operator, bool approved) public virtual override {
        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
    }

    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned.
    }

    function _isSenderApprovedOrOwner(
        address approvedAddress,
        address owner,
        address msgSender
    ) private pure returns (bool result) {
        assembly {

            owner := and(owner, _BITMASK_ADDRESS)

            msgSender := and(msgSender, _BITMASK_ADDRESS)

            result := or(eq(msgSender, owner), eq(msgSender, approvedAddress))
        }
    }

    function _getApprovedSlotAndAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId];

        assembly {
            approvedAddressSlot := tokenApproval.slot
            approvedAddress := sload(approvedAddressSlot)
        }
    }

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

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

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

        if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
            if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();

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

        _beforeTokenTransfers(from, to, tokenId, 1);

        assembly {
            if approvedAddress {

                sstore(approvedAddressSlot, 0)
            }
        }

        unchecked {

            --_packedAddressData[from]; 
            ++_packedAddressData[to]; 

            _packedOwnerships[tokenId] = _packOwnershipData(
                to,
                _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked)
            );

            if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;

                if (_packedOwnerships[nextTokenId] == 0) {

                    if (nextTokenId != _currentIndex) {

                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

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

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public payable virtual override {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

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

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

    function _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
            bytes4 retval
        ) {
            return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    function _mint(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (quantity == 0) revert MintZeroQuantity();

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

        unchecked {

            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            uint256 toMasked;
            uint256 end = startTokenId + quantity;

            assembly {

                toMasked := and(to, _BITMASK_ADDRESS)

                log4(
                    0, 
                    0, 
                    _TRANSFER_EVENT_SIGNATURE, 
                    0, 
                    toMasked, 
                    startTokenId 
                )

                for {
                    let tokenId := add(startTokenId, 1)
                } iszero(eq(tokenId, end)) {
                    tokenId := add(tokenId, 1)
                } {

                    log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
                }
            }
            if (toMasked == 0) revert MintToZeroAddress();

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

    function _mintERC2309(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();
        if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit();

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

        unchecked {

            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

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

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

    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal virtual {
        _mint(to, quantity);

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

    function _safeMint(address to, uint256 quantity) internal virtual {
        _safeMint(to, quantity, '');
    }

    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        address from = address(uint160(prevOwnershipPacked));

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

        if (approvalCheck) {
            
            if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
                if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
        }

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

        assembly {
            if approvedAddress {
                
                sstore(approvedAddressSlot, 0)
            }
        }

        unchecked {

            _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1;

            _packedOwnerships[tokenId] = _packOwnershipData(
                from,
                (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked)
            );

            if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;

                if (_packedOwnerships[nextTokenId] == 0) {

                    if (nextTokenId != _currentIndex) {

                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

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

        unchecked {
            _burnCounter++;
        }
    }

    function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual {
        uint256 packed = _packedOwnerships[index];
        if (packed == 0) revert OwnershipNotInitializedForExtraData();
        uint256 extraDataCasted;
        assembly {
            extraDataCasted := extraData
        }
        packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA);
        _packedOwnerships[index] = packed;
    }

    function _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

    function _nextExtraData(
        address from,
        address to,
        uint256 prevOwnershipPacked
    ) private view returns (uint256) {
        uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA);
        return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA;
    }

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

    function _toString(uint256 value) internal pure virtual returns (string memory str) {
        assembly {

            let m := add(mload(0x40), 0xa0)

            mstore(0x40, m)

            str := sub(m, 0x20)

            mstore(str, 0)

            let end := str

            for { let temp := value } 1 {} {
                str := sub(str, 1)

                mstore8(str, add(48, mod(temp, 10)))

                temp := div(temp, 10)

                if iszero(temp) { break }
            }

            let length := sub(end, str)

            str := sub(str, 0x20)

            mstore(str, length)
        }
    }
}



pragma solidity ^0.8.4;

interface IERC721ABurnable is IERC721A {

    function burn(uint256 tokenId) external;
}

pragma solidity ^0.8.4;
abstract contract ERC721ABurnable is ERC721A, IERC721ABurnable {
    function burn(uint256 tokenId) public virtual override {
        _burn(tokenId, true);
    }
}


pragma solidity ^0.8.16;
contract Aperillas is Ownable, ERC721A, ReentrancyGuard, ERC721ABurnable {
string public CONTRACT_URI = "";
mapping(address => uint) public userHasMinted;
bool public REVEALED;
string public UNREVEALED_URI = "";
string public BASE_URI = "https://bafybeia2mgt5tw7uonivcrwkkutx2n6nhp4jwa6euri6fu3shky7avprdy.ipfs.w3s.link/";
bool public isPublicMintEnabled = false;
uint public COLLECTION_SIZE = 6969; 
uint public MINT_PRICE = 5 ether; 
uint public MAX_BATCH_SIZE = 25;
uint public SUPPLY_PER_WALLET = 57;
uint public FREE_SUPPLY_PER_WALLET = 1;
constructor() ERC721A("APERILLAS", "APRLA") {}


    function TeamMint(uint256 quantity, address receiver) public onlyOwner {
        require(
            totalSupply() + quantity <= COLLECTION_SIZE,
            "No more Aperilla in stock!"
        );
        
        _safeMint(receiver, quantity);
    }

    modifier callerIsUser() {
        require(tx.origin == msg.sender, "The caller is another contract");
        _;
    }

    function getPrice(uint quantity) public view returns(uint){
        uint price;
        uint free = FREE_SUPPLY_PER_WALLET - userHasMinted[msg.sender];
        if (quantity >= free) {
            price = (MINT_PRICE) * (quantity - free);
        } else {
            price = 0;
        }
        return price;
    }

    function mint(uint quantity)
        external
        payable
        callerIsUser 
        nonReentrant
    {
        uint price;
        uint free = FREE_SUPPLY_PER_WALLET - userHasMinted[msg.sender];
        if (quantity >= free) {
            price = (MINT_PRICE) * (quantity - free);
            userHasMinted[msg.sender] = userHasMinted[msg.sender] + free;
        } else {
            price = 0;
            userHasMinted[msg.sender] = userHasMinted[msg.sender] + quantity;
        }

        require(isPublicMintEnabled, "Mint not ready yet!");
        require(totalSupply() + quantity <= COLLECTION_SIZE, "No more Aperillas left!");

        require(balanceOf(msg.sender) + quantity <= SUPPLY_PER_WALLET, "Tried to mint over over limit");

        require(quantity <= MAX_BATCH_SIZE, "Tried to mint over limit, retry with reduced quantity");
        require(msg.value >= price, "Must send more money!");

        _safeMint(msg.sender, quantity);

        if (msg.value > price) {
            payable(msg.sender).transfer(msg.value - price);
        }
    }
    function setPublicMintEnabled() public onlyOwner {
        isPublicMintEnabled = !isPublicMintEnabled;
    }

    function withdrawFunds() external onlyOwner nonReentrant {
        (bool success, ) = msg.sender.call{value: address(this).balance}("");
        require(success, "Transfer failed.");
    }

    function CollectionUrI(bool _revealed, string memory _baseURI) public onlyOwner {
        BASE_URI = _baseURI;
        REVEALED = _revealed;
    }

    function contractURI() public view returns (string memory) {
        return CONTRACT_URI;
    }

    function setContract(string memory _contractURI) public onlyOwner {
        CONTRACT_URI = _contractURI;
    }

    function ChangeCollectionSupply(uint256 _new) external onlyOwner {
        COLLECTION_SIZE = _new;
    }

    function ChangePrice(uint256 _newPrice) external onlyOwner {
        MINT_PRICE = _newPrice;
    }

    function ChangeFreePerWallet(uint256 _new) external onlyOwner {
        FREE_SUPPLY_PER_WALLET = _new;
    }

    function ChangeSupplyPerWallet(uint256 _new) external onlyOwner {
        SUPPLY_PER_WALLET = _new;
    }

    function SetMaxBatchSize(uint256 _new) external onlyOwner {
        MAX_BATCH_SIZE = _new;
    }

  function transferFrom(address from, address to, uint256 tokenId) public payable override (ERC721A, IERC721A) {
    super.transferFrom(from, to, tokenId);
    }

  function safeTransferFrom(address from, address to, uint256 tokenId) public payable override (ERC721A, IERC721A) {
    super.safeTransferFrom(from, to, tokenId);
    }

  function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data)
    public payable
    override (ERC721A, IERC721A)
   {
    super.safeTransferFrom(from, to, tokenId, data);
   }

    function tokenURI(uint256 _tokenId)
        public
        view
        override (ERC721A, IERC721A)
        returns (string memory)
    {
        if (REVEALED) {
            return
                string(abi.encodePacked(BASE_URI, Strings.toString(_tokenId)));
        } else {
            return UNREVEALED_URI;
        }
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"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":"BASE_URI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"COLLECTION_SIZE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CONTRACT_URI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_new","type":"uint256"}],"name":"ChangeCollectionSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_new","type":"uint256"}],"name":"ChangeFreePerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"ChangePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_new","type":"uint256"}],"name":"ChangeSupplyPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_revealed","type":"bool"},{"internalType":"string","name":"_baseURI","type":"string"}],"name":"CollectionUrI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"FREE_SUPPLY_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_BATCH_SIZE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REVEALED","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SUPPLY_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_new","type":"uint256"}],"name":"SetMaxBatchSize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"TeamMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"UNREVEALED_URI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicMintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","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":"payable","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":"_contractURI","type":"string"}],"name":"setContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setPublicMintEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userHasMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260405180602001604052806000815250600a9081620000249190620004dc565b5060405180602001604052806000815250600d9081620000459190620004dc565b506040518060800160405280605281526020016200428b60529139600e9081620000709190620004dc565b506000600f60006101000a81548160ff021916908315150217905550611b39601055674563918244f40000601155601960125560396013556001601455348015620000ba57600080fd5b506040518060400160405280600981526020017f41504552494c4c415300000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f4150524c41000000000000000000000000000000000000000000000000000000815250620001476200013b6200019160201b60201c565b6200019960201b60201c565b8160039081620001589190620004dc565b5080600490816200016a9190620004dc565b506200017b6200025d60201b60201c565b60018190555050506001600981905550620005c3565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002e457607f821691505b602082108103620002fa57620002f96200029c565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620003647fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000325565b62000370868362000325565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003bd620003b7620003b18462000388565b62000392565b62000388565b9050919050565b6000819050919050565b620003d9836200039c565b620003f1620003e882620003c4565b84845462000332565b825550505050565b600090565b62000408620003f9565b62000415818484620003ce565b505050565b5b818110156200043d5762000431600082620003fe565b6001810190506200041b565b5050565b601f8211156200048c57620004568162000300565b620004618462000315565b8101602085101562000471578190505b62000489620004808562000315565b8301826200041a565b50505b505050565b600082821c905092915050565b6000620004b16000198460080262000491565b1980831691505092915050565b6000620004cc83836200049e565b9150826002028217905092915050565b620004e78262000262565b67ffffffffffffffff8111156200050357620005026200026d565b5b6200050f8254620002cb565b6200051c82828562000441565b600060209050601f8311600181146200055457600084156200053f578287015190505b6200054b8582620004be565b865550620005bb565b601f198416620005648662000300565b60005b828110156200058e5784890151825560018201915060208501945060208101905062000567565b86831015620005ae5784890151620005aa601f8916826200049e565b8355505b6001600288020188555050505b505050505050565b613cb880620005d36000396000f3fe6080604052600436106102515760003560e01c80638da5cb5b11610139578063c87b56dd116100b6578063e8a3d4851161007a578063e8a3d4851461084b578063e985e9c514610876578063f2fde38b146108b3578063f7777747146108dc578063f814943d14610905578063fb92488b1461092e57610251565b8063c87b56dd14610750578063cfdbf2541461078d578063d8258d95146107b8578063dbddb26a146107e3578063e75722301461080e57610251565b8063a4cdd719116100fd578063a4cdd7191461069e578063a76a9587146106b5578063b88d4fde146106e0578063c002d23d146106fc578063c144a4ba1461072757610251565b80638da5cb5b146105da57806395d89b4114610605578063a0712d6814610630578063a1db246e1461064c578063a22cb4651461067557610251565b806342842e0e116101d25780635fe75587116101965780635fe75587146104cc5780636352211e146104f757806370a0823114610534578063715018a6146105715780637304ff6c1461058857806375b64471146105b157610251565b806342842e0e1461040857806342966c6814610424578063507862d11461044d57806356b48d631461047857806356b4f673146104a157610251565b80631422374f116102195780631422374f1461034257806318160ddd1461036d5780631d9857781461039857806323b872dd146103d557806324600fc3146103f157610251565b80630116bc2d1461025657806301ffc9a71461028157806306fdde03146102be578063081812fc146102e9578063095ea7b314610326575b600080fd5b34801561026257600080fd5b5061026b610957565b60405161027891906129a2565b60405180910390f35b34801561028d57600080fd5b506102a860048036038101906102a39190612a29565b61096a565b6040516102b591906129a2565b60405180910390f35b3480156102ca57600080fd5b506102d36109fc565b6040516102e09190612ae6565b60405180910390f35b3480156102f557600080fd5b50610310600480360381019061030b9190612b3e565b610a8e565b60405161031d9190612bac565b60405180910390f35b610340600480360381019061033b9190612bf3565b610b0d565b005b34801561034e57600080fd5b50610357610c51565b6040516103649190612c42565b60405180910390f35b34801561037957600080fd5b50610382610c57565b60405161038f9190612c42565b60405180910390f35b3480156103a457600080fd5b506103bf60048036038101906103ba9190612c5d565b610c6e565b6040516103cc9190612c42565b60405180910390f35b6103ef60048036038101906103ea9190612c8a565b610c86565b005b3480156103fd57600080fd5b50610406610c96565b005b610422600480360381019061041d9190612c8a565b610da2565b005b34801561043057600080fd5b5061044b60048036038101906104469190612b3e565b610db2565b005b34801561045957600080fd5b50610462610dc0565b60405161046f9190612ae6565b60405180910390f35b34801561048457600080fd5b5061049f600480360381019061049a9190612e12565b610e4e565b005b3480156104ad57600080fd5b506104b6610e69565b6040516104c39190612ae6565b60405180910390f35b3480156104d857600080fd5b506104e1610ef7565b6040516104ee9190612c42565b60405180910390f35b34801561050357600080fd5b5061051e60048036038101906105199190612b3e565b610efd565b60405161052b9190612bac565b60405180910390f35b34801561054057600080fd5b5061055b60048036038101906105569190612c5d565b610f0f565b6040516105689190612c42565b60405180910390f35b34801561057d57600080fd5b50610586610fc7565b005b34801561059457600080fd5b506105af60048036038101906105aa9190612e87565b610fdb565b005b3480156105bd57600080fd5b506105d860048036038101906105d39190612b3e565b611011565b005b3480156105e657600080fd5b506105ef611023565b6040516105fc9190612bac565b60405180910390f35b34801561061157600080fd5b5061061a61104c565b6040516106279190612ae6565b60405180910390f35b61064a60048036038101906106459190612b3e565b6110de565b005b34801561065857600080fd5b50610673600480360381019061066e9190612b3e565b61152b565b005b34801561068157600080fd5b5061069c60048036038101906106979190612ee3565b61153d565b005b3480156106aa57600080fd5b506106b3611648565b005b3480156106c157600080fd5b506106ca61167c565b6040516106d791906129a2565b60405180910390f35b6106fa60048036038101906106f59190612fc4565b61168f565b005b34801561070857600080fd5b506107116116a1565b60405161071e9190612c42565b60405180910390f35b34801561073357600080fd5b5061074e60048036038101906107499190612b3e565b6116a7565b005b34801561075c57600080fd5b5061077760048036038101906107729190612b3e565b6116b9565b6040516107849190612ae6565b60405180910390f35b34801561079957600080fd5b506107a2611795565b6040516107af9190612c42565b60405180910390f35b3480156107c457600080fd5b506107cd61179b565b6040516107da9190612c42565b60405180910390f35b3480156107ef57600080fd5b506107f86117a1565b6040516108059190612ae6565b60405180910390f35b34801561081a57600080fd5b5061083560048036038101906108309190612b3e565b61182f565b6040516108429190612c42565b60405180910390f35b34801561085757600080fd5b506108606118b9565b60405161086d9190612ae6565b60405180910390f35b34801561088257600080fd5b5061089d60048036038101906108989190613047565b61194b565b6040516108aa91906129a2565b60405180910390f35b3480156108bf57600080fd5b506108da60048036038101906108d59190612c5d565b6119df565b005b3480156108e857600080fd5b5061090360048036038101906108fe9190613087565b611a62565b005b34801561091157600080fd5b5061092c60048036038101906109279190612b3e565b611acf565b005b34801561093a57600080fd5b5061095560048036038101906109509190612b3e565b611ae1565b005b600f60009054906101000a900460ff1681565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109c557506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109f55750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060038054610a0b906130f6565b80601f0160208091040260200160405190810160405280929190818152602001828054610a37906130f6565b8015610a845780601f10610a5957610100808354040283529160200191610a84565b820191906000526020600020905b815481529060010190602001808311610a6757829003601f168201915b5050505050905090565b6000610a9982611af3565b610acf576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b1882610efd565b90508073ffffffffffffffffffffffffffffffffffffffff16610b39611b52565b73ffffffffffffffffffffffffffffffffffffffff1614610b9c57610b6581610b60611b52565b61194b565b610b9b576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60145481565b6000610c61611b5a565b6002546001540303905090565b600b6020528060005260406000206000915090505481565b610c91838383611b5f565b505050565b610c9e611e81565b600260095403610ce3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cda90613173565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051610d11906131c4565b60006040518083038185875af1925050503d8060008114610d4e576040519150601f19603f3d011682016040523d82523d6000602084013e610d53565b606091505b5050905080610d97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8e90613225565b60405180910390fd5b506001600981905550565b610dad838383611eff565b505050565b610dbd816001611f1f565b50565b600d8054610dcd906130f6565b80601f0160208091040260200160405190810160405280929190818152602001828054610df9906130f6565b8015610e465780601f10610e1b57610100808354040283529160200191610e46565b820191906000526020600020905b815481529060010190602001808311610e2957829003601f168201915b505050505081565b610e56611e81565b80600a9081610e6591906133f1565b5050565b600a8054610e76906130f6565b80601f0160208091040260200160405190810160405280929190818152602001828054610ea2906130f6565b8015610eef5780601f10610ec457610100808354040283529160200191610eef565b820191906000526020600020905b815481529060010190602001808311610ed257829003601f168201915b505050505081565b60135481565b6000610f0882612171565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f76576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610fcf611e81565b610fd9600061223d565b565b610fe3611e81565b80600e9081610ff291906133f1565b5081600c60006101000a81548160ff0219169083151502179055505050565b611019611e81565b8060108190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461105b906130f6565b80601f0160208091040260200160405190810160405280929190818152602001828054611087906130f6565b80156110d45780601f106110a9576101008083540402835291602001916110d4565b820191906000526020600020905b8154815290600101906020018083116110b757829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461114c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111439061350f565b60405180910390fd5b600260095403611191576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118890613173565b60405180910390fd5b6002600981905550600080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546014546111e9919061355e565b90508083106112a05780836111fe919061355e565b60115461120b9190613592565b915080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461125891906135d4565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611333565b6000915082600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546112ef91906135d4565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600f60009054906101000a900460ff16611382576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137990613654565b60405180910390fd5b6010548361138e610c57565b61139891906135d4565b11156113d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d0906136c0565b60405180910390fd5b601354836113e633610f0f565b6113f091906135d4565b1115611431576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114289061372c565b60405180910390fd5b601254831115611476576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146d906137be565b60405180910390fd5b813410156114b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b09061382a565b60405180910390fd5b6114c33384612301565b8134111561151e573373ffffffffffffffffffffffffffffffffffffffff166108fc83346114f1919061355e565b9081150290604051600060405180830381858888f1935050505015801561151c573d6000803e3d6000fd5b505b5050600160098190555050565b611533611e81565b8060148190555050565b806008600061154a611b52565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166115f7611b52565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161163c91906129a2565b60405180910390a35050565b611650611e81565b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b600c60009054906101000a900460ff1681565b61169b8484848461231f565b50505050565b60115481565b6116af611e81565b8060128190555050565b6060600c60009054906101000a900460ff161561170257600e6116db83612392565b6040516020016116ec929190613909565b6040516020818303038152906040529050611790565b600d805461170f906130f6565b80601f016020809104026020016040519081016040528092919081815260200182805461173b906130f6565b80156117885780601f1061175d57610100808354040283529160200191611788565b820191906000526020600020905b81548152906001019060200180831161176b57829003601f168201915b505050505090505b919050565b60125481565b60105481565b600e80546117ae906130f6565b80601f01602080910402602001604051908101604052809291908181526020018280546117da906130f6565b80156118275780601f106117fc57610100808354040283529160200191611827565b820191906000526020600020905b81548152906001019060200180831161180a57829003601f168201915b505050505081565b6000806000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054601454611881919061355e565b90508084106118aa578084611896919061355e565b6011546118a39190613592565b91506118af565b600091505b8192505050919050565b6060600a80546118c8906130f6565b80601f01602080910402602001604051908101604052809291908181526020018280546118f4906130f6565b80156119415780601f1061191657610100808354040283529160200191611941565b820191906000526020600020905b81548152906001019060200180831161192457829003601f168201915b5050505050905090565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6119e7611e81565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611a56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4d9061399f565b60405180910390fd5b611a5f8161223d565b50565b611a6a611e81565b60105482611a76610c57565b611a8091906135d4565b1115611ac1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab890613a0b565b60405180910390fd5b611acb8183612301565b5050565b611ad7611e81565b8060138190555050565b611ae9611e81565b8060118190555050565b600081611afe611b5a565b11158015611b0d575060015482105b8015611b4b575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b6000611b6a82612171565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611bd1576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611bdd846124f2565b91509150611bf38187611bee611b52565b612519565b611c3f57611c0886611c03611b52565b61194b565b611c3e576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611ca5576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611cb2868686600161255d565b8015611cbd57600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550611d8b85611d67888887612563565b7c02000000000000000000000000000000000000000000000000000000001761258b565b600560008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603611e115760006001850190506000600560008381526020019081526020016000205403611e0f576001548114611e0e578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611e7986868660016125b6565b505050505050565b611e896125bc565b73ffffffffffffffffffffffffffffffffffffffff16611ea7611023565b73ffffffffffffffffffffffffffffffffffffffff1614611efd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef490613a77565b60405180910390fd5b565b611f1a8383836040518060200160405280600081525061168f565b505050565b6000611f2a83612171565b90506000819050600080611f3d866124f2565b915091508415611fa657611f598184611f54611b52565b612519565b611fa557611f6e83611f69611b52565b61194b565b611fa4576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b611fb483600088600161255d565b8015611fbf57600082555b600160806001901b03600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506120678361202485600088612563565b7c02000000000000000000000000000000000000000000000000000000007c0100000000000000000000000000000000000000000000000000000000171761258b565b600560008881526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008516036120ed57600060018701905060006005600083815260200190815260200160002054036120eb5760015481146120ea578460056000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46121578360008860016125b6565b600260008154809291906001019190505550505050505050565b60008082905080612180611b5a565b11612206576001548110156122055760006005600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612203575b600081036121f95760056000836001900393508381526020019081526020016000205490506121cf565b8092505050612238565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61231b8282604051806020016040528060008152506125c4565b5050565b61232a848484610c86565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461238c5761235584848484612662565b61238b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060600082036123d9576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506124ed565b600082905060005b6000821461240b5780806123f490613a97565b915050600a826124049190613b0e565b91506123e1565b60008167ffffffffffffffff81111561242757612426612ce7565b5b6040519080825280601f01601f1916602001820160405280156124595781602001600182028036833780820191505090505b5090505b600085146124e657600182612472919061355e565b9150600a856124819190613b3f565b603061248d91906135d4565b60f81b8183815181106124a3576124a2613b70565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856124df9190613b0e565b945061245d565b8093505050505b919050565b60008060006007600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861257a8686846127b2565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b6125ce83836127bb565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461265d5760006001549050600083820390505b61260f6000868380600101945086612662565b612645576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106125fc57816001541461265a57600080fd5b50505b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612688611b52565b8786866040518563ffffffff1660e01b81526004016126aa9493929190613bf4565b6020604051808303816000875af19250505080156126e657506040513d601f19601f820116820180604052508101906126e39190613c55565b60015b61275f573d8060008114612716576040519150601f19603f3d011682016040523d82523d6000602084013e61271b565b606091505b506000815103612757576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60009392505050565b60006001549050600082036127fc576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612809600084838561255d565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612880836128716000866000612563565b61287a85612977565b1761258b565b6005600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461292157808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001810190506128e6565b506000820361295c576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600181905550505061297260008483856125b6565b505050565b60006001821460e11b9050919050565b60008115159050919050565b61299c81612987565b82525050565b60006020820190506129b76000830184612993565b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612a06816129d1565b8114612a1157600080fd5b50565b600081359050612a23816129fd565b92915050565b600060208284031215612a3f57612a3e6129c7565b5b6000612a4d84828501612a14565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612a90578082015181840152602081019050612a75565b60008484015250505050565b6000601f19601f8301169050919050565b6000612ab882612a56565b612ac28185612a61565b9350612ad2818560208601612a72565b612adb81612a9c565b840191505092915050565b60006020820190508181036000830152612b008184612aad565b905092915050565b6000819050919050565b612b1b81612b08565b8114612b2657600080fd5b50565b600081359050612b3881612b12565b92915050565b600060208284031215612b5457612b536129c7565b5b6000612b6284828501612b29565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612b9682612b6b565b9050919050565b612ba681612b8b565b82525050565b6000602082019050612bc16000830184612b9d565b92915050565b612bd081612b8b565b8114612bdb57600080fd5b50565b600081359050612bed81612bc7565b92915050565b60008060408385031215612c0a57612c096129c7565b5b6000612c1885828601612bde565b9250506020612c2985828601612b29565b9150509250929050565b612c3c81612b08565b82525050565b6000602082019050612c576000830184612c33565b92915050565b600060208284031215612c7357612c726129c7565b5b6000612c8184828501612bde565b91505092915050565b600080600060608486031215612ca357612ca26129c7565b5b6000612cb186828701612bde565b9350506020612cc286828701612bde565b9250506040612cd386828701612b29565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612d1f82612a9c565b810181811067ffffffffffffffff82111715612d3e57612d3d612ce7565b5b80604052505050565b6000612d516129bd565b9050612d5d8282612d16565b919050565b600067ffffffffffffffff821115612d7d57612d7c612ce7565b5b612d8682612a9c565b9050602081019050919050565b82818337600083830152505050565b6000612db5612db084612d62565b612d47565b905082815260208101848484011115612dd157612dd0612ce2565b5b612ddc848285612d93565b509392505050565b600082601f830112612df957612df8612cdd565b5b8135612e09848260208601612da2565b91505092915050565b600060208284031215612e2857612e276129c7565b5b600082013567ffffffffffffffff811115612e4657612e456129cc565b5b612e5284828501612de4565b91505092915050565b612e6481612987565b8114612e6f57600080fd5b50565b600081359050612e8181612e5b565b92915050565b60008060408385031215612e9e57612e9d6129c7565b5b6000612eac85828601612e72565b925050602083013567ffffffffffffffff811115612ecd57612ecc6129cc565b5b612ed985828601612de4565b9150509250929050565b60008060408385031215612efa57612ef96129c7565b5b6000612f0885828601612bde565b9250506020612f1985828601612e72565b9150509250929050565b600067ffffffffffffffff821115612f3e57612f3d612ce7565b5b612f4782612a9c565b9050602081019050919050565b6000612f67612f6284612f23565b612d47565b905082815260208101848484011115612f8357612f82612ce2565b5b612f8e848285612d93565b509392505050565b600082601f830112612fab57612faa612cdd565b5b8135612fbb848260208601612f54565b91505092915050565b60008060008060808587031215612fde57612fdd6129c7565b5b6000612fec87828801612bde565b9450506020612ffd87828801612bde565b935050604061300e87828801612b29565b925050606085013567ffffffffffffffff81111561302f5761302e6129cc565b5b61303b87828801612f96565b91505092959194509250565b6000806040838503121561305e5761305d6129c7565b5b600061306c85828601612bde565b925050602061307d85828601612bde565b9150509250929050565b6000806040838503121561309e5761309d6129c7565b5b60006130ac85828601612b29565b92505060206130bd85828601612bde565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061310e57607f821691505b602082108103613121576131206130c7565b5b50919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600061315d601f83612a61565b915061316882613127565b602082019050919050565b6000602082019050818103600083015261318c81613150565b9050919050565b600081905092915050565b50565b60006131ae600083613193565b91506131b98261319e565b600082019050919050565b60006131cf826131a1565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b600061320f601083612a61565b915061321a826131d9565b602082019050919050565b6000602082019050818103600083015261323e81613202565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026132a77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261326a565b6132b1868361326a565b95508019841693508086168417925050509392505050565b6000819050919050565b60006132ee6132e96132e484612b08565b6132c9565b612b08565b9050919050565b6000819050919050565b613308836132d3565b61331c613314826132f5565b848454613277565b825550505050565b600090565b613331613324565b61333c8184846132ff565b505050565b5b8181101561336057613355600082613329565b600181019050613342565b5050565b601f8211156133a55761337681613245565b61337f8461325a565b8101602085101561338e578190505b6133a261339a8561325a565b830182613341565b50505b505050565b600082821c905092915050565b60006133c8600019846008026133aa565b1980831691505092915050565b60006133e183836133b7565b9150826002028217905092915050565b6133fa82612a56565b67ffffffffffffffff81111561341357613412612ce7565b5b61341d82546130f6565b613428828285613364565b600060209050601f83116001811461345b5760008415613449578287015190505b61345385826133d5565b8655506134bb565b601f19841661346986613245565b60005b828110156134915784890151825560018201915060208501945060208101905061346c565b868310156134ae57848901516134aa601f8916826133b7565b8355505b6001600288020188555050505b505050505050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b60006134f9601e83612a61565b9150613504826134c3565b602082019050919050565b60006020820190508181036000830152613528816134ec565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061356982612b08565b915061357483612b08565b925082820390508181111561358c5761358b61352f565b5b92915050565b600061359d82612b08565b91506135a883612b08565b92508282026135b681612b08565b915082820484148315176135cd576135cc61352f565b5b5092915050565b60006135df82612b08565b91506135ea83612b08565b92508282019050808211156136025761360161352f565b5b92915050565b7f4d696e74206e6f74207265616479207965742100000000000000000000000000600082015250565b600061363e601383612a61565b915061364982613608565b602082019050919050565b6000602082019050818103600083015261366d81613631565b9050919050565b7f4e6f206d6f72652041706572696c6c6173206c65667421000000000000000000600082015250565b60006136aa601783612a61565b91506136b582613674565b602082019050919050565b600060208201905081810360008301526136d98161369d565b9050919050565b7f547269656420746f206d696e74206f766572206f766572206c696d6974000000600082015250565b6000613716601d83612a61565b9150613721826136e0565b602082019050919050565b6000602082019050818103600083015261374581613709565b9050919050565b7f547269656420746f206d696e74206f766572206c696d69742c2072657472792060008201527f776974682072656475636564207175616e746974790000000000000000000000602082015250565b60006137a8603583612a61565b91506137b38261374c565b604082019050919050565b600060208201905081810360008301526137d78161379b565b9050919050565b7f4d7573742073656e64206d6f7265206d6f6e6579210000000000000000000000600082015250565b6000613814601583612a61565b915061381f826137de565b602082019050919050565b6000602082019050818103600083015261384381613807565b9050919050565b600081905092915050565b60008154613862816130f6565b61386c818661384a565b94506001821660008114613887576001811461389c576138cf565b60ff19831686528115158202860193506138cf565b6138a585613245565b60005b838110156138c7578154818901526001820191506020810190506138a8565b838801955050505b50505092915050565b60006138e382612a56565b6138ed818561384a565b93506138fd818560208601612a72565b80840191505092915050565b60006139158285613855565b915061392182846138d8565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613989602683612a61565b91506139948261392d565b604082019050919050565b600060208201905081810360008301526139b88161397c565b9050919050565b7f4e6f206d6f72652041706572696c6c6120696e2073746f636b21000000000000600082015250565b60006139f5601a83612a61565b9150613a00826139bf565b602082019050919050565b60006020820190508181036000830152613a24816139e8565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613a61602083612a61565b9150613a6c82613a2b565b602082019050919050565b60006020820190508181036000830152613a9081613a54565b9050919050565b6000613aa282612b08565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613ad457613ad361352f565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613b1982612b08565b9150613b2483612b08565b925082613b3457613b33613adf565b5b828204905092915050565b6000613b4a82612b08565b9150613b5583612b08565b925082613b6557613b64613adf565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000613bc682613b9f565b613bd08185613baa565b9350613be0818560208601612a72565b613be981612a9c565b840191505092915050565b6000608082019050613c096000830187612b9d565b613c166020830186612b9d565b613c236040830185612c33565b8181036060830152613c358184613bbb565b905095945050505050565b600081519050613c4f816129fd565b92915050565b600060208284031215613c6b57613c6a6129c7565b5b6000613c7984828501613c40565b9150509291505056fea26469706673582212207b7a07f6781fb8bb6b84b55b84c23cc1c4e649f38c8169bd8e2c6cf5f63412cc64736f6c6343000812003368747470733a2f2f6261667962656961326d677435747737756f6e69766372776b6b757478326e366e6870346a776136657572693666753373686b79376176707264792e697066732e7733732e6c696e6b2f

Deployed Bytecode

0x6080604052600436106102515760003560e01c80638da5cb5b11610139578063c87b56dd116100b6578063e8a3d4851161007a578063e8a3d4851461084b578063e985e9c514610876578063f2fde38b146108b3578063f7777747146108dc578063f814943d14610905578063fb92488b1461092e57610251565b8063c87b56dd14610750578063cfdbf2541461078d578063d8258d95146107b8578063dbddb26a146107e3578063e75722301461080e57610251565b8063a4cdd719116100fd578063a4cdd7191461069e578063a76a9587146106b5578063b88d4fde146106e0578063c002d23d146106fc578063c144a4ba1461072757610251565b80638da5cb5b146105da57806395d89b4114610605578063a0712d6814610630578063a1db246e1461064c578063a22cb4651461067557610251565b806342842e0e116101d25780635fe75587116101965780635fe75587146104cc5780636352211e146104f757806370a0823114610534578063715018a6146105715780637304ff6c1461058857806375b64471146105b157610251565b806342842e0e1461040857806342966c6814610424578063507862d11461044d57806356b48d631461047857806356b4f673146104a157610251565b80631422374f116102195780631422374f1461034257806318160ddd1461036d5780631d9857781461039857806323b872dd146103d557806324600fc3146103f157610251565b80630116bc2d1461025657806301ffc9a71461028157806306fdde03146102be578063081812fc146102e9578063095ea7b314610326575b600080fd5b34801561026257600080fd5b5061026b610957565b60405161027891906129a2565b60405180910390f35b34801561028d57600080fd5b506102a860048036038101906102a39190612a29565b61096a565b6040516102b591906129a2565b60405180910390f35b3480156102ca57600080fd5b506102d36109fc565b6040516102e09190612ae6565b60405180910390f35b3480156102f557600080fd5b50610310600480360381019061030b9190612b3e565b610a8e565b60405161031d9190612bac565b60405180910390f35b610340600480360381019061033b9190612bf3565b610b0d565b005b34801561034e57600080fd5b50610357610c51565b6040516103649190612c42565b60405180910390f35b34801561037957600080fd5b50610382610c57565b60405161038f9190612c42565b60405180910390f35b3480156103a457600080fd5b506103bf60048036038101906103ba9190612c5d565b610c6e565b6040516103cc9190612c42565b60405180910390f35b6103ef60048036038101906103ea9190612c8a565b610c86565b005b3480156103fd57600080fd5b50610406610c96565b005b610422600480360381019061041d9190612c8a565b610da2565b005b34801561043057600080fd5b5061044b60048036038101906104469190612b3e565b610db2565b005b34801561045957600080fd5b50610462610dc0565b60405161046f9190612ae6565b60405180910390f35b34801561048457600080fd5b5061049f600480360381019061049a9190612e12565b610e4e565b005b3480156104ad57600080fd5b506104b6610e69565b6040516104c39190612ae6565b60405180910390f35b3480156104d857600080fd5b506104e1610ef7565b6040516104ee9190612c42565b60405180910390f35b34801561050357600080fd5b5061051e60048036038101906105199190612b3e565b610efd565b60405161052b9190612bac565b60405180910390f35b34801561054057600080fd5b5061055b60048036038101906105569190612c5d565b610f0f565b6040516105689190612c42565b60405180910390f35b34801561057d57600080fd5b50610586610fc7565b005b34801561059457600080fd5b506105af60048036038101906105aa9190612e87565b610fdb565b005b3480156105bd57600080fd5b506105d860048036038101906105d39190612b3e565b611011565b005b3480156105e657600080fd5b506105ef611023565b6040516105fc9190612bac565b60405180910390f35b34801561061157600080fd5b5061061a61104c565b6040516106279190612ae6565b60405180910390f35b61064a60048036038101906106459190612b3e565b6110de565b005b34801561065857600080fd5b50610673600480360381019061066e9190612b3e565b61152b565b005b34801561068157600080fd5b5061069c60048036038101906106979190612ee3565b61153d565b005b3480156106aa57600080fd5b506106b3611648565b005b3480156106c157600080fd5b506106ca61167c565b6040516106d791906129a2565b60405180910390f35b6106fa60048036038101906106f59190612fc4565b61168f565b005b34801561070857600080fd5b506107116116a1565b60405161071e9190612c42565b60405180910390f35b34801561073357600080fd5b5061074e60048036038101906107499190612b3e565b6116a7565b005b34801561075c57600080fd5b5061077760048036038101906107729190612b3e565b6116b9565b6040516107849190612ae6565b60405180910390f35b34801561079957600080fd5b506107a2611795565b6040516107af9190612c42565b60405180910390f35b3480156107c457600080fd5b506107cd61179b565b6040516107da9190612c42565b60405180910390f35b3480156107ef57600080fd5b506107f86117a1565b6040516108059190612ae6565b60405180910390f35b34801561081a57600080fd5b5061083560048036038101906108309190612b3e565b61182f565b6040516108429190612c42565b60405180910390f35b34801561085757600080fd5b506108606118b9565b60405161086d9190612ae6565b60405180910390f35b34801561088257600080fd5b5061089d60048036038101906108989190613047565b61194b565b6040516108aa91906129a2565b60405180910390f35b3480156108bf57600080fd5b506108da60048036038101906108d59190612c5d565b6119df565b005b3480156108e857600080fd5b5061090360048036038101906108fe9190613087565b611a62565b005b34801561091157600080fd5b5061092c60048036038101906109279190612b3e565b611acf565b005b34801561093a57600080fd5b5061095560048036038101906109509190612b3e565b611ae1565b005b600f60009054906101000a900460ff1681565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109c557506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109f55750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060038054610a0b906130f6565b80601f0160208091040260200160405190810160405280929190818152602001828054610a37906130f6565b8015610a845780601f10610a5957610100808354040283529160200191610a84565b820191906000526020600020905b815481529060010190602001808311610a6757829003601f168201915b5050505050905090565b6000610a9982611af3565b610acf576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b1882610efd565b90508073ffffffffffffffffffffffffffffffffffffffff16610b39611b52565b73ffffffffffffffffffffffffffffffffffffffff1614610b9c57610b6581610b60611b52565b61194b565b610b9b576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60145481565b6000610c61611b5a565b6002546001540303905090565b600b6020528060005260406000206000915090505481565b610c91838383611b5f565b505050565b610c9e611e81565b600260095403610ce3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cda90613173565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051610d11906131c4565b60006040518083038185875af1925050503d8060008114610d4e576040519150601f19603f3d011682016040523d82523d6000602084013e610d53565b606091505b5050905080610d97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8e90613225565b60405180910390fd5b506001600981905550565b610dad838383611eff565b505050565b610dbd816001611f1f565b50565b600d8054610dcd906130f6565b80601f0160208091040260200160405190810160405280929190818152602001828054610df9906130f6565b8015610e465780601f10610e1b57610100808354040283529160200191610e46565b820191906000526020600020905b815481529060010190602001808311610e2957829003601f168201915b505050505081565b610e56611e81565b80600a9081610e6591906133f1565b5050565b600a8054610e76906130f6565b80601f0160208091040260200160405190810160405280929190818152602001828054610ea2906130f6565b8015610eef5780601f10610ec457610100808354040283529160200191610eef565b820191906000526020600020905b815481529060010190602001808311610ed257829003601f168201915b505050505081565b60135481565b6000610f0882612171565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f76576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610fcf611e81565b610fd9600061223d565b565b610fe3611e81565b80600e9081610ff291906133f1565b5081600c60006101000a81548160ff0219169083151502179055505050565b611019611e81565b8060108190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461105b906130f6565b80601f0160208091040260200160405190810160405280929190818152602001828054611087906130f6565b80156110d45780601f106110a9576101008083540402835291602001916110d4565b820191906000526020600020905b8154815290600101906020018083116110b757829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461114c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111439061350f565b60405180910390fd5b600260095403611191576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118890613173565b60405180910390fd5b6002600981905550600080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546014546111e9919061355e565b90508083106112a05780836111fe919061355e565b60115461120b9190613592565b915080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461125891906135d4565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611333565b6000915082600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546112ef91906135d4565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600f60009054906101000a900460ff16611382576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137990613654565b60405180910390fd5b6010548361138e610c57565b61139891906135d4565b11156113d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d0906136c0565b60405180910390fd5b601354836113e633610f0f565b6113f091906135d4565b1115611431576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114289061372c565b60405180910390fd5b601254831115611476576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146d906137be565b60405180910390fd5b813410156114b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b09061382a565b60405180910390fd5b6114c33384612301565b8134111561151e573373ffffffffffffffffffffffffffffffffffffffff166108fc83346114f1919061355e565b9081150290604051600060405180830381858888f1935050505015801561151c573d6000803e3d6000fd5b505b5050600160098190555050565b611533611e81565b8060148190555050565b806008600061154a611b52565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166115f7611b52565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161163c91906129a2565b60405180910390a35050565b611650611e81565b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b600c60009054906101000a900460ff1681565b61169b8484848461231f565b50505050565b60115481565b6116af611e81565b8060128190555050565b6060600c60009054906101000a900460ff161561170257600e6116db83612392565b6040516020016116ec929190613909565b6040516020818303038152906040529050611790565b600d805461170f906130f6565b80601f016020809104026020016040519081016040528092919081815260200182805461173b906130f6565b80156117885780601f1061175d57610100808354040283529160200191611788565b820191906000526020600020905b81548152906001019060200180831161176b57829003601f168201915b505050505090505b919050565b60125481565b60105481565b600e80546117ae906130f6565b80601f01602080910402602001604051908101604052809291908181526020018280546117da906130f6565b80156118275780601f106117fc57610100808354040283529160200191611827565b820191906000526020600020905b81548152906001019060200180831161180a57829003601f168201915b505050505081565b6000806000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054601454611881919061355e565b90508084106118aa578084611896919061355e565b6011546118a39190613592565b91506118af565b600091505b8192505050919050565b6060600a80546118c8906130f6565b80601f01602080910402602001604051908101604052809291908181526020018280546118f4906130f6565b80156119415780601f1061191657610100808354040283529160200191611941565b820191906000526020600020905b81548152906001019060200180831161192457829003601f168201915b5050505050905090565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6119e7611e81565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611a56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4d9061399f565b60405180910390fd5b611a5f8161223d565b50565b611a6a611e81565b60105482611a76610c57565b611a8091906135d4565b1115611ac1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab890613a0b565b60405180910390fd5b611acb8183612301565b5050565b611ad7611e81565b8060138190555050565b611ae9611e81565b8060118190555050565b600081611afe611b5a565b11158015611b0d575060015482105b8015611b4b575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b6000611b6a82612171565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611bd1576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611bdd846124f2565b91509150611bf38187611bee611b52565b612519565b611c3f57611c0886611c03611b52565b61194b565b611c3e576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611ca5576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611cb2868686600161255d565b8015611cbd57600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550611d8b85611d67888887612563565b7c02000000000000000000000000000000000000000000000000000000001761258b565b600560008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603611e115760006001850190506000600560008381526020019081526020016000205403611e0f576001548114611e0e578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611e7986868660016125b6565b505050505050565b611e896125bc565b73ffffffffffffffffffffffffffffffffffffffff16611ea7611023565b73ffffffffffffffffffffffffffffffffffffffff1614611efd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef490613a77565b60405180910390fd5b565b611f1a8383836040518060200160405280600081525061168f565b505050565b6000611f2a83612171565b90506000819050600080611f3d866124f2565b915091508415611fa657611f598184611f54611b52565b612519565b611fa557611f6e83611f69611b52565b61194b565b611fa4576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b611fb483600088600161255d565b8015611fbf57600082555b600160806001901b03600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506120678361202485600088612563565b7c02000000000000000000000000000000000000000000000000000000007c0100000000000000000000000000000000000000000000000000000000171761258b565b600560008881526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008516036120ed57600060018701905060006005600083815260200190815260200160002054036120eb5760015481146120ea578460056000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46121578360008860016125b6565b600260008154809291906001019190505550505050505050565b60008082905080612180611b5a565b11612206576001548110156122055760006005600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612203575b600081036121f95760056000836001900393508381526020019081526020016000205490506121cf565b8092505050612238565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61231b8282604051806020016040528060008152506125c4565b5050565b61232a848484610c86565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461238c5761235584848484612662565b61238b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060600082036123d9576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506124ed565b600082905060005b6000821461240b5780806123f490613a97565b915050600a826124049190613b0e565b91506123e1565b60008167ffffffffffffffff81111561242757612426612ce7565b5b6040519080825280601f01601f1916602001820160405280156124595781602001600182028036833780820191505090505b5090505b600085146124e657600182612472919061355e565b9150600a856124819190613b3f565b603061248d91906135d4565b60f81b8183815181106124a3576124a2613b70565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856124df9190613b0e565b945061245d565b8093505050505b919050565b60008060006007600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861257a8686846127b2565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b6125ce83836127bb565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461265d5760006001549050600083820390505b61260f6000868380600101945086612662565b612645576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106125fc57816001541461265a57600080fd5b50505b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612688611b52565b8786866040518563ffffffff1660e01b81526004016126aa9493929190613bf4565b6020604051808303816000875af19250505080156126e657506040513d601f19601f820116820180604052508101906126e39190613c55565b60015b61275f573d8060008114612716576040519150601f19603f3d011682016040523d82523d6000602084013e61271b565b606091505b506000815103612757576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60009392505050565b60006001549050600082036127fc576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612809600084838561255d565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612880836128716000866000612563565b61287a85612977565b1761258b565b6005600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461292157808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001810190506128e6565b506000820361295c576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600181905550505061297260008483856125b6565b505050565b60006001821460e11b9050919050565b60008115159050919050565b61299c81612987565b82525050565b60006020820190506129b76000830184612993565b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612a06816129d1565b8114612a1157600080fd5b50565b600081359050612a23816129fd565b92915050565b600060208284031215612a3f57612a3e6129c7565b5b6000612a4d84828501612a14565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612a90578082015181840152602081019050612a75565b60008484015250505050565b6000601f19601f8301169050919050565b6000612ab882612a56565b612ac28185612a61565b9350612ad2818560208601612a72565b612adb81612a9c565b840191505092915050565b60006020820190508181036000830152612b008184612aad565b905092915050565b6000819050919050565b612b1b81612b08565b8114612b2657600080fd5b50565b600081359050612b3881612b12565b92915050565b600060208284031215612b5457612b536129c7565b5b6000612b6284828501612b29565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612b9682612b6b565b9050919050565b612ba681612b8b565b82525050565b6000602082019050612bc16000830184612b9d565b92915050565b612bd081612b8b565b8114612bdb57600080fd5b50565b600081359050612bed81612bc7565b92915050565b60008060408385031215612c0a57612c096129c7565b5b6000612c1885828601612bde565b9250506020612c2985828601612b29565b9150509250929050565b612c3c81612b08565b82525050565b6000602082019050612c576000830184612c33565b92915050565b600060208284031215612c7357612c726129c7565b5b6000612c8184828501612bde565b91505092915050565b600080600060608486031215612ca357612ca26129c7565b5b6000612cb186828701612bde565b9350506020612cc286828701612bde565b9250506040612cd386828701612b29565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612d1f82612a9c565b810181811067ffffffffffffffff82111715612d3e57612d3d612ce7565b5b80604052505050565b6000612d516129bd565b9050612d5d8282612d16565b919050565b600067ffffffffffffffff821115612d7d57612d7c612ce7565b5b612d8682612a9c565b9050602081019050919050565b82818337600083830152505050565b6000612db5612db084612d62565b612d47565b905082815260208101848484011115612dd157612dd0612ce2565b5b612ddc848285612d93565b509392505050565b600082601f830112612df957612df8612cdd565b5b8135612e09848260208601612da2565b91505092915050565b600060208284031215612e2857612e276129c7565b5b600082013567ffffffffffffffff811115612e4657612e456129cc565b5b612e5284828501612de4565b91505092915050565b612e6481612987565b8114612e6f57600080fd5b50565b600081359050612e8181612e5b565b92915050565b60008060408385031215612e9e57612e9d6129c7565b5b6000612eac85828601612e72565b925050602083013567ffffffffffffffff811115612ecd57612ecc6129cc565b5b612ed985828601612de4565b9150509250929050565b60008060408385031215612efa57612ef96129c7565b5b6000612f0885828601612bde565b9250506020612f1985828601612e72565b9150509250929050565b600067ffffffffffffffff821115612f3e57612f3d612ce7565b5b612f4782612a9c565b9050602081019050919050565b6000612f67612f6284612f23565b612d47565b905082815260208101848484011115612f8357612f82612ce2565b5b612f8e848285612d93565b509392505050565b600082601f830112612fab57612faa612cdd565b5b8135612fbb848260208601612f54565b91505092915050565b60008060008060808587031215612fde57612fdd6129c7565b5b6000612fec87828801612bde565b9450506020612ffd87828801612bde565b935050604061300e87828801612b29565b925050606085013567ffffffffffffffff81111561302f5761302e6129cc565b5b61303b87828801612f96565b91505092959194509250565b6000806040838503121561305e5761305d6129c7565b5b600061306c85828601612bde565b925050602061307d85828601612bde565b9150509250929050565b6000806040838503121561309e5761309d6129c7565b5b60006130ac85828601612b29565b92505060206130bd85828601612bde565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061310e57607f821691505b602082108103613121576131206130c7565b5b50919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600061315d601f83612a61565b915061316882613127565b602082019050919050565b6000602082019050818103600083015261318c81613150565b9050919050565b600081905092915050565b50565b60006131ae600083613193565b91506131b98261319e565b600082019050919050565b60006131cf826131a1565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b600061320f601083612a61565b915061321a826131d9565b602082019050919050565b6000602082019050818103600083015261323e81613202565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026132a77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261326a565b6132b1868361326a565b95508019841693508086168417925050509392505050565b6000819050919050565b60006132ee6132e96132e484612b08565b6132c9565b612b08565b9050919050565b6000819050919050565b613308836132d3565b61331c613314826132f5565b848454613277565b825550505050565b600090565b613331613324565b61333c8184846132ff565b505050565b5b8181101561336057613355600082613329565b600181019050613342565b5050565b601f8211156133a55761337681613245565b61337f8461325a565b8101602085101561338e578190505b6133a261339a8561325a565b830182613341565b50505b505050565b600082821c905092915050565b60006133c8600019846008026133aa565b1980831691505092915050565b60006133e183836133b7565b9150826002028217905092915050565b6133fa82612a56565b67ffffffffffffffff81111561341357613412612ce7565b5b61341d82546130f6565b613428828285613364565b600060209050601f83116001811461345b5760008415613449578287015190505b61345385826133d5565b8655506134bb565b601f19841661346986613245565b60005b828110156134915784890151825560018201915060208501945060208101905061346c565b868310156134ae57848901516134aa601f8916826133b7565b8355505b6001600288020188555050505b505050505050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b60006134f9601e83612a61565b9150613504826134c3565b602082019050919050565b60006020820190508181036000830152613528816134ec565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061356982612b08565b915061357483612b08565b925082820390508181111561358c5761358b61352f565b5b92915050565b600061359d82612b08565b91506135a883612b08565b92508282026135b681612b08565b915082820484148315176135cd576135cc61352f565b5b5092915050565b60006135df82612b08565b91506135ea83612b08565b92508282019050808211156136025761360161352f565b5b92915050565b7f4d696e74206e6f74207265616479207965742100000000000000000000000000600082015250565b600061363e601383612a61565b915061364982613608565b602082019050919050565b6000602082019050818103600083015261366d81613631565b9050919050565b7f4e6f206d6f72652041706572696c6c6173206c65667421000000000000000000600082015250565b60006136aa601783612a61565b91506136b582613674565b602082019050919050565b600060208201905081810360008301526136d98161369d565b9050919050565b7f547269656420746f206d696e74206f766572206f766572206c696d6974000000600082015250565b6000613716601d83612a61565b9150613721826136e0565b602082019050919050565b6000602082019050818103600083015261374581613709565b9050919050565b7f547269656420746f206d696e74206f766572206c696d69742c2072657472792060008201527f776974682072656475636564207175616e746974790000000000000000000000602082015250565b60006137a8603583612a61565b91506137b38261374c565b604082019050919050565b600060208201905081810360008301526137d78161379b565b9050919050565b7f4d7573742073656e64206d6f7265206d6f6e6579210000000000000000000000600082015250565b6000613814601583612a61565b915061381f826137de565b602082019050919050565b6000602082019050818103600083015261384381613807565b9050919050565b600081905092915050565b60008154613862816130f6565b61386c818661384a565b94506001821660008114613887576001811461389c576138cf565b60ff19831686528115158202860193506138cf565b6138a585613245565b60005b838110156138c7578154818901526001820191506020810190506138a8565b838801955050505b50505092915050565b60006138e382612a56565b6138ed818561384a565b93506138fd818560208601612a72565b80840191505092915050565b60006139158285613855565b915061392182846138d8565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613989602683612a61565b91506139948261392d565b604082019050919050565b600060208201905081810360008301526139b88161397c565b9050919050565b7f4e6f206d6f72652041706572696c6c6120696e2073746f636b21000000000000600082015250565b60006139f5601a83612a61565b9150613a00826139bf565b602082019050919050565b60006020820190508181036000830152613a24816139e8565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613a61602083612a61565b9150613a6c82613a2b565b602082019050919050565b60006020820190508181036000830152613a9081613a54565b9050919050565b6000613aa282612b08565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613ad457613ad361352f565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613b1982612b08565b9150613b2483612b08565b925082613b3457613b33613adf565b5b828204905092915050565b6000613b4a82612b08565b9150613b5583612b08565b925082613b6557613b64613adf565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000613bc682613b9f565b613bd08185613baa565b9350613be0818560208601612a72565b613be981612a9c565b840191505092915050565b6000608082019050613c096000830187612b9d565b613c166020830186612b9d565b613c236040830185612c33565b8181036060830152613c358184613bbb565b905095945050505050565b600081519050613c4f816129fd565b92915050565b600060208284031215613c6b57613c6a6129c7565b5b6000613c7984828501613c40565b9150509291505056fea26469706673582212207b7a07f6781fb8bb6b84b55b84c23cc1c4e649f38c8169bd8e2c6cf5f63412cc64736f6c63430008120033

Deployed Bytecode Sourcemap

30560:4602:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30889:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14590:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14842:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18418:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18002:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31076:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12953:180;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30670:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34259:161;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33119:191;;;;;;;;;;;;;:::i;:::-;;34426:169;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30431:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30741:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33580:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30636:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31039:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15490:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13418:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;948:103;;;;;;;;;;;;;:::i;:::-;;33318:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33700:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;713:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14950:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31901:1094;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33922:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18644:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33001:110;;;;;;;;;;;;;:::i;:::-;;30718:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34601:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30969:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34155:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34816:341;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31005:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30931:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30777:109;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31569:324;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33475:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18886:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1061:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31173:259;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34040:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33814:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30889:39;;;;;;;;;;;;;:::o;14590:244::-;14675:4;14729:10;14714:25;;:11;:25;;;;:68;;;;14772:10;14757:25;;:11;:25;;;;14714:68;:111;;;;14815:10;14800:25;;:11;:25;;;;14714:111;14694:131;;14590:244;;;:::o;14842:100::-;14896:13;14929:5;14922:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14842:100;:::o;18418:218::-;18494:7;18519:16;18527:7;18519;:16::i;:::-;18514:64;;18544:34;;;;;;;;;;;;;;18514:64;18598:15;:24;18614:7;18598:24;;;;;;;;;;;:30;;;;;;;;;;;;18591:37;;18418:218;;;:::o;18002:408::-;18091:13;18107:16;18115:7;18107;:16::i;:::-;18091:32;;18163:5;18140:28;;:19;:17;:19::i;:::-;:28;;;18136:175;;18188:44;18205:5;18212:19;:17;:19::i;:::-;18188:16;:44::i;:::-;18183:128;;18260:35;;;;;;;;;;;;;;18183:128;18136:175;18356:2;18323:15;:24;18339:7;18323:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;18394:7;18390:2;18374:28;;18383:5;18374:28;;;;;;;;;;;;18080:330;18002:408;;:::o;31076:38::-;;;;:::o;12953:180::-;13014:7;13099:15;:13;:15::i;:::-;13084:12;;13068:13;;:28;:46;13061:53;;12953:180;:::o;30670:45::-;;;;;;;;;;;;;;;;;:::o;34259:161::-;34375:37;34394:4;34400:2;34404:7;34375:18;:37::i;:::-;34259:161;;;:::o;33119:191::-;672:13;:11;:13::i;:::-;1622:1:::1;1780:7;;:19:::0;1772:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;1622:1;1848:7;:18;;;;33188:12:::2;33206:10;:15;;33229:21;33206:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33187:68;;;33274:7;33266:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;33176:134;1578:1:::1;1893:7;:22;;;;33119:191::o:0;34426:169::-;34546:41;34569:4;34575:2;34579:7;34546:22;:41::i;:::-;34426:169;;;:::o;30431:94::-;30497:20;30503:7;30512:4;30497:5;:20::i;:::-;30431:94;:::o;30741:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;33580:112::-;672:13;:11;:13::i;:::-;33672:12:::1;33657;:27;;;;;;:::i;:::-;;33580:112:::0;:::o;30636:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31039:34::-;;;;:::o;15490:152::-;15562:7;15605:27;15624:7;15605:18;:27::i;:::-;15582:52;;15490:152;;;:::o;13418:233::-;13490:7;13531:1;13514:19;;:5;:19;;;13510:60;;13542:28;;;;;;;;;;;;;;13510:60;11226:13;13588:18;:25;13607:5;13588:25;;;;;;;;;;;;;;;;:55;13581:62;;13418:233;;;:::o;948:103::-;672:13;:11;:13::i;:::-;1013:30:::1;1040:1;1013:18;:30::i;:::-;948:103::o:0;33318:149::-;672:13;:11;:13::i;:::-;33420:8:::1;33409;:19;;;;;;:::i;:::-;;33450:9;33439:8;;:20;;;;;;;;;;;;;;;;;;33318:149:::0;;:::o;33700:106::-;672:13;:11;:13::i;:::-;33794:4:::1;33776:15;:22;;;;33700:106:::0;:::o;713:87::-;759:7;786:6;;;;;;;;;;;779:13;;713:87;:::o;14950:104::-;15006:13;15039:7;15032:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14950:104;:::o;31901:1094::-;31496:10;31483:23;;:9;:23;;;31475:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;1622:1:::1;1780:7;;:19:::0;1772:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;1622:1;1848:7;:18;;;;32026:10:::2;32047:9:::0;32084:13:::2;:25;32098:10;32084:25;;;;;;;;;;;;;;;;32059:22;;:50;;;;:::i;:::-;32047:62;;32136:4;32124:8;:16;32120:285;;32192:4;32181:8;:15;;;;:::i;:::-;32166:10;;32165:32;;;;:::i;:::-;32157:40;;32268:4;32240:13;:25;32254:10;32240:25;;;;;;;;;;;;;;;;:32;;;;:::i;:::-;32212:13;:25;32226:10;32212:25;;;;;;;;;;;;;;;:60;;;;32120:285;;;32313:1;32305:9;;32385:8;32357:13;:25;32371:10;32357:25;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;32329:13;:25;32343:10;32329:25;;;;;;;;;;;;;;;:64;;;;32120:285;32425:19;;;;;;;;;;;32417:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;32515:15;;32503:8;32487:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:43;;32479:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;32615:17;;32603:8;32579:21;32589:10;32579:9;:21::i;:::-;:32;;;;:::i;:::-;:53;;32571:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;32699:14;;32687:8;:26;;32679:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;32803:5;32790:9;:18;;32782:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;32847:31;32857:10;32869:8;32847:9;:31::i;:::-;32907:5;32895:9;:17;32891:97;;;32937:10;32929:28;;:47;32970:5;32958:9;:17;;;;:::i;:::-;32929:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;32891:97;32015:980;;1578:1:::1;1893:7;:22;;;;31901:1094:::0;:::o;33922:110::-;672:13;:11;:13::i;:::-;34020:4:::1;33995:22;:29;;;;33922:110:::0;:::o;18644:234::-;18791:8;18739:18;:39;18758:19;:17;:19::i;:::-;18739:39;;;;;;;;;;;;;;;:49;18779:8;18739:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;18851:8;18815:55;;18830:19;:17;:19::i;:::-;18815:55;;;18861:8;18815:55;;;;;;:::i;:::-;;;;;;;;18644:234;;:::o;33001:110::-;672:13;:11;:13::i;:::-;33084:19:::1;;;;;;;;;;;33083:20;33061:19;;:42;;;;;;;;;;;;;;;;;;33001:110::o:0;30718:20::-;;;;;;;;;;;;;:::o;34601:207::-;34754:47;34777:4;34783:2;34787:7;34796:4;34754:22;:47::i;:::-;34601:207;;;;:::o;30969:32::-;;;;:::o;34155:98::-;672:13;:11;:13::i;:::-;34241:4:::1;34224:14;:21;;;;34155:98:::0;:::o;34816:341::-;34938:13;34973:8;;;;;;;;;;;34969:181;;;35046:8;35056:26;35073:8;35056:16;:26::i;:::-;35029:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;34998:86;;;;34969:181;35124:14;35117:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34816:341;;;;:::o;31005:31::-;;;;:::o;30931:34::-;;;;:::o;30777:109::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31569:324::-;31622:4;31638:10;31659:9;31696:13;:25;31710:10;31696:25;;;;;;;;;;;;;;;;31671:22;;:50;;;;:::i;:::-;31659:62;;31748:4;31736:8;:16;31732:131;;31804:4;31793:8;:15;;;;:::i;:::-;31778:10;;31777:32;;;;:::i;:::-;31769:40;;31732:131;;;31850:1;31842:9;;31732:131;31880:5;31873:12;;;;31569:324;;;:::o;33475:97::-;33519:13;33552:12;33545:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33475:97;:::o;18886:164::-;18983:4;19007:18;:25;19026:5;19007:25;;;;;;;;;;;;;;;:35;19033:8;19007:35;;;;;;;;;;;;;;;;;;;;;;;;;19000:42;;18886:164;;;;:::o;1061:201::-;672:13;:11;:13::i;:::-;1170:1:::1;1150:22;;:8;:22;;::::0;1142:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;1226:28;1245:8;1226:18;:28::i;:::-;1061:201:::0;:::o;31173:259::-;672:13;:11;:13::i;:::-;31305:15:::1;;31293:8;31277:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:43;;31255:119;;;;;;;;;;;;:::i;:::-;;;;;;;;;31395:29;31405:8;31415;31395:9;:29::i;:::-;31173:259:::0;;:::o;34040:107::-;672:13;:11;:13::i;:::-;34135:4:::1;34115:17;:24;;;;34040:107:::0;:::o;33814:100::-;672:13;:11;:13::i;:::-;33897:9:::1;33884:10;:22;;;;33814:100:::0;:::o;19058:282::-;19123:4;19179:7;19160:15;:13;:15::i;:::-;:26;;:66;;;;;19213:13;;19203:7;:23;19160:66;:153;;;;;19312:1;11600:8;19264:17;:26;19282:7;19264:26;;;;;;;;;;;;:44;:49;19160:153;19140:173;;19058:282;;;:::o;29438:105::-;29498:7;29525:10;29518:17;;29438:105;:::o;12742:92::-;12798:7;12742:92;:::o;20153:1651::-;20295:27;20325;20344:7;20325:18;:27::i;:::-;20295:57;;20410:4;20369:45;;20385:19;20369:45;;;20365:86;;20423:28;;;;;;;;;;;;;;20365:86;20465:27;20494:23;20521:35;20548:7;20521:26;:35::i;:::-;20464:92;;;;20574:68;20599:15;20616:4;20622:19;:17;:19::i;:::-;20574:24;:68::i;:::-;20569:180;;20662:43;20679:4;20685:19;:17;:19::i;:::-;20662:16;:43::i;:::-;20657:92;;20714:35;;;;;;;;;;;;;;20657:92;20569:180;20780:1;20766:16;;:2;:16;;;20762:52;;20791:23;;;;;;;;;;;;;;20762:52;20827:43;20849:4;20855:2;20859:7;20868:1;20827:21;:43::i;:::-;20910:15;20907:85;;;20975:1;20954:19;20947:30;20907:85;21044:18;:24;21063:4;21044:24;;;;;;;;;;;;;;;;21042:26;;;;;;;;;;;;21086:18;:22;21105:2;21086:22;;;;;;;;;;;;;;;;21084:24;;;;;;;;;;;21155:146;21192:2;21241:45;21256:4;21262:2;21266:19;21241:14;:45::i;:::-;11734:8;21213:73;21155:18;:146::i;:::-;21126:17;:26;21144:7;21126:26;;;;;;;;;;;:175;;;;21373:1;11734:8;21322:19;:47;:52;21318:370;;21395:19;21427:1;21417:7;:11;21395:33;;21487:1;21453:17;:30;21471:11;21453:30;;;;;;;;;;;;:35;21449:224;;21534:13;;21519:11;:28;21515:139;;21611:19;21578:17;:30;21596:11;21578:30;;;;;;;;;;;:52;;;;21515:139;21449:224;21376:312;21318:370;21735:7;21731:2;21716:27;;21725:4;21716:27;;;;;;;;;;;;21754:42;21775:4;21781:2;21785:7;21794:1;21754:20;:42::i;:::-;20284:1520;;;20153:1651;;;:::o;808:132::-;883:12;:10;:12::i;:::-;872:23;;:7;:5;:7::i;:::-;:23;;;864:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;808:132::o;21812:193::-;21958:39;21975:4;21981:2;21985:7;21958:39;;;;;;;;;;;;:16;:39::i;:::-;21812:193;;;:::o;26808:1679::-;26888:27;26918;26937:7;26918:18;:27::i;:::-;26888:57;;26958:12;26989:19;26958:52;;27024:27;27053:23;27080:35;27107:7;27080:26;:35::i;:::-;27023:92;;;;27132:13;27128:244;;;27181:68;27206:15;27223:4;27229:19;:17;:19::i;:::-;27181:24;:68::i;:::-;27176:184;;27273:43;27290:4;27296:19;:17;:19::i;:::-;27273:16;:43::i;:::-;27268:92;;27325:35;;;;;;;;;;;;;;27268:92;27176:184;27128:244;27384:51;27406:4;27420:1;27424:7;27433:1;27384:21;:51::i;:::-;27475:15;27472:101;;;27556:1;27535:19;27528:30;27472:101;27682:1;11357:3;27652:1;:26;;27651:32;27623:18;:24;27642:4;27623:24;;;;;;;;;;;;;;;;:60;;;;;;;;;;;27729:176;27766:4;27837:53;27852:4;27866:1;27870:19;27837:14;:53::i;:::-;11734:8;11600;27790:43;27789:101;27729:18;:176::i;:::-;27700:17;:26;27718:7;27700:26;;;;;;;;;;;:205;;;;27977:1;11734:8;27926:19;:47;:52;27922:370;;27999:19;28031:1;28021:7;:11;27999:33;;28091:1;28057:17;:30;28075:11;28057:30;;;;;;;;;;;;:35;28053:224;;28138:13;;28123:11;:28;28119:139;;28215:19;28182:17;:30;28200:11;28182:30;;;;;;;;;;;:52;;;;28119:139;28053:224;27980:312;27922:370;28347:7;28343:1;28320:35;;28329:4;28320:35;;;;;;;;;;;;28366:50;28387:4;28401:1;28405:7;28414:1;28366:20;:50::i;:::-;28454:12;;:14;;;;;;;;;;;;;26877:1610;;;;26808:1679;;:::o;16197:633::-;16264:7;16284:12;16299:7;16284:22;;16367:4;16348:15;:13;:15::i;:::-;:23;16344:419;;16401:13;;16394:4;:20;16390:373;;;16439:14;16456:17;:23;16474:4;16456:23;;;;;;;;;;;;16439:40;;16536:1;11600:8;16508:6;:24;:29;16504:240;;16568:113;16585:1;16575:6;:11;16568:113;;16628:17;:25;16646:6;;;;;;;16628:25;;;;;;;;;;;;16619:34;;16568:113;;;16714:6;16707:13;;;;;;16504:240;16416:347;16390:373;16344:419;16791:31;;;;;;;;;;;;;;16197:633;;;;:::o;1270:191::-;1344:16;1363:6;;;;;;;;;;;1344:25;;1389:8;1380:6;;:17;;;;;;;;;;;;;;;;;;1444:8;1413:40;;1434:8;1413:40;;;;;;;;;;;;1333:128;1270:191;:::o;26591:112::-;26668:27;26678:2;26682:8;26668:27;;;;;;;;;;;;:9;:27::i;:::-;26591:112;;:::o;22013:407::-;22188:31;22201:4;22207:2;22211:7;22188:12;:31::i;:::-;22252:1;22234:2;:14;;;:19;22230:183;;22273:56;22304:4;22310:2;22314:7;22323:5;22273:30;:56::i;:::-;22268:145;;22357:40;;;;;;;;;;;;;;22268:145;22230:183;22013:407;;;;:::o;2097:534::-;2153:13;2194:1;2185:5;:10;2181:53;;2212:10;;;;;;;;;;;;;;;;;;;;;2181:53;2244:12;2259:5;2244:20;;2275:14;2300:78;2315:1;2307:4;:9;2300:78;;2333:8;;;;;:::i;:::-;;;;2364:2;2356:10;;;;;:::i;:::-;;;2300:78;;;2388:19;2420:6;2410:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2388:39;;2438:154;2454:1;2445:5;:10;2438:154;;2482:1;2472:11;;;;;:::i;:::-;;;2549:2;2541:5;:10;;;;:::i;:::-;2528:2;:24;;;;:::i;:::-;2515:39;;2498:6;2505;2498:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;2578:2;2569:11;;;;;:::i;:::-;;;2438:154;;;2616:6;2602:21;;;;;2097:534;;;;:::o;19753:392::-;19855:27;19884:23;19925:38;19966:15;:24;19982:7;19966:24;;;;;;;;;;;19925:65;;20050:18;20027:41;;20107:19;20101:26;20082:45;;20012:126;19753:392;;;:::o;19348:397::-;19497:11;19567:16;19560:5;19556:28;19547:37;;19628:16;19617:9;19613:32;19600:45;;19710:15;19699:9;19696:30;19688:5;19677:9;19674:20;19671:56;19661:66;;19348:397;;;;;:::o;22428:159::-;;;;;:::o;29119:311::-;29254:7;29274:16;11797:3;29300:19;:41;;29274:68;;11797:3;29368:31;29379:4;29385:2;29389:9;29368:10;:31::i;:::-;29360:40;;:62;;29353:69;;;29119:311;;;;;:::o;17212:450::-;17292:14;17460:16;17453:5;17449:28;17440:37;;17637:5;17623:11;17598:23;17594:41;17591:52;17584:5;17581:63;17571:73;;17212:450;;;;:::o;22595:158::-;;;;;:::o;161:98::-;214:7;241:10;234:17;;161:98;:::o;25894:689::-;26025:19;26031:2;26035:8;26025:5;:19::i;:::-;26104:1;26086:2;:14;;;:19;26082:483;;26126:11;26140:13;;26126:27;;26172:13;26194:8;26188:3;:14;26172:30;;26221:233;26252:62;26291:1;26295:2;26299:7;;;;;;26308:5;26252:30;:62::i;:::-;26247:167;;26350:40;;;;;;;;;;;;;;26247:167;26449:3;26441:5;:11;26221:233;;26536:3;26519:13;;:20;26515:34;;26541:8;;;26515:34;26107:458;;26082:483;25894:689;;;:::o;22761:716::-;22924:4;22970:2;22945:45;;;22991:19;:17;:19::i;:::-;23012:4;23018:7;23027:5;22945:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;22941:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23245:1;23228:6;:13;:18;23224:235;;23274:40;;;;;;;;;;;;;;23224:235;23417:6;23411:13;23402:6;23398:2;23394:15;23387:38;22941:529;23114:54;;;23104:64;;;:6;:64;;;;23097:71;;;22761:716;;;;;;:::o;28964:147::-;29101:6;28964:147;;;;;:::o;23485:1442::-;23558:20;23581:13;;23558:36;;23621:1;23609:8;:13;23605:44;;23631:18;;;;;;;;;;;;;;23605:44;23662:61;23692:1;23696:2;23700:12;23714:8;23662:21;:61::i;:::-;23832:1;11297:2;23802:1;:26;;23801:32;23789:8;:45;23763:18;:22;23782:2;23763:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;23885:139;23922:2;23976:33;23999:1;24003:2;24007:1;23976:14;:33::i;:::-;23943:30;23964:8;23943:20;:30::i;:::-;:66;23885:18;:139::i;:::-;23851:17;:31;23869:12;23851:31;;;;;;;;;;;:173;;;;24041:16;24072:11;24101:8;24086:12;:23;24072:37;;24176:16;24172:2;24168:25;24156:37;;24396:12;24364:8;24339:1;24290:25;24265:1;24240;24213:215;24508:1;24494:12;24490:20;24448:279;24549:3;24540:7;24537:16;24448:279;;24700:7;24690:8;24687:1;24660:25;24657:1;24654;24649:59;24602:1;24593:7;24589:15;24578:26;;24448:279;;;24452:77;24772:1;24760:8;:13;24756:45;;24782:19;;;;;;;;;;;;;;24756:45;24834:3;24818:13;:19;;;;23736:1113;;24859:60;24888:1;24892:2;24896:12;24910:8;24859:20;:60::i;:::-;23547:1380;23485:1442;;:::o;17670:324::-;17740:14;17973:1;17963:8;17960:15;17934:24;17930:46;17920:56;;17670:324;;;:::o;7:90:1:-;41:7;84:5;77:13;70:21;59:32;;7:90;;;:::o;103:109::-;184:21;199:5;184:21;:::i;:::-;179:3;172:34;103:109;;:::o;218:210::-;305:4;343:2;332:9;328:18;320:26;;356:65;418:1;407:9;403:17;394:6;356:65;:::i;:::-;218:210;;;;:::o;434:75::-;467:6;500:2;494:9;484:19;;434:75;:::o;515:117::-;624:1;621;614:12;638:117;747:1;744;737:12;761:149;797:7;837:66;830:5;826:78;815:89;;761:149;;;:::o;916:120::-;988:23;1005:5;988:23;:::i;:::-;981:5;978:34;968:62;;1026:1;1023;1016:12;968:62;916:120;:::o;1042:137::-;1087:5;1125:6;1112:20;1103:29;;1141:32;1167:5;1141:32;:::i;:::-;1042:137;;;;:::o;1185:327::-;1243:6;1292:2;1280:9;1271:7;1267:23;1263:32;1260:119;;;1298:79;;:::i;:::-;1260:119;1418:1;1443:52;1487:7;1478:6;1467:9;1463:22;1443:52;:::i;:::-;1433:62;;1389:116;1185:327;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:329::-;5301:6;5350:2;5338:9;5329:7;5325:23;5321:32;5318:119;;;5356:79;;:::i;:::-;5318:119;5476:1;5501:53;5546:7;5537:6;5526:9;5522:22;5501:53;:::i;:::-;5491:63;;5447:117;5242:329;;;;:::o;5577:619::-;5654:6;5662;5670;5719:2;5707:9;5698:7;5694:23;5690:32;5687:119;;;5725:79;;:::i;:::-;5687:119;5845:1;5870:53;5915:7;5906:6;5895:9;5891:22;5870:53;:::i;:::-;5860:63;;5816:117;5972:2;5998:53;6043:7;6034:6;6023:9;6019:22;5998:53;:::i;:::-;5988:63;;5943:118;6100:2;6126:53;6171:7;6162:6;6151:9;6147:22;6126:53;:::i;:::-;6116:63;;6071:118;5577:619;;;;;:::o;6202:117::-;6311:1;6308;6301:12;6325:117;6434:1;6431;6424:12;6448:180;6496:77;6493:1;6486:88;6593:4;6590:1;6583:15;6617:4;6614:1;6607:15;6634:281;6717:27;6739:4;6717:27;:::i;:::-;6709:6;6705:40;6847:6;6835:10;6832:22;6811:18;6799:10;6796:34;6793:62;6790:88;;;6858:18;;:::i;:::-;6790:88;6898:10;6894:2;6887:22;6677:238;6634:281;;:::o;6921:129::-;6955:6;6982:20;;:::i;:::-;6972:30;;7011:33;7039:4;7031:6;7011:33;:::i;:::-;6921:129;;;:::o;7056:308::-;7118:4;7208:18;7200:6;7197:30;7194:56;;;7230:18;;:::i;:::-;7194:56;7268:29;7290:6;7268:29;:::i;:::-;7260:37;;7352:4;7346;7342:15;7334:23;;7056:308;;;:::o;7370:146::-;7467:6;7462:3;7457;7444:30;7508:1;7499:6;7494:3;7490:16;7483:27;7370:146;;;:::o;7522:425::-;7600:5;7625:66;7641:49;7683:6;7641:49;:::i;:::-;7625:66;:::i;:::-;7616:75;;7714:6;7707:5;7700:21;7752:4;7745:5;7741:16;7790:3;7781:6;7776:3;7772:16;7769:25;7766:112;;;7797:79;;:::i;:::-;7766:112;7887:54;7934:6;7929:3;7924;7887:54;:::i;:::-;7606:341;7522:425;;;;;:::o;7967:340::-;8023:5;8072:3;8065:4;8057:6;8053:17;8049:27;8039:122;;8080:79;;:::i;:::-;8039:122;8197:6;8184:20;8222:79;8297:3;8289:6;8282:4;8274:6;8270:17;8222:79;:::i;:::-;8213:88;;8029:278;7967:340;;;;:::o;8313:509::-;8382:6;8431:2;8419:9;8410:7;8406:23;8402:32;8399:119;;;8437:79;;:::i;:::-;8399:119;8585:1;8574:9;8570:17;8557:31;8615:18;8607:6;8604:30;8601:117;;;8637:79;;:::i;:::-;8601:117;8742:63;8797:7;8788:6;8777:9;8773:22;8742:63;:::i;:::-;8732:73;;8528:287;8313:509;;;;:::o;8828:116::-;8898:21;8913:5;8898:21;:::i;:::-;8891:5;8888:32;8878:60;;8934:1;8931;8924:12;8878:60;8828:116;:::o;8950:133::-;8993:5;9031:6;9018:20;9009:29;;9047:30;9071:5;9047:30;:::i;:::-;8950:133;;;;:::o;9089:648::-;9164:6;9172;9221:2;9209:9;9200:7;9196:23;9192:32;9189:119;;;9227:79;;:::i;:::-;9189:119;9347:1;9372:50;9414:7;9405:6;9394:9;9390:22;9372:50;:::i;:::-;9362:60;;9318:114;9499:2;9488:9;9484:18;9471:32;9530:18;9522:6;9519:30;9516:117;;;9552:79;;:::i;:::-;9516:117;9657:63;9712:7;9703:6;9692:9;9688:22;9657:63;:::i;:::-;9647:73;;9442:288;9089:648;;;;;:::o;9743:468::-;9808:6;9816;9865:2;9853:9;9844:7;9840:23;9836:32;9833:119;;;9871:79;;:::i;:::-;9833:119;9991:1;10016:53;10061:7;10052:6;10041:9;10037:22;10016:53;:::i;:::-;10006:63;;9962:117;10118:2;10144:50;10186:7;10177:6;10166:9;10162:22;10144:50;:::i;:::-;10134:60;;10089:115;9743:468;;;;;:::o;10217:307::-;10278:4;10368:18;10360:6;10357:30;10354:56;;;10390:18;;:::i;:::-;10354:56;10428:29;10450:6;10428:29;:::i;:::-;10420:37;;10512:4;10506;10502:15;10494:23;;10217:307;;;:::o;10530:423::-;10607:5;10632:65;10648:48;10689:6;10648:48;:::i;:::-;10632:65;:::i;:::-;10623:74;;10720:6;10713:5;10706:21;10758:4;10751:5;10747:16;10796:3;10787:6;10782:3;10778:16;10775:25;10772:112;;;10803:79;;:::i;:::-;10772:112;10893:54;10940:6;10935:3;10930;10893:54;:::i;:::-;10613:340;10530:423;;;;;:::o;10972:338::-;11027:5;11076:3;11069:4;11061:6;11057:17;11053:27;11043:122;;11084:79;;:::i;:::-;11043:122;11201:6;11188:20;11226:78;11300:3;11292:6;11285:4;11277:6;11273:17;11226:78;:::i;:::-;11217:87;;11033:277;10972:338;;;;:::o;11316:943::-;11411:6;11419;11427;11435;11484:3;11472:9;11463:7;11459:23;11455:33;11452:120;;;11491:79;;:::i;:::-;11452:120;11611:1;11636:53;11681:7;11672:6;11661:9;11657:22;11636:53;:::i;:::-;11626:63;;11582:117;11738:2;11764:53;11809:7;11800:6;11789:9;11785:22;11764:53;:::i;:::-;11754:63;;11709:118;11866:2;11892:53;11937:7;11928:6;11917:9;11913:22;11892:53;:::i;:::-;11882:63;;11837:118;12022:2;12011:9;12007:18;11994:32;12053:18;12045:6;12042:30;12039:117;;;12075:79;;:::i;:::-;12039:117;12180:62;12234:7;12225:6;12214:9;12210:22;12180:62;:::i;:::-;12170:72;;11965:287;11316:943;;;;;;;:::o;12265:474::-;12333:6;12341;12390:2;12378:9;12369:7;12365:23;12361:32;12358:119;;;12396:79;;:::i;:::-;12358:119;12516:1;12541:53;12586:7;12577:6;12566:9;12562:22;12541:53;:::i;:::-;12531:63;;12487:117;12643:2;12669:53;12714:7;12705:6;12694:9;12690:22;12669:53;:::i;:::-;12659:63;;12614:118;12265:474;;;;;:::o;12745:::-;12813:6;12821;12870:2;12858:9;12849:7;12845:23;12841:32;12838:119;;;12876:79;;:::i;:::-;12838:119;12996:1;13021:53;13066:7;13057:6;13046:9;13042:22;13021:53;:::i;:::-;13011:63;;12967:117;13123:2;13149:53;13194:7;13185:6;13174:9;13170:22;13149:53;:::i;:::-;13139:63;;13094:118;12745:474;;;;;:::o;13225:180::-;13273:77;13270:1;13263:88;13370:4;13367:1;13360:15;13394:4;13391:1;13384:15;13411:320;13455:6;13492:1;13486:4;13482:12;13472:22;;13539:1;13533:4;13529:12;13560:18;13550:81;;13616:4;13608:6;13604:17;13594:27;;13550:81;13678:2;13670:6;13667:14;13647:18;13644:38;13641:84;;13697:18;;:::i;:::-;13641:84;13462:269;13411:320;;;:::o;13737:181::-;13877:33;13873:1;13865:6;13861:14;13854:57;13737:181;:::o;13924:366::-;14066:3;14087:67;14151:2;14146:3;14087:67;:::i;:::-;14080:74;;14163:93;14252:3;14163:93;:::i;:::-;14281:2;14276:3;14272:12;14265:19;;13924:366;;;:::o;14296:419::-;14462:4;14500:2;14489:9;14485:18;14477:26;;14549:9;14543:4;14539:20;14535:1;14524:9;14520:17;14513:47;14577:131;14703:4;14577:131;:::i;:::-;14569:139;;14296:419;;;:::o;14721:147::-;14822:11;14859:3;14844:18;;14721:147;;;;:::o;14874:114::-;;:::o;14994:398::-;15153:3;15174:83;15255:1;15250:3;15174:83;:::i;:::-;15167:90;;15266:93;15355:3;15266:93;:::i;:::-;15384:1;15379:3;15375:11;15368:18;;14994:398;;;:::o;15398:379::-;15582:3;15604:147;15747:3;15604:147;:::i;:::-;15597:154;;15768:3;15761:10;;15398:379;;;:::o;15783:166::-;15923:18;15919:1;15911:6;15907:14;15900:42;15783:166;:::o;15955:366::-;16097:3;16118:67;16182:2;16177:3;16118:67;:::i;:::-;16111:74;;16194:93;16283:3;16194:93;:::i;:::-;16312:2;16307:3;16303:12;16296:19;;15955:366;;;:::o;16327:419::-;16493:4;16531:2;16520:9;16516:18;16508:26;;16580:9;16574:4;16570:20;16566:1;16555:9;16551:17;16544:47;16608:131;16734:4;16608:131;:::i;:::-;16600:139;;16327:419;;;:::o;16752:141::-;16801:4;16824:3;16816:11;;16847:3;16844:1;16837:14;16881:4;16878:1;16868:18;16860:26;;16752:141;;;:::o;16899:93::-;16936:6;16983:2;16978;16971:5;16967:14;16963:23;16953:33;;16899:93;;;:::o;16998:107::-;17042:8;17092:5;17086:4;17082:16;17061:37;;16998:107;;;;:::o;17111:393::-;17180:6;17230:1;17218:10;17214:18;17253:97;17283:66;17272:9;17253:97;:::i;:::-;17371:39;17401:8;17390:9;17371:39;:::i;:::-;17359:51;;17443:4;17439:9;17432:5;17428:21;17419:30;;17492:4;17482:8;17478:19;17471:5;17468:30;17458:40;;17187:317;;17111:393;;;;;:::o;17510:60::-;17538:3;17559:5;17552:12;;17510:60;;;:::o;17576:142::-;17626:9;17659:53;17677:34;17686:24;17704:5;17686:24;:::i;:::-;17677:34;:::i;:::-;17659:53;:::i;:::-;17646:66;;17576:142;;;:::o;17724:75::-;17767:3;17788:5;17781:12;;17724:75;;;:::o;17805:269::-;17915:39;17946:7;17915:39;:::i;:::-;17976:91;18025:41;18049:16;18025:41;:::i;:::-;18017:6;18010:4;18004:11;17976:91;:::i;:::-;17970:4;17963:105;17881:193;17805:269;;;:::o;18080:73::-;18125:3;18080:73;:::o;18159:189::-;18236:32;;:::i;:::-;18277:65;18335:6;18327;18321:4;18277:65;:::i;:::-;18212:136;18159:189;;:::o;18354:186::-;18414:120;18431:3;18424:5;18421:14;18414:120;;;18485:39;18522:1;18515:5;18485:39;:::i;:::-;18458:1;18451:5;18447:13;18438:22;;18414:120;;;18354:186;;:::o;18546:543::-;18647:2;18642:3;18639:11;18636:446;;;18681:38;18713:5;18681:38;:::i;:::-;18765:29;18783:10;18765:29;:::i;:::-;18755:8;18751:44;18948:2;18936:10;18933:18;18930:49;;;18969:8;18954:23;;18930:49;18992:80;19048:22;19066:3;19048:22;:::i;:::-;19038:8;19034:37;19021:11;18992:80;:::i;:::-;18651:431;;18636:446;18546:543;;;:::o;19095:117::-;19149:8;19199:5;19193:4;19189:16;19168:37;;19095:117;;;;:::o;19218:169::-;19262:6;19295:51;19343:1;19339:6;19331:5;19328:1;19324:13;19295:51;:::i;:::-;19291:56;19376:4;19370;19366:15;19356:25;;19269:118;19218:169;;;;:::o;19392:295::-;19468:4;19614:29;19639:3;19633:4;19614:29;:::i;:::-;19606:37;;19676:3;19673:1;19669:11;19663:4;19660:21;19652:29;;19392:295;;;;:::o;19692:1395::-;19809:37;19842:3;19809:37;:::i;:::-;19911:18;19903:6;19900:30;19897:56;;;19933:18;;:::i;:::-;19897:56;19977:38;20009:4;20003:11;19977:38;:::i;:::-;20062:67;20122:6;20114;20108:4;20062:67;:::i;:::-;20156:1;20180:4;20167:17;;20212:2;20204:6;20201:14;20229:1;20224:618;;;;20886:1;20903:6;20900:77;;;20952:9;20947:3;20943:19;20937:26;20928:35;;20900:77;21003:67;21063:6;21056:5;21003:67;:::i;:::-;20997:4;20990:81;20859:222;20194:887;;20224:618;20276:4;20272:9;20264:6;20260:22;20310:37;20342:4;20310:37;:::i;:::-;20369:1;20383:208;20397:7;20394:1;20391:14;20383:208;;;20476:9;20471:3;20467:19;20461:26;20453:6;20446:42;20527:1;20519:6;20515:14;20505:24;;20574:2;20563:9;20559:18;20546:31;;20420:4;20417:1;20413:12;20408:17;;20383:208;;;20619:6;20610:7;20607:19;20604:179;;;20677:9;20672:3;20668:19;20662:26;20720:48;20762:4;20754:6;20750:17;20739:9;20720:48;:::i;:::-;20712:6;20705:64;20627:156;20604:179;20829:1;20825;20817:6;20813:14;20809:22;20803:4;20796:36;20231:611;;;20194:887;;19784:1303;;;19692:1395;;:::o;21093:180::-;21233:32;21229:1;21221:6;21217:14;21210:56;21093:180;:::o;21279:366::-;21421:3;21442:67;21506:2;21501:3;21442:67;:::i;:::-;21435:74;;21518:93;21607:3;21518:93;:::i;:::-;21636:2;21631:3;21627:12;21620:19;;21279:366;;;:::o;21651:419::-;21817:4;21855:2;21844:9;21840:18;21832:26;;21904:9;21898:4;21894:20;21890:1;21879:9;21875:17;21868:47;21932:131;22058:4;21932:131;:::i;:::-;21924:139;;21651:419;;;:::o;22076:180::-;22124:77;22121:1;22114:88;22221:4;22218:1;22211:15;22245:4;22242:1;22235:15;22262:194;22302:4;22322:20;22340:1;22322:20;:::i;:::-;22317:25;;22356:20;22374:1;22356:20;:::i;:::-;22351:25;;22400:1;22397;22393:9;22385:17;;22424:1;22418:4;22415:11;22412:37;;;22429:18;;:::i;:::-;22412:37;22262:194;;;;:::o;22462:410::-;22502:7;22525:20;22543:1;22525:20;:::i;:::-;22520:25;;22559:20;22577:1;22559:20;:::i;:::-;22554:25;;22614:1;22611;22607:9;22636:30;22654:11;22636:30;:::i;:::-;22625:41;;22815:1;22806:7;22802:15;22799:1;22796:22;22776:1;22769:9;22749:83;22726:139;;22845:18;;:::i;:::-;22726:139;22510:362;22462:410;;;;:::o;22878:191::-;22918:3;22937:20;22955:1;22937:20;:::i;:::-;22932:25;;22971:20;22989:1;22971:20;:::i;:::-;22966:25;;23014:1;23011;23007:9;23000:16;;23035:3;23032:1;23029:10;23026:36;;;23042:18;;:::i;:::-;23026:36;22878:191;;;;:::o;23075:169::-;23215:21;23211:1;23203:6;23199:14;23192:45;23075:169;:::o;23250:366::-;23392:3;23413:67;23477:2;23472:3;23413:67;:::i;:::-;23406:74;;23489:93;23578:3;23489:93;:::i;:::-;23607:2;23602:3;23598:12;23591:19;;23250:366;;;:::o;23622:419::-;23788:4;23826:2;23815:9;23811:18;23803:26;;23875:9;23869:4;23865:20;23861:1;23850:9;23846:17;23839:47;23903:131;24029:4;23903:131;:::i;:::-;23895:139;;23622:419;;;:::o;24047:173::-;24187:25;24183:1;24175:6;24171:14;24164:49;24047:173;:::o;24226:366::-;24368:3;24389:67;24453:2;24448:3;24389:67;:::i;:::-;24382:74;;24465:93;24554:3;24465:93;:::i;:::-;24583:2;24578:3;24574:12;24567:19;;24226:366;;;:::o;24598:419::-;24764:4;24802:2;24791:9;24787:18;24779:26;;24851:9;24845:4;24841:20;24837:1;24826:9;24822:17;24815:47;24879:131;25005:4;24879:131;:::i;:::-;24871:139;;24598:419;;;:::o;25023:179::-;25163:31;25159:1;25151:6;25147:14;25140:55;25023:179;:::o;25208:366::-;25350:3;25371:67;25435:2;25430:3;25371:67;:::i;:::-;25364:74;;25447:93;25536:3;25447:93;:::i;:::-;25565:2;25560:3;25556:12;25549:19;;25208:366;;;:::o;25580:419::-;25746:4;25784:2;25773:9;25769:18;25761:26;;25833:9;25827:4;25823:20;25819:1;25808:9;25804:17;25797:47;25861:131;25987:4;25861:131;:::i;:::-;25853:139;;25580:419;;;:::o;26005:240::-;26145:34;26141:1;26133:6;26129:14;26122:58;26214:23;26209:2;26201:6;26197:15;26190:48;26005:240;:::o;26251:366::-;26393:3;26414:67;26478:2;26473:3;26414:67;:::i;:::-;26407:74;;26490:93;26579:3;26490:93;:::i;:::-;26608:2;26603:3;26599:12;26592:19;;26251:366;;;:::o;26623:419::-;26789:4;26827:2;26816:9;26812:18;26804:26;;26876:9;26870:4;26866:20;26862:1;26851:9;26847:17;26840:47;26904:131;27030:4;26904:131;:::i;:::-;26896:139;;26623:419;;;:::o;27048:171::-;27188:23;27184:1;27176:6;27172:14;27165:47;27048:171;:::o;27225:366::-;27367:3;27388:67;27452:2;27447:3;27388:67;:::i;:::-;27381:74;;27464:93;27553:3;27464:93;:::i;:::-;27582:2;27577:3;27573:12;27566:19;;27225:366;;;:::o;27597:419::-;27763:4;27801:2;27790:9;27786:18;27778:26;;27850:9;27844:4;27840:20;27836:1;27825:9;27821:17;27814:47;27878:131;28004:4;27878:131;:::i;:::-;27870:139;;27597:419;;;:::o;28022:148::-;28124:11;28161:3;28146:18;;28022:148;;;;:::o;28200:874::-;28303:3;28340:5;28334:12;28369:36;28395:9;28369:36;:::i;:::-;28421:89;28503:6;28498:3;28421:89;:::i;:::-;28414:96;;28541:1;28530:9;28526:17;28557:1;28552:166;;;;28732:1;28727:341;;;;28519:549;;28552:166;28636:4;28632:9;28621;28617:25;28612:3;28605:38;28698:6;28691:14;28684:22;28676:6;28672:35;28667:3;28663:45;28656:52;;28552:166;;28727:341;28794:38;28826:5;28794:38;:::i;:::-;28854:1;28868:154;28882:6;28879:1;28876:13;28868:154;;;28956:7;28950:14;28946:1;28941:3;28937:11;28930:35;29006:1;28997:7;28993:15;28982:26;;28904:4;28901:1;28897:12;28892:17;;28868:154;;;29051:6;29046:3;29042:16;29035:23;;28734:334;;28519:549;;28307:767;;28200:874;;;;:::o;29080:390::-;29186:3;29214:39;29247:5;29214:39;:::i;:::-;29269:89;29351:6;29346:3;29269:89;:::i;:::-;29262:96;;29367:65;29425:6;29420:3;29413:4;29406:5;29402:16;29367:65;:::i;:::-;29457:6;29452:3;29448:16;29441:23;;29190:280;29080:390;;;;:::o;29476:429::-;29653:3;29675:92;29763:3;29754:6;29675:92;:::i;:::-;29668:99;;29784:95;29875:3;29866:6;29784:95;:::i;:::-;29777:102;;29896:3;29889:10;;29476:429;;;;;:::o;29911:225::-;30051:34;30047:1;30039:6;30035:14;30028:58;30120:8;30115:2;30107:6;30103:15;30096:33;29911:225;:::o;30142:366::-;30284:3;30305:67;30369:2;30364:3;30305:67;:::i;:::-;30298:74;;30381:93;30470:3;30381:93;:::i;:::-;30499:2;30494:3;30490:12;30483:19;;30142:366;;;:::o;30514:419::-;30680:4;30718:2;30707:9;30703:18;30695:26;;30767:9;30761:4;30757:20;30753:1;30742:9;30738:17;30731:47;30795:131;30921:4;30795:131;:::i;:::-;30787:139;;30514:419;;;:::o;30939:176::-;31079:28;31075:1;31067:6;31063:14;31056:52;30939:176;:::o;31121:366::-;31263:3;31284:67;31348:2;31343:3;31284:67;:::i;:::-;31277:74;;31360:93;31449:3;31360:93;:::i;:::-;31478:2;31473:3;31469:12;31462:19;;31121:366;;;:::o;31493:419::-;31659:4;31697:2;31686:9;31682:18;31674:26;;31746:9;31740:4;31736:20;31732:1;31721:9;31717:17;31710:47;31774:131;31900:4;31774:131;:::i;:::-;31766:139;;31493:419;;;:::o;31918:182::-;32058:34;32054:1;32046:6;32042:14;32035:58;31918:182;:::o;32106:366::-;32248:3;32269:67;32333:2;32328:3;32269:67;:::i;:::-;32262:74;;32345:93;32434:3;32345:93;:::i;:::-;32463:2;32458:3;32454:12;32447:19;;32106:366;;;:::o;32478:419::-;32644:4;32682:2;32671:9;32667:18;32659:26;;32731:9;32725:4;32721:20;32717:1;32706:9;32702:17;32695:47;32759:131;32885:4;32759:131;:::i;:::-;32751:139;;32478:419;;;:::o;32903:233::-;32942:3;32965:24;32983:5;32965:24;:::i;:::-;32956:33;;33011:66;33004:5;33001:77;32998:103;;33081:18;;:::i;:::-;32998:103;33128:1;33121:5;33117:13;33110:20;;32903:233;;;:::o;33142:180::-;33190:77;33187:1;33180:88;33287:4;33284:1;33277:15;33311:4;33308:1;33301:15;33328:185;33368:1;33385:20;33403:1;33385:20;:::i;:::-;33380:25;;33419:20;33437:1;33419:20;:::i;:::-;33414:25;;33458:1;33448:35;;33463:18;;:::i;:::-;33448:35;33505:1;33502;33498:9;33493:14;;33328:185;;;;:::o;33519:176::-;33551:1;33568:20;33586:1;33568:20;:::i;:::-;33563:25;;33602:20;33620:1;33602:20;:::i;:::-;33597:25;;33641:1;33631:35;;33646:18;;:::i;:::-;33631:35;33687:1;33684;33680:9;33675:14;;33519:176;;;;:::o;33701:180::-;33749:77;33746:1;33739:88;33846:4;33843:1;33836:15;33870:4;33867:1;33860:15;33887:98;33938:6;33972:5;33966:12;33956:22;;33887:98;;;:::o;33991:168::-;34074:11;34108:6;34103:3;34096:19;34148:4;34143:3;34139:14;34124:29;;33991:168;;;;:::o;34165:373::-;34251:3;34279:38;34311:5;34279:38;:::i;:::-;34333:70;34396:6;34391:3;34333:70;:::i;:::-;34326:77;;34412:65;34470:6;34465:3;34458:4;34451:5;34447:16;34412:65;:::i;:::-;34502:29;34524:6;34502:29;:::i;:::-;34497:3;34493:39;34486:46;;34255:283;34165:373;;;;:::o;34544:640::-;34739:4;34777:3;34766:9;34762:19;34754:27;;34791:71;34859:1;34848:9;34844:17;34835:6;34791:71;:::i;:::-;34872:72;34940:2;34929:9;34925:18;34916:6;34872:72;:::i;:::-;34954;35022:2;35011:9;35007:18;34998:6;34954:72;:::i;:::-;35073:9;35067:4;35063:20;35058:2;35047:9;35043:18;35036:48;35101:76;35172:4;35163:6;35101:76;:::i;:::-;35093:84;;34544:640;;;;;;;:::o;35190:141::-;35246:5;35277:6;35271:13;35262:22;;35293:32;35319:5;35293:32;:::i;:::-;35190:141;;;;:::o;35337:349::-;35406:6;35455:2;35443:9;35434:7;35430:23;35426:32;35423:119;;;35461:79;;:::i;:::-;35423:119;35581:1;35606:63;35661:7;35652:6;35641:9;35637:22;35606:63;:::i;:::-;35596:73;;35552:127;35337:349;;;;:::o

Swarm Source

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