ETH Price: $2,647.97 (+0.31%)

Token

Night Bat Legends (NBL)
 

Overview

Max Total Supply

4,666 NBL

Holders

632

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
5 NBL
0x4bc335735112142d7c2aac5c8d156479987e1f1e
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
NightBats

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-10-29
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 ▄▀▀▄ ▀▄  ▄▀▀█▀▄    ▄▀▀▀▀▄   ▄▀▀▄ ▄▄   ▄▀▀▀█▀▀▄                   
█  █ █ █ █   █  █  █        █  █   ▄▀ █    █  ▐                   
▐  █  ▀█ ▐   █  ▐  █    ▀▄▄ ▐  █▄▄▄█  ▐   █                       
  █   █      █     █     █ █   █   █     █                        
▄▀   █    ▄▀▀▀▀▀▄  ▐▀▄▄▄▄▀ ▐  ▄▀  ▄▀   ▄▀                         
█    ▐   █       █ ▐         █   █    █                           
▐        ▐       ▐           ▐   ▐    ▐                           
 ▄▀▀█▄▄   ▄▀▀█▄   ▄▀▀▀█▀▀▄                                        
▐ ▄▀   █ ▐ ▄▀ ▀▄ █    █  ▐                                        
  █▄▄▄▀    █▄▄▄█ ▐   █                                            
  █   █   ▄▀   █    █                                             
 ▄▀▄▄▄▀  █   ▄▀   ▄▀                                              
█    ▐   ▐   ▐   █                                                
▐                ▐                                                
 ▄▀▀▀▀▄     ▄▀▀█▄▄▄▄  ▄▀▀▀▀▄   ▄▀▀█▄▄▄▄  ▄▀▀▄ ▀▄  ▄▀▀█▄▄   ▄▀▀▀▀▄ 
█    █     ▐  ▄▀   ▐ █        ▐  ▄▀   ▐ █  █ █ █ █ ▄▀   █ █ █   ▐ 
▐    █       █▄▄▄▄▄  █    ▀▄▄   █▄▄▄▄▄  ▐  █  ▀█ ▐ █    █    ▀▄   
    █        █    ▌  █     █ █  █    ▌    █   █    █    █ ▀▄   █  
  ▄▀▄▄▄▄▄▄▀ ▄▀▄▄▄▄   ▐▀▄▄▄▄▀ ▐ ▄▀▄▄▄▄   ▄▀   █    ▄▀▄▄▄▄▀  █▀▀▀   
  █         █    ▐   ▐         █    ▐   █    ▐   █     ▐   ▐      
  ▐         ▐                  ▐        ▐        ▐                
*/

// Contract developed by Bats
// Eeeeek! Squeak! Screeeech!

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() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

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

        _;

        _status = _NOT_ENTERED;
    }
}

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

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            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.13;

contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry constant operatorFilterRegistry =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {

        if (address(operatorFilterRegistry).code.length > 0) {
            if (subscribe) {
                operatorFilterRegistry.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    operatorFilterRegistry.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    operatorFilterRegistry.register(address(this));
                }
            }
        }
    }

    modifier onlyAllowedOperator() virtual {

        if (address(operatorFilterRegistry).code.length > 0) {
            if (!operatorFilterRegistry.isOperatorAllowed(address(this), msg.sender)) {
                revert OperatorNotAllowed(msg.sender);
            }
        }
        _;
    }
}

pragma solidity ^0.8.13;

contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}

pragma solidity ^0.8.13;

interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator) external returns (bool);
    function register(address registrant) external;
    function registerAndSubscribe(address registrant, address subscription) external;
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;
    function updateOperator(address registrant, address operator, bool filtered) external;
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
    function subscribe(address registrant, address registrantToSubscribe) external;
    function unsubscribe(address registrant, bool copyExistingEntries) external;
    function subscriptionOf(address addr) external returns (address registrant);
    function subscribers(address registrant) external returns (address[] memory);
    function subscriberAt(address registrant, uint256 index) external returns (address);
    function copyEntriesOf(address registrant, address registrantToCopy) external;
    function isOperatorFiltered(address registrant, address operator) external returns (bool);
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
    function filteredOperators(address addr) external returns (address[] memory);
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
    function isRegistered(address addr) external returns (bool);
    function codeHashOf(address addr) external returns (bytes32);
}

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.17;
contract NightBats is Ownable, ERC721A, ReentrancyGuard, ERC721ABurnable, DefaultOperatorFilterer{

string public CONTRACT_URI = "https://opensea.thebatlegends.xyz/";
    mapping(address => uint) public userHasMinted;
    bool public REVEALED;

    string public UNREVEALED_URI = "https://opensea.thebatlegends.xyz/";
    string public BASE_URI = "https://opensea.thebatlegends.xyz/";

    bool public isPublicMintEnabled = false;

    uint public COLLECTION_SIZE = 4666;
    uint public MINT_PRICE = 0.0004 ether;

    uint public MAX_BATCH_SIZE = 21;
    uint public SUPPLY_PER_WALLET = 50;
    uint public FREE_SUPPLY_PER_WALLET = 3;

    constructor() ERC721A("Night Bat Legends", "NBL") {}

    function Airdrop(uint256 quantity, address receiver) public onlyOwner {
        require(
            totalSupply() + quantity <= COLLECTION_SIZE,
            "No more NFTs 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, "NFTs not ready yet!");
        require(totalSupply() + quantity <= COLLECTION_SIZE, "No more NFTs!");

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

        require(quantity <= MAX_BATCH_SIZE, "Tried to mint quanity over limit, retry with reduced quantity");
        require(msg.value >= price, "Must send enough eth to adopt Bat");

        _safeMint(msg.sender, quantity);

        if (msg.value > price) {
            payable(msg.sender).transfer(msg.value - price);
        }
    }

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

    function setPublicMintEnabled() public onlyOwner {
        isPublicMintEnabled = !isPublicMintEnabled;
    }

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

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

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

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

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

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

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

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

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

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

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data)
        public payable
        override (ERC721A, IERC721A)
        onlyAllowedOperator
    {
        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":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","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":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"Airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"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":[],"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":[],"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":"bool","name":"_revealed","type":"bool"},{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_contractURI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setPublicMintEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_new","type":"uint256"}],"name":"set_COLLECTION_SIZE","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_new","type":"uint256"}],"name":"set_FREE_SUPPLY_PER_WALLET","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_new","type":"uint256"}],"name":"set_MAX_BATCH_SIZE","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_new","type":"uint256"}],"name":"set_SUPPLY_PER_WALLET","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"}]

