ETH Price: $3,352.19 (-3.67%)
Gas: 6.3 Gwei

Token

Tactical Pepe Force (TPF)
 

Overview

Max Total Supply

5,000 TPF

Holders

1,706

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 TPF
0x288e1ea236eb545c314b7868a078fce73b4ecad5
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:
TacticalPepeForce

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-09-02
*/

/**
 _______             _____  _______  _____   _____            _        _____   ______  _____   ______   ______   ____   _____    _____  ______ 
|__   __|    /\     / ____||__   __||_   _| / ____|    /\    | |      |  __ \ |  ____||  __ \ |  ____| |  ____| / __ \ |  __ \  / ____||  ____|
   | |      /  \   | |        | |     | |  | |        /  \   | |      | |__) || |__   | |__) || |__    | |__   | |  | || |__) || |     | |__   
   | |     / /\ \  | |        | |     | |  | |       / /\ \  | |      |  ___/ |  __|  |  ___/ |  __|   |  __|  | |  | ||  _  / | |     |  __|  
   | |    / ____ \ | |____    | |    _| |_ | |____  / ____ \ | |____  | |     | |____ | |     | |____  | |     | |__| || | \ \ | |____ | |____ 
   |_|   /_/    \_\ \_____|   |_|   |_____| \_____|/_/    \_\|______| |_|     |______||_|     |______| |_|      \____/ |_|  \_\ \_____||______|
                                                                                                                                               
                                                                                                                                                                                                            
*/

// SPDX-License-Identifier: MIT     

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

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

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

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

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

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

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

    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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


    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

pragma solidity ^0.8.0;

abstract contract ReentrancyGuard {

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

        _status = _ENTERED;

        _;

        _status = _NOT_ENTERED;
    }
}

pragma solidity ^0.8.0;

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

    function toString(uint256 value) internal pure returns (string memory) {

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

    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

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

pragma solidity ^0.8.0;


library EnumerableSet {


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

        mapping(bytes32 => uint256) _indexes;
    }

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

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

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

        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) {

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

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

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

            set._values.pop();

            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

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

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

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

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

    struct Bytes32Set {
        Set _inner;
    }

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

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

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

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

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

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

    struct AddressSet {
        Set _inner;
    }

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

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

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

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

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

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

        assembly {
            result := store
        }

        return result;
    }

    struct UintSet {
        Set _inner;
    }

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

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

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

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

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

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

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

        return result;
    }
}

pragma solidity ^0.8.4;

interface IERC721A {

    error ApprovalCallerNotOwnerNorApproved();

    error ApprovalQueryForNonexistentToken();

    error BalanceQueryForZeroAddress();

    error MintToZeroAddress();

    error MintZeroQuantity();

    error OwnerQueryForNonexistentToken();

    error TransferCallerNotOwnerNorApproved();

    error TransferFromIncorrectOwner();

    error TransferToNonERC721ReceiverImplementer();

    error TransferToZeroAddress();

    error URIQueryForNonexistentToken();

    error MintERC2309QuantityExceedsLimit();

    error OwnershipNotInitializedForExtraData();

    struct TokenOwnership {

        address addr;

        uint64 startTimestamp;

        bool burned;

        uint24 extraData;
    }

    function totalSupply() external view returns (uint256);

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

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

    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    function balanceOf(address owner) external view returns (uint256 balance);

    function ownerOf(uint256 tokenId) external view returns (address owner);

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

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

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

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

    function setApprovalForAll(address operator, bool _approved) external;

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

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

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

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

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

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

pragma solidity ^0.8.4;

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

contract ERC721A is IERC721A {

    struct TokenApprovalRef {
        address value;
    }

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

    uint256 private constant _BITPOS_NUMBER_MINTED = 64;

    uint256 private constant _BITPOS_NUMBER_BURNED = 128;

    uint256 private constant _BITPOS_AUX = 192;

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

    uint256 private constant _BITPOS_START_TIMESTAMP = 160;

    uint256 private constant _BITMASK_BURNED = 1 << 224;

    uint256 private constant _BITPOS_NEXT_INITIALIZED = 225;

    uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225;

    uint256 private constant _BITPOS_EXTRA_DATA = 232;

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

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

    uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;

    bytes32 private constant _TRANSFER_EVENT_SIGNATURE =
        0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;

    uint256 private _currentIndex;

    uint256 private _burnCounter;

    string private _name;

    string private _symbol;

    mapping(uint256 => uint256) private _packedOwnerships;

    mapping(address => uint256) private _packedAddressData;

    mapping(uint256 => TokenApprovalRef) private _tokenApprovals;

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

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

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

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

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

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

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

        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

                    if (packed & _BITMASK_BURNED == 0) {

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

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

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

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

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

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

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

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

        return _tokenApprovals[tokenId].value;
    }

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

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

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

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

            owner := and(owner, _BITMASK_ADDRESS)

            msgSender := and(msgSender, _BITMASK_ADDRESS)

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

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

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

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

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

        assembly {
            if approvedAddress {

                sstore(approvedAddressSlot, 0)
            }
        }

        unchecked {

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

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

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

                if (_packedOwnerships[nextTokenId] == 0) {

                    if (nextTokenId != _currentIndex) {

                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

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

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

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

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

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

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

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

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

        unchecked {

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

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

            uint256 toMasked;
            uint256 end = startTokenId + quantity;

            assembly {

                toMasked := and(to, _BITMASK_ADDRESS)

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

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

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

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

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

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

        unchecked {

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

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

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

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

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

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

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

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

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

        address from = address(uint160(prevOwnershipPacked));

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

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

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

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

        unchecked {

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

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

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

                if (_packedOwnerships[nextTokenId] == 0) {

                    if (nextTokenId != _currentIndex) {

                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

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

        unchecked {
            _burnCounter++;
        }
    }

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

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

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

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

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

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

            mstore(0x40, m)

            str := sub(m, 0x20)

            mstore(str, 0)

            let end := str

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

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

                temp := div(temp, 10)

                if iszero(temp) { break }
            }

            let length := sub(end, str)

            str := sub(str, 0x20)

            mstore(str, length)
        }
    }
}

pragma solidity ^0.8.13;

contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (subscribe) {
                OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    OPERATOR_FILTER_REGISTRY.register(address(this));
                }
            }
        }
    }

     modifier onlyAllowedOperator(address from) virtual {
        // Allow spending tokens from addresses with balance
        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
        // from an EOA.
        if (from != msg.sender) {
            _checkFilterOperator(msg.sender);
        }
        _;
    }

    /**
     * @dev A helper function to check if an operator approval is allowed.
     */
    modifier onlyAllowedOperatorApproval(address operator) virtual {
        _checkFilterOperator(operator);
        _;
    }

    /**
     * @dev A helper function to check if an operator is allowed.
     */
    function _checkFilterOperator(address operator) internal view virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            // under normal circumstances, this function will revert rather than return false, but inheriting contracts
            // may specify their own OperatorFilterRegistry implementations, which may behave differently
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) {
                revert OperatorNotAllowed(operator);
            }
        }
    }
}


pragma solidity ^0.8.13;

contract DefaultOperatorFilterer is OperatorFilterer {
    /// @dev The constructor that is called when the contract is being deployed.
    constructor() OperatorFilterer(CANONICAL_CORI_SUBSCRIPTION, true) {}
}

pragma solidity ^0.8.13;

interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator) external view 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);
}

address constant CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS = 0x000000000000AAeB6D7670E522A718067333cd4E;
address constant CANONICAL_CORI_SUBSCRIPTION = 0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6;

pragma solidity ^0.8.4;

interface IERC721ABurnable is IERC721A {

    function burn(uint256 tokenId) external;
}

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