60806040526040518060600160405280602281526020016200471b60229139600a90816200002e9190620006ce565b506040518060600160405280602281526020016200471b60229139600d9081620000599190620006ce565b506040518060600160405280602281526020016200471b60229139600e9081620000849190620006ce565b505f600f5f6101000a81548160ff02191690831515021790555061123a60105566016bcc41e90000601155601560125560326013556003601455348015620000ca575f80fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280601181526020017f4e6967687420426174204c6567656e64730000000000000000000000000000008152506040518060400160405280600381526020017f4e424c00000000000000000000000000000000000000000000000000000000008152506200016e620001626200039e60201b60201c565b620003a560201b60201c565b81600390816200017f9190620006ce565b508060049081620001919190620006ce565b50620001a26200046660201b60201c565b600181905550505060016009819055505f6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156200039657801562000267576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b815260040162000232929190620007f5565b5f604051808303815f87803b1580156200024a575f80fd5b505af11580156200025d573d5f803e3d5ffd5b5050505062000395565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146200031b576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b8152600401620002e6929190620007f5565b5f604051808303815f87803b158015620002fe575f80fd5b505af115801562000311573d5f803e3d5ffd5b5050505062000394565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b815260040162000364919062000820565b5f604051808303815f87803b1580156200037c575f80fd5b505af11580156200038f573d5f803e3d5ffd5b505050505b5b5b50506200083b565b5f33905090565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f90565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620004e657607f821691505b602082108103620004fc57620004fb620004a1565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302620005607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000523565b6200056c868362000523565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620005b6620005b0620005aa8462000584565b6200058d565b62000584565b9050919050565b5f819050919050565b620005d18362000596565b620005e9620005e082620005bd565b8484546200052f565b825550505050565b5f90565b620005ff620005f1565b6200060c818484620005c6565b505050565b5b818110156200063357620006275f82620005f5565b60018101905062000612565b5050565b601f82111562000682576200064c8162000502565b620006578462000514565b8101602085101562000667578190505b6200067f620006768562000514565b83018262000611565b50505b505050565b5f82821c905092915050565b5f620006a45f198460080262000687565b1980831691505092915050565b5f620006be838362000693565b9150826002028217905092915050565b620006d9826200046a565b67ffffffffffffffff811115620006f557620006f462000474565b5b620007018254620004ce565b6200070e82828562000637565b5f60209050601f83116001811462000744575f84156200072f578287015190505b6200073b8582620006b1565b865550620007aa565b601f198416620007548662000502565b5f5b828110156200077d5784890151825560018201915060208501945060208101905062000756565b868310156200079d578489015162000799601f89168262000693565b8355505b6001600288020188555050505b505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620007dd82620007b2565b9050919050565b620007ef81620007d1565b82525050565b5f6040820190506200080a5f830185620007e4565b620008196020830184620007e4565b9392505050565b5f602082019050620008355f830184620007e4565b92915050565b613ed280620008495f395ff3fe608060405260043610610250575f3560e01c80638da5cb5b11610138578063b88d4fde116100b5578063dbddb26a11610079578063dbddb26a14610814578063e113ad951461083e578063e757223014610866578063e8a3d485146108a2578063e985e9c5146108cc578063f2fde38b1461090857610250565b8063b88d4fde1461073e578063c002d23d1461075a578063c87b56dd14610784578063cfdbf254146107c0578063d8258d95146107ea57610250565b8063a0712d68116100fc578063a0712d6814610692578063a22cb465146106ae578063a4cdd719146106d6578063a76a9587146106ec578063a9527e821461071657610250565b80638da5cb5b146105c657806391b7f5ed146105f0578063938e3d7b1461061857806395d89b41146106405780639e1f39d61461066a57610250565b8063336f5ec3116101d15780635fe75587116101955780635fe75587146104be5780636352211e146104e857806363fa5bde1461052457806370a082311461054c578063715018a6146105885780637871e1541461059e57610250565b8063336f5ec3146103fe57806342842e0e1461042657806342966c6814610442578063507862d11461046a57806356b4f6731461049457610250565b80631422374f116102185780631422374f1461033c57806318160ddd146103665780631d9857781461039057806323b872dd146103cc57806324600fc3146103e857610250565b80630116bc2d1461025457806301ffc9a71461027e57806306fdde03146102ba578063081812fc146102e4578063095ea7b314610320575b5f80fd5b34801561025f575f80fd5b50610268610930565b6040516102759190612bab565b60405180910390f35b348015610289575f80fd5b506102a4600480360381019061029f9190612c2a565b610942565b6040516102b19190612bab565b60405180910390f35b3480156102c5575f80fd5b506102ce6109d3565b6040516102db9190612cdf565b60405180910390f35b3480156102ef575f80fd5b5061030a60048036038101906103059190612d32565b610a63565b6040516103179190612d9c565b60405180910390f35b61033a60048036038101906103359190612ddf565b610add565b005b348015610347575f80fd5b50610350610c1c565b60405161035d9190612e2c565b60405180910390f35b348015610371575f80fd5b5061037a610c22565b6040516103879190612e2c565b60405180910390f35b34801561039b575f80fd5b506103b660048036038101906103b19190612e45565b610c38565b6040516103c39190612e2c565b60405180910390f35b6103e660048036038101906103e19190612e70565b610c4d565b005b3480156103f3575f80fd5b506103fc610d55565b005b348015610409575f80fd5b50610424600480360381019061041f9190612d32565b610e5d565b005b610440600480360381019061043b9190612e70565b610e6f565b005b34801561044d575f80fd5b5061046860048036038101906104639190612d32565b610f77565b005b348015610475575f80fd5b5061047e610f85565b60405161048b9190612cdf565b60405180910390f35b34801561049f575f80fd5b506104a8611011565b6040516104b59190612cdf565b60405180910390f35b3480156104c9575f80fd5b506104d261109d565b6040516104df9190612e2c565b60405180910390f35b3480156104f3575f80fd5b5061050e60048036038101906105099190612d32565b6110a3565b60405161051b9190612d9c565b60405180910390f35b34801561052f575f80fd5b5061054a60048036038101906105459190612d32565b6110b4565b005b348015610557575f80fd5b50610572600480360381019061056d9190612e45565b6110c6565b60405161057f9190612e2c565b60405180910390f35b348015610593575f80fd5b5061059c61117b565b005b3480156105a9575f80fd5b506105c460048036038101906105bf9190612ec0565b61118e565b005b3480156105d1575f80fd5b506105da6111fb565b6040516105e79190612d9c565b60405180910390f35b3480156105fb575f80fd5b5061061660048036038101906106119190612d32565b611222565b005b348015610623575f80fd5b5061063e6004803603810190610639919061302a565b611234565b005b34801561064b575f80fd5b5061065461124f565b6040516106619190612cdf565b60405180910390f35b348015610675575f80fd5b50610690600480360381019061068b919061309b565b6112df565b005b6106ac60048036038101906106a79190612d32565b611314565b005b3480156106b9575f80fd5b506106d460048036038101906106cf91906130f5565b611751565b005b3480156106e1575f80fd5b506106ea611857565b005b3480156106f7575f80fd5b50610700611889565b60405161070d9190612bab565b60405180910390f35b348015610721575f80fd5b5061073c60048036038101906107379190612d32565b61189b565b005b610758600480360381019061075391906131d1565b6118ad565b005b348015610765575f80fd5b5061076e6119b7565b60405161077b9190612e2c565b60405180910390f35b34801561078f575f80fd5b506107aa60048036038101906107a59190612d32565b6119bd565b6040516107b79190612cdf565b60405180910390f35b3480156107cb575f80fd5b506107d4611a96565b6040516107e19190612e2c565b60405180910390f35b3480156107f5575f80fd5b506107fe611a9c565b60405161080b9190612e2c565b60405180910390f35b34801561081f575f80fd5b50610828611aa2565b6040516108359190612cdf565b60405180910390f35b348015610849575f80fd5b50610864600480360381019061085f9190612d32565b611b2e565b005b348015610871575f80fd5b5061088c60048036038101906108879190612d32565b611b40565b6040516108999190612e2c565b60405180910390f35b3480156108ad575f80fd5b506108b6611bc5565b6040516108c39190612cdf565b60405180910390f35b3480156108d7575f80fd5b506108f260048036038101906108ed9190613251565b611c55565b6040516108ff9190612bab565b60405180910390f35b348015610913575f80fd5b5061092e60048036038101906109299190612e45565b611ce3565b005b600f5f9054906101000a900460ff1681565b5f6301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061099c57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109cc5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600380546109e2906132bc565b80601f0160208091040260200160405190810160405280929190818152602001828054610a0e906132bc565b8015610a595780601f10610a3057610100808354040283529160200191610a59565b820191905f5260205f20905b815481529060010190602001808311610a3c57829003601f168201915b5050505050905090565b5f610a6d82611d65565b610aa3576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075f8381526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f610ae7826110a3565b90508073ffffffffffffffffffffffffffffffffffffffff16610b08611dc0565b73ffffffffffffffffffffffffffffffffffffffff1614610b6b57610b3481610b2f611dc0565b611c55565b610b6a576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b8260075f8481526020019081526020015f205f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60145481565b5f610c2b611dc7565b6002546001540303905090565b600b602052805f5260405f205f915090505481565b5f6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610d45576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610cc39291906132ec565b6020604051808303815f875af1158015610cdf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d039190613327565b610d4457336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610d3b9190612d9c565b60405180910390fd5b5b610d50838383611dcb565b505050565b610d5d6120da565b600260095403610da2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d999061339c565b60405180910390fd5b60026009819055505f3373ffffffffffffffffffffffffffffffffffffffff1647604051610dcf906133e7565b5f6040518083038185875af1925050503d805f8114610e09576040519150601f19603f3d011682016040523d82523d5f602084013e610e0e565b606091505b5050905080610e52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4990613445565b60405180910390fd5b506001600981905550565b610e656120da565b8060128190555050565b5f6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610f67576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610ee59291906132ec565b6020604051808303815f875af1158015610f01573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f259190613327565b610f6657336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610f5d9190612d9c565b60405180910390fd5b5b610f72838383612158565b505050565b610f82816001612177565b50565b600d8054610f92906132bc565b80601f0160208091040260200160405190810160405280929190818152602001828054610fbe906132bc565b80156110095780601f10610fe057610100808354040283529160200191611009565b820191905f5260205f20905b815481529060010190602001808311610fec57829003601f168201915b505050505081565b600a805461101e906132bc565b80601f016020809104026020016040519081016040528092919081815260200182805461104a906132bc565b80156110955780601f1061106c57610100808354040283529160200191611095565b820191905f5260205f20905b81548152906001019060200180831161107857829003601f168201915b505050505081565b60135481565b5f6110ad826123b4565b9050919050565b6110bc6120da565b8060108190555050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361112c576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff60065f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054169050919050565b6111836120da565b61118c5f612478565b565b6111966120da565b601054826111a2610c22565b6111ac9190613490565b11156111ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e49061350d565b60405180910390fd5b6111f78183612539565b5050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61122a6120da565b8060118190555050565b61123c6120da565b80600a908161124b91906136c8565b5050565b60606004805461125e906132bc565b80601f016020809104026020016040519081016040528092919081815260200182805461128a906132bc565b80156112d55780601f106112ac576101008083540402835291602001916112d5565b820191905f5260205f20905b8154815290600101906020018083116112b857829003601f168201915b5050505050905090565b6112e76120da565b80600e90816112f691906136c8565b5081600c5f6101000a81548160ff0219169083151502179055505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611382576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611379906137e1565b60405180910390fd5b6002600954036113c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113be9061339c565b60405180910390fd5b60026009819055505f80600b5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205460145461141c91906137ff565b90508083106114cf57808361143191906137ff565b60115461143e9190613832565b915080600b5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546114899190613490565b600b5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555061155d565b5f915082600b5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461151b9190613490565b600b5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b600f5f9054906101000a900460ff166115ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a2906138bd565b60405180910390fd5b601054836115b7610c22565b6115c19190613490565b1115611602576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f990613925565b60405180910390fd5b6013548361160f336110c6565b6116199190613490565b111561165a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611651906139b3565b60405180910390fd5b60125483111561169f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169690613a41565b60405180910390fd5b813410156116e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d990613acf565b60405180910390fd5b6116ec3384612539565b81341115611744573373ffffffffffffffffffffffffffffffffffffffff166108fc833461171a91906137ff565b90811502906040515f60405180830381858888f19350505050158015611742573d5f803e3d5ffd5b505b5050600160098190555050565b8060085f61175d611dc0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611806611dc0565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161184b9190612bab565b60405180910390a35050565b61185f6120da565b600f5f9054906101000a900460ff1615600f5f6101000a81548160ff021916908315150217905550565b600c5f9054906101000a900460ff1681565b6118a36120da565b8060148190555050565b5f6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156119a5576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016119239291906132ec565b6020604051808303815f875af115801561193f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119639190613327565b6119a457336040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161199b9190612d9c565b60405180910390fd5b5b6119b184848484612556565b50505050565b60115481565b6060600c5f9054906101000a900460ff1615611a0557600e6119de836125c8565b6040516020016119ef929190613ba7565b6040516020818303038152906040529050611a91565b600d8054611a12906132bc565b80601f0160208091040260200160405190810160405280929190818152602001828054611a3e906132bc565b8015611a895780601f10611a6057610100808354040283529160200191611a89565b820191905f5260205f20905b815481529060010190602001808311611a6c57829003601f168201915b505050505090505b919050565b60125481565b60105481565b600e8054611aaf906132bc565b80601f0160208091040260200160405190810160405280929190818152602001828054611adb906132bc565b8015611b265780601f10611afd57610100808354040283529160200191611b26565b820191905f5260205f20905b815481529060010190602001808311611b0957829003601f168201915b505050505081565b611b366120da565b8060138190555050565b5f805f600b5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054601454611b8e91906137ff565b9050808410611bb7578084611ba391906137ff565b601154611bb09190613832565b9150611bbb565b5f91505b8192505050919050565b6060600a8054611bd4906132bc565b80601f0160208091040260200160405190810160405280929190818152602001828054611c00906132bc565b8015611c4b5780601f10611c2257610100808354040283529160200191611c4b565b820191905f5260205f20905b815481529060010190602001808311611c2e57829003601f168201915b5050505050905090565b5f60085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b611ceb6120da565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611d59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5090613c3a565b60405180910390fd5b611d6281612478565b50565b5f81611d6f611dc7565b11158015611d7e575060015482105b8015611db957505f7c010000000000000000000000000000000000000000000000000000000060055f8581526020019081526020015f205416145b9050919050565b5f33905090565b5f90565b5f611dd5826123b4565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611e3c576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80611e4784612721565b91509150611e5d8187611e58611dc0565b612744565b611ea957611e7286611e6d611dc0565b611c55565b611ea8576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611f0e576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611f1b8686866001612787565b8015611f25575f82555b60065f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8154600190039190508190555060065f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815460010191905081905550611fed85611fc988888761278d565b7c0200000000000000000000000000000000000000000000000000000000176127b4565b60055f8681526020019081526020015f20819055505f7c020000000000000000000000000000000000000000000000000000000084160361206a575f6001850190505f60055f8381526020019081526020015f205403612068576001548114612067578360055f8381526020019081526020015f20819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46120d286868660016127de565b505050505050565b6120e26127e4565b73ffffffffffffffffffffffffffffffffffffffff166121006111fb565b73ffffffffffffffffffffffffffffffffffffffff1614612156576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214d90613ca2565b60405180910390fd5b565b61217283838360405180602001604052805f8152506118ad565b505050565b5f612181836123b4565b90505f8190505f8061219286612721565b9150915084156121fb576121ae81846121a9611dc0565b612744565b6121fa576121c3836121be611dc0565b611c55565b6121f9576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b612208835f886001612787565b8015612212575f82555b600160806001901b0360065f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055506122b683612273855f8861278d565b7c02000000000000000000000000000000000000000000000000000000007c010000000000000000000000000000000000000000000000000000000017176127b4565b60055f8881526020019081526020015f20819055505f7c0200000000000000000000000000000000000000000000000000000000851603612333575f6001870190505f60055f8381526020019081526020015f205403612331576001548114612330578460055f8381526020019081526020015f20819055505b5b505b855f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461239b835f8860016127de565b60025f8154809291906001019190505550505050505050565b5f80829050806123c2611dc7565b1161244157600154811015612440575f60055f8381526020019081526020015f205490505f7c010000000000000000000000000000000000000000000000000000000082160361243e575b5f81036124345760055f836001900393508381526020019081526020015f2054905061240d565b8092505050612473565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612552828260405180602001604052805f8152506127eb565b5050565b612561848484610c4d565b5f8373ffffffffffffffffffffffffffffffffffffffff163b146125c25761258b84848484612884565b6125c1576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60605f820361260e576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061271c565b5f8290505f5b5f821461263d57808061262690613cc0565b915050600a826126369190613d34565b9150612614565b5f8167ffffffffffffffff81111561265857612657612f06565b5b6040519080825280601f01601f19166020018201604052801561268a5781602001600182028036833780820191505090505b5090505b5f8514612715576001826126a291906137ff565b9150600a856126b19190613d64565b60306126bd9190613490565b60f81b8183815181106126d3576126d2613d94565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600a8561270e9190613d34565b945061268e565b8093505050505b919050565b5f805f60075f8581526020019081526020015f2090508092508254915050915091565b5f73ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b5f8060e883901c905060e86127a38686846129cf565b62ffffff16901b9150509392505050565b5f73ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b5f33905090565b6127f583836129d7565b5f8373ffffffffffffffffffffffffffffffffffffffff163b1461287f575f60015490505f83820390505b6128325f868380600101945086612884565b612868576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061282057816001541461287c575f80fd5b50505b505050565b5f8373ffffffffffffffffffffffffffffffffffffffff1663150b7a026128a9611dc0565b8786866040518563ffffffff1660e01b81526004016128cb9493929190613e13565b6020604051808303815f875af192505050801561290657506040513d601f19601f820116820180604052508101906129039190613e71565b60015b61297c573d805f8114612934576040519150601f19603f3d011682016040523d82523d5f602084013e612939565b606091505b505f815103612974576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b5f9392505050565b5f60015490505f8203612a16576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612a225f848385612787565b600160406001901b17820260065f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282540192505081905550612a9483612a855f865f61278d565b612a8e85612b82565b176127b4565b60055f8381526020019081526020015f20819055505f80838301905073ffffffffffffffffffffffffffffffffffffffff8516915082825f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4600183015b818114612b2e5780835f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4600181019050612af5565b505f8203612b68576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806001819055505050612b7d5f8483856127de565b505050565b5f6001821460e11b9050919050565b5f8115159050919050565b612ba581612b91565b82525050565b5f602082019050612bbe5f830184612b9c565b92915050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612c0981612bd5565b8114612c13575f80fd5b50565b5f81359050612c2481612c00565b92915050565b5f60208284031215612c3f57612c3e612bcd565b5b5f612c4c84828501612c16565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015612c8c578082015181840152602081019050612c71565b5f8484015250505050565b5f601f19601f8301169050919050565b5f612cb182612c55565b612cbb8185612c5f565b9350612ccb818560208601612c6f565b612cd481612c97565b840191505092915050565b5f6020820190508181035f830152612cf78184612ca7565b905092915050565b5f819050919050565b612d1181612cff565b8114612d1b575f80fd5b50565b5f81359050612d2c81612d08565b92915050565b5f60208284031215612d4757612d46612bcd565b5b5f612d5484828501612d1e565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612d8682612d5d565b9050919050565b612d9681612d7c565b82525050565b5f602082019050612daf5f830184612d8d565b92915050565b612dbe81612d7c565b8114612dc8575f80fd5b50565b5f81359050612dd981612db5565b92915050565b5f8060408385031215612df557612df4612bcd565b5b5f612e0285828601612dcb565b9250506020612e1385828601612d1e565b9150509250929050565b612e2681612cff565b82525050565b5f602082019050612e3f5f830184612e1d565b92915050565b5f60208284031215612e5a57612e59612bcd565b5b5f612e6784828501612dcb565b91505092915050565b5f805f60608486031215612e8757612e86612bcd565b5b5f612e9486828701612dcb565b9350506020612ea586828701612dcb565b9250506040612eb686828701612d1e565b9150509250925092565b5f8060408385031215612ed657612ed5612bcd565b5b5f612ee385828601612d1e565b9250506020612ef485828601612dcb565b9150509250929050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b612f3c82612c97565b810181811067ffffffffffffffff82111715612f5b57612f5a612f06565b5b80604052505050565b5f612f6d612bc4565b9050612f798282612f33565b919050565b5f67ffffffffffffffff821115612f9857612f97612f06565b5b612fa182612c97565b9050602081019050919050565b828183375f83830152505050565b5f612fce612fc984612f7e565b612f64565b905082815260208101848484011115612fea57612fe9612f02565b5b612ff5848285612fae565b509392505050565b5f82601f83011261301157613010612efe565b5b8135613021848260208601612fbc565b91505092915050565b5f6020828403121561303f5761303e612bcd565b5b5f82013567ffffffffffffffff81111561305c5761305b612bd1565b5b61306884828501612ffd565b91505092915050565b61307a81612b91565b8114613084575f80fd5b50565b5f8135905061309581613071565b92915050565b5f80604083850312156130b1576130b0612bcd565b5b5f6130be85828601613087565b925050602083013567ffffffffffffffff8111156130df576130de612bd1565b5b6130eb85828601612ffd565b9150509250929050565b5f806040838503121561310b5761310a612bcd565b5b5f61311885828601612dcb565b925050602061312985828601613087565b9150509250929050565b5f67ffffffffffffffff82111561314d5761314c612f06565b5b61315682612c97565b9050602081019050919050565b5f61317561317084613133565b612f64565b90508281526020810184848401111561319157613190612f02565b5b61319c848285612fae565b509392505050565b5f82601f8301126131b8576131b7612efe565b5b81356131c8848260208601613163565b91505092915050565b5f805f80608085870312156131e9576131e8612bcd565b5b5f6131f687828801612dcb565b945050602061320787828801612dcb565b935050604061321887828801612d1e565b925050606085013567ffffffffffffffff81111561323957613238612bd1565b5b613245878288016131a4565b91505092959194509250565b5f806040838503121561326757613266612bcd565b5b5f61327485828601612dcb565b925050602061328585828601612dcb565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806132d357607f821691505b6020821081036132e6576132e561328f565b5b50919050565b5f6040820190506132ff5f830185612d8d565b61330c6020830184612d8d565b9392505050565b5f8151905061332181613071565b92915050565b5f6020828403121561333c5761333b612bcd565b5b5f61334984828501613313565b91505092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f613386601f83612c5f565b915061339182613352565b602082019050919050565b5f6020820190508181035f8301526133b38161337a565b9050919050565b5f81905092915050565b50565b5f6133d25f836133ba565b91506133dd826133c4565b5f82019050919050565b5f6133f1826133c7565b9150819050919050565b7f5472616e73666572206661696c656400000000000000000000000000000000005f82015250565b5f61342f600f83612c5f565b915061343a826133fb565b602082019050919050565b5f6020820190508181035f83015261345c81613423565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61349a82612cff565b91506134a583612cff565b92508282019050808211156134bd576134bc613463565b5b92915050565b7f4e6f206d6f7265204e46547320696e2073746f636b21000000000000000000005f82015250565b5f6134f7601683612c5f565b9150613502826134c3565b602082019050919050565b5f6020820190508181035f830152613524816134eb565b9050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026135877fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261354c565b613591868361354c565b95508019841693508086168417925050509392505050565b5f819050919050565b5f6135cc6135c76135c284612cff565b6135a9565b612cff565b9050919050565b5f819050919050565b6135e5836135b2565b6135f96135f1826135d3565b848454613558565b825550505050565b5f90565b61360d613601565b6136188184846135dc565b505050565b5b8181101561363b576136305f82613605565b60018101905061361e565b5050565b601f821115613680576136518161352b565b61365a8461353d565b81016020851015613669578190505b61367d6136758561353d565b83018261361d565b50505b505050565b5f82821c905092915050565b5f6136a05f1984600802613685565b1980831691505092915050565b5f6136b88383613691565b9150826002028217905092915050565b6136d182612c55565b67ffffffffffffffff8111156136ea576136e9612f06565b5b6136f482546132bc565b6136ff82828561363f565b5f60209050601f831160018114613730575f841561371e578287015190505b61372885826136ad565b86555061378f565b601f19841661373e8661352b565b5f5b8281101561376557848901518255600182019150602085019450602081019050613740565b86831015613782578489015161377e601f891682613691565b8355505b6001600288020188555050505b505050505050565b7f5468652063616c6c657220697320616e6f7468657220636f6e747261637400005f82015250565b5f6137cb601e83612c5f565b91506137d682613797565b602082019050919050565b5f6020820190508181035f8301526137f8816137bf565b9050919050565b5f61380982612cff565b915061381483612cff565b925082820390508181111561382c5761382b613463565b5b92915050565b5f61383c82612cff565b915061384783612cff565b925082820261385581612cff565b9150828204841483151761386c5761386b613463565b5b5092915050565b7f4e465473206e6f742072656164792079657421000000000000000000000000005f82015250565b5f6138a7601383612c5f565b91506138b282613873565b602082019050919050565b5f6020820190508181035f8301526138d48161389b565b9050919050565b7f4e6f206d6f7265204e46547321000000000000000000000000000000000000005f82015250565b5f61390f600d83612c5f565b915061391a826138db565b602082019050919050565b5f6020820190508181035f83015261393c81613903565b9050919050565b7f547269656420746f20746f74616c206d696e74207175616e69747920706572205f8201527f77616c6c6574206f766572206c696d6974000000000000000000000000000000602082015250565b5f61399d603183612c5f565b91506139a882613943565b604082019050919050565b5f6020820190508181035f8301526139ca81613991565b9050919050565b7f547269656420746f206d696e74207175616e697479206f766572206c696d69745f8201527f2c20726574727920776974682072656475636564207175616e74697479000000602082015250565b5f613a2b603d83612c5f565b9150613a36826139d1565b604082019050919050565b5f6020820190508181035f830152613a5881613a1f565b9050919050565b7f4d7573742073656e6420656e6f7567682065746820746f2061646f70742042615f8201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b5f613ab9602183612c5f565b9150613ac482613a5f565b604082019050919050565b5f6020820190508181035f830152613ae681613aad565b9050919050565b5f81905092915050565b5f8154613b03816132bc565b613b0d8186613aed565b9450600182165f8114613b275760018114613b3c57613b6e565b60ff1983168652811515820286019350613b6e565b613b458561352b565b5f5b83811015613b6657815481890152600182019150602081019050613b47565b838801955050505b50505092915050565b5f613b8182612c55565b613b8b8185613aed565b9350613b9b818560208601612c6f565b80840191505092915050565b5f613bb28285613af7565b9150613bbe8284613b77565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f613c24602683612c5f565b9150613c2f82613bca565b604082019050919050565b5f6020820190508181035f830152613c5181613c18565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f613c8c602083612c5f565b9150613c9782613c58565b602082019050919050565b5f6020820190508181035f830152613cb981613c80565b9050919050565b5f613cca82612cff565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613cfc57613cfb613463565b5b600182019050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f613d3e82612cff565b9150613d4983612cff565b925082613d5957613d58613d07565b5b828204905092915050565b5f613d6e82612cff565b9150613d7983612cff565b925082613d8957613d88613d07565b5b828206905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f81519050919050565b5f82825260208201905092915050565b5f613de582613dc1565b613def8185613dcb565b9350613dff818560208601612c6f565b613e0881612c97565b840191505092915050565b5f608082019050613e265f830187612d8d565b613e336020830186612d8d565b613e406040830185612e1d565b8181036060830152613e528184613ddb565b905095945050505050565b5f81519050613e6b81612c00565b92915050565b5f60208284031215613e8657613e85612bcd565b5b5f613e9384828501613e5d565b9150509291505056fea2646970667358221220b6d0062482bb5e486b7676700b040093e2b02ceffaf8d53dc3a3e5a09c939c2464736f6c6343000814003368747470733a2f2f6f70656e7365612e7468656261746c6567656e64732e78797a2f

Deployed Bytecode

0x608060405260043610610250575f3560e01c80638da5cb5b11610138578063b88d4fde116100b5578063dbddb26a11610079578063dbddb26a14610814578063e113ad951461083e578063e757223014610866578063e8a3d485146108a2578063e985e9c5146108cc578063f2fde38b1461090857610250565b8063b88d4fde1461073e578063c002d23d1461075a578063c87b56dd14610784578063cfdbf254146107c0578063d8258d95146107ea57610250565b8063a0712d68116100fc578063a0712d6814610692578063a22cb465146106ae578063a4cdd719146106d6578063a76a9587146106ec578063a9527e821461071657610250565b80638da5cb5b146105c657806391b7f5ed146105f0578063938e3d7b1461061857806395d89b41146106405780639e1f39d61461066a57610250565b8063336f5ec3116101d15780635fe75587116101955780635fe75587146104be5780636352211e146104e857806363fa5bde1461052457806370a082311461054c578063715018a6146105885780637871e1541461059e57610250565b8063336f5ec3146103fe57806342842e0e1461042657806342966c6814610442578063507862d11461046a57806356b4f6731461049457610250565b80631422374f116102185780631422374f1461033c57806318160ddd146103665780631d9857781461039057806323b872dd146103cc57806324600fc3146103e857610250565b80630116bc2d1461025457806301ffc9a71461027e57806306fdde03146102ba578063081812fc146102e4578063095ea7b314610320575b5f80fd5b34801561025f575f80fd5b50610268610930565b6040516102759190612bab565b60405180910390f35b348015610289575f80fd5b506102a4600480360381019061029f9190612c2a565b610942565b6040516102b19190612bab565b60405180910390f35b3480156102c5575f80fd5b506102ce6109d3565b6040516102db9190612cdf565b60405180910390f35b3480156102ef575f80fd5b5061030a60048036038101906103059190612d32565b610a63565b6040516103179190612d9c565b60405180910390f35b61033a60048036038101906103359190612ddf565b610add565b005b348015610347575f80fd5b50610350610c1c565b60405161035d9190612e2c565b60405180910390f35b348015610371575f80fd5b5061037a610c22565b6040516103879190612e2c565b60405180910390f35b34801561039b575f80fd5b506103b660048036038101906103b19190612e45565b610c38565b6040516103c39190612e2c565b60405180910390f35b6103e660048036038101906103e19190612e70565b610c4d565b005b3480156103f3575f80fd5b506103fc610d55565b005b348015610409575f80fd5b50610424600480360381019061041f9190612d32565b610e5d565b005b610440600480360381019061043b9190612e70565b610e6f565b005b34801561044d575f80fd5b5061046860048036038101906104639190612d32565b610f77565b005b348015610475575f80fd5b5061047e610f85565b60405161048b9190612cdf565b60405180910390f35b34801561049f575f80fd5b506104a8611011565b6040516104b59190612cdf565b60405180910390f35b3480156104c9575f80fd5b506104d261109d565b6040516104df9190612e2c565b60405180910390f35b3480156104f3575f80fd5b5061050e60048036038101906105099190612d32565b6110a3565b60405161051b9190612d9c565b60405180910390f35b34801561052f575f80fd5b5061054a60048036038101906105459190612d32565b6110b4565b005b348015610557575f80fd5b50610572600480360381019061056d9190612e45565b6110c6565b60405161057f9190612e2c565b60405180910390f35b348015610593575f80fd5b5061059c61117b565b005b3480156105a9575f80fd5b506105c460048036038101906105bf9190612ec0565b61118e565b005b3480156105d1575f80fd5b506105da6111fb565b6040516105e79190612d9c565b60405180910390f35b3480156105fb575f80fd5b5061061660048036038101906106119190612d32565b611222565b005b348015610623575f80fd5b5061063e6004803603810190610639919061302a565b611234565b005b34801561064b575f80fd5b5061065461124f565b6040516106619190612cdf565b60405180910390f35b348015610675575f80fd5b50610690600480360381019061068b919061309b565b6112df565b005b6106ac60048036038101906106a79190612d32565b611314565b005b3480156106b9575f80fd5b506106d460048036038101906106cf91906130f5565b611751565b005b3480156106e1575f80fd5b506106ea611857565b005b3480156106f7575f80fd5b50610700611889565b60405161070d9190612bab565b60405180910390f35b348015610721575f80fd5b5061073c60048036038101906107379190612d32565b61189b565b005b610758600480360381019061075391906131d1565b6118ad565b005b348015610765575f80fd5b5061076e6119b7565b60405161077b9190612e2c565b60405180910390f35b34801561078f575f80fd5b506107aa60048036038101906107a59190612d32565b6119bd565b6040516107b79190612cdf565b60405180910390f35b3480156107cb575f80fd5b506107d4611a96565b6040516107e19190612e2c565b60405180910390f35b3480156107f5575f80fd5b506107fe611a9c565b60405161080b9190612e2c565b60405180910390f35b34801561081f575f80fd5b50610828611aa2565b6040516108359190612cdf565b60405180910390f35b348015610849575f80fd5b50610864600480360381019061085f9190612d32565b611b2e565b005b348015610871575f80fd5b5061088c60048036038101906108879190612d32565b611b40565b6040516108999190612e2c565b60405180910390f35b3480156108ad575f80fd5b506108b6611bc5565b6040516108c39190612cdf565b60405180910390f35b3480156108d7575f80fd5b506108f260048036038101906108ed9190613251565b611c55565b6040516108ff9190612bab565b60405180910390f35b348015610913575f80fd5b5061092e60048036038101906109299190612e45565b611ce3565b005b600f5f9054906101000a900460ff1681565b5f6301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061099c57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109cc5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600380546109e2906132bc565b80601f0160208091040260200160405190810160405280929190818152602001828054610a0e906132bc565b8015610a595780601f10610a3057610100808354040283529160200191610a59565b820191905f5260205f20905b815481529060010190602001808311610a3c57829003601f168201915b5050505050905090565b5f610a6d82611d65565b610aa3576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075f8381526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f610ae7826110a3565b90508073ffffffffffffffffffffffffffffffffffffffff16610b08611dc0565b73ffffffffffffffffffffffffffffffffffffffff1614610b6b57610b3481610b2f611dc0565b611c55565b610b6a576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b8260075f8481526020019081526020015f205f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60145481565b5f610c2b611dc7565b6002546001540303905090565b600b602052805f5260405f205f915090505481565b5f6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610d45576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610cc39291906132ec565b6020604051808303815f875af1158015610cdf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d039190613327565b610d4457336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610d3b9190612d9c565b60405180910390fd5b5b610d50838383611dcb565b505050565b610d5d6120da565b600260095403610da2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d999061339c565b60405180910390fd5b60026009819055505f3373ffffffffffffffffffffffffffffffffffffffff1647604051610dcf906133e7565b5f6040518083038185875af1925050503d805f8114610e09576040519150601f19603f3d011682016040523d82523d5f602084013e610e0e565b606091505b5050905080610e52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4990613445565b60405180910390fd5b506001600981905550565b610e656120da565b8060128190555050565b5f6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610f67576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610ee59291906132ec565b6020604051808303815f875af1158015610f01573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f259190613327565b610f6657336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610f5d9190612d9c565b60405180910390fd5b5b610f72838383612158565b505050565b610f82816001612177565b50565b600d8054610f92906132bc565b80601f0160208091040260200160405190810160405280929190818152602001828054610fbe906132bc565b80156110095780601f10610fe057610100808354040283529160200191611009565b820191905f5260205f20905b815481529060010190602001808311610fec57829003601f168201915b505050505081565b600a805461101e906132bc565b80601f016020809104026020016040519081016040528092919081815260200182805461104a906132bc565b80156110955780601f1061106c57610100808354040283529160200191611095565b820191905f5260205f20905b81548152906001019060200180831161107857829003601f168201915b505050505081565b60135481565b5f6110ad826123b4565b9050919050565b6110bc6120da565b8060108190555050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361112c576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff60065f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054169050919050565b6111836120da565b61118c5f612478565b565b6111966120da565b601054826111a2610c22565b6111ac9190613490565b11156111ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e49061350d565b60405180910390fd5b6111f78183612539565b5050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61122a6120da565b8060118190555050565b61123c6120da565b80600a908161124b91906136c8565b5050565b60606004805461125e906132bc565b80601f016020809104026020016040519081016040528092919081815260200182805461128a906132bc565b80156112d55780601f106112ac576101008083540402835291602001916112d5565b820191905f5260205f20905b8154815290600101906020018083116112b857829003601f168201915b5050505050905090565b6112e76120da565b80600e90816112f691906136c8565b5081600c5f6101000a81548160ff0219169083151502179055505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611382576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611379906137e1565b60405180910390fd5b6002600954036113c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113be9061339c565b60405180910390fd5b60026009819055505f80600b5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205460145461141c91906137ff565b90508083106114cf57808361143191906137ff565b60115461143e9190613832565b915080600b5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546114899190613490565b600b5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555061155d565b5f915082600b5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461151b9190613490565b600b5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b600f5f9054906101000a900460ff166115ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a2906138bd565b60405180910390fd5b601054836115b7610c22565b6115c19190613490565b1115611602576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f990613925565b60405180910390fd5b6013548361160f336110c6565b6116199190613490565b111561165a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611651906139b3565b60405180910390fd5b60125483111561169f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169690613a41565b60405180910390fd5b813410156116e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d990613acf565b60405180910390fd5b6116ec3384612539565b81341115611744573373ffffffffffffffffffffffffffffffffffffffff166108fc833461171a91906137ff565b90811502906040515f60405180830381858888f19350505050158015611742573d5f803e3d5ffd5b505b5050600160098190555050565b8060085f61175d611dc0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611806611dc0565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161184b9190612bab565b60405180910390a35050565b61185f6120da565b600f5f9054906101000a900460ff1615600f5f6101000a81548160ff021916908315150217905550565b600c5f9054906101000a900460ff1681565b6118a36120da565b8060148190555050565b5f6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156119a5576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016119239291906132ec565b6020604051808303815f875af115801561193f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119639190613327565b6119a457336040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161199b9190612d9c565b60405180910390fd5b5b6119b184848484612556565b50505050565b60115481565b6060600c5f9054906101000a900460ff1615611a0557600e6119de836125c8565b6040516020016119ef929190613ba7565b6040516020818303038152906040529050611a91565b600d8054611a12906132bc565b80601f0160208091040260200160405190810160405280929190818152602001828054611a3e906132bc565b8015611a895780601f10611a6057610100808354040283529160200191611a89565b820191905f5260205f20905b815481529060010190602001808311611a6c57829003601f168201915b505050505090505b919050565b60125481565b60105481565b600e8054611aaf906132bc565b80601f0160208091040260200160405190810160405280929190818152602001828054611adb906132bc565b8015611b265780601f10611afd57610100808354040283529160200191611b26565b820191905f5260205f20905b815481529060010190602001808311611b0957829003601f168201915b505050505081565b611b366120da565b8060138190555050565b5f805f600b5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054601454611b8e91906137ff565b9050808410611bb7578084611ba391906137ff565b601154611bb09190613832565b9150611bbb565b5f91505b8192505050919050565b6060600a8054611bd4906132bc565b80601f0160208091040260200160405190810160405280929190818152602001828054611c00906132bc565b8015611c4b5780601f10611c2257610100808354040283529160200191611c4b565b820191905f5260205f20905b815481529060010190602001808311611c2e57829003601f168201915b5050505050905090565b5f60085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b611ceb6120da565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611d59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5090613c3a565b60405180910390fd5b611d6281612478565b50565b5f81611d6f611dc7565b11158015611d7e575060015482105b8015611db957505f7c010000000000000000000000000000000000000000000000000000000060055f8581526020019081526020015f205416145b9050919050565b5f33905090565b5f90565b5f611dd5826123b4565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611e3c576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80611e4784612721565b91509150611e5d8187611e58611dc0565b612744565b611ea957611e7286611e6d611dc0565b611c55565b611ea8576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611f0e576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611f1b8686866001612787565b8015611f25575f82555b60065f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8154600190039190508190555060065f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815460010191905081905550611fed85611fc988888761278d565b7c0200000000000000000000000000000000000000000000000000000000176127b4565b60055f8681526020019081526020015f20819055505f7c020000000000000000000000000000000000000000000000000000000084160361206a575f6001850190505f60055f8381526020019081526020015f205403612068576001548114612067578360055f8381526020019081526020015f20819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46120d286868660016127de565b505050505050565b6120e26127e4565b73ffffffffffffffffffffffffffffffffffffffff166121006111fb565b73ffffffffffffffffffffffffffffffffffffffff1614612156576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214d90613ca2565b60405180910390fd5b565b61217283838360405180602001604052805f8152506118ad565b505050565b5f612181836123b4565b90505f8190505f8061219286612721565b9150915084156121fb576121ae81846121a9611dc0565b612744565b6121fa576121c3836121be611dc0565b611c55565b6121f9576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b612208835f886001612787565b8015612212575f82555b600160806001901b0360065f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055506122b683612273855f8861278d565b7c02000000000000000000000000000000000000000000000000000000007c010000000000000000000000000000000000000000000000000000000017176127b4565b60055f8881526020019081526020015f20819055505f7c0200000000000000000000000000000000000000000000000000000000851603612333575f6001870190505f60055f8381526020019081526020015f205403612331576001548114612330578460055f8381526020019081526020015f20819055505b5b505b855f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461239b835f8860016127de565b60025f8154809291906001019190505550505050505050565b5f80829050806123c2611dc7565b1161244157600154811015612440575f60055f8381526020019081526020015f205490505f7c010000000000000000000000000000000000000000000000000000000082160361243e575b5f81036124345760055f836001900393508381526020019081526020015f2054905061240d565b8092505050612473565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612552828260405180602001604052805f8152506127eb565b5050565b612561848484610c4d565b5f8373ffffffffffffffffffffffffffffffffffffffff163b146125c25761258b84848484612884565b6125c1576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60605f820361260e576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061271c565b5f8290505f5b5f821461263d57808061262690613cc0565b915050600a826126369190613d34565b9150612614565b5f8167ffffffffffffffff81111561265857612657612f06565b5b6040519080825280601f01601f19166020018201604052801561268a5781602001600182028036833780820191505090505b5090505b5f8514612715576001826126a291906137ff565b9150600a856126b19190613d64565b60306126bd9190613490565b60f81b8183815181106126d3576126d2613d94565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600a8561270e9190613d34565b945061268e565b8093505050505b919050565b5f805f60075f8581526020019081526020015f2090508092508254915050915091565b5f73ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b5f8060e883901c905060e86127a38686846129cf565b62ffffff16901b9150509392505050565b5f73ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b5f33905090565b6127f583836129d7565b5f8373ffffffffffffffffffffffffffffffffffffffff163b1461287f575f60015490505f83820390505b6128325f868380600101945086612884565b612868576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061282057816001541461287c575f80fd5b50505b505050565b5f8373ffffffffffffffffffffffffffffffffffffffff1663150b7a026128a9611dc0565b8786866040518563ffffffff1660e01b81526004016128cb9493929190613e13565b6020604051808303815f875af192505050801561290657506040513d601f19601f820116820180604052508101906129039190613e71565b60015b61297c573d805f8114612934576040519150601f19603f3d011682016040523d82523d5f602084013e612939565b606091505b505f815103612974576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b5f9392505050565b5f60015490505f8203612a16576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612a225f848385612787565b600160406001901b17820260065f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282540192505081905550612a9483612a855f865f61278d565b612a8e85612b82565b176127b4565b60055f8381526020019081526020015f20819055505f80838301905073ffffffffffffffffffffffffffffffffffffffff8516915082825f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4600183015b818114612b2e5780835f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4600181019050612af5565b505f8203612b68576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806001819055505050612b7d5f8483856127de565b505050565b5f6001821460e11b9050919050565b5f8115159050919050565b612ba581612b91565b82525050565b5f602082019050612bbe5f830184612b9c565b92915050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612c0981612bd5565b8114612c13575f80fd5b50565b5f81359050612c2481612c00565b92915050565b5f60208284031215612c3f57612c3e612bcd565b5b5f612c4c84828501612c16565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015612c8c578082015181840152602081019050612c71565b5f8484015250505050565b5f601f19601f8301169050919050565b5f612cb182612c55565b612cbb8185612c5f565b9350612ccb818560208601612c6f565b612cd481612c97565b840191505092915050565b5f6020820190508181035f830152612cf78184612ca7565b905092915050565b5f819050919050565b612d1181612cff565b8114612d1b575f80fd5b50565b5f81359050612d2c81612d08565b92915050565b5f60208284031215612d4757612d46612bcd565b5b5f612d5484828501612d1e565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612d8682612d5d565b9050919050565b612d9681612d7c565b82525050565b5f602082019050612daf5f830184612d8d565b92915050565b612dbe81612d7c565b8114612dc8575f80fd5b50565b5f81359050612dd981612db5565b92915050565b5f8060408385031215612df557612df4612bcd565b5b5f612e0285828601612dcb565b9250506020612e1385828601612d1e565b9150509250929050565b612e2681612cff565b82525050565b5f602082019050612e3f5f830184612e1d565b92915050565b5f60208284031215612e5a57612e59612bcd565b5b5f612e6784828501612dcb565b91505092915050565b5f805f60608486031215612e8757612e86612bcd565b5b5f612e9486828701612dcb565b9350506020612ea586828701612dcb565b9250506040612eb686828701612d1e565b9150509250925092565b5f8060408385031215612ed657612ed5612bcd565b5b5f612ee385828601612d1e565b9250506020612ef485828601612dcb565b9150509250929050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b612f3c82612c97565b810181811067ffffffffffffffff82111715612f5b57612f5a612f06565b5b80604052505050565b5f612f6d612bc4565b9050612f798282612f33565b919050565b5f67ffffffffffffffff821115612f9857612f97612f06565b5b612fa182612c97565b9050602081019050919050565b828183375f83830152505050565b5f612fce612fc984612f7e565b612f64565b905082815260208101848484011115612fea57612fe9612f02565b5b612ff5848285612fae565b509392505050565b5f82601f83011261301157613010612efe565b5b8135613021848260208601612fbc565b91505092915050565b5f6020828403121561303f5761303e612bcd565b5b5f82013567ffffffffffffffff81111561305c5761305b612bd1565b5b61306884828501612ffd565b91505092915050565b61307a81612b91565b8114613084575f80fd5b50565b5f8135905061309581613071565b92915050565b5f80604083850312156130b1576130b0612bcd565b5b5f6130be85828601613087565b925050602083013567ffffffffffffffff8111156130df576130de612bd1565b5b6130eb85828601612ffd565b9150509250929050565b5f806040838503121561310b5761310a612bcd565b5b5f61311885828601612dcb565b925050602061312985828601613087565b9150509250929050565b5f67ffffffffffffffff82111561314d5761314c612f06565b5b61315682612c97565b9050602081019050919050565b5f61317561317084613133565b612f64565b90508281526020810184848401111561319157613190612f02565b5b61319c848285612fae565b509392505050565b5f82601f8301126131b8576131b7612efe565b5b81356131c8848260208601613163565b91505092915050565b5f805f80608085870312156131e9576131e8612bcd565b5b5f6131f687828801612dcb565b945050602061320787828801612dcb565b935050604061321887828801612d1e565b925050606085013567ffffffffffffffff81111561323957613238612bd1565b5b613245878288016131a4565b91505092959194509250565b5f806040838503121561326757613266612bcd565b5b5f61327485828601612dcb565b925050602061328585828601612dcb565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806132d357607f821691505b6020821081036132e6576132e561328f565b5b50919050565b5f6040820190506132ff5f830185612d8d565b61330c6020830184612d8d565b9392505050565b5f8151905061332181613071565b92915050565b5f6020828403121561333c5761333b612bcd565b5b5f61334984828501613313565b91505092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f613386601f83612c5f565b915061339182613352565b602082019050919050565b5f6020820190508181035f8301526133b38161337a565b9050919050565b5f81905092915050565b50565b5f6133d25f836133ba565b91506133dd826133c4565b5f82019050919050565b5f6133f1826133c7565b9150819050919050565b7f5472616e73666572206661696c656400000000000000000000000000000000005f82015250565b5f61342f600f83612c5f565b915061343a826133fb565b602082019050919050565b5f6020820190508181035f83015261345c81613423565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61349a82612cff565b91506134a583612cff565b92508282019050808211156134bd576134bc613463565b5b92915050565b7f4e6f206d6f7265204e46547320696e2073746f636b21000000000000000000005f82015250565b5f6134f7601683612c5f565b9150613502826134c3565b602082019050919050565b5f6020820190508181035f830152613524816134eb565b9050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026135877fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261354c565b613591868361354c565b95508019841693508086168417925050509392505050565b5f819050919050565b5f6135cc6135c76135c284612cff565b6135a9565b612cff565b9050919050565b5f819050919050565b6135e5836135b2565b6135f96135f1826135d3565b848454613558565b825550505050565b5f90565b61360d613601565b6136188184846135dc565b505050565b5b8181101561363b576136305f82613605565b60018101905061361e565b5050565b601f821115613680576136518161352b565b61365a8461353d565b81016020851015613669578190505b61367d6136758561353d565b83018261361d565b50505b505050565b5f82821c905092915050565b5f6136a05f1984600802613685565b1980831691505092915050565b5f6136b88383613691565b9150826002028217905092915050565b6136d182612c55565b67ffffffffffffffff8111156136ea576136e9612f06565b5b6136f482546132bc565b6136ff82828561363f565b5f60209050601f831160018114613730575f841561371e578287015190505b61372885826136ad565b86555061378f565b601f19841661373e8661352b565b5f5b8281101561376557848901518255600182019150602085019450602081019050613740565b86831015613782578489015161377e601f891682613691565b8355505b6001600288020188555050505b505050505050565b7f5468652063616c6c657220697320616e6f7468657220636f6e747261637400005f82015250565b5f6137cb601e83612c5f565b91506137d682613797565b602082019050919050565b5f6020820190508181035f8301526137f8816137bf565b9050919050565b5f61380982612cff565b915061381483612cff565b925082820390508181111561382c5761382b613463565b5b92915050565b5f61383c82612cff565b915061384783612cff565b925082820261385581612cff565b9150828204841483151761386c5761386b613463565b5b5092915050565b7f4e465473206e6f742072656164792079657421000000000000000000000000005f82015250565b5f6138a7601383612c5f565b91506138b282613873565b602082019050919050565b5f6020820190508181035f8301526138d48161389b565b9050919050565b7f4e6f206d6f7265204e46547321000000000000000000000000000000000000005f82015250565b5f61390f600d83612c5f565b915061391a826138db565b602082019050919050565b5f6020820190508181035f83015261393c81613903565b9050919050565b7f547269656420746f20746f74616c206d696e74207175616e69747920706572205f8201527f77616c6c6574206f766572206c696d6974000000000000000000000000000000602082015250565b5f61399d603183612c5f565b91506139a882613943565b604082019050919050565b5f6020820190508181035f8301526139ca81613991565b9050919050565b7f547269656420746f206d696e74207175616e697479206f766572206c696d69745f8201527f2c20726574727920776974682072656475636564207175616e74697479000000602082015250565b5f613a2b603d83612c5f565b9150613a36826139d1565b604082019050919050565b5f6020820190508181035f830152613a5881613a1f565b9050919050565b7f4d7573742073656e6420656e6f7567682065746820746f2061646f70742042615f8201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b5f613ab9602183612c5f565b9150613ac482613a5f565b604082019050919050565b5f6020820190508181035f830152613ae681613aad565b9050919050565b5f81905092915050565b5f8154613b03816132bc565b613b0d8186613aed565b9450600182165f8114613b275760018114613b3c57613b6e565b60ff1983168652811515820286019350613b6e565b613b458561352b565b5f5b83811015613b6657815481890152600182019150602081019050613b47565b838801955050505b50505092915050565b5f613b8182612c55565b613b8b8185613aed565b9350613b9b818560208601612c6f565b80840191505092915050565b5f613bb28285613af7565b9150613bbe8284613b77565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f613c24602683612c5f565b9150613c2f82613bca565b604082019050919050565b5f6020820190508181035f830152613c5181613c18565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f613c8c602083612c5f565b9150613c9782613c58565b602082019050919050565b5f6020820190508181035f830152613cb981613c80565b9050919050565b5f613cca82612cff565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613cfc57613cfb613463565b5b600182019050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f613d3e82612cff565b9150613d4983612cff565b925082613d5957613d58613d07565b5b828204905092915050565b5f613d6e82612cff565b9150613d7983612cff565b925082613d8957613d88613d07565b5b828206905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f81519050919050565b5f82825260208201905092915050565b5f613de582613dc1565b613def8185613dcb565b9350613dff818560208601612c6f565b613e0881612c97565b840191505092915050565b5f608082019050613e265f830187612d8d565b613e336020830186612d8d565b613e406040830185612e1d565b8181036060830152613e528184613ddb565b905095945050505050565b5f81519050613e6b81612c00565b92915050565b5f60208284031215613e8657613e85612bcd565b5b5f613e9384828501613e5d565b9150509291505056fea2646970667358221220b6d0062482bb5e486b7676700b040093e2b02ceffaf8d53dc3a3e5a09c939c2464736f6c63430008140033