pragma solidity ^0.8.16;
contract TacticalPepeForce is Ownable, ERC721A, ReentrancyGuard, ERC721ABurnable, DefaultOperatorFilterer{
string public CONTRACT_URI = "";
mapping(address => uint) public userHasMinted;
bool public REVEALED;
string public UNREVEALED_URI = "";
string public BASE_URI = "https://nftstorage.link/ipfs/bafybeih2xduo6tawcjp737sfz3gvvavtqbkfyinchydeqs7wc2w3tjjmae/";
bool public isPublicMintEnabled = false;
uint public COLLECTION_SIZE = 5000; 
uint public MINT_PRICE = 0.0069 ether; 
uint public MAX_BATCH_SIZE = 25;
uint public SUPPLY_PER_WALLET = 57;
uint public FREE_SUPPLY_PER_WALLET = 2;
constructor() ERC721A("Tactical Pepe Force", "TPF") {}


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

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

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

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

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

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

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

        _safeMint(msg.sender, quantity);

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

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

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

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

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

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

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

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

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

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

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

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

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data)
    public
    override(ERC721A, IERC721A)
    payable
    onlyAllowedOperator(from)
    {
    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":[],"name":"BASE_URI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"COLLECTION_SIZE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CONTRACT_URI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_new","type":"uint256"}],"name":"ChangeCollectionSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_new","type":"uint256"}],"name":"ChangeFreePerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"ChangePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_new","type":"uint256"}],"name":"ChangeSupplyPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_revealed","type":"bool"},{"internalType":"string","name":"_baseURI","type":"string"}],"name":"CollectionUrI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"FREE_SUPPLY_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_BATCH_SIZE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REVEALED","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SUPPLY_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_new","type":"uint256"}],"name":"SetMaxBatchSize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"TeamMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"UNREVEALED_URI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicMintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_contractURI","type":"string"}],"name":"setContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setPublicMintEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userHasMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260405180602001604052806000815250600a9081620000249190620006e9565b5060405180602001604052806000815250600d9081620000459190620006e9565b506040518060800160405280605981526020016200480460599139600e9081620000709190620006e9565b506000600f60006101000a81548160ff0219169083151502179055506113886010556618838370f34000601155601960125560396013556002601455348015620000b957600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280601381526020017f546163746963616c205065706520466f726365000000000000000000000000008152506040518060400160405280600381526020017f54504600000000000000000000000000000000000000000000000000000000008152506200015d620001516200039e60201b60201c565b620003a660201b60201c565b81600390816200016e9190620006e9565b508060049081620001809190620006e9565b50620001916200046a60201b60201c565b6001819055505050600160098190555060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115620003965780156200025c576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b81526004016200022292919062000815565b600060405180830381600087803b1580156200023d57600080fd5b505af115801562000252573d6000803e3d6000fd5b5050505062000395565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000316576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b8152600401620002dc92919062000815565b600060405180830381600087803b158015620002f757600080fd5b505af11580156200030c573d6000803e3d6000fd5b5050505062000394565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b81526004016200035f919062000842565b600060405180830381600087803b1580156200037a57600080fd5b505af11580156200038f573d6000803e3d6000fd5b505050505b5b5b50506200085f565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620004f157607f821691505b602082108103620005075762000506620004a9565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620005717fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000532565b6200057d868362000532565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620005ca620005c4620005be8462000595565b6200059f565b62000595565b9050919050565b6000819050919050565b620005e683620005a9565b620005fe620005f582620005d1565b8484546200053f565b825550505050565b600090565b6200061562000606565b62000622818484620005db565b505050565b5b818110156200064a576200063e6000826200060b565b60018101905062000628565b5050565b601f821115620006995762000663816200050d565b6200066e8462000522565b810160208510156200067e578190505b620006966200068d8562000522565b83018262000627565b50505b505050565b600082821c905092915050565b6000620006be600019846008026200069e565b1980831691505092915050565b6000620006d98383620006ab565b9150826002028217905092915050565b620006f4826200046f565b67ffffffffffffffff81111562000710576200070f6200047a565b5b6200071c8254620004d8565b620007298282856200064e565b600060209050601f8311600181146200076157600084156200074c578287015190505b620007588582620006cb565b865550620007c8565b601f19841662000771866200050d565b60005b828110156200079b5784890151825560018201915060208501945060208101905062000774565b86831015620007bb5784890151620007b7601f891682620006ab565b8355505b6001600288020188555050505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620007fd82620007d0565b9050919050565b6200080f81620007f0565b82525050565b60006040820190506200082c600083018562000804565b6200083b602083018462000804565b9392505050565b600060208201905062000859600083018462000804565b92915050565b613f95806200086f6000396000f3fe60806040526004361061025c5760003560e01c806375b6447111610144578063c87b56dd116100b6578063e8a3d4851161007a578063e8a3d48514610881578063e985e9c5146108ac578063f2fde38b146108e9578063f777774714610912578063f814943d1461093b578063fb92488b146109645761025c565b8063c87b56dd14610786578063cfdbf254146107c3578063d8258d95146107ee578063dbddb26a14610819578063e7572230146108445761025c565b8063a22cb46511610108578063a22cb465146106ab578063a4cdd719146106d4578063a76a9587146106eb578063b88d4fde14610716578063c002d23d14610732578063c144a4ba1461075d5761025c565b806375b64471146105e75780638da5cb5b1461061057806395d89b411461063b578063a0712d6814610666578063a1db246e146106825761025c565b806341f43434116101dd57806356b4f673116101a157806356b4f673146104d75780635fe75587146105025780636352211e1461052d57806370a082311461056a578063715018a6146105a75780637304ff6c146105be5761025c565b806341f434341461041357806342842e0e1461043e57806342966c681461045a578063507862d11461048357806356b48d63146104ae5761025c565b80631422374f116102245780631422374f1461034d57806318160ddd146103785780631d985778146103a357806323b872dd146103e057806324600fc3146103fc5761025c565b80630116bc2d1461026157806301ffc9a71461028c57806306fdde03146102c9578063081812fc146102f4578063095ea7b314610331575b600080fd5b34801561026d57600080fd5b5061027661098d565b6040516102839190612ba4565b60405180910390f35b34801561029857600080fd5b506102b360048036038101906102ae9190612c2b565b6109a0565b6040516102c09190612ba4565b60405180910390f35b3480156102d557600080fd5b506102de610a32565b6040516102eb9190612ce8565b60405180910390f35b34801561030057600080fd5b5061031b60048036038101906103169190612d40565b610ac4565b6040516103289190612dae565b60405180910390f35b61034b60048036038101906103469190612df5565b610b43565b005b34801561035957600080fd5b50610362610c87565b60405161036f9190612e44565b60405180910390f35b34801561038457600080fd5b5061038d610c8d565b60405161039a9190612e44565b60405180910390f35b3480156103af57600080fd5b506103ca60048036038101906103c59190612e5f565b610ca4565b6040516103d79190612e44565b60405180910390f35b6103fa60048036038101906103f59190612e8c565b610cbc565b005b34801561040857600080fd5b50610411610d0b565b005b34801561041f57600080fd5b50610428610e17565b6040516104359190612f3e565b60405180910390f35b61045860048036038101906104539190612e8c565b610e29565b005b34801561046657600080fd5b50610481600480360381019061047c9190612d40565b610e78565b005b34801561048f57600080fd5b50610498610e86565b6040516104a59190612ce8565b60405180910390f35b3480156104ba57600080fd5b506104d560048036038101906104d0919061308e565b610f14565b005b3480156104e357600080fd5b506104ec610f2f565b6040516104f99190612ce8565b60405180910390f35b34801561050e57600080fd5b50610517610fbd565b6040516105249190612e44565b60405180910390f35b34801561053957600080fd5b50610554600480360381019061054f9190612d40565b610fc3565b6040516105619190612dae565b60405180910390f35b34801561057657600080fd5b50610591600480360381019061058c9190612e5f565b610fd5565b60405161059e9190612e44565b60405180910390f35b3480156105b357600080fd5b506105bc61108d565b005b3480156105ca57600080fd5b506105e560048036038101906105e09190613103565b6110a1565b005b3480156105f357600080fd5b5061060e60048036038101906106099190612d40565b6110d7565b005b34801561061c57600080fd5b506106256110e9565b6040516106329190612dae565b60405180910390f35b34801561064757600080fd5b50610650611112565b60405161065d9190612ce8565b60405180910390f35b610680600480360381019061067b9190612d40565b6111a4565b005b34801561068e57600080fd5b506106a960048036038101906106a49190612d40565b6115f1565b005b3480156106b757600080fd5b506106d260048036038101906106cd919061315f565b611603565b005b3480156106e057600080fd5b506106e961170e565b005b3480156106f757600080fd5b50610700611742565b60405161070d9190612ba4565b60405180910390f35b610730600480360381019061072b9190613240565b611755565b005b34801561073e57600080fd5b506107476117a6565b6040516107549190612e44565b60405180910390f35b34801561076957600080fd5b50610784600480360381019061077f9190612d40565b6117ac565b005b34801561079257600080fd5b506107ad60048036038101906107a89190612d40565b6117be565b6040516107ba9190612ce8565b60405180910390f35b3480156107cf57600080fd5b506107d861189a565b6040516107e59190612e44565b60405180910390f35b3480156107fa57600080fd5b506108036118a0565b6040516108109190612e44565b60405180910390f35b34801561082557600080fd5b5061082e6118a6565b60405161083b9190612ce8565b60405180910390f35b34801561085057600080fd5b5061086b60048036038101906108669190612d40565b611934565b6040516108789190612e44565b60405180910390f35b34801561088d57600080fd5b506108966119be565b6040516108a39190612ce8565b60405180910390f35b3480156108b857600080fd5b506108d360048036038101906108ce91906132c3565b611a50565b6040516108e09190612ba4565b60405180910390f35b3480156108f557600080fd5b50610910600480360381019061090b9190612e5f565b611ae4565b005b34801561091e57600080fd5b5061093960048036038101906109349190613303565b611b67565b005b34801561094757600080fd5b50610962600480360381019061095d9190612d40565b611bd4565b005b34801561097057600080fd5b5061098b60048036038101906109869190612d40565b611be6565b005b600f60009054906101000a900460ff1681565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109fb57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a2b5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060038054610a4190613372565b80601f0160208091040260200160405190810160405280929190818152602001828054610a6d90613372565b8015610aba5780601f10610a8f57610100808354040283529160200191610aba565b820191906000526020600020905b815481529060010190602001808311610a9d57829003601f168201915b5050505050905090565b6000610acf82611bf8565b610b05576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b4e82610fc3565b90508073ffffffffffffffffffffffffffffffffffffffff16610b6f611c57565b73ffffffffffffffffffffffffffffffffffffffff1614610bd257610b9b81610b96611c57565b611a50565b610bd1576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60145481565b6000610c97611c5f565b6002546001540303905090565b600b6020528060005260406000206000915090505481565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610cfa57610cf933611c64565b5b610d05848484611d61565b50505050565b610d13612083565b600260095403610d58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4f906133ef565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051610d8690613440565b60006040518083038185875af1925050503d8060008114610dc3576040519150601f19603f3d011682016040523d82523d6000602084013e610dc8565b606091505b5050905080610e0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e03906134a1565b60405180910390fd5b506001600981905550565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e6757610e6633611c64565b5b610e72848484612101565b50505050565b610e83816001612121565b50565b600d8054610e9390613372565b80601f0160208091040260200160405190810160405280929190818152602001828054610ebf90613372565b8015610f0c5780601f10610ee157610100808354040283529160200191610f0c565b820191906000526020600020905b815481529060010190602001808311610eef57829003601f168201915b505050505081565b610f1c612083565b80600a9081610f2b9190613663565b5050565b600a8054610f3c90613372565b80601f0160208091040260200160405190810160405280929190818152602001828054610f6890613372565b8015610fb55780601f10610f8a57610100808354040283529160200191610fb5565b820191906000526020600020905b815481529060010190602001808311610f9857829003601f168201915b505050505081565b60135481565b6000610fce82612373565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361103c576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611095612083565b61109f600061243f565b565b6110a9612083565b80600e90816110b89190613663565b5081600c60006101000a81548160ff0219169083151502179055505050565b6110df612083565b8060108190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461112190613372565b80601f016020809104026020016040519081016040528092919081815260200182805461114d90613372565b801561119a5780601f1061116f5761010080835404028352916020019161119a565b820191906000526020600020905b81548152906001019060200180831161117d57829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611212576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120990613781565b60405180910390fd5b600260095403611257576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124e906133ef565b60405180910390fd5b6002600981905550600080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546014546112af91906137d0565b90508083106113665780836112c491906137d0565b6011546112d19190613804565b915080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461131e9190613846565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506113f9565b6000915082600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546113b59190613846565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600f60009054906101000a900460ff16611448576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143f906138c6565b60405180910390fd5b60105483611454610c8d565b61145e9190613846565b111561149f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149690613932565b60405180910390fd5b601354836114ac33610fd5565b6114b69190613846565b11156114f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ee9061399e565b60405180910390fd5b60125483111561153c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153390613a30565b60405180910390fd5b8134101561157f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157690613a9c565b60405180910390fd5b6115893384612503565b813411156115e4573373ffffffffffffffffffffffffffffffffffffffff166108fc83346115b791906137d0565b9081150290604051600060405180830381858888f193505050501580156115e2573d6000803e3d6000fd5b505b5050600160098190555050565b6115f9612083565b8060148190555050565b8060086000611610611c57565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116bd611c57565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117029190612ba4565b60405180910390a35050565b611716612083565b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b600c60009054906101000a900460ff1681565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146117935761179233611c64565b5b61179f85858585612521565b5050505050565b60115481565b6117b4612083565b8060128190555050565b6060600c60009054906101000a900460ff161561180757600e6117e083612594565b6040516020016117f1929190613b7b565b6040516020818303038152906040529050611895565b600d805461181490613372565b80601f016020809104026020016040519081016040528092919081815260200182805461184090613372565b801561188d5780601f106118625761010080835404028352916020019161188d565b820191906000526020600020905b81548152906001019060200180831161187057829003601f168201915b505050505090505b919050565b60125481565b60105481565b600e80546118b390613372565b80601f01602080910402602001604051908101604052809291908181526020018280546118df90613372565b801561192c5780601f106119015761010080835404028352916020019161192c565b820191906000526020600020905b81548152906001019060200180831161190f57829003601f168201915b505050505081565b6000806000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460145461198691906137d0565b90508084106119af57808461199b91906137d0565b6011546119a89190613804565b91506119b4565b600091505b8192505050919050565b6060600a80546119cd90613372565b80601f01602080910402602001604051908101604052809291908181526020018280546119f990613372565b8015611a465780601f10611a1b57610100808354040283529160200191611a46565b820191906000526020600020905b815481529060010190602001808311611a2957829003601f168201915b5050505050905090565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611aec612083565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5290613c11565b60405180910390fd5b611b648161243f565b50565b611b6f612083565b60105482611b7b610c8d565b611b859190613846565b1115611bc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbd90613c7d565b60405180910390fd5b611bd08183612503565b5050565b611bdc612083565b8060138190555050565b611bee612083565b8060118190555050565b600081611c03611c5f565b11158015611c12575060015482105b8015611c50575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611d5e576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611cdb929190613c9d565b602060405180830381865afa158015611cf8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d1c9190613cdb565b611d5d57806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611d549190612dae565b60405180910390fd5b5b50565b6000611d6c82612373565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611dd3576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611ddf846126f4565b91509150611df58187611df0611c57565b61271b565b611e4157611e0a86611e05611c57565b611a50565b611e40576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611ea7576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611eb4868686600161275f565b8015611ebf57600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550611f8d85611f69888887612765565b7c02000000000000000000000000000000000000000000000000000000001761278d565b600560008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036120135760006001850190506000600560008381526020019081526020016000205403612011576001548114612010578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461207b86868660016127b8565b505050505050565b61208b6127be565b73ffffffffffffffffffffffffffffffffffffffff166120a96110e9565b73ffffffffffffffffffffffffffffffffffffffff16146120ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f690613d54565b60405180910390fd5b565b61211c83838360405180602001604052806000815250611755565b505050565b600061212c83612373565b9050600081905060008061213f866126f4565b9150915084156121a85761215b8184612156611c57565b61271b565b6121a7576121708361216b611c57565b611a50565b6121a6576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b6121b683600088600161275f565b80156121c157600082555b600160806001901b03600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506122698361222685600088612765565b7c02000000000000000000000000000000000000000000000000000000007c0100000000000000000000000000000000000000000000000000000000171761278d565b600560008881526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008516036122ef57600060018701905060006005600083815260200190815260200160002054036122ed5760015481146122ec578460056000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123598360008860016127b8565b600260008154809291906001019190505550505050505050565b60008082905080612382611c5f565b11612408576001548110156124075760006005600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612405575b600081036123fb5760056000836001900393508381526020019081526020016000205490506123d1565b809250505061243a565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61251d8282604051806020016040528060008152506127c6565b5050565b61252c848484610cbc565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461258e5761255784848484612864565b61258d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060600082036125db576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506126ef565b600082905060005b6000821461260d5780806125f690613d74565b915050600a826126069190613deb565b91506125e3565b60008167ffffffffffffffff81111561262957612628612f63565b5b6040519080825280601f01601f19166020018201604052801561265b5781602001600182028036833780820191505090505b5090505b600085146126e85760018261267491906137d0565b9150600a856126839190613e1c565b603061268f9190613846565b60f81b8183815181106126a5576126a4613e4d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126e19190613deb565b945061265f565b8093505050505b919050565b60008060006007600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861277c8686846129b4565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b6127d083836129bd565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461285f5760006001549050600083820390505b6128116000868380600101945086612864565b612847576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106127fe57816001541461285c57600080fd5b50505b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261288a611c57565b8786866040518563ffffffff1660e01b81526004016128ac9493929190613ed1565b6020604051808303816000875af19250505080156128e857506040513d601f19601f820116820180604052508101906128e59190613f32565b60015b612961573d8060008114612918576040519150601f19603f3d011682016040523d82523d6000602084013e61291d565b606091505b506000815103612959576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60009392505050565b60006001549050600082036129fe576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612a0b600084838561275f565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612a8283612a736000866000612765565b612a7c85612b79565b1761278d565b6005600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114612b2357808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612ae8565b5060008203612b5e576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806001819055505050612b7460008483856127b8565b505050565b60006001821460e11b9050919050565b60008115159050919050565b612b9e81612b89565b82525050565b6000602082019050612bb96000830184612b95565b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612c0881612bd3565b8114612c1357600080fd5b50565b600081359050612c2581612bff565b92915050565b600060208284031215612c4157612c40612bc9565b5b6000612c4f84828501612c16565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612c92578082015181840152602081019050612c77565b60008484015250505050565b6000601f19601f8301169050919050565b6000612cba82612c58565b612cc48185612c63565b9350612cd4818560208601612c74565b612cdd81612c9e565b840191505092915050565b60006020820190508181036000830152612d028184612caf565b905092915050565b6000819050919050565b612d1d81612d0a565b8114612d2857600080fd5b50565b600081359050612d3a81612d14565b92915050565b600060208284031215612d5657612d55612bc9565b5b6000612d6484828501612d2b565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612d9882612d6d565b9050919050565b612da881612d8d565b82525050565b6000602082019050612dc36000830184612d9f565b92915050565b612dd281612d8d565b8114612ddd57600080fd5b50565b600081359050612def81612dc9565b92915050565b60008060408385031215612e0c57612e0b612bc9565b5b6000612e1a85828601612de0565b9250506020612e2b85828601612d2b565b9150509250929050565b612e3e81612d0a565b82525050565b6000602082019050612e596000830184612e35565b92915050565b600060208284031215612e7557612e74612bc9565b5b6000612e8384828501612de0565b91505092915050565b600080600060608486031215612ea557612ea4612bc9565b5b6000612eb386828701612de0565b9350506020612ec486828701612de0565b9250506040612ed586828701612d2b565b9150509250925092565b6000819050919050565b6000612f04612eff612efa84612d6d565b612edf565b612d6d565b9050919050565b6000612f1682612ee9565b9050919050565b6000612f2882612f0b565b9050919050565b612f3881612f1d565b82525050565b6000602082019050612f536000830184612f2f565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612f9b82612c9e565b810181811067ffffffffffffffff82111715612fba57612fb9612f63565b5b80604052505050565b6000612fcd612bbf565b9050612fd98282612f92565b919050565b600067ffffffffffffffff821115612ff957612ff8612f63565b5b61300282612c9e565b9050602081019050919050565b82818337600083830152505050565b600061303161302c84612fde565b612fc3565b90508281526020810184848401111561304d5761304c612f5e565b5b61305884828561300f565b509392505050565b600082601f83011261307557613074612f59565b5b813561308584826020860161301e565b91505092915050565b6000602082840312156130a4576130a3612bc9565b5b600082013567ffffffffffffffff8111156130c2576130c1612bce565b5b6130ce84828501613060565b91505092915050565b6130e081612b89565b81146130eb57600080fd5b50565b6000813590506130fd816130d7565b92915050565b6000806040838503121561311a57613119612bc9565b5b6000613128858286016130ee565b925050602083013567ffffffffffffffff81111561314957613148612bce565b5b61315585828601613060565b9150509250929050565b6000806040838503121561317657613175612bc9565b5b600061318485828601612de0565b9250506020613195858286016130ee565b9150509250929050565b600067ffffffffffffffff8211156131ba576131b9612f63565b5b6131c382612c9e565b9050602081019050919050565b60006131e36131de8461319f565b612fc3565b9050828152602081018484840111156131ff576131fe612f5e565b5b61320a84828561300f565b509392505050565b600082601f83011261322757613226612f59565b5b81356132378482602086016131d0565b91505092915050565b6000806000806080858703121561325a57613259612bc9565b5b600061326887828801612de0565b945050602061327987828801612de0565b935050604061328a87828801612d2b565b925050606085013567ffffffffffffffff8111156132ab576132aa612bce565b5b6132b787828801613212565b91505092959194509250565b600080604083850312156132da576132d9612bc9565b5b60006132e885828601612de0565b92505060206132f985828601612de0565b9150509250929050565b6000806040838503121561331a57613319612bc9565b5b600061332885828601612d2b565b925050602061333985828601612de0565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061338a57607f821691505b60208210810361339d5761339c613343565b5b50919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006133d9601f83612c63565b91506133e4826133a3565b602082019050919050565b60006020820190508181036000830152613408816133cc565b9050919050565b600081905092915050565b50565b600061342a60008361340f565b91506134358261341a565b600082019050919050565b600061344b8261341d565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b600061348b601083612c63565b915061349682613455565b602082019050919050565b600060208201905081810360008301526134ba8161347e565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026135237fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826134e6565b61352d86836134e6565b95508019841693508086168417925050509392505050565b600061356061355b61355684612d0a565b612edf565b612d0a565b9050919050565b6000819050919050565b61357a83613545565b61358e61358682613567565b8484546134f3565b825550505050565b600090565b6135a3613596565b6135ae818484613571565b505050565b5b818110156135d2576135c760008261359b565b6001810190506135b4565b5050565b601f821115613617576135e8816134c1565b6135f1846134d6565b81016020851015613600578190505b61361461360c856134d6565b8301826135b3565b50505b505050565b600082821c905092915050565b600061363a6000198460080261361c565b1980831691505092915050565b60006136538383613629565b9150826002028217905092915050565b61366c82612c58565b67ffffffffffffffff81111561368557613684612f63565b5b61368f8254613372565b61369a8282856135d6565b600060209050601f8311600181146136cd57600084156136bb578287015190505b6136c58582613647565b86555061372d565b601f1984166136db866134c1565b60005b82811015613703578489015182556001820191506020850194506020810190506136de565b86831015613720578489015161371c601f891682613629565b8355505b6001600288020188555050505b505050505050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b600061376b601e83612c63565b915061377682613735565b602082019050919050565b6000602082019050818103600083015261379a8161375e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006137db82612d0a565b91506137e683612d0a565b92508282039050818111156137fe576137fd6137a1565b5b92915050565b600061380f82612d0a565b915061381a83612d0a565b925082820261382881612d0a565b9150828204841483151761383f5761383e6137a1565b5b5092915050565b600061385182612d0a565b915061385c83612d0a565b9250828201905080821115613874576138736137a1565b5b92915050565b7f4d696e74206e6f74207265616479207965742100000000000000000000000000600082015250565b60006138b0601383612c63565b91506138bb8261387a565b602082019050919050565b600060208201905081810360008301526138df816138a3565b9050919050565b7f4e6f206d6f7265206c6566742100000000000000000000000000000000000000600082015250565b600061391c600d83612c63565b9150613927826138e6565b602082019050919050565b6000602082019050818103600083015261394b8161390f565b9050919050565b7f547269656420746f206d696e74206f766572206f766572206c696d6974000000600082015250565b6000613988601d83612c63565b915061399382613952565b602082019050919050565b600060208201905081810360008301526139b78161397b565b9050919050565b7f547269656420746f206d696e74206f766572206c696d69742c2072657472792060008201527f776974682072656475636564207175616e746974790000000000000000000000602082015250565b6000613a1a603583612c63565b9150613a25826139be565b604082019050919050565b60006020820190508181036000830152613a4981613a0d565b9050919050565b7f4d7573742073656e64206d6f7265206d6f6e6579210000000000000000000000600082015250565b6000613a86601583612c63565b9150613a9182613a50565b602082019050919050565b60006020820190508181036000830152613ab581613a79565b9050919050565b600081905092915050565b60008154613ad481613372565b613ade8186613abc565b94506001821660008114613af95760018114613b0e57613b41565b60ff1983168652811515820286019350613b41565b613b17856134c1565b60005b83811015613b3957815481890152600182019150602081019050613b1a565b838801955050505b50505092915050565b6000613b5582612c58565b613b5f8185613abc565b9350613b6f818560208601612c74565b80840191505092915050565b6000613b878285613ac7565b9150613b938284613b4a565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613bfb602683612c63565b9150613c0682613b9f565b604082019050919050565b60006020820190508181036000830152613c2a81613bee565b9050919050565b7f4e6f206d6f7265205065706520696e2073746f636b2100000000000000000000600082015250565b6000613c67601683612c63565b9150613c7282613c31565b602082019050919050565b60006020820190508181036000830152613c9681613c5a565b9050919050565b6000604082019050613cb26000830185612d9f565b613cbf6020830184612d9f565b9392505050565b600081519050613cd5816130d7565b92915050565b600060208284031215613cf157613cf0612bc9565b5b6000613cff84828501613cc6565b91505092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613d3e602083612c63565b9150613d4982613d08565b602082019050919050565b60006020820190508181036000830152613d6d81613d31565b9050919050565b6000613d7f82612d0a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613db157613db06137a1565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613df682612d0a565b9150613e0183612d0a565b925082613e1157613e10613dbc565b5b828204905092915050565b6000613e2782612d0a565b9150613e3283612d0a565b925082613e4257613e41613dbc565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000613ea382613e7c565b613ead8185613e87565b9350613ebd818560208601612c74565b613ec681612c9e565b840191505092915050565b6000608082019050613ee66000830187612d9f565b613ef36020830186612d9f565b613f006040830185612e35565b8181036060830152613f128184613e98565b905095945050505050565b600081519050613f2c81612bff565b92915050565b600060208284031215613f4857613f47612bc9565b5b6000613f5684828501613f1d565b9150509291505056fea2646970667358221220d196bddb1c920375bfdc3c9bc971b4b3cc87960963d0aaa716142bfacad9a7b464736f6c6343000812003368747470733a2f2f6e667473746f726167652e6c696e6b2f697066732f6261667962656968327864756f36746177636a7037333773667a3367767661767471626b6679696e63687964657173377763327733746a6a6d61652f