Deployed Bytecode Sourcemap

36476:4836:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36875:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16973:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17225:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20801:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20385:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37089:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15336:180;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36650:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40314:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39051:190;;;;;;;;;;;;;:::i;:::-;;40205:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40507:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36349:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36731:67;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36578:65;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37048:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17873:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39749:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15801:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3085:103;;;;;;;;;;;;;:::i;:::-;;37196:254;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2850:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39860:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39626:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17333:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39367:146;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37919:1124;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21027:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39249:110;;;;;;;;;;;;;:::i;:::-;;36702:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39965:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40708:250;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36964:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40966:341;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37010:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36923:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36805:61;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40090:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37587:324;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39521:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21269:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3198:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36875:39;;;;;;;;;;;;;:::o;16973:244::-;17058:4;17112:10;17097:25;;:11;:25;;;;:68;;;;17155:10;17140:25;;:11;:25;;;;17097:68;:111;;;;17198:10;17183:25;;:11;:25;;;;17097:111;17077:131;;16973:244;;;:::o;17225:100::-;17279:13;17312:5;17305:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17225:100;:::o;20801:218::-;20877:7;20902:16;20910:7;20902;:16::i;:::-;20897:64;;20927:34;;;;;;;;;;;;;;20897:64;20981:15;:24;20997:7;20981:24;;;;;;;;;;;:30;;;;;;;;;;;;20974:37;;20801:218;;;:::o;20385:408::-;20474:13;20490:16;20498:7;20490;:16::i;:::-;20474:32;;20546:5;20523:28;;:19;:17;:19::i;:::-;:28;;;20519:175;;20571:44;20588:5;20595:19;:17;:19::i;:::-;20571:16;:44::i;:::-;20566:128;;20643:35;;;;;;;;;;;;;;20566:128;20519:175;20739:2;20706:15;:24;20722:7;20706:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;20777:7;20773:2;20757:28;;20766:5;20757:28;;;;;;;;;;;;20463:330;20385:408;;:::o;37089:38::-;;;;:::o;15336:180::-;15397:7;15482:15;:13;:15::i;:::-;15467:12;;15451:13;;:28;:46;15444:53;;15336:180;:::o;36650:45::-;;;;;;;;;;;;;;;;;:::o;40314:185::-;33585:1;32796:42;33539:43;;;:47;33535:225;;;32796:42;33608:40;;;33657:4;33664:10;33608:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33603:146;;33722:10;33703:30;;;;;;;;;;;:::i;:::-;;;;;;;;33603:146;33535:225;40454:37:::1;40473:4;40479:2;40483:7;40454:18;:37::i;:::-;40314:185:::0;;;:::o;39051:190::-;2809:13;:11;:13::i;:::-;3759:1:::1;3979:7;;:19:::0;3971:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;3759:1;4112:7;:18;;;;39120:12:::2;39138:10;:15;;39161:21;39138:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39119:68;;;39206:7;39198:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;39108:133;3715:1:::1;4157:7;:22;;;;39051:190::o:0;40205:101::-;2809:13;:11;:13::i;:::-;40294:4:::1;40277:14;:21;;;;40205:101:::0;:::o;40507:193::-;33585:1;32796:42;33539:43;;;:47;33535:225;;;32796:42;33608:40;;;33657:4;33664:10;33608:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33603:146;;33722:10;33703:30;;;;;;;;;;;:::i;:::-;;;;;;;;33603:146;33535:225;40651:41:::1;40674:4;40680:2;40684:7;40651:22;:41::i;:::-;40507:193:::0;;;:::o;36349:94::-;36415:20;36421:7;36430:4;36415:5;:20::i;:::-;36349:94;:::o;36731:67::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;36578:65::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;37048:34::-;;;;:::o;17873:152::-;17945:7;17988:27;18007:7;17988:18;:27::i;:::-;17965:52;;17873:152;;;:::o;39749:103::-;2809:13;:11;:13::i;:::-;39840:4:::1;39822:15;:22;;;;39749:103:::0;:::o;15801:233::-;15873:7;15914:1;15897:19;;:5;:19;;;15893:60;;15925:28;;;;;;;;;;;;;;15893:60;13609:13;15971:18;:25;15990:5;15971:25;;;;;;;;;;;;;;;;:55;15964:62;;15801:233;;;:::o;3085:103::-;2809:13;:11;:13::i;:::-;3150:30:::1;3177:1;3150:18;:30::i;:::-;3085:103::o:0;37196:254::-;2809:13;:11;:13::i;:::-;37327:15:::1;;37315:8;37299:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:43;;37277:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;37413:29;37423:8;37433;37413:9;:29::i;:::-;37196:254:::0;;:::o;2850:87::-;2896:7;2923:6;;;;;;;;;;;2916:13;;2850:87;:::o;39860:97::-;2809:13;:11;:13::i;:::-;39940:9:::1;39927:10;:22;;;;39860:97:::0;:::o;39626:115::-;2809:13;:11;:13::i;:::-;39721:12:::1;39706;:27;;;;;;:::i;:::-;;39626:115:::0;:::o;17333:104::-;17389:13;17422:7;17415:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17333:104;:::o;39367:146::-;2809:13;:11;:13::i;:::-;39466:8:::1;39455;:19;;;;;;:::i;:::-;;39496:9;39485:8;;:20;;;;;;;;;;;;;;;;;;39367:146:::0;;:::o;37919:1124::-;37514:10;37501:23;;:9;:23;;;37493:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;3759:1:::1;3979:7;;:19:::0;3971:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;3759:1;4112:7;:18;;;;38044:10:::2;38065:9:::0;38102:13:::2;:25;38116:10;38102:25;;;;;;;;;;;;;;;;38077:22;;:50;;;;:::i;:::-;38065:62;;38154:4;38142:8;:16;38138:285;;38210:4;38199:8;:15;;;;:::i;:::-;38184:10;;38183:32;;;;:::i;:::-;38175:40;;38286:4;38258:13;:25;38272:10;38258:25;;;;;;;;;;;;;;;;:32;;;;:::i;:::-;38230:13;:25;38244:10;38230:25;;;;;;;;;;;;;;;:60;;;;38138:285;;;38331:1;38323:9;;38403:8;38375:13;:25;38389:10;38375:25;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;38347:13;:25;38361:10;38347:25;;;;;;;;;;;;;;;:64;;;;38138:285;38443:19;;;;;;;;;;;38435:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;38533:15;;38521:8;38505:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:43;;38497:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;38623:17;;38611:8;38587:21;38597:10;38587:9;:21::i;:::-;:32;;;;:::i;:::-;:53;;38579:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;38727:14;;38715:8;:26;;38707:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;38839:5;38826:9;:18;;38818:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;38895:31;38905:10;38917:8;38895:9;:31::i;:::-;38955:5;38943:9;:17;38939:97;;;38985:10;38977:28;;:47;39018:5;39006:9;:17;;;;:::i;:::-;38977:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;38939:97;38033:1010;;3715:1:::1;4157:7;:22;;;;37919:1124:::0;:::o;21027:234::-;21174:8;21122:18;:39;21141:19;:17;:19::i;:::-;21122:39;;;;;;;;;;;;;;;:49;21162:8;21122:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;21234:8;21198:55;;21213:19;:17;:19::i;:::-;21198:55;;;21244:8;21198:55;;;;;;:::i;:::-;;;;;;;;21027:234;;:::o;39249:110::-;2809:13;:11;:13::i;:::-;39332:19:::1;;;;;;;;;;;39331:20;39309:19;;:42;;;;;;;;;;;;;;;;;;39249:110::o:0;36702:20::-;;;;;;;;;;;;;:::o;39965:117::-;2809:13;:11;:13::i;:::-;40070:4:::1;40045:22;:29;;;;39965:117:::0;:::o;40708:250::-;33585:1;32796:42;33539:43;;;:47;33535:225;;;32796:42;33608:40;;;33657:4;33664:10;33608:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33603:146;;33722:10;33703:30;;;;;;;;;;;:::i;:::-;;;;;;;;33603:146;33535:225;40903:47:::1;40926:4;40932:2;40936:7;40945:4;40903:22;:47::i;:::-;40708:250:::0;;;;:::o;36964:37::-;;;;:::o;40966:341::-;41088:13;41123:8;;;;;;;;;;;41119:181;;;41196:8;41206:26;41223:8;41206:16;:26::i;:::-;41179:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;41148:86;;;;41119:181;41274:14;41267:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40966:341;;;;:::o;37010:31::-;;;;:::o;36923:34::-;;;;:::o;36805:61::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;40090:107::-;2809:13;:11;:13::i;:::-;40185:4:::1;40165:17;:24;;;;40090:107:::0;:::o;37587:324::-;37640:4;37656:10;37677:9;37714:13;:25;37728:10;37714:25;;;;;;;;;;;;;;;;37689:22;;:50;;;;:::i;:::-;37677:62;;37766:4;37754:8;:16;37750:131;;37822:4;37811:8;:15;;;;:::i;:::-;37796:10;;37795:32;;;;:::i;:::-;37787:40;;37750:131;;;37868:1;37860:9;;37750:131;37898:5;37891:12;;;;37587:324;;;:::o;39521:97::-;39565:13;39598:12;39591:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39521:97;:::o;21269:164::-;21366:4;21390:18;:25;21409:5;21390:25;;;;;;;;;;;;;;;:35;21416:8;21390:35;;;;;;;;;;;;;;;;;;;;;;;;;21383:42;;21269:164;;;;:::o;3198:201::-;2809:13;:11;:13::i;:::-;3307:1:::1;3287:22;;:8;:22;;::::0;3279:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;3363:28;3382:8;3363:18;:28::i;:::-;3198:201:::0;:::o;21441:282::-;21506:4;21562:7;21543:15;:13;:15::i;:::-;:26;;:66;;;;;21596:13;;21586:7;:23;21543:66;:153;;;;;21695:1;13983:8;21647:17;:26;21665:7;21647:26;;;;;;;;;;;;:44;:49;21543:153;21523:173;;21441:282;;;:::o;31821:105::-;31881:7;31908:10;31901:17;;31821:105;:::o;15125:92::-;15181:7;15125:92;:::o;22536:1651::-;22678:27;22708;22727:7;22708:18;:27::i;:::-;22678:57;;22793:4;22752:45;;22768:19;22752:45;;;22748:86;;22806:28;;;;;;;;;;;;;;22748:86;22848:27;22877:23;22904:35;22931:7;22904:26;:35::i;:::-;22847:92;;;;22957:68;22982:15;22999:4;23005:19;:17;:19::i;:::-;22957:24;:68::i;:::-;22952:180;;23045:43;23062:4;23068:19;:17;:19::i;:::-;23045:16;:43::i;:::-;23040:92;;23097:35;;;;;;;;;;;;;;23040:92;22952:180;23163:1;23149:16;;:2;:16;;;23145:52;;23174:23;;;;;;;;;;;;;;23145:52;23210:43;23232:4;23238:2;23242:7;23251:1;23210:21;:43::i;:::-;23293:15;23290:85;;;23358:1;23337:19;23330:30;23290:85;23427:18;:24;23446:4;23427:24;;;;;;;;;;;;;;;;23425:26;;;;;;;;;;;;23469:18;:22;23488:2;23469:22;;;;;;;;;;;;;;;;23467:24;;;;;;;;;;;23538:146;23575:2;23624:45;23639:4;23645:2;23649:19;23624:14;:45::i;:::-;14117:8;23596:73;23538:18;:146::i;:::-;23509:17;:26;23527:7;23509:26;;;;;;;;;;;:175;;;;23756:1;14117:8;23705:19;:47;:52;23701:370;;23778:19;23810:1;23800:7;:11;23778:33;;23870:1;23836:17;:30;23854:11;23836:30;;;;;;;;;;;;:35;23832:224;;23917:13;;23902:11;:28;23898:139;;23994:19;23961:17;:30;23979:11;23961:30;;;;;;;;;;;:52;;;;23898:139;23832:224;23759:312;23701:370;24118:7;24114:2;24099:27;;24108:4;24099:27;;;;;;;;;;;;24137:42;24158:4;24164:2;24168:7;24177:1;24137:20;:42::i;:::-;22667:1520;;;22536:1651;;;:::o;2945:132::-;3020:12;:10;:12::i;:::-;3009:23;;:7;:5;:7::i;:::-;:23;;;3001:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2945:132::o;24195:193::-;24341:39;24358:4;24364:2;24368:7;24341:39;;;;;;;;;;;;:16;:39::i;:::-;24195:193;;;:::o;29191:1679::-;29271:27;29301;29320:7;29301:18;:27::i;:::-;29271:57;;29341:12;29372:19;29341:52;;29407:27;29436:23;29463:35;29490:7;29463:26;:35::i;:::-;29406:92;;;;29515:13;29511:244;;;29564:68;29589:15;29606:4;29612:19;:17;:19::i;:::-;29564:24;:68::i;:::-;29559:184;;29656:43;29673:4;29679:19;:17;:19::i;:::-;29656:16;:43::i;:::-;29651:92;;29708:35;;;;;;;;;;;;;;29651:92;29559:184;29511:244;29767:51;29789:4;29803:1;29807:7;29816:1;29767:21;:51::i;:::-;29858:15;29855:101;;;29939:1;29918:19;29911:30;29855:101;30065:1;13740:3;30035:1;:26;;30034:32;30006:18;:24;30025:4;30006:24;;;;;;;;;;;;;;;;:60;;;;;;;;;;;30112:176;30149:4;30220:53;30235:4;30249:1;30253:19;30220:14;:53::i;:::-;14117:8;13983;30173:43;30172:101;30112:18;:176::i;:::-;30083:17;:26;30101:7;30083:26;;;;;;;;;;;:205;;;;30360:1;14117:8;30309:19;:47;:52;30305:370;;30382:19;30414:1;30404:7;:11;30382:33;;30474:1;30440:17;:30;30458:11;30440:30;;;;;;;;;;;;:35;30436:224;;30521:13;;30506:11;:28;30502:139;;30598:19;30565:17;:30;30583:11;30565:30;;;;;;;;;;;:52;;;;30502:139;30436:224;30363:312;30305:370;30730:7;30726:1;30703:35;;30712:4;30703:35;;;;;;;;;;;;30749:50;30770:4;30784:1;30788:7;30797:1;30749:20;:50::i;:::-;30837:12;;:14;;;;;;;;;;;;;29260:1610;;;;29191:1679;;:::o;18580:633::-;18647:7;18667:12;18682:7;18667:22;;18750:4;18731:15;:13;:15::i;:::-;:23;18727:419;;18784:13;;18777:4;:20;18773:373;;;18822:14;18839:17;:23;18857:4;18839:23;;;;;;;;;;;;18822:40;;18919:1;13983:8;18891:6;:24;:29;18887:240;;18951:113;18968:1;18958:6;:11;18951:113;;19011:17;:25;19029:6;;;;;;;19011:25;;;;;;;;;;;;19002:34;;18951:113;;;19097:6;19090:13;;;;;;18887:240;18799:347;18773:373;18727:419;19174:31;;;;;;;;;;;;;;18580:633;;;;:::o;3407:191::-;3481:16;3500:6;;;;;;;;;;;3481:25;;3526:8;3517:6;;:17;;;;;;;;;;;;;;;;;;3581:8;3550:40;;3571:8;3550:40;;;;;;;;;;;;3470:128;3407:191;:::o;28974:112::-;29051:27;29061:2;29065:8;29051:27;;;;;;;;;;;;:9;:27::i;:::-;28974:112;;:::o;24396:407::-;24571:31;24584:4;24590:2;24594:7;24571:12;:31::i;:::-;24635:1;24617:2;:14;;;:19;24613:183;;24656:56;24687:4;24693:2;24697:7;24706:5;24656:30;:56::i;:::-;24651:145;;24740:40;;;;;;;;;;;;;;24651:145;24613:183;24396:407;;;;:::o;4361:534::-;4417:13;4458:1;4449:5;:10;4445:53;;4476:10;;;;;;;;;;;;;;;;;;;;;4445:53;4508:12;4523:5;4508:20;;4539:14;4564:78;4579:1;4571:4;:9;4564:78;;4597:8;;;;;:::i;:::-;;;;4628:2;4620:10;;;;;:::i;:::-;;;4564:78;;;4652:19;4684:6;4674:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4652:39;;4702:154;4718:1;4709:5;:10;4702:154;;4746:1;4736:11;;;;;:::i;:::-;;;4813:2;4805:5;:10;;;;:::i;:::-;4792:2;:24;;;;:::i;:::-;4779:39;;4762:6;4769;4762:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;4842:2;4833:11;;;;;:::i;:::-;;;4702:154;;;4880:6;4866:21;;;;;4361:534;;;;:::o;22136:392::-;22238:27;22267:23;22308:38;22349:15;:24;22365:7;22349:24;;;;;;;;;;;22308:65;;22433:18;22410:41;;22490:19;22484:26;22465:45;;22395:126;22136:392;;;:::o;21731:397::-;21880:11;21950:16;21943:5;21939:28;21930:37;;22011:16;22000:9;21996:32;21983:45;;22093:15;22082:9;22079:30;22071:5;22060:9;22057:20;22054:56;22044:66;;21731:397;;;;;:::o;24811:159::-;;;;;:::o;31502:311::-;31637:7;31657:16;14180:3;31683:19;:41;;31657:68;;14180:3;31751:31;31762:4;31768:2;31772:9;31751:10;:31::i;:::-;31743:40;;:62;;31736:69;;;31502:311;;;;;:::o;19595:450::-;19675:14;19843:16;19836:5;19832:28;19823:37;;20020:5;20006:11;19981:23;19977:41;19974:52;19967:5;19964:63;19954:73;;19595:450;;;;:::o;24978:158::-;;;;;:::o;2296:98::-;2349:7;2376:10;2369:17;;2296:98;:::o;28277:689::-;28408:19;28414:2;28418:8;28408:5;:19::i;:::-;28487:1;28469:2;:14;;;:19;28465:483;;28509:11;28523:13;;28509:27;;28555:13;28577:8;28571:3;:14;28555:30;;28604:233;28635:62;28674:1;28678:2;28682:7;;;;;;28691:5;28635:30;:62::i;:::-;28630:167;;28733:40;;;;;;;;;;;;;;28630:167;28832:3;28824:5;:11;28604:233;;28919:3;28902:13;;:20;28898:34;;28924:8;;;28898:34;28490:458;;28465:483;28277:689;;;:::o;25144:716::-;25307:4;25353:2;25328:45;;;25374:19;:17;:19::i;:::-;25395:4;25401:7;25410:5;25328:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;25324:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25628:1;25611:6;:13;:18;25607:235;;25657:40;;;;;;;;;;;;;;25607:235;25800:6;25794:13;25785:6;25781:2;25777:15;25770:38;25324:529;25497:54;;;25487:64;;;:6;:64;;;;25480:71;;;25144:716;;;;;;:::o;31347:147::-;31484:6;31347:147;;;;;:::o;25868:1442::-;25941:20;25964:13;;25941:36;;26004:1;25992:8;:13;25988:44;;26014:18;;;;;;;;;;;;;;25988:44;26045:61;26075:1;26079:2;26083:12;26097:8;26045:21;:61::i;:::-;26215:1;13680:2;26185:1;:26;;26184:32;26172:8;:45;26146:18;:22;26165:2;26146:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;26268:139;26305:2;26359:33;26382:1;26386:2;26390:1;26359:14;:33::i;:::-;26326:30;26347:8;26326:20;:30::i;:::-;:66;26268:18;:139::i;:::-;26234:17;:31;26252:12;26234:31;;;;;;;;;;;:173;;;;26424:16;26455:11;26484:8;26469:12;:23;26455:37;;26559:16;26555:2;26551:25;26539:37;;26779:12;26747:8;26722:1;26673:25;26648:1;26623;26596:215;26891:1;26877:12;26873:20;26831:279;26932:3;26923:7;26920:16;26831:279;;27083:7;27073:8;27070:1;27043:25;27040:1;27037;27032:59;26985:1;26976:7;26972:15;26961:26;;26831:279;;;26835:77;27155:1;27143:8;:13;27139:45;;27165:19;;;;;;;;;;;;;;27139:45;27217:3;27201:13;:19;;;;26119:1113;;27242:60;27271:1;27275:2;27279:12;27293:8;27242:20;:60::i;:::-;25930:1380;25868:1442;;:::o;20053:324::-;20123:14;20356:1;20346:8;20343:15;20317:24;20313:46;20303:56;;20053: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:474::-;6270:6;6278;6327:2;6315:9;6306:7;6302:23;6298:32;6295:119;;;6333:79;;:::i;:::-;6295:119;6453:1;6478:53;6523:7;6514:6;6503:9;6499:22;6478:53;:::i;:::-;6468:63;;6424:117;6580:2;6606:53;6651:7;6642:6;6631:9;6627:22;6606:53;:::i;:::-;6596:63;;6551:118;6202:474;;;;;:::o;6682:117::-;6791:1;6788;6781:12;6805:117;6914:1;6911;6904:12;6928:180;6976:77;6973:1;6966:88;7073:4;7070:1;7063:15;7097:4;7094:1;7087:15;7114:281;7197:27;7219:4;7197:27;:::i;:::-;7189:6;7185:40;7327:6;7315:10;7312:22;7291:18;7279:10;7276:34;7273:62;7270:88;;;7338:18;;:::i;:::-;7270:88;7378:10;7374:2;7367:22;7157:238;7114:281;;:::o;7401:129::-;7435:6;7462:20;;:::i;:::-;7452:30;;7491:33;7519:4;7511:6;7491:33;:::i;:::-;7401:129;;;:::o;7536:308::-;7598:4;7688:18;7680:6;7677:30;7674:56;;;7710:18;;:::i;:::-;7674:56;7748:29;7770:6;7748:29;:::i;:::-;7740:37;;7832:4;7826;7822:15;7814:23;;7536:308;;;:::o;7850:146::-;7947:6;7942:3;7937;7924:30;7988:1;7979:6;7974:3;7970:16;7963:27;7850:146;;;:::o;8002:425::-;8080:5;8105:66;8121:49;8163:6;8121:49;:::i;:::-;8105:66;:::i;:::-;8096:75;;8194:6;8187:5;8180:21;8232:4;8225:5;8221:16;8270:3;8261:6;8256:3;8252:16;8249:25;8246:112;;;8277:79;;:::i;:::-;8246:112;8367:54;8414:6;8409:3;8404;8367:54;:::i;:::-;8086:341;8002:425;;;;;:::o;8447:340::-;8503:5;8552:3;8545:4;8537:6;8533:17;8529:27;8519:122;;8560:79;;:::i;:::-;8519:122;8677:6;8664:20;8702:79;8777:3;8769:6;8762:4;8754:6;8750:17;8702:79;:::i;:::-;8693:88;;8509:278;8447:340;;;;:::o;8793:509::-;8862:6;8911:2;8899:9;8890:7;8886:23;8882:32;8879:119;;;8917:79;;:::i;:::-;8879:119;9065:1;9054:9;9050:17;9037:31;9095:18;9087:6;9084:30;9081:117;;;9117:79;;:::i;:::-;9081:117;9222:63;9277:7;9268:6;9257:9;9253:22;9222:63;:::i;:::-;9212:73;;9008:287;8793:509;;;;:::o;9308:116::-;9378:21;9393:5;9378:21;:::i;:::-;9371:5;9368:32;9358:60;;9414:1;9411;9404:12;9358:60;9308:116;:::o;9430:133::-;9473:5;9511:6;9498:20;9489:29;;9527:30;9551:5;9527:30;:::i;:::-;9430:133;;;;:::o;9569:648::-;9644:6;9652;9701:2;9689:9;9680:7;9676:23;9672:32;9669:119;;;9707:79;;:::i;:::-;9669:119;9827:1;9852:50;9894:7;9885:6;9874:9;9870:22;9852:50;:::i;:::-;9842:60;;9798:114;9979:2;9968:9;9964:18;9951:32;10010:18;10002:6;9999:30;9996:117;;;10032:79;;:::i;:::-;9996:117;10137:63;10192:7;10183:6;10172:9;10168:22;10137:63;:::i;:::-;10127:73;;9922:288;9569:648;;;;;:::o;10223:468::-;10288:6;10296;10345:2;10333:9;10324:7;10320:23;10316:32;10313:119;;;10351:79;;:::i;:::-;10313:119;10471:1;10496:53;10541:7;10532:6;10521:9;10517:22;10496:53;:::i;:::-;10486:63;;10442:117;10598:2;10624:50;10666:7;10657:6;10646:9;10642:22;10624:50;:::i;:::-;10614:60;;10569:115;10223:468;;;;;:::o;10697:307::-;10758:4;10848:18;10840:6;10837:30;10834:56;;;10870:18;;:::i;:::-;10834:56;10908:29;10930:6;10908:29;:::i;:::-;10900:37;;10992:4;10986;10982:15;10974:23;;10697:307;;;:::o;11010:423::-;11087:5;11112:65;11128:48;11169:6;11128:48;:::i;:::-;11112:65;:::i;:::-;11103:74;;11200:6;11193:5;11186:21;11238:4;11231:5;11227:16;11276:3;11267:6;11262:3;11258:16;11255:25;11252:112;;;11283:79;;:::i;:::-;11252:112;11373:54;11420:6;11415:3;11410;11373:54;:::i;:::-;11093:340;11010:423;;;;;:::o;11452:338::-;11507:5;11556:3;11549:4;11541:6;11537:17;11533:27;11523:122;;11564:79;;:::i;:::-;11523:122;11681:6;11668:20;11706:78;11780:3;11772:6;11765:4;11757:6;11753:17;11706:78;:::i;:::-;11697:87;;11513:277;11452:338;;;;:::o;11796:943::-;11891:6;11899;11907;11915;11964:3;11952:9;11943:7;11939:23;11935:33;11932:120;;;11971:79;;:::i;:::-;11932:120;12091:1;12116:53;12161:7;12152:6;12141:9;12137:22;12116:53;:::i;:::-;12106:63;;12062:117;12218:2;12244:53;12289:7;12280:6;12269:9;12265:22;12244:53;:::i;:::-;12234:63;;12189:118;12346:2;12372:53;12417:7;12408:6;12397:9;12393:22;12372:53;:::i;:::-;12362:63;;12317:118;12502:2;12491:9;12487:18;12474:32;12533:18;12525:6;12522:30;12519:117;;;12555:79;;:::i;:::-;12519:117;12660:62;12714:7;12705:6;12694:9;12690:22;12660:62;:::i;:::-;12650:72;;12445:287;11796:943;;;;;;;:::o;12745:474::-;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:332::-;13858:4;13896:2;13885:9;13881:18;13873:26;;13909:71;13977:1;13966:9;13962:17;13953:6;13909:71;:::i;:::-;13990:72;14058:2;14047:9;14043:18;14034:6;13990:72;:::i;:::-;13737:332;;;;;:::o;14075:137::-;14129:5;14160:6;14154:13;14145:22;;14176:30;14200:5;14176:30;:::i;:::-;14075:137;;;;:::o;14218:345::-;14285:6;14334:2;14322:9;14313:7;14309:23;14305:32;14302:119;;;14340:79;;:::i;:::-;14302:119;14460:1;14485:61;14538:7;14529:6;14518:9;14514:22;14485:61;:::i;:::-;14475:71;;14431:125;14218:345;;;;:::o;14569:181::-;14709:33;14705:1;14697:6;14693:14;14686:57;14569:181;:::o;14756:366::-;14898:3;14919:67;14983:2;14978:3;14919:67;:::i;:::-;14912:74;;14995:93;15084:3;14995:93;:::i;:::-;15113:2;15108:3;15104:12;15097:19;;14756:366;;;:::o;15128:419::-;15294:4;15332:2;15321:9;15317:18;15309:26;;15381:9;15375:4;15371:20;15367:1;15356:9;15352:17;15345:47;15409:131;15535:4;15409:131;:::i;:::-;15401:139;;15128:419;;;:::o;15553:147::-;15654:11;15691:3;15676:18;;15553:147;;;;:::o;15706:114::-;;:::o;15826:398::-;15985:3;16006:83;16087:1;16082:3;16006:83;:::i;:::-;15999:90;;16098:93;16187:3;16098:93;:::i;:::-;16216:1;16211:3;16207:11;16200:18;;15826:398;;;:::o;16230:379::-;16414:3;16436:147;16579:3;16436:147;:::i;:::-;16429:154;;16600:3;16593:10;;16230:379;;;:::o;16615:165::-;16755:17;16751:1;16743:6;16739:14;16732:41;16615:165;:::o;16786:366::-;16928:3;16949:67;17013:2;17008:3;16949:67;:::i;:::-;16942:74;;17025:93;17114:3;17025:93;:::i;:::-;17143:2;17138:3;17134:12;17127:19;;16786:366;;;:::o;17158:419::-;17324:4;17362:2;17351:9;17347:18;17339:26;;17411:9;17405:4;17401:20;17397:1;17386:9;17382:17;17375:47;17439:131;17565:4;17439:131;:::i;:::-;17431:139;;17158:419;;;:::o;17583:180::-;17631:77;17628:1;17621:88;17728:4;17725:1;17718:15;17752:4;17749:1;17742:15;17769:191;17809:3;17828:20;17846:1;17828:20;:::i;:::-;17823:25;;17862:20;17880:1;17862:20;:::i;:::-;17857:25;;17905:1;17902;17898:9;17891:16;;17926:3;17923:1;17920:10;17917:36;;;17933:18;;:::i;:::-;17917:36;17769:191;;;;:::o;17966:172::-;18106:24;18102:1;18094:6;18090:14;18083:48;17966:172;:::o;18144:366::-;18286:3;18307:67;18371:2;18366:3;18307:67;:::i;:::-;18300:74;;18383:93;18472:3;18383:93;:::i;:::-;18501:2;18496:3;18492:12;18485:19;;18144:366;;;:::o;18516:419::-;18682:4;18720:2;18709:9;18705:18;18697:26;;18769:9;18763:4;18759:20;18755:1;18744:9;18740:17;18733:47;18797:131;18923:4;18797:131;:::i;:::-;18789:139;;18516:419;;;:::o;18941:141::-;18990:4;19013:3;19005:11;;19036:3;19033:1;19026:14;19070:4;19067:1;19057:18;19049:26;;18941:141;;;:::o;19088:93::-;19125:6;19172:2;19167;19160:5;19156:14;19152:23;19142:33;;19088:93;;;:::o;19187:107::-;19231:8;19281:5;19275:4;19271:16;19250:37;;19187:107;;;;:::o;19300:393::-;19369:6;19419:1;19407:10;19403:18;19442:97;19472:66;19461:9;19442:97;:::i;:::-;19560:39;19590:8;19579:9;19560:39;:::i;:::-;19548:51;;19632:4;19628:9;19621:5;19617:21;19608:30;;19681:4;19671:8;19667:19;19660:5;19657:30;19647:40;;19376:317;;19300:393;;;;;:::o;19699:60::-;19727:3;19748:5;19741:12;;19699:60;;;:::o;19765:142::-;19815:9;19848:53;19866:34;19875:24;19893:5;19875:24;:::i;:::-;19866:34;:::i;:::-;19848:53;:::i;:::-;19835:66;;19765:142;;;:::o;19913:75::-;19956:3;19977:5;19970:12;;19913:75;;;:::o;19994:269::-;20104:39;20135:7;20104:39;:::i;:::-;20165:91;20214:41;20238:16;20214:41;:::i;:::-;20206:6;20199:4;20193:11;20165:91;:::i;:::-;20159:4;20152:105;20070:193;19994:269;;;:::o;20269:73::-;20314:3;20269:73;:::o;20348:189::-;20425:32;;:::i;:::-;20466:65;20524:6;20516;20510:4;20466:65;:::i;:::-;20401:136;20348:189;;:::o;20543:186::-;20603:120;20620:3;20613:5;20610:14;20603:120;;;20674:39;20711:1;20704:5;20674:39;:::i;:::-;20647:1;20640:5;20636:13;20627:22;;20603:120;;;20543:186;;:::o;20735:543::-;20836:2;20831:3;20828:11;20825:446;;;20870:38;20902:5;20870:38;:::i;:::-;20954:29;20972:10;20954:29;:::i;:::-;20944:8;20940:44;21137:2;21125:10;21122:18;21119:49;;;21158:8;21143:23;;21119:49;21181:80;21237:22;21255:3;21237:22;:::i;:::-;21227:8;21223:37;21210:11;21181:80;:::i;:::-;20840:431;;20825:446;20735:543;;;:::o;21284:117::-;21338:8;21388:5;21382:4;21378:16;21357:37;;21284:117;;;;:::o;21407:169::-;21451:6;21484:51;21532:1;21528:6;21520:5;21517:1;21513:13;21484:51;:::i;:::-;21480:56;21565:4;21559;21555:15;21545:25;;21458:118;21407:169;;;;:::o;21581:295::-;21657:4;21803:29;21828:3;21822:4;21803:29;:::i;:::-;21795:37;;21865:3;21862:1;21858:11;21852:4;21849:21;21841:29;;21581:295;;;;:::o;21881:1395::-;21998:37;22031:3;21998:37;:::i;:::-;22100:18;22092:6;22089:30;22086:56;;;22122:18;;:::i;:::-;22086:56;22166:38;22198:4;22192:11;22166:38;:::i;:::-;22251:67;22311:6;22303;22297:4;22251:67;:::i;:::-;22345:1;22369:4;22356:17;;22401:2;22393:6;22390:14;22418:1;22413:618;;;;23075:1;23092:6;23089:77;;;23141:9;23136:3;23132:19;23126:26;23117:35;;23089:77;23192:67;23252:6;23245:5;23192:67;:::i;:::-;23186:4;23179:81;23048:222;22383:887;;22413:618;22465:4;22461:9;22453:6;22449:22;22499:37;22531:4;22499:37;:::i;:::-;22558:1;22572:208;22586:7;22583:1;22580:14;22572:208;;;22665:9;22660:3;22656:19;22650:26;22642:6;22635:42;22716:1;22708:6;22704:14;22694:24;;22763:2;22752:9;22748:18;22735:31;;22609:4;22606:1;22602:12;22597:17;;22572:208;;;22808:6;22799:7;22796:19;22793:179;;;22866:9;22861:3;22857:19;22851:26;22909:48;22951:4;22943:6;22939:17;22928:9;22909:48;:::i;:::-;22901:6;22894:64;22816:156;22793:179;23018:1;23014;23006:6;23002:14;22998:22;22992:4;22985:36;22420:611;;;22383:887;;21973:1303;;;21881:1395;;:::o;23282:180::-;23422:32;23418:1;23410:6;23406:14;23399:56;23282:180;:::o;23468:366::-;23610:3;23631:67;23695:2;23690:3;23631:67;:::i;:::-;23624:74;;23707:93;23796:3;23707:93;:::i;:::-;23825:2;23820:3;23816:12;23809:19;;23468:366;;;:::o;23840:419::-;24006:4;24044:2;24033:9;24029:18;24021:26;;24093:9;24087:4;24083:20;24079:1;24068:9;24064:17;24057:47;24121:131;24247:4;24121:131;:::i;:::-;24113:139;;23840:419;;;:::o;24265:194::-;24305:4;24325:20;24343:1;24325:20;:::i;:::-;24320:25;;24359:20;24377:1;24359:20;:::i;:::-;24354:25;;24403:1;24400;24396:9;24388:17;;24427:1;24421:4;24418:11;24415:37;;;24432:18;;:::i;:::-;24415:37;24265:194;;;;:::o;24465:410::-;24505:7;24528:20;24546:1;24528:20;:::i;:::-;24523:25;;24562:20;24580:1;24562:20;:::i;:::-;24557:25;;24617:1;24614;24610:9;24639:30;24657:11;24639:30;:::i;:::-;24628:41;;24818:1;24809:7;24805:15;24802:1;24799:22;24779:1;24772:9;24752:83;24729:139;;24848:18;;:::i;:::-;24729:139;24513:362;24465:410;;;;:::o;24881:169::-;25021:21;25017:1;25009:6;25005:14;24998:45;24881:169;:::o;25056:366::-;25198:3;25219:67;25283:2;25278:3;25219:67;:::i;:::-;25212:74;;25295:93;25384:3;25295:93;:::i;:::-;25413:2;25408:3;25404:12;25397:19;;25056:366;;;:::o;25428:419::-;25594:4;25632:2;25621:9;25617:18;25609:26;;25681:9;25675:4;25671:20;25667:1;25656:9;25652:17;25645:47;25709:131;25835:4;25709:131;:::i;:::-;25701:139;;25428:419;;;:::o;25853:163::-;25993:15;25989:1;25981:6;25977:14;25970:39;25853:163;:::o;26022:366::-;26164:3;26185:67;26249:2;26244:3;26185:67;:::i;:::-;26178:74;;26261:93;26350:3;26261:93;:::i;:::-;26379:2;26374:3;26370:12;26363:19;;26022:366;;;:::o;26394:419::-;26560:4;26598:2;26587:9;26583:18;26575:26;;26647:9;26641:4;26637:20;26633:1;26622:9;26618:17;26611:47;26675:131;26801:4;26675:131;:::i;:::-;26667:139;;26394:419;;;:::o;26819:236::-;26959:34;26955:1;26947:6;26943:14;26936:58;27028:19;27023:2;27015:6;27011:15;27004:44;26819:236;:::o;27061:366::-;27203:3;27224:67;27288:2;27283:3;27224:67;:::i;:::-;27217:74;;27300:93;27389:3;27300:93;:::i;:::-;27418:2;27413:3;27409:12;27402:19;;27061:366;;;:::o;27433:419::-;27599:4;27637:2;27626:9;27622:18;27614:26;;27686:9;27680:4;27676:20;27672:1;27661:9;27657:17;27650:47;27714:131;27840:4;27714:131;:::i;:::-;27706:139;;27433:419;;;:::o;27858:248::-;27998:34;27994:1;27986:6;27982:14;27975:58;28067:31;28062:2;28054:6;28050:15;28043:56;27858:248;:::o;28112:366::-;28254:3;28275:67;28339:2;28334:3;28275:67;:::i;:::-;28268:74;;28351:93;28440:3;28351:93;:::i;:::-;28469:2;28464:3;28460:12;28453:19;;28112:366;;;:::o;28484:419::-;28650:4;28688:2;28677:9;28673:18;28665:26;;28737:9;28731:4;28727:20;28723:1;28712:9;28708:17;28701:47;28765:131;28891:4;28765:131;:::i;:::-;28757:139;;28484:419;;;:::o;28909:220::-;29049:34;29045:1;29037:6;29033:14;29026:58;29118:3;29113:2;29105:6;29101:15;29094:28;28909:220;:::o;29135:366::-;29277:3;29298:67;29362:2;29357:3;29298:67;:::i;:::-;29291:74;;29374:93;29463:3;29374:93;:::i;:::-;29492:2;29487:3;29483:12;29476:19;;29135:366;;;:::o;29507:419::-;29673:4;29711:2;29700:9;29696:18;29688:26;;29760:9;29754:4;29750:20;29746:1;29735:9;29731:17;29724:47;29788:131;29914:4;29788:131;:::i;:::-;29780:139;;29507:419;;;:::o;29932:148::-;30034:11;30071:3;30056:18;;29932:148;;;;:::o;30110:874::-;30213:3;30250:5;30244:12;30279:36;30305:9;30279:36;:::i;:::-;30331:89;30413:6;30408:3;30331:89;:::i;:::-;30324:96;;30451:1;30440:9;30436:17;30467:1;30462:166;;;;30642:1;30637:341;;;;30429:549;;30462:166;30546:4;30542:9;30531;30527:25;30522:3;30515:38;30608:6;30601:14;30594:22;30586:6;30582:35;30577:3;30573:45;30566:52;;30462:166;;30637:341;30704:38;30736:5;30704:38;:::i;:::-;30764:1;30778:154;30792:6;30789:1;30786:13;30778:154;;;30866:7;30860:14;30856:1;30851:3;30847:11;30840:35;30916:1;30907:7;30903:15;30892:26;;30814:4;30811:1;30807:12;30802:17;;30778:154;;;30961:6;30956:3;30952:16;30945:23;;30644:334;;30429:549;;30217:767;;30110:874;;;;:::o;30990:390::-;31096:3;31124:39;31157:5;31124:39;:::i;:::-;31179:89;31261:6;31256:3;31179:89;:::i;:::-;31172:96;;31277:65;31335:6;31330:3;31323:4;31316:5;31312:16;31277:65;:::i;:::-;31367:6;31362:3;31358:16;31351:23;;31100:280;30990:390;;;;:::o;31386:429::-;31563:3;31585:92;31673:3;31664:6;31585:92;:::i;:::-;31578:99;;31694:95;31785:3;31776:6;31694:95;:::i;:::-;31687:102;;31806:3;31799:10;;31386:429;;;;;:::o;31821:225::-;31961:34;31957:1;31949:6;31945:14;31938:58;32030:8;32025:2;32017:6;32013:15;32006:33;31821:225;:::o;32052:366::-;32194:3;32215:67;32279:2;32274:3;32215:67;:::i;:::-;32208:74;;32291:93;32380:3;32291:93;:::i;:::-;32409:2;32404:3;32400:12;32393:19;;32052:366;;;:::o;32424:419::-;32590:4;32628:2;32617:9;32613:18;32605:26;;32677:9;32671:4;32667:20;32663:1;32652:9;32648:17;32641:47;32705:131;32831:4;32705:131;:::i;:::-;32697:139;;32424:419;;;:::o;32849:182::-;32989:34;32985:1;32977:6;32973:14;32966:58;32849:182;:::o;33037:366::-;33179:3;33200:67;33264:2;33259:3;33200:67;:::i;:::-;33193:74;;33276:93;33365:3;33276:93;:::i;:::-;33394:2;33389:3;33385:12;33378:19;;33037:366;;;:::o;33409:419::-;33575:4;33613:2;33602:9;33598:18;33590:26;;33662:9;33656:4;33652:20;33648:1;33637:9;33633:17;33626:47;33690:131;33816:4;33690:131;:::i;:::-;33682:139;;33409:419;;;:::o;33834:233::-;33873:3;33896:24;33914:5;33896:24;:::i;:::-;33887:33;;33942:66;33935:5;33932:77;33929:103;;34012:18;;:::i;:::-;33929:103;34059:1;34052:5;34048:13;34041:20;;33834:233;;;:::o;34073:180::-;34121:77;34118:1;34111:88;34218:4;34215:1;34208:15;34242:4;34239:1;34232:15;34259:185;34299:1;34316:20;34334:1;34316:20;:::i;:::-;34311:25;;34350:20;34368:1;34350:20;:::i;:::-;34345:25;;34389:1;34379:35;;34394:18;;:::i;:::-;34379:35;34436:1;34433;34429:9;34424:14;;34259:185;;;;:::o;34450:176::-;34482:1;34499:20;34517:1;34499:20;:::i;:::-;34494:25;;34533:20;34551:1;34533:20;:::i;:::-;34528:25;;34572:1;34562:35;;34577:18;;:::i;:::-;34562:35;34618:1;34615;34611:9;34606:14;;34450:176;;;;:::o;34632:180::-;34680:77;34677:1;34670:88;34777:4;34774:1;34767:15;34801:4;34798:1;34791:15;34818:98;34869:6;34903:5;34897:12;34887:22;;34818:98;;;:::o;34922:168::-;35005:11;35039:6;35034:3;35027:19;35079:4;35074:3;35070:14;35055:29;;34922:168;;;;:::o;35096:373::-;35182:3;35210:38;35242:5;35210:38;:::i;:::-;35264:70;35327:6;35322:3;35264:70;:::i;:::-;35257:77;;35343:65;35401:6;35396:3;35389:4;35382:5;35378:16;35343:65;:::i;:::-;35433:29;35455:6;35433:29;:::i;:::-;35428:3;35424:39;35417:46;;35186:283;35096:373;;;;:::o;35475:640::-;35670:4;35708:3;35697:9;35693:19;35685:27;;35722:71;35790:1;35779:9;35775:17;35766:6;35722:71;:::i;:::-;35803:72;35871:2;35860:9;35856:18;35847:6;35803:72;:::i;:::-;35885;35953:2;35942:9;35938:18;35929:6;35885:72;:::i;:::-;36004:9;35998:4;35994:20;35989:2;35978:9;35974:18;35967:48;36032:76;36103:4;36094:6;36032:76;:::i;:::-;36024:84;;35475:640;;;;;;;:::o;36121:141::-;36177:5;36208:6;36202:13;36193:22;;36224:32;36250:5;36224:32;:::i;:::-;36121:141;;;;:::o;36268:349::-;36337:6;36386:2;36374:9;36365:7;36361:23;36357:32;36354:119;;;36392:79;;:::i;:::-;36354:119;36512:1;36537:63;36592:7;36583:6;36572:9;36568:22;36537:63;:::i;:::-;36527:73;;36483:127;36268:349;;;;:::o

Swarm Source

ipfs://b6d0062482bb5e486b7676700b040093e2b02ceffaf8d53dc3a3e5a09c939c24
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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