Deployed Bytecode

0x60806040526004361061025c5760003560e01c806375b6447111610144578063c87b56dd116100b6578063e8a3d4851161007a578063e8a3d48514610881578063e985e9c5146108ac578063f2fde38b146108e9578063f777774714610912578063f814943d1461093b578063fb92488b146109645761025c565b8063c87b56dd14610786578063cfdbf254146107c3578063d8258d95146107ee578063dbddb26a14610819578063e7572230146108445761025c565b8063a22cb46511610108578063a22cb465146106ab578063a4cdd719146106d4578063a76a9587146106eb578063b88d4fde14610716578063c002d23d14610732578063c144a4ba1461075d5761025c565b806375b64471146105e75780638da5cb5b1461061057806395d89b411461063b578063a0712d6814610666578063a1db246e146106825761025c565b806341f43434116101dd57806356b4f673116101a157806356b4f673146104d75780635fe75587146105025780636352211e1461052d57806370a082311461056a578063715018a6146105a75780637304ff6c146105be5761025c565b806341f434341461041357806342842e0e1461043e57806342966c681461045a578063507862d11461048357806356b48d63146104ae5761025c565b80631422374f116102245780631422374f1461034d57806318160ddd146103785780631d985778146103a357806323b872dd146103e057806324600fc3146103fc5761025c565b80630116bc2d1461026157806301ffc9a71461028c57806306fdde03146102c9578063081812fc146102f4578063095ea7b314610331575b600080fd5b34801561026d57600080fd5b5061027661098d565b6040516102839190612ba4565b60405180910390f35b34801561029857600080fd5b506102b360048036038101906102ae9190612c2b565b6109a0565b6040516102c09190612ba4565b60405180910390f35b3480156102d557600080fd5b506102de610a32565b6040516102eb9190612ce8565b60405180910390f35b34801561030057600080fd5b5061031b60048036038101906103169190612d40565b610ac4565b6040516103289190612dae565b60405180910390f35b61034b60048036038101906103469190612df5565b610b43565b005b34801561035957600080fd5b50610362610c87565b60405161036f9190612e44565b60405180910390f35b34801561038457600080fd5b5061038d610c8d565b60405161039a9190612e44565b60405180910390f35b3480156103af57600080fd5b506103ca60048036038101906103c59190612e5f565b610ca4565b6040516103d79190612e44565b60405180910390f35b6103fa60048036038101906103f59190612e8c565b610cbc565b005b34801561040857600080fd5b50610411610d0b565b005b34801561041f57600080fd5b50610428610e17565b6040516104359190612f3e565b60405180910390f35b61045860048036038101906104539190612e8c565b610e29565b005b34801561046657600080fd5b50610481600480360381019061047c9190612d40565b610e78565b005b34801561048f57600080fd5b50610498610e86565b6040516104a59190612ce8565b60405180910390f35b3480156104ba57600080fd5b506104d560048036038101906104d0919061308e565b610f14565b005b3480156104e357600080fd5b506104ec610f2f565b6040516104f99190612ce8565b60405180910390f35b34801561050e57600080fd5b50610517610fbd565b6040516105249190612e44565b60405180910390f35b34801561053957600080fd5b50610554600480360381019061054f9190612d40565b610fc3565b6040516105619190612dae565b60405180910390f35b34801561057657600080fd5b50610591600480360381019061058c9190612e5f565b610fd5565b60405161059e9190612e44565b60405180910390f35b3480156105b357600080fd5b506105bc61108d565b005b3480156105ca57600080fd5b506105e560048036038101906105e09190613103565b6110a1565b005b3480156105f357600080fd5b5061060e60048036038101906106099190612d40565b6110d7565b005b34801561061c57600080fd5b506106256110e9565b6040516106329190612dae565b60405180910390f35b34801561064757600080fd5b50610650611112565b60405161065d9190612ce8565b60405180910390f35b610680600480360381019061067b9190612d40565b6111a4565b005b34801561068e57600080fd5b506106a960048036038101906106a49190612d40565b6115f1565b005b3480156106b757600080fd5b506106d260048036038101906106cd919061315f565b611603565b005b3480156106e057600080fd5b506106e961170e565b005b3480156106f757600080fd5b50610700611742565b60405161070d9190612ba4565b60405180910390f35b610730600480360381019061072b9190613240565b611755565b005b34801561073e57600080fd5b506107476117a6565b6040516107549190612e44565b60405180910390f35b34801561076957600080fd5b50610784600480360381019061077f9190612d40565b6117ac565b005b34801561079257600080fd5b506107ad60048036038101906107a89190612d40565b6117be565b6040516107ba9190612ce8565b60405180910390f35b3480156107cf57600080fd5b506107d861189a565b6040516107e59190612e44565b60405180910390f35b3480156107fa57600080fd5b506108036118a0565b6040516108109190612e44565b60405180910390f35b34801561082557600080fd5b5061082e6118a6565b60405161083b9190612ce8565b60405180910390f35b34801561085057600080fd5b5061086b60048036038101906108669190612d40565b611934565b6040516108789190612e44565b60405180910390f35b34801561088d57600080fd5b506108966119be565b6040516108a39190612ce8565b60405180910390f35b3480156108b857600080fd5b506108d360048036038101906108ce91906132c3565b611a50565b6040516108e09190612ba4565b60405180910390f35b3480156108f557600080fd5b50610910600480360381019061090b9190612e5f565b611ae4565b005b34801561091e57600080fd5b5061093960048036038101906109349190613303565b611b67565b005b34801561094757600080fd5b50610962600480360381019061095d9190612d40565b611bd4565b005b34801561097057600080fd5b5061098b60048036038101906109869190612d40565b611be6565b005b600f60009054906101000a900460ff1681565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109fb57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a2b5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060038054610a4190613372565b80601f0160208091040260200160405190810160405280929190818152602001828054610a6d90613372565b8015610aba5780601f10610a8f57610100808354040283529160200191610aba565b820191906000526020600020905b815481529060010190602001808311610a9d57829003601f168201915b5050505050905090565b6000610acf82611bf8565b610b05576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b4e82610fc3565b90508073ffffffffffffffffffffffffffffffffffffffff16610b6f611c57565b73ffffffffffffffffffffffffffffffffffffffff1614610bd257610b9b81610b96611c57565b611a50565b610bd1576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60145481565b6000610c97611c5f565b6002546001540303905090565b600b6020528060005260406000206000915090505481565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610cfa57610cf933611c64565b5b610d05848484611d61565b50505050565b610d13612083565b600260095403610d58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4f906133ef565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051610d8690613440565b60006040518083038185875af1925050503d8060008114610dc3576040519150601f19603f3d011682016040523d82523d6000602084013e610dc8565b606091505b5050905080610e0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e03906134a1565b60405180910390fd5b506001600981905550565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e6757610e6633611c64565b5b610e72848484612101565b50505050565b610e83816001612121565b50565b600d8054610e9390613372565b80601f0160208091040260200160405190810160405280929190818152602001828054610ebf90613372565b8015610f0c5780601f10610ee157610100808354040283529160200191610f0c565b820191906000526020600020905b815481529060010190602001808311610eef57829003601f168201915b505050505081565b610f1c612083565b80600a9081610f2b9190613663565b5050565b600a8054610f3c90613372565b80601f0160208091040260200160405190810160405280929190818152602001828054610f6890613372565b8015610fb55780601f10610f8a57610100808354040283529160200191610fb5565b820191906000526020600020905b815481529060010190602001808311610f9857829003601f168201915b505050505081565b60135481565b6000610fce82612373565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361103c576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611095612083565b61109f600061243f565b565b6110a9612083565b80600e90816110b89190613663565b5081600c60006101000a81548160ff0219169083151502179055505050565b6110df612083565b8060108190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461112190613372565b80601f016020809104026020016040519081016040528092919081815260200182805461114d90613372565b801561119a5780601f1061116f5761010080835404028352916020019161119a565b820191906000526020600020905b81548152906001019060200180831161117d57829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611212576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120990613781565b60405180910390fd5b600260095403611257576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124e906133ef565b60405180910390fd5b6002600981905550600080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546014546112af91906137d0565b90508083106113665780836112c491906137d0565b6011546112d19190613804565b915080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461131e9190613846565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506113f9565b6000915082600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546113b59190613846565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600f60009054906101000a900460ff16611448576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143f906138c6565b60405180910390fd5b60105483611454610c8d565b61145e9190613846565b111561149f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149690613932565b60405180910390fd5b601354836114ac33610fd5565b6114b69190613846565b11156114f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ee9061399e565b60405180910390fd5b60125483111561153c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153390613a30565b60405180910390fd5b8134101561157f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157690613a9c565b60405180910390fd5b6115893384612503565b813411156115e4573373ffffffffffffffffffffffffffffffffffffffff166108fc83346115b791906137d0565b9081150290604051600060405180830381858888f193505050501580156115e2573d6000803e3d6000fd5b505b5050600160098190555050565b6115f9612083565b8060148190555050565b8060086000611610611c57565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116bd611c57565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117029190612ba4565b60405180910390a35050565b611716612083565b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b600c60009054906101000a900460ff1681565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146117935761179233611c64565b5b61179f85858585612521565b5050505050565b60115481565b6117b4612083565b8060128190555050565b6060600c60009054906101000a900460ff161561180757600e6117e083612594565b6040516020016117f1929190613b7b565b6040516020818303038152906040529050611895565b600d805461181490613372565b80601f016020809104026020016040519081016040528092919081815260200182805461184090613372565b801561188d5780601f106118625761010080835404028352916020019161188d565b820191906000526020600020905b81548152906001019060200180831161187057829003601f168201915b505050505090505b919050565b60125481565b60105481565b600e80546118b390613372565b80601f01602080910402602001604051908101604052809291908181526020018280546118df90613372565b801561192c5780601f106119015761010080835404028352916020019161192c565b820191906000526020600020905b81548152906001019060200180831161190f57829003601f168201915b505050505081565b6000806000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460145461198691906137d0565b90508084106119af57808461199b91906137d0565b6011546119a89190613804565b91506119b4565b600091505b8192505050919050565b6060600a80546119cd90613372565b80601f01602080910402602001604051908101604052809291908181526020018280546119f990613372565b8015611a465780601f10611a1b57610100808354040283529160200191611a46565b820191906000526020600020905b815481529060010190602001808311611a2957829003601f168201915b5050505050905090565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611aec612083565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5290613c11565b60405180910390fd5b611b648161243f565b50565b611b6f612083565b60105482611b7b610c8d565b611b859190613846565b1115611bc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbd90613c7d565b60405180910390fd5b611bd08183612503565b5050565b611bdc612083565b8060138190555050565b611bee612083565b8060118190555050565b600081611c03611c5f565b11158015611c12575060015482105b8015611c50575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611d5e576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611cdb929190613c9d565b602060405180830381865afa158015611cf8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d1c9190613cdb565b611d5d57806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611d549190612dae565b60405180910390fd5b5b50565b6000611d6c82612373565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611dd3576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611ddf846126f4565b91509150611df58187611df0611c57565b61271b565b611e4157611e0a86611e05611c57565b611a50565b611e40576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611ea7576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611eb4868686600161275f565b8015611ebf57600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550611f8d85611f69888887612765565b7c02000000000000000000000000000000000000000000000000000000001761278d565b600560008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036120135760006001850190506000600560008381526020019081526020016000205403612011576001548114612010578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461207b86868660016127b8565b505050505050565b61208b6127be565b73ffffffffffffffffffffffffffffffffffffffff166120a96110e9565b73ffffffffffffffffffffffffffffffffffffffff16146120ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f690613d54565b60405180910390fd5b565b61211c83838360405180602001604052806000815250611755565b505050565b600061212c83612373565b9050600081905060008061213f866126f4565b9150915084156121a85761215b8184612156611c57565b61271b565b6121a7576121708361216b611c57565b611a50565b6121a6576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b6121b683600088600161275f565b80156121c157600082555b600160806001901b03600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506122698361222685600088612765565b7c02000000000000000000000000000000000000000000000000000000007c0100000000000000000000000000000000000000000000000000000000171761278d565b600560008881526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008516036122ef57600060018701905060006005600083815260200190815260200160002054036122ed5760015481146122ec578460056000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123598360008860016127b8565b600260008154809291906001019190505550505050505050565b60008082905080612382611c5f565b11612408576001548110156124075760006005600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612405575b600081036123fb5760056000836001900393508381526020019081526020016000205490506123d1565b809250505061243a565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61251d8282604051806020016040528060008152506127c6565b5050565b61252c848484610cbc565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461258e5761255784848484612864565b61258d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060600082036125db576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506126ef565b600082905060005b6000821461260d5780806125f690613d74565b915050600a826126069190613deb565b91506125e3565b60008167ffffffffffffffff81111561262957612628612f63565b5b6040519080825280601f01601f19166020018201604052801561265b5781602001600182028036833780820191505090505b5090505b600085146126e85760018261267491906137d0565b9150600a856126839190613e1c565b603061268f9190613846565b60f81b8183815181106126a5576126a4613e4d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126e19190613deb565b945061265f565b8093505050505b919050565b60008060006007600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861277c8686846129b4565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b6127d083836129bd565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461285f5760006001549050600083820390505b6128116000868380600101945086612864565b612847576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106127fe57816001541461285c57600080fd5b50505b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261288a611c57565b8786866040518563ffffffff1660e01b81526004016128ac9493929190613ed1565b6020604051808303816000875af19250505080156128e857506040513d601f19601f820116820180604052508101906128e59190613f32565b60015b612961573d8060008114612918576040519150601f19603f3d011682016040523d82523d6000602084013e61291d565b606091505b506000815103612959576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60009392505050565b60006001549050600082036129fe576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612a0b600084838561275f565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612a8283612a736000866000612765565b612a7c85612b79565b1761278d565b6005600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114612b2357808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612ae8565b5060008203612b5e576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806001819055505050612b7460008483856127b8565b505050565b60006001821460e11b9050919050565b60008115159050919050565b612b9e81612b89565b82525050565b6000602082019050612bb96000830184612b95565b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612c0881612bd3565b8114612c1357600080fd5b50565b600081359050612c2581612bff565b92915050565b600060208284031215612c4157612c40612bc9565b5b6000612c4f84828501612c16565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612c92578082015181840152602081019050612c77565b60008484015250505050565b6000601f19601f8301169050919050565b6000612cba82612c58565b612cc48185612c63565b9350612cd4818560208601612c74565b612cdd81612c9e565b840191505092915050565b60006020820190508181036000830152612d028184612caf565b905092915050565b6000819050919050565b612d1d81612d0a565b8114612d2857600080fd5b50565b600081359050612d3a81612d14565b92915050565b600060208284031215612d5657612d55612bc9565b5b6000612d6484828501612d2b565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612d9882612d6d565b9050919050565b612da881612d8d565b82525050565b6000602082019050612dc36000830184612d9f565b92915050565b612dd281612d8d565b8114612ddd57600080fd5b50565b600081359050612def81612dc9565b92915050565b60008060408385031215612e0c57612e0b612bc9565b5b6000612e1a85828601612de0565b9250506020612e2b85828601612d2b565b9150509250929050565b612e3e81612d0a565b82525050565b6000602082019050612e596000830184612e35565b92915050565b600060208284031215612e7557612e74612bc9565b5b6000612e8384828501612de0565b91505092915050565b600080600060608486031215612ea557612ea4612bc9565b5b6000612eb386828701612de0565b9350506020612ec486828701612de0565b9250506040612ed586828701612d2b565b9150509250925092565b6000819050919050565b6000612f04612eff612efa84612d6d565b612edf565b612d6d565b9050919050565b6000612f1682612ee9565b9050919050565b6000612f2882612f0b565b9050919050565b612f3881612f1d565b82525050565b6000602082019050612f536000830184612f2f565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612f9b82612c9e565b810181811067ffffffffffffffff82111715612fba57612fb9612f63565b5b80604052505050565b6000612fcd612bbf565b9050612fd98282612f92565b919050565b600067ffffffffffffffff821115612ff957612ff8612f63565b5b61300282612c9e565b9050602081019050919050565b82818337600083830152505050565b600061303161302c84612fde565b612fc3565b90508281526020810184848401111561304d5761304c612f5e565b5b61305884828561300f565b509392505050565b600082601f83011261307557613074612f59565b5b813561308584826020860161301e565b91505092915050565b6000602082840312156130a4576130a3612bc9565b5b600082013567ffffffffffffffff8111156130c2576130c1612bce565b5b6130ce84828501613060565b91505092915050565b6130e081612b89565b81146130eb57600080fd5b50565b6000813590506130fd816130d7565b92915050565b6000806040838503121561311a57613119612bc9565b5b6000613128858286016130ee565b925050602083013567ffffffffffffffff81111561314957613148612bce565b5b61315585828601613060565b9150509250929050565b6000806040838503121561317657613175612bc9565b5b600061318485828601612de0565b9250506020613195858286016130ee565b9150509250929050565b600067ffffffffffffffff8211156131ba576131b9612f63565b5b6131c382612c9e565b9050602081019050919050565b60006131e36131de8461319f565b612fc3565b9050828152602081018484840111156131ff576131fe612f5e565b5b61320a84828561300f565b509392505050565b600082601f83011261322757613226612f59565b5b81356132378482602086016131d0565b91505092915050565b6000806000806080858703121561325a57613259612bc9565b5b600061326887828801612de0565b945050602061327987828801612de0565b935050604061328a87828801612d2b565b925050606085013567ffffffffffffffff8111156132ab576132aa612bce565b5b6132b787828801613212565b91505092959194509250565b600080604083850312156132da576132d9612bc9565b5b60006132e885828601612de0565b92505060206132f985828601612de0565b9150509250929050565b6000806040838503121561331a57613319612bc9565b5b600061332885828601612d2b565b925050602061333985828601612de0565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061338a57607f821691505b60208210810361339d5761339c613343565b5b50919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006133d9601f83612c63565b91506133e4826133a3565b602082019050919050565b60006020820190508181036000830152613408816133cc565b9050919050565b600081905092915050565b50565b600061342a60008361340f565b91506134358261341a565b600082019050919050565b600061344b8261341d565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b600061348b601083612c63565b915061349682613455565b602082019050919050565b600060208201905081810360008301526134ba8161347e565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026135237fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826134e6565b61352d86836134e6565b95508019841693508086168417925050509392505050565b600061356061355b61355684612d0a565b612edf565b612d0a565b9050919050565b6000819050919050565b61357a83613545565b61358e61358682613567565b8484546134f3565b825550505050565b600090565b6135a3613596565b6135ae818484613571565b505050565b5b818110156135d2576135c760008261359b565b6001810190506135b4565b5050565b601f821115613617576135e8816134c1565b6135f1846134d6565b81016020851015613600578190505b61361461360c856134d6565b8301826135b3565b50505b505050565b600082821c905092915050565b600061363a6000198460080261361c565b1980831691505092915050565b60006136538383613629565b9150826002028217905092915050565b61366c82612c58565b67ffffffffffffffff81111561368557613684612f63565b5b61368f8254613372565b61369a8282856135d6565b600060209050601f8311600181146136cd57600084156136bb578287015190505b6136c58582613647565b86555061372d565b601f1984166136db866134c1565b60005b82811015613703578489015182556001820191506020850194506020810190506136de565b86831015613720578489015161371c601f891682613629565b8355505b6001600288020188555050505b505050505050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b600061376b601e83612c63565b915061377682613735565b602082019050919050565b6000602082019050818103600083015261379a8161375e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006137db82612d0a565b91506137e683612d0a565b92508282039050818111156137fe576137fd6137a1565b5b92915050565b600061380f82612d0a565b915061381a83612d0a565b925082820261382881612d0a565b9150828204841483151761383f5761383e6137a1565b5b5092915050565b600061385182612d0a565b915061385c83612d0a565b9250828201905080821115613874576138736137a1565b5b92915050565b7f4d696e74206e6f74207265616479207965742100000000000000000000000000600082015250565b60006138b0601383612c63565b91506138bb8261387a565b602082019050919050565b600060208201905081810360008301526138df816138a3565b9050919050565b7f4e6f206d6f7265206c6566742100000000000000000000000000000000000000600082015250565b600061391c600d83612c63565b9150613927826138e6565b602082019050919050565b6000602082019050818103600083015261394b8161390f565b9050919050565b7f547269656420746f206d696e74206f766572206f766572206c696d6974000000600082015250565b6000613988601d83612c63565b915061399382613952565b602082019050919050565b600060208201905081810360008301526139b78161397b565b9050919050565b7f547269656420746f206d696e74206f766572206c696d69742c2072657472792060008201527f776974682072656475636564207175616e746974790000000000000000000000602082015250565b6000613a1a603583612c63565b9150613a25826139be565b604082019050919050565b60006020820190508181036000830152613a4981613a0d565b9050919050565b7f4d7573742073656e64206d6f7265206d6f6e6579210000000000000000000000600082015250565b6000613a86601583612c63565b9150613a9182613a50565b602082019050919050565b60006020820190508181036000830152613ab581613a79565b9050919050565b600081905092915050565b60008154613ad481613372565b613ade8186613abc565b94506001821660008114613af95760018114613b0e57613b41565b60ff1983168652811515820286019350613b41565b613b17856134c1565b60005b83811015613b3957815481890152600182019150602081019050613b1a565b838801955050505b50505092915050565b6000613b5582612c58565b613b5f8185613abc565b9350613b6f818560208601612c74565b80840191505092915050565b6000613b878285613ac7565b9150613b938284613b4a565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613bfb602683612c63565b9150613c0682613b9f565b604082019050919050565b60006020820190508181036000830152613c2a81613bee565b9050919050565b7f4e6f206d6f7265205065706520696e2073746f636b2100000000000000000000600082015250565b6000613c67601683612c63565b9150613c7282613c31565b602082019050919050565b60006020820190508181036000830152613c9681613c5a565b9050919050565b6000604082019050613cb26000830185612d9f565b613cbf6020830184612d9f565b9392505050565b600081519050613cd5816130d7565b92915050565b600060208284031215613cf157613cf0612bc9565b5b6000613cff84828501613cc6565b91505092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613d3e602083612c63565b9150613d4982613d08565b602082019050919050565b60006020820190508181036000830152613d6d81613d31565b9050919050565b6000613d7f82612d0a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613db157613db06137a1565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613df682612d0a565b9150613e0183612d0a565b925082613e1157613e10613dbc565b5b828204905092915050565b6000613e2782612d0a565b9150613e3283612d0a565b925082613e4257613e41613dbc565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000613ea382613e7c565b613ead8185613e87565b9350613ebd818560208601612c74565b613ec681612c9e565b840191505092915050565b6000608082019050613ee66000830187612d9f565b613ef36020830186612d9f565b613f006040830185612e35565b8181036060830152613f128184613e98565b905095945050505050565b600081519050613f2c81612bff565b92915050565b600060208284031215613f4857613f47612bc9565b5b6000613f5684828501613f1d565b9150509291505056fea2646970667358221220d196bddb1c920375bfdc3c9bc971b4b3cc87960963d0aaa716142bfacad9a7b464736f6c63430008120033

Deployed Bytecode Sourcemap

36793:4731:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37161:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15759:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16011:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19587:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19171:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37353:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14122:180;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36935:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40532:186;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39390:191;;;;;;;;;;;;;:::i;:::-;;31491:143;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40726:194;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36664:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37006:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39851:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36901:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37316:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16659:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14587:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2117:103;;;;;;;;;;;;;:::i;:::-;;39589:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39971:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1882:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16119:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38182:1084;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40193:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19813:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39272:110;;;;;;;;;;;;;:::i;:::-;;36983:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40928:244;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37241:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40426:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41178:341;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37282:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37203:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37042:116;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37850:324;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39746:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20055:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2230:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37458:255;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40311:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40085:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37161:39;;;;;;;;;;;;;:::o;15759:244::-;15844:4;15898:10;15883:25;;:11;:25;;;;:68;;;;15941:10;15926:25;;:11;:25;;;;15883:68;:111;;;;15984:10;15969:25;;:11;:25;;;;15883:111;15863:131;;15759:244;;;:::o;16011:100::-;16065:13;16098:5;16091:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16011:100;:::o;19587:218::-;19663:7;19688:16;19696:7;19688;:16::i;:::-;19683:64;;19713:34;;;;;;;;;;;;;;19683:64;19767:15;:24;19783:7;19767:24;;;;;;;;;;;:30;;;;;;;;;;;;19760:37;;19587:218;;;:::o;19171:408::-;19260:13;19276:16;19284:7;19276;:16::i;:::-;19260:32;;19332:5;19309:28;;:19;:17;:19::i;:::-;:28;;;19305:175;;19357:44;19374:5;19381:19;:17;:19::i;:::-;19357:16;:44::i;:::-;19352:128;;19429:35;;;;;;;;;;;;;;19352:128;19305:175;19525:2;19492:15;:24;19508:7;19492:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;19563:7;19559:2;19543:28;;19552:5;19543:28;;;;;;;;;;;;19249:330;19171:408;;:::o;37353:38::-;;;;:::o;14122:180::-;14183:7;14268:15;:13;:15::i;:::-;14253:12;;14237:13;;:28;:46;14230:53;;14122:180;:::o;36935:45::-;;;;;;;;;;;;;;;;;:::o;40532:186::-;40660:4;32841:10;32833:18;;:4;:18;;;32829:83;;32868:32;32889:10;32868:20;:32::i;:::-;32829:83;40673:37:::1;40692:4;40698:2;40702:7;40673:18;:37::i;:::-;40532:186:::0;;;;:::o;39390:191::-;1841:13;:11;:13::i;:::-;2791:1:::1;2949:7;;:19:::0;2941:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2791:1;3017:7;:18;;;;39459:12:::2;39477:10;:15;;39500:21;39477:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39458:68;;;39545:7;39537:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;39447:134;2747:1:::1;3062:7;:22;;;;39390:191::o:0;31491:143::-;36308:42;31491:143;:::o;40726:194::-;40858:4;32841:10;32833:18;;:4;:18;;;32829:83;;32868:32;32889:10;32868:20;:32::i;:::-;32829:83;40871:41:::1;40894:4;40900:2;40904:7;40871:22;:41::i;:::-;40726:194:::0;;;;:::o;36664:94::-;36730:20;36736:7;36745:4;36730:5;:20::i;:::-;36664:94;:::o;37006:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;39851:112::-;1841:13;:11;:13::i;:::-;39943:12:::1;39928;:27;;;;;;:::i;:::-;;39851:112:::0;:::o;36901:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;37316:34::-;;;;:::o;16659:152::-;16731:7;16774:27;16793:7;16774:18;:27::i;:::-;16751:52;;16659:152;;;:::o;14587:233::-;14659:7;14700:1;14683:19;;:5;:19;;;14679:60;;14711:28;;;;;;;;;;;;;;14679:60;12395:13;14757:18;:25;14776:5;14757:25;;;;;;;;;;;;;;;;:55;14750:62;;14587:233;;;:::o;2117:103::-;1841:13;:11;:13::i;:::-;2182:30:::1;2209:1;2182:18;:30::i;:::-;2117:103::o:0;39589:149::-;1841:13;:11;:13::i;:::-;39691:8:::1;39680;:19;;;;;;:::i;:::-;;39721:9;39710:8;;:20;;;;;;;;;;;;;;;;;;39589:149:::0;;:::o;39971:106::-;1841:13;:11;:13::i;:::-;40065:4:::1;40047:15;:22;;;;39971:106:::0;:::o;1882:87::-;1928:7;1955:6;;;;;;;;;;;1948:13;;1882:87;:::o;16119:104::-;16175:13;16208:7;16201:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16119:104;:::o;38182:1084::-;37777:10;37764:23;;:9;:23;;;37756:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;2791:1:::1;2949:7;;:19:::0;2941:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2791:1;3017:7;:18;;;;38307:10:::2;38328:9:::0;38365:13:::2;:25;38379:10;38365:25;;;;;;;;;;;;;;;;38340:22;;:50;;;;:::i;:::-;38328:62;;38417:4;38405:8;:16;38401:285;;38473:4;38462:8;:15;;;;:::i;:::-;38447:10;;38446:32;;;;:::i;:::-;38438:40;;38549:4;38521:13;:25;38535:10;38521:25;;;;;;;;;;;;;;;;:32;;;;:::i;:::-;38493:13;:25;38507:10;38493:25;;;;;;;;;;;;;;;:60;;;;38401:285;;;38594:1;38586:9;;38666:8;38638:13;:25;38652:10;38638:25;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;38610:13;:25;38624:10;38610:25;;;;;;;;;;;;;;;:64;;;;38401:285;38706:19;;;;;;;;;;;38698:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;38796:15;;38784:8;38768:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:43;;38760:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;38886:17;;38874:8;38850:21;38860:10;38850:9;:21::i;:::-;:32;;;;:::i;:::-;:53;;38842:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;38970:14;;38958:8;:26;;38950:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;39074:5;39061:9;:18;;39053:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;39118:31;39128:10;39140:8;39118:9;:31::i;:::-;39178:5;39166:9;:17;39162:97;;;39208:10;39200:28;;:47;39241:5;39229:9;:17;;;;:::i;:::-;39200:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;39162:97;38296:970;;2747:1:::1;3062:7;:22;;;;38182:1084:::0;:::o;40193:110::-;1841:13;:11;:13::i;:::-;40291:4:::1;40266:22;:29;;;;40193:110:::0;:::o;19813:234::-;19960:8;19908:18;:39;19927:19;:17;:19::i;:::-;19908:39;;;;;;;;;;;;;;;:49;19948:8;19908:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;20020:8;19984:55;;19999:19;:17;:19::i;:::-;19984:55;;;20030:8;19984:55;;;;;;:::i;:::-;;;;;;;;19813:234;;:::o;39272:110::-;1841:13;:11;:13::i;:::-;39355:19:::1;;;;;;;;;;;39354:20;39332:19;;:42;;;;;;;;;;;;;;;;;;39272:110::o:0;36983:20::-;;;;;;;;;;;;;:::o;40928:244::-;41099:4;32841:10;32833:18;;:4;:18;;;32829:83;;32868:32;32889:10;32868:20;:32::i;:::-;32829:83;41117:47:::1;41140:4;41146:2;41150:7;41159:4;41117:22;:47::i;:::-;40928:244:::0;;;;;:::o;37241:37::-;;;;:::o;40426:98::-;1841:13;:11;:13::i;:::-;40512:4:::1;40495:14;:21;;;;40426:98:::0;:::o;41178:341::-;41300:13;41335:8;;;;;;;;;;;41331:181;;;41408:8;41418:26;41435:8;41418:16;:26::i;:::-;41391:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;41360:86;;;;41331:181;41486:14;41479:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41178:341;;;;:::o;37282:31::-;;;;:::o;37203:34::-;;;;:::o;37042:116::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;37850:324::-;37903:4;37919:10;37940:9;37977:13;:25;37991:10;37977:25;;;;;;;;;;;;;;;;37952:22;;:50;;;;:::i;:::-;37940:62;;38029:4;38017:8;:16;38013:131;;38085:4;38074:8;:15;;;;:::i;:::-;38059:10;;38058:32;;;;:::i;:::-;38050:40;;38013:131;;;38131:1;38123:9;;38013:131;38161:5;38154:12;;;;37850:324;;;:::o;39746:97::-;39790:13;39823:12;39816:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39746:97;:::o;20055:164::-;20152:4;20176:18;:25;20195:5;20176:25;;;;;;;;;;;;;;;:35;20202:8;20176:35;;;;;;;;;;;;;;;;;;;;;;;;;20169:42;;20055:164;;;;:::o;2230:201::-;1841:13;:11;:13::i;:::-;2339:1:::1;2319:22;;:8;:22;;::::0;2311:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2395:28;2414:8;2395:18;:28::i;:::-;2230:201:::0;:::o;37458:255::-;1841:13;:11;:13::i;:::-;37590:15:::1;;37578:8;37562:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:43;;37540:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;37676:29;37686:8;37696;37676:9;:29::i;:::-;37458:255:::0;;:::o;40311:107::-;1841:13;:11;:13::i;:::-;40406:4:::1;40386:17;:24;;;;40311:107:::0;:::o;40085:100::-;1841:13;:11;:13::i;:::-;40168:9:::1;40155:10;:22;;;;40085:100:::0;:::o;20227:282::-;20292:4;20348:7;20329:15;:13;:15::i;:::-;:26;;:66;;;;;20382:13;;20372:7;:23;20329:66;:153;;;;;20481:1;12769:8;20433:17;:26;20451:7;20433:26;;;;;;;;;;;;:44;:49;20329:153;20309:173;;20227:282;;;:::o;30607:105::-;30667:7;30694:10;30687:17;;30607:105;:::o;13911:92::-;13967:7;13911:92;:::o;33250:647::-;33489:1;36308:42;33441:45;;;:49;33437:453;;;36308:42;33740;;;33791:4;33798:8;33740:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33735:144;;33854:8;33835:28;;;;;;;;;;;:::i;:::-;;;;;;;;33735:144;33437:453;33250:647;:::o;21322:1651::-;21464:27;21494;21513:7;21494:18;:27::i;:::-;21464:57;;21579:4;21538:45;;21554:19;21538:45;;;21534:86;;21592:28;;;;;;;;;;;;;;21534:86;21634:27;21663:23;21690:35;21717:7;21690:26;:35::i;:::-;21633:92;;;;21743:68;21768:15;21785:4;21791:19;:17;:19::i;:::-;21743:24;:68::i;:::-;21738:180;;21831:43;21848:4;21854:19;:17;:19::i;:::-;21831:16;:43::i;:::-;21826:92;;21883:35;;;;;;;;;;;;;;21826:92;21738:180;21949:1;21935:16;;:2;:16;;;21931:52;;21960:23;;;;;;;;;;;;;;21931:52;21996:43;22018:4;22024:2;22028:7;22037:1;21996:21;:43::i;:::-;22079:15;22076:85;;;22144:1;22123:19;22116:30;22076:85;22213:18;:24;22232:4;22213:24;;;;;;;;;;;;;;;;22211:26;;;;;;;;;;;;22255:18;:22;22274:2;22255:22;;;;;;;;;;;;;;;;22253:24;;;;;;;;;;;22324:146;22361:2;22410:45;22425:4;22431:2;22435:19;22410:14;:45::i;:::-;12903:8;22382:73;22324:18;:146::i;:::-;22295:17;:26;22313:7;22295:26;;;;;;;;;;;:175;;;;22542:1;12903:8;22491:19;:47;:52;22487:370;;22564:19;22596:1;22586:7;:11;22564:33;;22656:1;22622:17;:30;22640:11;22622:30;;;;;;;;;;;;:35;22618:224;;22703:13;;22688:11;:28;22684:139;;22780:19;22747:17;:30;22765:11;22747:30;;;;;;;;;;;:52;;;;22684:139;22618:224;22545:312;22487:370;22904:7;22900:2;22885:27;;22894:4;22885:27;;;;;;;;;;;;22923:42;22944:4;22950:2;22954:7;22963:1;22923:20;:42::i;:::-;21453:1520;;;21322:1651;;;:::o;1977:132::-;2052:12;:10;:12::i;:::-;2041:23;;:7;:5;:7::i;:::-;:23;;;2033:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1977:132::o;22981:193::-;23127:39;23144:4;23150:2;23154:7;23127:39;;;;;;;;;;;;:16;:39::i;:::-;22981:193;;;:::o;27977:1679::-;28057:27;28087;28106:7;28087:18;:27::i;:::-;28057:57;;28127:12;28158:19;28127:52;;28193:27;28222:23;28249:35;28276:7;28249:26;:35::i;:::-;28192:92;;;;28301:13;28297:244;;;28350:68;28375:15;28392:4;28398:19;:17;:19::i;:::-;28350:24;:68::i;:::-;28345:184;;28442:43;28459:4;28465:19;:17;:19::i;:::-;28442:16;:43::i;:::-;28437:92;;28494:35;;;;;;;;;;;;;;28437:92;28345:184;28297:244;28553:51;28575:4;28589:1;28593:7;28602:1;28553:21;:51::i;:::-;28644:15;28641:101;;;28725:1;28704:19;28697:30;28641:101;28851:1;12526:3;28821:1;:26;;28820:32;28792:18;:24;28811:4;28792:24;;;;;;;;;;;;;;;;:60;;;;;;;;;;;28898:176;28935:4;29006:53;29021:4;29035:1;29039:19;29006:14;:53::i;:::-;12903:8;12769;28959:43;28958:101;28898:18;:176::i;:::-;28869:17;:26;28887:7;28869:26;;;;;;;;;;;:205;;;;29146:1;12903:8;29095:19;:47;:52;29091:370;;29168:19;29200:1;29190:7;:11;29168:33;;29260:1;29226:17;:30;29244:11;29226:30;;;;;;;;;;;;:35;29222:224;;29307:13;;29292:11;:28;29288:139;;29384:19;29351:17;:30;29369:11;29351:30;;;;;;;;;;;:52;;;;29288:139;29222:224;29149:312;29091:370;29516:7;29512:1;29489:35;;29498:4;29489:35;;;;;;;;;;;;29535:50;29556:4;29570:1;29574:7;29583:1;29535:20;:50::i;:::-;29623:12;;:14;;;;;;;;;;;;;28046:1610;;;;27977:1679;;:::o;17366:633::-;17433:7;17453:12;17468:7;17453:22;;17536:4;17517:15;:13;:15::i;:::-;:23;17513:419;;17570:13;;17563:4;:20;17559:373;;;17608:14;17625:17;:23;17643:4;17625:23;;;;;;;;;;;;17608:40;;17705:1;12769:8;17677:6;:24;:29;17673:240;;17737:113;17754:1;17744:6;:11;17737:113;;17797:17;:25;17815:6;;;;;;;17797:25;;;;;;;;;;;;17788:34;;17737:113;;;17883:6;17876:13;;;;;;17673:240;17585:347;17559:373;17513:419;17960:31;;;;;;;;;;;;;;17366:633;;;;:::o;2439:191::-;2513:16;2532:6;;;;;;;;;;;2513:25;;2558:8;2549:6;;:17;;;;;;;;;;;;;;;;;;2613:8;2582:40;;2603:8;2582:40;;;;;;;;;;;;2502:128;2439:191;:::o;27760:112::-;27837:27;27847:2;27851:8;27837:27;;;;;;;;;;;;:9;:27::i;:::-;27760:112;;:::o;23182:407::-;23357:31;23370:4;23376:2;23380:7;23357:12;:31::i;:::-;23421:1;23403:2;:14;;;:19;23399:183;;23442:56;23473:4;23479:2;23483:7;23492:5;23442:30;:56::i;:::-;23437:145;;23526:40;;;;;;;;;;;;;;23437:145;23399:183;23182:407;;;;:::o;3266:534::-;3322:13;3363:1;3354:5;:10;3350:53;;3381:10;;;;;;;;;;;;;;;;;;;;;3350:53;3413:12;3428:5;3413:20;;3444:14;3469:78;3484:1;3476:4;:9;3469:78;;3502:8;;;;;:::i;:::-;;;;3533:2;3525:10;;;;;:::i;:::-;;;3469:78;;;3557:19;3589:6;3579:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3557:39;;3607:154;3623:1;3614:5;:10;3607:154;;3651:1;3641:11;;;;;:::i;:::-;;;3718:2;3710:5;:10;;;;:::i;:::-;3697:2;:24;;;;:::i;:::-;3684:39;;3667:6;3674;3667:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;3747:2;3738:11;;;;;:::i;:::-;;;3607:154;;;3785:6;3771:21;;;;;3266:534;;;;:::o;20922:392::-;21024:27;21053:23;21094:38;21135:15;:24;21151:7;21135:24;;;;;;;;;;;21094:65;;21219:18;21196:41;;21276:19;21270:26;21251:45;;21181:126;20922:392;;;:::o;20517:397::-;20666:11;20736:16;20729:5;20725:28;20716:37;;20797:16;20786:9;20782:32;20769:45;;20879:15;20868:9;20865:30;20857:5;20846:9;20843:20;20840:56;20830:66;;20517:397;;;;;:::o;23597:159::-;;;;;:::o;30288:311::-;30423:7;30443:16;12966:3;30469:19;:41;;30443:68;;12966:3;30537:31;30548:4;30554:2;30558:9;30537:10;:31::i;:::-;30529:40;;:62;;30522:69;;;30288:311;;;;;:::o;18381:450::-;18461:14;18629:16;18622:5;18618:28;18609:37;;18806:5;18792:11;18767:23;18763:41;18760:52;18753:5;18750:63;18740:73;;18381:450;;;;:::o;23764:158::-;;;;;:::o;1330:98::-;1383:7;1410:10;1403:17;;1330:98;:::o;27063:689::-;27194:19;27200:2;27204:8;27194:5;:19::i;:::-;27273:1;27255:2;:14;;;:19;27251:483;;27295:11;27309:13;;27295:27;;27341:13;27363:8;27357:3;:14;27341:30;;27390:233;27421:62;27460:1;27464:2;27468:7;;;;;;27477:5;27421:30;:62::i;:::-;27416:167;;27519:40;;;;;;;;;;;;;;27416:167;27618:3;27610:5;:11;27390:233;;27705:3;27688:13;;:20;27684:34;;27710:8;;;27684:34;27276:458;;27251:483;27063:689;;;:::o;23930:716::-;24093:4;24139:2;24114:45;;;24160:19;:17;:19::i;:::-;24181:4;24187:7;24196:5;24114:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;24110:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24414:1;24397:6;:13;:18;24393:235;;24443:40;;;;;;;;;;;;;;24393:235;24586:6;24580:13;24571:6;24567:2;24563:15;24556:38;24110:529;24283:54;;;24273:64;;;:6;:64;;;;24266:71;;;23930:716;;;;;;:::o;30133:147::-;30270:6;30133:147;;;;;:::o;24654:1442::-;24727:20;24750:13;;24727:36;;24790:1;24778:8;:13;24774:44;;24800:18;;;;;;;;;;;;;;24774:44;24831:61;24861:1;24865:2;24869:12;24883:8;24831:21;:61::i;:::-;25001:1;12466:2;24971:1;:26;;24970:32;24958:8;:45;24932:18;:22;24951:2;24932:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;25054:139;25091:2;25145:33;25168:1;25172:2;25176:1;25145:14;:33::i;:::-;25112:30;25133:8;25112:20;:30::i;:::-;:66;25054:18;:139::i;:::-;25020:17;:31;25038:12;25020:31;;;;;;;;;;;:173;;;;25210:16;25241:11;25270:8;25255:12;:23;25241:37;;25345:16;25341:2;25337:25;25325:37;;25565:12;25533:8;25508:1;25459:25;25434:1;25409;25382:215;25677:1;25663:12;25659:20;25617:279;25718:3;25709:7;25706:16;25617:279;;25869:7;25859:8;25856:1;25829:25;25826:1;25823;25818:59;25771:1;25762:7;25758:15;25747:26;;25617:279;;;25621:77;25941:1;25929:8;:13;25925:45;;25951:19;;;;;;;;;;;;;;25925:45;26003:3;25987:13;:19;;;;24905:1113;;26028:60;26057:1;26061:2;26065:12;26079:8;26028:20;:60::i;:::-;24716:1380;24654:1442;;:::o;18839:324::-;18909:14;19142:1;19132:8;19129:15;19103:24;19099:46;19089:56;;18839: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:60::-;6230:3;6251:5;6244:12;;6202:60;;;:::o;6268:142::-;6318:9;6351:53;6369:34;6378:24;6396:5;6378:24;:::i;:::-;6369:34;:::i;:::-;6351:53;:::i;:::-;6338:66;;6268:142;;;:::o;6416:126::-;6466:9;6499:37;6530:5;6499:37;:::i;:::-;6486:50;;6416:126;;;:::o;6548:158::-;6630:9;6663:37;6694:5;6663:37;:::i;:::-;6650:50;;6548:158;;;:::o;6712:195::-;6831:69;6894:5;6831:69;:::i;:::-;6826:3;6819:82;6712:195;;:::o;6913:286::-;7038:4;7076:2;7065:9;7061:18;7053:26;;7089:103;7189:1;7178:9;7174:17;7165:6;7089:103;:::i;:::-;6913:286;;;;:::o;7205:117::-;7314:1;7311;7304:12;7328:117;7437:1;7434;7427:12;7451:180;7499:77;7496:1;7489:88;7596:4;7593:1;7586:15;7620:4;7617:1;7610:15;7637:281;7720:27;7742:4;7720:27;:::i;:::-;7712:6;7708:40;7850:6;7838:10;7835:22;7814:18;7802:10;7799:34;7796:62;7793:88;;;7861:18;;:::i;:::-;7793:88;7901:10;7897:2;7890:22;7680:238;7637:281;;:::o;7924:129::-;7958:6;7985:20;;:::i;:::-;7975:30;;8014:33;8042:4;8034:6;8014:33;:::i;:::-;7924:129;;;:::o;8059:308::-;8121:4;8211:18;8203:6;8200:30;8197:56;;;8233:18;;:::i;:::-;8197:56;8271:29;8293:6;8271:29;:::i;:::-;8263:37;;8355:4;8349;8345:15;8337:23;;8059:308;;;:::o;8373:146::-;8470:6;8465:3;8460;8447:30;8511:1;8502:6;8497:3;8493:16;8486:27;8373:146;;;:::o;8525:425::-;8603:5;8628:66;8644:49;8686:6;8644:49;:::i;:::-;8628:66;:::i;:::-;8619:75;;8717:6;8710:5;8703:21;8755:4;8748:5;8744:16;8793:3;8784:6;8779:3;8775:16;8772:25;8769:112;;;8800:79;;:::i;:::-;8769:112;8890:54;8937:6;8932:3;8927;8890:54;:::i;:::-;8609:341;8525:425;;;;;:::o;8970:340::-;9026:5;9075:3;9068:4;9060:6;9056:17;9052:27;9042:122;;9083:79;;:::i;:::-;9042:122;9200:6;9187:20;9225:79;9300:3;9292:6;9285:4;9277:6;9273:17;9225:79;:::i;:::-;9216:88;;9032:278;8970:340;;;;:::o;9316:509::-;9385:6;9434:2;9422:9;9413:7;9409:23;9405:32;9402:119;;;9440:79;;:::i;:::-;9402:119;9588:1;9577:9;9573:17;9560:31;9618:18;9610:6;9607:30;9604:117;;;9640:79;;:::i;:::-;9604:117;9745:63;9800:7;9791:6;9780:9;9776:22;9745:63;:::i;:::-;9735:73;;9531:287;9316:509;;;;:::o;9831:116::-;9901:21;9916:5;9901:21;:::i;:::-;9894:5;9891:32;9881:60;;9937:1;9934;9927:12;9881:60;9831:116;:::o;9953:133::-;9996:5;10034:6;10021:20;10012:29;;10050:30;10074:5;10050:30;:::i;:::-;9953:133;;;;:::o;10092:648::-;10167:6;10175;10224:2;10212:9;10203:7;10199:23;10195:32;10192:119;;;10230:79;;:::i;:::-;10192:119;10350:1;10375:50;10417:7;10408:6;10397:9;10393:22;10375:50;:::i;:::-;10365:60;;10321:114;10502:2;10491:9;10487:18;10474:32;10533:18;10525:6;10522:30;10519:117;;;10555:79;;:::i;:::-;10519:117;10660:63;10715:7;10706:6;10695:9;10691:22;10660:63;:::i;:::-;10650:73;;10445:288;10092:648;;;;;:::o;10746:468::-;10811:6;10819;10868:2;10856:9;10847:7;10843:23;10839:32;10836:119;;;10874:79;;:::i;:::-;10836:119;10994:1;11019:53;11064:7;11055:6;11044:9;11040:22;11019:53;:::i;:::-;11009:63;;10965:117;11121:2;11147:50;11189:7;11180:6;11169:9;11165:22;11147:50;:::i;:::-;11137:60;;11092:115;10746:468;;;;;:::o;11220:307::-;11281:4;11371:18;11363:6;11360:30;11357:56;;;11393:18;;:::i;:::-;11357:56;11431:29;11453:6;11431:29;:::i;:::-;11423:37;;11515:4;11509;11505:15;11497:23;;11220:307;;;:::o;11533:423::-;11610:5;11635:65;11651:48;11692:6;11651:48;:::i;:::-;11635:65;:::i;:::-;11626:74;;11723:6;11716:5;11709:21;11761:4;11754:5;11750:16;11799:3;11790:6;11785:3;11781:16;11778:25;11775:112;;;11806:79;;:::i;:::-;11775:112;11896:54;11943:6;11938:3;11933;11896:54;:::i;:::-;11616:340;11533:423;;;;;:::o;11975:338::-;12030:5;12079:3;12072:4;12064:6;12060:17;12056:27;12046:122;;12087:79;;:::i;:::-;12046:122;12204:6;12191:20;12229:78;12303:3;12295:6;12288:4;12280:6;12276:17;12229:78;:::i;:::-;12220:87;;12036:277;11975:338;;;;:::o;12319:943::-;12414:6;12422;12430;12438;12487:3;12475:9;12466:7;12462:23;12458:33;12455:120;;;12494:79;;:::i;:::-;12455:120;12614:1;12639:53;12684:7;12675:6;12664:9;12660:22;12639:53;:::i;:::-;12629:63;;12585:117;12741:2;12767:53;12812:7;12803:6;12792:9;12788:22;12767:53;:::i;:::-;12757:63;;12712:118;12869:2;12895:53;12940:7;12931:6;12920:9;12916:22;12895:53;:::i;:::-;12885:63;;12840:118;13025:2;13014:9;13010:18;12997:32;13056:18;13048:6;13045:30;13042:117;;;13078:79;;:::i;:::-;13042:117;13183:62;13237:7;13228:6;13217:9;13213:22;13183:62;:::i;:::-;13173:72;;12968:287;12319:943;;;;;;;:::o;13268:474::-;13336:6;13344;13393:2;13381:9;13372:7;13368:23;13364:32;13361:119;;;13399:79;;:::i;:::-;13361:119;13519:1;13544:53;13589:7;13580:6;13569:9;13565:22;13544:53;:::i;:::-;13534:63;;13490:117;13646:2;13672:53;13717:7;13708:6;13697:9;13693:22;13672:53;:::i;:::-;13662:63;;13617:118;13268:474;;;;;:::o;13748:::-;13816:6;13824;13873:2;13861:9;13852:7;13848:23;13844:32;13841:119;;;13879:79;;:::i;:::-;13841:119;13999:1;14024:53;14069:7;14060:6;14049:9;14045:22;14024:53;:::i;:::-;14014:63;;13970:117;14126:2;14152:53;14197:7;14188:6;14177:9;14173:22;14152:53;:::i;:::-;14142:63;;14097:118;13748:474;;;;;:::o;14228:180::-;14276:77;14273:1;14266:88;14373:4;14370:1;14363:15;14397:4;14394:1;14387:15;14414:320;14458:6;14495:1;14489:4;14485:12;14475:22;;14542:1;14536:4;14532:12;14563:18;14553:81;;14619:4;14611:6;14607:17;14597:27;;14553:81;14681:2;14673:6;14670:14;14650:18;14647:38;14644:84;;14700:18;;:::i;:::-;14644:84;14465:269;14414:320;;;:::o;14740:181::-;14880:33;14876:1;14868:6;14864:14;14857:57;14740:181;:::o;14927:366::-;15069:3;15090:67;15154:2;15149:3;15090:67;:::i;:::-;15083:74;;15166:93;15255:3;15166:93;:::i;:::-;15284:2;15279:3;15275:12;15268:19;;14927:366;;;:::o;15299:419::-;15465:4;15503:2;15492:9;15488:18;15480:26;;15552:9;15546:4;15542:20;15538:1;15527:9;15523:17;15516:47;15580:131;15706:4;15580:131;:::i;:::-;15572:139;;15299:419;;;:::o;15724:147::-;15825:11;15862:3;15847:18;;15724:147;;;;:::o;15877:114::-;;:::o;15997:398::-;16156:3;16177:83;16258:1;16253:3;16177:83;:::i;:::-;16170:90;;16269:93;16358:3;16269:93;:::i;:::-;16387:1;16382:3;16378:11;16371:18;;15997:398;;;:::o;16401:379::-;16585:3;16607:147;16750:3;16607:147;:::i;:::-;16600:154;;16771:3;16764:10;;16401:379;;;:::o;16786:166::-;16926:18;16922:1;16914:6;16910:14;16903:42;16786:166;:::o;16958:366::-;17100:3;17121:67;17185:2;17180:3;17121:67;:::i;:::-;17114:74;;17197:93;17286:3;17197:93;:::i;:::-;17315:2;17310:3;17306:12;17299:19;;16958:366;;;:::o;17330:419::-;17496:4;17534:2;17523:9;17519:18;17511:26;;17583:9;17577:4;17573:20;17569:1;17558:9;17554:17;17547:47;17611:131;17737:4;17611:131;:::i;:::-;17603:139;;17330:419;;;:::o;17755:141::-;17804:4;17827:3;17819:11;;17850:3;17847:1;17840:14;17884:4;17881:1;17871:18;17863:26;;17755:141;;;:::o;17902:93::-;17939:6;17986:2;17981;17974:5;17970:14;17966:23;17956:33;;17902:93;;;:::o;18001:107::-;18045:8;18095:5;18089:4;18085:16;18064:37;;18001:107;;;;:::o;18114:393::-;18183:6;18233:1;18221:10;18217:18;18256:97;18286:66;18275:9;18256:97;:::i;:::-;18374:39;18404:8;18393:9;18374:39;:::i;:::-;18362:51;;18446:4;18442:9;18435:5;18431:21;18422:30;;18495:4;18485:8;18481:19;18474:5;18471:30;18461:40;;18190:317;;18114:393;;;;;:::o;18513:142::-;18563:9;18596:53;18614:34;18623:24;18641:5;18623:24;:::i;:::-;18614:34;:::i;:::-;18596:53;:::i;:::-;18583:66;;18513:142;;;:::o;18661:75::-;18704:3;18725:5;18718:12;;18661:75;;;:::o;18742:269::-;18852:39;18883:7;18852:39;:::i;:::-;18913:91;18962:41;18986:16;18962:41;:::i;:::-;18954:6;18947:4;18941:11;18913:91;:::i;:::-;18907:4;18900:105;18818:193;18742:269;;;:::o;19017:73::-;19062:3;19017:73;:::o;19096:189::-;19173:32;;:::i;:::-;19214:65;19272:6;19264;19258:4;19214:65;:::i;:::-;19149:136;19096:189;;:::o;19291:186::-;19351:120;19368:3;19361:5;19358:14;19351:120;;;19422:39;19459:1;19452:5;19422:39;:::i;:::-;19395:1;19388:5;19384:13;19375:22;;19351:120;;;19291:186;;:::o;19483:543::-;19584:2;19579:3;19576:11;19573:446;;;19618:38;19650:5;19618:38;:::i;:::-;19702:29;19720:10;19702:29;:::i;:::-;19692:8;19688:44;19885:2;19873:10;19870:18;19867:49;;;19906:8;19891:23;;19867:49;19929:80;19985:22;20003:3;19985:22;:::i;:::-;19975:8;19971:37;19958:11;19929:80;:::i;:::-;19588:431;;19573:446;19483:543;;;:::o;20032:117::-;20086:8;20136:5;20130:4;20126:16;20105:37;;20032:117;;;;:::o;20155:169::-;20199:6;20232:51;20280:1;20276:6;20268:5;20265:1;20261:13;20232:51;:::i;:::-;20228:56;20313:4;20307;20303:15;20293:25;;20206:118;20155:169;;;;:::o;20329:295::-;20405:4;20551:29;20576:3;20570:4;20551:29;:::i;:::-;20543:37;;20613:3;20610:1;20606:11;20600:4;20597:21;20589:29;;20329:295;;;;:::o;20629:1395::-;20746:37;20779:3;20746:37;:::i;:::-;20848:18;20840:6;20837:30;20834:56;;;20870:18;;:::i;:::-;20834:56;20914:38;20946:4;20940:11;20914:38;:::i;:::-;20999:67;21059:6;21051;21045:4;20999:67;:::i;:::-;21093:1;21117:4;21104:17;;21149:2;21141:6;21138:14;21166:1;21161:618;;;;21823:1;21840:6;21837:77;;;21889:9;21884:3;21880:19;21874:26;21865:35;;21837:77;21940:67;22000:6;21993:5;21940:67;:::i;:::-;21934:4;21927:81;21796:222;21131:887;;21161:618;21213:4;21209:9;21201:6;21197:22;21247:37;21279:4;21247:37;:::i;:::-;21306:1;21320:208;21334:7;21331:1;21328:14;21320:208;;;21413:9;21408:3;21404:19;21398:26;21390:6;21383:42;21464:1;21456:6;21452:14;21442:24;;21511:2;21500:9;21496:18;21483:31;;21357:4;21354:1;21350:12;21345:17;;21320:208;;;21556:6;21547:7;21544:19;21541:179;;;21614:9;21609:3;21605:19;21599:26;21657:48;21699:4;21691:6;21687:17;21676:9;21657:48;:::i;:::-;21649:6;21642:64;21564:156;21541:179;21766:1;21762;21754:6;21750:14;21746:22;21740:4;21733:36;21168:611;;;21131:887;;20721:1303;;;20629:1395;;:::o;22030:180::-;22170:32;22166:1;22158:6;22154:14;22147:56;22030:180;:::o;22216:366::-;22358:3;22379:67;22443:2;22438:3;22379:67;:::i;:::-;22372:74;;22455:93;22544:3;22455:93;:::i;:::-;22573:2;22568:3;22564:12;22557:19;;22216:366;;;:::o;22588:419::-;22754:4;22792:2;22781:9;22777:18;22769:26;;22841:9;22835:4;22831:20;22827:1;22816:9;22812:17;22805:47;22869:131;22995:4;22869:131;:::i;:::-;22861:139;;22588:419;;;:::o;23013:180::-;23061:77;23058:1;23051:88;23158:4;23155:1;23148:15;23182:4;23179:1;23172:15;23199:194;23239:4;23259:20;23277:1;23259:20;:::i;:::-;23254:25;;23293:20;23311:1;23293:20;:::i;:::-;23288:25;;23337:1;23334;23330:9;23322:17;;23361:1;23355:4;23352:11;23349:37;;;23366:18;;:::i;:::-;23349:37;23199:194;;;;:::o;23399:410::-;23439:7;23462:20;23480:1;23462:20;:::i;:::-;23457:25;;23496:20;23514:1;23496:20;:::i;:::-;23491:25;;23551:1;23548;23544:9;23573:30;23591:11;23573:30;:::i;:::-;23562:41;;23752:1;23743:7;23739:15;23736:1;23733:22;23713:1;23706:9;23686:83;23663:139;;23782:18;;:::i;:::-;23663:139;23447:362;23399:410;;;;:::o;23815:191::-;23855:3;23874:20;23892:1;23874:20;:::i;:::-;23869:25;;23908:20;23926:1;23908:20;:::i;:::-;23903:25;;23951:1;23948;23944:9;23937:16;;23972:3;23969:1;23966:10;23963:36;;;23979:18;;:::i;:::-;23963:36;23815:191;;;;:::o;24012:169::-;24152:21;24148:1;24140:6;24136:14;24129:45;24012:169;:::o;24187:366::-;24329:3;24350:67;24414:2;24409:3;24350:67;:::i;:::-;24343:74;;24426:93;24515:3;24426:93;:::i;:::-;24544:2;24539:3;24535:12;24528:19;;24187:366;;;:::o;24559:419::-;24725:4;24763:2;24752:9;24748:18;24740:26;;24812:9;24806:4;24802:20;24798:1;24787:9;24783:17;24776:47;24840:131;24966:4;24840:131;:::i;:::-;24832:139;;24559:419;;;:::o;24984:163::-;25124:15;25120:1;25112:6;25108:14;25101:39;24984:163;:::o;25153:366::-;25295:3;25316:67;25380:2;25375:3;25316:67;:::i;:::-;25309:74;;25392:93;25481:3;25392:93;:::i;:::-;25510:2;25505:3;25501:12;25494:19;;25153:366;;;:::o;25525:419::-;25691:4;25729:2;25718:9;25714:18;25706:26;;25778:9;25772:4;25768:20;25764:1;25753:9;25749:17;25742:47;25806:131;25932:4;25806:131;:::i;:::-;25798:139;;25525:419;;;:::o;25950:179::-;26090:31;26086:1;26078:6;26074:14;26067:55;25950:179;:::o;26135:366::-;26277:3;26298:67;26362:2;26357:3;26298:67;:::i;:::-;26291:74;;26374:93;26463:3;26374:93;:::i;:::-;26492:2;26487:3;26483:12;26476:19;;26135:366;;;:::o;26507:419::-;26673:4;26711:2;26700:9;26696:18;26688:26;;26760:9;26754:4;26750:20;26746:1;26735:9;26731:17;26724:47;26788:131;26914:4;26788:131;:::i;:::-;26780:139;;26507:419;;;:::o;26932:240::-;27072:34;27068:1;27060:6;27056:14;27049:58;27141:23;27136:2;27128:6;27124:15;27117:48;26932:240;:::o;27178:366::-;27320:3;27341:67;27405:2;27400:3;27341:67;:::i;:::-;27334:74;;27417:93;27506:3;27417:93;:::i;:::-;27535:2;27530:3;27526:12;27519:19;;27178:366;;;:::o;27550:419::-;27716:4;27754:2;27743:9;27739:18;27731:26;;27803:9;27797:4;27793:20;27789:1;27778:9;27774:17;27767:47;27831:131;27957:4;27831:131;:::i;:::-;27823:139;;27550:419;;;:::o;27975:171::-;28115:23;28111:1;28103:6;28099:14;28092:47;27975:171;:::o;28152:366::-;28294:3;28315:67;28379:2;28374:3;28315:67;:::i;:::-;28308:74;;28391:93;28480:3;28391:93;:::i;:::-;28509:2;28504:3;28500:12;28493:19;;28152:366;;;:::o;28524:419::-;28690:4;28728:2;28717:9;28713:18;28705:26;;28777:9;28771:4;28767:20;28763:1;28752:9;28748:17;28741:47;28805:131;28931:4;28805:131;:::i;:::-;28797:139;;28524:419;;;:::o;28949:148::-;29051:11;29088:3;29073:18;;28949:148;;;;:::o;29127:874::-;29230:3;29267:5;29261:12;29296:36;29322:9;29296:36;:::i;:::-;29348:89;29430:6;29425:3;29348:89;:::i;:::-;29341:96;;29468:1;29457:9;29453:17;29484:1;29479:166;;;;29659:1;29654:341;;;;29446:549;;29479:166;29563:4;29559:9;29548;29544:25;29539:3;29532:38;29625:6;29618:14;29611:22;29603:6;29599:35;29594:3;29590:45;29583:52;;29479:166;;29654:341;29721:38;29753:5;29721:38;:::i;:::-;29781:1;29795:154;29809:6;29806:1;29803:13;29795:154;;;29883:7;29877:14;29873:1;29868:3;29864:11;29857:35;29933:1;29924:7;29920:15;29909:26;;29831:4;29828:1;29824:12;29819:17;;29795:154;;;29978:6;29973:3;29969:16;29962:23;;29661:334;;29446:549;;29234:767;;29127:874;;;;:::o;30007:390::-;30113:3;30141:39;30174:5;30141:39;:::i;:::-;30196:89;30278:6;30273:3;30196:89;:::i;:::-;30189:96;;30294:65;30352:6;30347:3;30340:4;30333:5;30329:16;30294:65;:::i;:::-;30384:6;30379:3;30375:16;30368:23;;30117:280;30007:390;;;;:::o;30403:429::-;30580:3;30602:92;30690:3;30681:6;30602:92;:::i;:::-;30595:99;;30711:95;30802:3;30793:6;30711:95;:::i;:::-;30704:102;;30823:3;30816:10;;30403:429;;;;;:::o;30838:225::-;30978:34;30974:1;30966:6;30962:14;30955:58;31047:8;31042:2;31034:6;31030:15;31023:33;30838:225;:::o;31069:366::-;31211:3;31232:67;31296:2;31291:3;31232:67;:::i;:::-;31225:74;;31308:93;31397:3;31308:93;:::i;:::-;31426:2;31421:3;31417:12;31410:19;;31069:366;;;:::o;31441:419::-;31607:4;31645:2;31634:9;31630:18;31622:26;;31694:9;31688:4;31684:20;31680:1;31669:9;31665:17;31658:47;31722:131;31848:4;31722:131;:::i;:::-;31714:139;;31441:419;;;:::o;31866:172::-;32006:24;32002:1;31994:6;31990:14;31983:48;31866:172;:::o;32044:366::-;32186:3;32207:67;32271:2;32266:3;32207:67;:::i;:::-;32200:74;;32283:93;32372:3;32283:93;:::i;:::-;32401:2;32396:3;32392:12;32385:19;;32044:366;;;:::o;32416:419::-;32582:4;32620:2;32609:9;32605:18;32597:26;;32669:9;32663:4;32659:20;32655:1;32644:9;32640:17;32633:47;32697:131;32823:4;32697:131;:::i;:::-;32689:139;;32416:419;;;:::o;32841:332::-;32962:4;33000:2;32989:9;32985:18;32977:26;;33013:71;33081:1;33070:9;33066:17;33057:6;33013:71;:::i;:::-;33094:72;33162:2;33151:9;33147:18;33138:6;33094:72;:::i;:::-;32841:332;;;;;:::o;33179:137::-;33233:5;33264:6;33258:13;33249:22;;33280:30;33304:5;33280:30;:::i;:::-;33179:137;;;;:::o;33322:345::-;33389:6;33438:2;33426:9;33417:7;33413:23;33409:32;33406:119;;;33444:79;;:::i;:::-;33406:119;33564:1;33589:61;33642:7;33633:6;33622:9;33618:22;33589:61;:::i;:::-;33579:71;;33535:125;33322:345;;;;:::o;33673:182::-;33813:34;33809:1;33801:6;33797:14;33790:58;33673:182;:::o;33861:366::-;34003:3;34024:67;34088:2;34083:3;34024:67;:::i;:::-;34017:74;;34100:93;34189:3;34100:93;:::i;:::-;34218:2;34213:3;34209:12;34202:19;;33861:366;;;:::o;34233:419::-;34399:4;34437:2;34426:9;34422:18;34414:26;;34486:9;34480:4;34476:20;34472:1;34461:9;34457:17;34450:47;34514:131;34640:4;34514:131;:::i;:::-;34506:139;;34233:419;;;:::o;34658:233::-;34697:3;34720:24;34738:5;34720:24;:::i;:::-;34711:33;;34766:66;34759:5;34756:77;34753:103;;34836:18;;:::i;:::-;34753:103;34883:1;34876:5;34872:13;34865:20;;34658:233;;;:::o;34897:180::-;34945:77;34942:1;34935:88;35042:4;35039:1;35032:15;35066:4;35063:1;35056:15;35083:185;35123:1;35140:20;35158:1;35140:20;:::i;:::-;35135:25;;35174:20;35192:1;35174:20;:::i;:::-;35169:25;;35213:1;35203:35;;35218:18;;:::i;:::-;35203:35;35260:1;35257;35253:9;35248:14;;35083:185;;;;:::o;35274:176::-;35306:1;35323:20;35341:1;35323:20;:::i;:::-;35318:25;;35357:20;35375:1;35357:20;:::i;:::-;35352:25;;35396:1;35386:35;;35401:18;;:::i;:::-;35386:35;35442:1;35439;35435:9;35430:14;;35274:176;;;;:::o;35456:180::-;35504:77;35501:1;35494:88;35601:4;35598:1;35591:15;35625:4;35622:1;35615:15;35642:98;35693:6;35727:5;35721:12;35711:22;;35642:98;;;:::o;35746:168::-;35829:11;35863:6;35858:3;35851:19;35903:4;35898:3;35894:14;35879:29;;35746:168;;;;:::o;35920:373::-;36006:3;36034:38;36066:5;36034:38;:::i;:::-;36088:70;36151:6;36146:3;36088:70;:::i;:::-;36081:77;;36167:65;36225:6;36220:3;36213:4;36206:5;36202:16;36167:65;:::i;:::-;36257:29;36279:6;36257:29;:::i;:::-;36252:3;36248:39;36241:46;;36010:283;35920:373;;;;:::o;36299:640::-;36494:4;36532:3;36521:9;36517:19;36509:27;;36546:71;36614:1;36603:9;36599:17;36590:6;36546:71;:::i;:::-;36627:72;36695:2;36684:9;36680:18;36671:6;36627:72;:::i;:::-;36709;36777:2;36766:9;36762:18;36753:6;36709:72;:::i;:::-;36828:9;36822:4;36818:20;36813:2;36802:9;36798:18;36791:48;36856:76;36927:4;36918:6;36856:76;:::i;:::-;36848:84;;36299:640;;;;;;;:::o;36945:141::-;37001:5;37032:6;37026:13;37017:22;;37048:32;37074:5;37048:32;:::i;:::-;36945:141;;;;:::o;37092:349::-;37161:6;37210:2;37198:9;37189:7;37185:23;37181:32;37178:119;;;37216:79;;:::i;:::-;37178:119;37336:1;37361:63;37416:7;37407:6;37396:9;37392:22;37361:63;:::i;:::-;37351:73;;37307:127;37092:349;;;;:::o

Swarm Source

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