ETH Price: $2,526.06 (+3.10%)

Token

FlameHeads (FH)
 

Overview

Max Total Supply

6,666 FH

Holders

533

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 FH
0xbd916076c68403eeb45e6ea4d5cd7288ac402181
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:
FlameHeads

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 7 of 15: FlameHeads.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.19;

import {ERC721A, IERC721A} from "ERC721A.sol";
import {Ownable} from "Ownable.sol";
import {MerkleProof} from "MerkleProof.sol";
import {OperatorFilterer} from "OperatorFilterer.sol";
import {IERC2981} from "IERC2981.sol";
import {ERC2981} from "ERC2981.sol";
import {ERC721ABurnable} from "ERC721ABurnable.sol";
import {ERC721AQueryable} from "ERC721AQueryable.sol";

error MintingPaused();
error MaxSupplyReached();
error WithdrawalFailed();
error WrongEtherAmount();
error InvalidMintAddress();
error ArrayLengthMismatch();
error MaxPerTransactionReached();
error MaxPerWalletReached();
error NoWL();

contract FlameHeads is
  Ownable,
  ERC721A,
  ERC2981,
  ERC721ABurnable,
  ERC721AQueryable,
  OperatorFilterer
{
  enum Step {
        Paused,
        Whitelist,
        Public
  }

  Step public sellingStep;
  uint256 public constant MAX_SUPPLY = 6666;
  uint256 public constant MAX_PER_WALLET_WL = 1;
  uint256 public constant MAX_PER_TRANSACTION_PUBLIC = 6;
  uint256 public MINT_PRICE = 0.006 ether;
  uint256 public WL_MAX_SUPPLY = 1111;
  bool public operatorFilteringEnabled = true;
  bytes32 public merkleRootWL;
  mapping(address => uint8) public NFTsperWalletWL;

  string tokenBaseUri = "";

  constructor(address deployer) ERC721A("FlameHeads", "FH") {
    sellingStep = Step(0);
    _transferOwnership(deployer);
    _registerForOperatorFiltering();
    _setDefaultRoyalty(deployer, 300);
  }

  function mint(uint8 quantity) external payable {
    if (sellingStep != Step(2)) revert MintingPaused();
    if (_totalMinted() + quantity > MAX_SUPPLY - WL_MAX_SUPPLY) revert MaxSupplyReached();
    if (quantity > MAX_PER_TRANSACTION_PUBLIC) revert MaxPerTransactionReached();
    if (msg.value < quantity * MINT_PRICE) revert WrongEtherAmount();

    _mint(msg.sender, quantity);
  }

  function wlmint(bytes32[] calldata _proof) external payable {
    if (sellingStep != Step(1)) revert MintingPaused();
    if (isWhiteListed(msg.sender, _proof) != true) revert NoWL();
    if (_totalMinted() + 1 > MAX_SUPPLY) revert MaxSupplyReached();
    if(NFTsperWalletWL[msg.sender] == MAX_PER_WALLET_WL) revert MaxPerWalletReached();
    NFTsperWalletWL[msg.sender] += 1;

    _mint(msg.sender, 1);
  }

  function isWhiteListed(address _account, bytes32[] calldata _proof) internal view returns(bool) {
    return MerkleProof.verify(_proof, merkleRootWL, keccak256(abi.encodePacked(_account)));
  }

  function setMerkleRoot(bytes32 _merkleRoot) external onlyOwner {
    merkleRootWL = _merkleRoot;
  }

  function setStep(uint8 step) external onlyOwner {
    sellingStep = Step(step);
  }

  function setMintPrice(uint256 newMintPrice) external onlyOwner {
    MINT_PRICE = newMintPrice;
  }

  function getMintPrice() public view returns (uint256) {
    return MINT_PRICE;
  }

  function setWLMaxSupply(uint256 newWLMaxSupply) external onlyOwner {
    WL_MAX_SUPPLY = newWLMaxSupply;
  }

  function setDefaultRoyalty(
    address receiver,
    uint96 feeNumerator
  ) public onlyOwner {
    _setDefaultRoyalty(receiver, feeNumerator);
  }

  function setOperatorFilteringEnabled(bool value) public onlyOwner {
    operatorFilteringEnabled = value;
  }

  function setBaseURI(string calldata newBaseUri) external onlyOwner {
    tokenBaseUri = newBaseUri;
  }

  function collectReserves(uint16 quantity) external onlyOwner {
    if (_totalMinted() + quantity > MAX_SUPPLY) revert MaxSupplyReached();

    _mint(msg.sender, quantity);
  }

  function withdraw() public onlyOwner {
    (bool success, ) = payable(owner()).call{value: address(this).balance}("");

    if (!success) {
      revert WithdrawalFailed();
    }
  }

  function _startTokenId() internal pure override returns (uint256) {
    return 1;
  }

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

  function supportsInterface(
    bytes4 interfaceId
  ) public view virtual override(ERC721A, IERC721A, ERC2981) returns (bool) {
    return
      ERC721A.supportsInterface(interfaceId) ||
      ERC2981.supportsInterface(interfaceId);
  }

  function _operatorFilteringEnabled() internal view override returns (bool) {
    return operatorFilteringEnabled;
  }

  function _isPriorityOperator(
    address operator
  ) internal pure override returns (bool) {
    return operator == address(0x1E0049783F008A0085193E00003D00cd54003c71);
  }

  function setApprovalForAll(
    address operator,
    bool approved
  ) public override(ERC721A, IERC721A) onlyAllowedOperatorApproval(operator) {
    super.setApprovalForAll(operator, approved);
  }

  function approve(
    address operator,
    uint256 tokenId
  )
    public
    payable
    override(ERC721A, IERC721A)
    onlyAllowedOperatorApproval(operator)
  {
    super.approve(operator, tokenId);
  }

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

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

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

File 1 of 15: Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

File 2 of 15: ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

File 3 of 15: ERC2981.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/common/ERC2981.sol)

pragma solidity ^0.8.0;

import "IERC2981.sol";
import "ERC165.sol";

/**
 * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
 * fee is specified in basis points by default.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC2981 is IERC2981, ERC165 {
    struct RoyaltyInfo {
        address receiver;
        uint96 royaltyFraction;
    }

    RoyaltyInfo private _defaultRoyaltyInfo;
    mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) {
        return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @inheritdoc IERC2981
     */
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) {
        RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId];

        if (royalty.receiver == address(0)) {
            royalty = _defaultRoyaltyInfo;
        }

        uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator();

        return (royalty.receiver, royaltyAmount);
    }

    /**
     * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
     * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
     * override.
     */
    function _feeDenominator() internal pure virtual returns (uint96) {
        return 10000;
    }

    /**
     * @dev Sets the royalty information that all ids in this contract will default to.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: invalid receiver");

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Removes default royalty information.
     */
    function _deleteDefaultRoyalty() internal virtual {
        delete _defaultRoyaltyInfo;
    }

    /**
     * @dev Sets the royalty information for a specific token id, overriding the global default.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setTokenRoyalty(
        uint256 tokenId,
        address receiver,
        uint96 feeNumerator
    ) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: Invalid parameters");

        _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Resets royalty information for the token id back to the global default.
     */
    function _resetTokenRoyalty(uint256 tokenId) internal virtual {
        delete _tokenRoyaltyInfo[tokenId];
    }
}

File 4 of 15: ERC721A.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.2.3
// Creator: Chiru Labs

pragma solidity ^0.8.4;

import './IERC721A.sol';

/**
 * @dev Interface of ERC721 token receiver.
 */
interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

/**
 * @title ERC721A
 *
 * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721)
 * Non-Fungible Token Standard, including the Metadata extension.
 * Optimized for lower gas during batch mints.
 *
 * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...)
 * starting from `_startTokenId()`.
 *
 * Assumptions:
 *
 * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364).
    struct TokenApprovalRef {
        address value;
    }

    // =============================================================
    //                           CONSTANTS
    // =============================================================

    // Mask of an entry in packed address data.
    uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

    // The bit position of `numberMinted` in packed address data.
    uint256 private constant _BITPOS_NUMBER_MINTED = 64;

    // The bit position of `numberBurned` in packed address data.
    uint256 private constant _BITPOS_NUMBER_BURNED = 128;

    // The bit position of `aux` in packed address data.
    uint256 private constant _BITPOS_AUX = 192;

    // Mask of all 256 bits in packed address data except the 64 bits for `aux`.
    uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;

    // The bit position of `startTimestamp` in packed ownership.
    uint256 private constant _BITPOS_START_TIMESTAMP = 160;

    // The bit mask of the `burned` bit in packed ownership.
    uint256 private constant _BITMASK_BURNED = 1 << 224;

    // The bit position of the `nextInitialized` bit in packed ownership.
    uint256 private constant _BITPOS_NEXT_INITIALIZED = 225;

    // The bit mask of the `nextInitialized` bit in packed ownership.
    uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225;

    // The bit position of `extraData` in packed ownership.
    uint256 private constant _BITPOS_EXTRA_DATA = 232;

    // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`.
    uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;

    // The mask of the lower 160 bits for addresses.
    uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1;

    // The maximum `quantity` that can be minted with {_mintERC2309}.
    // This limit is to prevent overflows on the address data entries.
    // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309}
    // is required to cause an overflow, which is unrealistic.
    uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;

    // The `Transfer` event signature is given by:
    // `keccak256(bytes("Transfer(address,address,uint256)"))`.
    bytes32 private constant _TRANSFER_EVENT_SIGNATURE =
        0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;

    // =============================================================
    //                            STORAGE
    // =============================================================

    // The next token ID to be minted.
    uint256 private _currentIndex;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned.
    // See {_packedOwnershipOf} implementation for details.
    //
    // Bits Layout:
    // - [0..159]   `addr`
    // - [160..223] `startTimestamp`
    // - [224]      `burned`
    // - [225]      `nextInitialized`
    // - [232..255] `extraData`
    mapping(uint256 => uint256) private _packedOwnerships;

    // Mapping owner address to address data.
    //
    // Bits Layout:
    // - [0..63]    `balance`
    // - [64..127]  `numberMinted`
    // - [128..191] `numberBurned`
    // - [192..255] `aux`
    mapping(address => uint256) private _packedAddressData;

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

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

    // =============================================================
    //                          CONSTRUCTOR
    // =============================================================

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

    // =============================================================
    //                   TOKEN COUNTING OPERATIONS
    // =============================================================

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

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

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see {_totalMinted}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than `_currentIndex - _startTokenId()` times.
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * @dev Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view virtual returns (uint256) {
        // Counter underflow is impossible as `_currentIndex` does not decrement,
        // and it is initialized to `_startTokenId()`.
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @dev Returns the total number of tokens burned.
     */
    function _totalBurned() internal view virtual returns (uint256) {
        return _burnCounter;
    }

    // =============================================================
    //                    ADDRESS DATA OPERATIONS
    // =============================================================

    /**
     * @dev Returns the number of tokens in `owner`'s account.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY;
    }

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

    /**
     * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return uint64(_packedAddressData[owner] >> _BITPOS_AUX);
    }

    /**
     * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal 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;
    }

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        // The interface IDs are constants representing the first 4 bytes
        // of the XOR of all function selectors in the interface.
        // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165)
        // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`)
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

    // =============================================================
    //                        IERC721Metadata
    // =============================================================

    /**
     * @dev Returns the token collection name.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

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

    // =============================================================
    //                     OWNERSHIPS OPERATIONS
    // =============================================================

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

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

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

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

    /**
     * Returns the packed ownership data of `tokenId`.
     */
    function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & _BITMASK_BURNED == 0) {
                        // Invariant:
                        // There will always be an initialized ownership slot
                        // (i.e. `ownership.addr != address(0) && ownership.burned == false`)
                        // before an unintialized ownership slot
                        // (i.e. `ownership.addr == address(0) && ownership.burned == false`)
                        // Hence, `curr` will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed will be zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev Returns the unpacked `TokenOwnership` struct from `packed`.
     */
    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP);
        ownership.burned = packed & _BITMASK_BURNED != 0;
        ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA);
    }

    /**
     * @dev Packs ownership data into a single uint256.
     */
    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))
        }
    }

    /**
     * @dev Returns the `nextInitialized` flag set if `quantity` equals 1.
     */
    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))
        }
    }

    // =============================================================
    //                      APPROVAL OPERATIONS
    // =============================================================

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the
     * zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    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);
    }

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId].value;
    }

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom}
     * for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
    }

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted. See {_mint}.
     */
    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.
    }

    /**
     * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`.
     */
    function _isSenderApprovedOrOwner(
        address approvedAddress,
        address owner,
        address msgSender
    ) private pure returns (bool result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean.
            msgSender := and(msgSender, _BITMASK_ADDRESS)
            // `msgSender == owner || msgSender == approvedAddress`.
            result := or(eq(msgSender, owner), eq(msgSender, approvedAddress))
        }
    }

    /**
     * @dev Returns the storage slot and value for the approved address of `tokenId`.
     */
    function _getApprovedSlotAndAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId];
        // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`.
        assembly {
            approvedAddressSlot := tokenApproval.slot
            approvedAddress := sload(approvedAddressSlot)
        }
    }

    // =============================================================
    //                      TRANSFER OPERATIONS
    // =============================================================

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token
     * by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    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);

        // The nested ifs save around 20+ gas over a compound boolean condition.
        if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
            if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();

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

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256.
        unchecked {
            // We can directly increment and decrement the balances.
            --_packedAddressData[from]; // Updates: `balance -= 1`.
            ++_packedAddressData[to]; // Updates: `balance += 1`.

            // Updates:
            // - `address` to the next owner.
            // - `startTimestamp` to the timestamp of transfering.
            // - `burned` to `false`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                to,
                _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked)
            );

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

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

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token
     * by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement
     * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    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();
            }
    }

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

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

    /**
     * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * `from` - Previous owner of the given token ID.
     * `to` - Target address that will receive the token.
     * `tokenId` - Token ID to be transferred.
     * `_data` - Optional data to send along with the call.
     *
     * Returns whether the call correctly returned the expected magic value.
     */
    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))
                }
            }
        }
    }

    // =============================================================
    //                        MINT OPERATIONS
    // =============================================================

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _mint(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // `balance` and `numberMinted` have a maximum limit of 2**64.
        // `tokenId` has a maximum limit of 2**256.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            uint256 toMasked;
            uint256 end = startTokenId + quantity;

            // Use assembly to loop and emit the `Transfer` event for gas savings.
            // The duplicated `log4` removes an extra check and reduces stack juggling.
            // The assembly, together with the surrounding Solidity code, have been
            // delicately arranged to nudge the compiler into producing optimized opcodes.
            assembly {
                // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
                toMasked := and(to, _BITMASK_ADDRESS)
                // Emit the `Transfer` event.
                log4(
                    0, // Start of data (0, since no data).
                    0, // End of data (0, since no data).
                    _TRANSFER_EVENT_SIGNATURE, // Signature.
                    0, // `address(0)`.
                    toMasked, // `to`.
                    startTokenId // `tokenId`.
                )

                // The `iszero(eq(,))` check ensures that large values of `quantity`
                // that overflows uint256 will make the loop run out of gas.
                // The compiler will optimize the `iszero` away for performance.
                for {
                    let tokenId := add(startTokenId, 1)
                } iszero(eq(tokenId, end)) {
                    tokenId := add(tokenId, 1)
                } {
                    // Emit the `Transfer` event. Similar to above.
                    log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
                }
            }
            if (toMasked == 0) revert MintToZeroAddress();

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

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * This function is intended for efficient minting only during contract creation.
     *
     * It emits only one {ConsecutiveTransfer} as defined in
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309),
     * instead of a sequence of {Transfer} event(s).
     *
     * Calling this function outside of contract creation WILL make your contract
     * non-compliant with the ERC721 standard.
     * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309
     * {ConsecutiveTransfer} event is only permissible during contract creation.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {ConsecutiveTransfer} event.
     */
    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);

        // Overflows are unrealistic due to the above check for `quantity` to be below the limit.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _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);
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement
     * {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * See {_mint}.
     *
     * Emits a {Transfer} event for each mint.
     */
    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();
            }
        }
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal virtual {
        _safeMint(to, quantity, '');
    }

    // =============================================================
    //                        BURN OPERATIONS
    // =============================================================

    /**
     * @dev Equivalent to `_burn(tokenId, false)`.
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        address from = address(uint160(prevOwnershipPacked));

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

        if (approvalCheck) {
            // The nested ifs save around 20+ gas over a compound boolean condition.
            if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
                if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
        }

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

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256.
        unchecked {
            // Updates:
            // - `balance -= 1`.
            // - `numberBurned += 1`.
            //
            // We can directly decrement the balance, and increment the number burned.
            // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`.
            _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1;

            // Updates:
            // - `address` to the last owner.
            // - `startTimestamp` to the timestamp of burning.
            // - `burned` to `true`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                from,
                (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked)
            );

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

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

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

    // =============================================================
    //                     EXTRA DATA OPERATIONS
    // =============================================================

    /**
     * @dev Directly sets the extra data for the ownership data `index`.
     */
    function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual {
        uint256 packed = _packedOwnerships[index];
        if (packed == 0) revert OwnershipNotInitializedForExtraData();
        uint256 extraDataCasted;
        // Cast `extraData` with assembly to avoid redundant masking.
        assembly {
            extraDataCasted := extraData
        }
        packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA);
        _packedOwnerships[index] = packed;
    }

    /**
     * @dev Called during each token transfer to set the 24bit `extraData` field.
     * Intended to be overridden by the cosumer contract.
     *
     * `previousExtraData` - the value of `extraData` before transfer.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

    /**
     * @dev Returns the next extra data for the packed ownership data.
     * The returned result is shifted into position.
     */
    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;
    }

    // =============================================================
    //                       OTHER OPERATIONS
    // =============================================================

    /**
     * @dev Returns the message sender (defaults to `msg.sender`).
     *
     * If you are writing GSN compatible contracts, you need to override this function.
     */
    function _msgSenderERC721A() internal view virtual returns (address) {
        return msg.sender;
    }

    /**
     * @dev Converts a uint256 to its ASCII string decimal representation.
     */
    function _toString(uint256 value) internal pure virtual returns (string memory str) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit), but
            // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned.
            // We will need 1 word for the trailing zeros padding, 1 word for the length,
            // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0.
            let m := add(mload(0x40), 0xa0)
            // Update the free memory pointer to allocate.
            mstore(0x40, m)
            // Assign the `str` to the end.
            str := sub(m, 0x20)
            // Zeroize the slot after the string.
            mstore(str, 0)

            // Cache the end of the memory to calculate the length later.
            let end := str

            // We write the string from rightmost digit to leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // prettier-ignore
            for { let temp := value } 1 {} {
                str := sub(str, 1)
                // Write the character to the pointer.
                // The ASCII index of the '0' character is 48.
                mstore8(str, add(48, mod(temp, 10)))
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
                // prettier-ignore
                if iszero(temp) { break }
            }

            let length := sub(end, str)
            // Move the pointer 32 bytes leftwards to make room for the length.
            str := sub(str, 0x20)
            // Store the length.
            mstore(str, length)
        }
    }
}

File 5 of 15: ERC721ABurnable.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.2.3
// Creator: Chiru Labs

pragma solidity ^0.8.4;

import './IERC721ABurnable.sol';
import '../ERC721A.sol';

/**
 * @title ERC721ABurnable.
 *
 * @dev ERC721A token that can be irreversibly burned (destroyed).
 */
abstract contract ERC721ABurnable is ERC721A, IERC721ABurnable {
    /**
     * @dev Burns `tokenId`. See {ERC721A-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual override {
        _burn(tokenId, true);
    }
}

File 6 of 15: ERC721AQueryable.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.2.3
// Creator: Chiru Labs

pragma solidity ^0.8.4;

import './IERC721AQueryable.sol';
import '../ERC721A.sol';

/**
 * @title ERC721AQueryable.
 *
 * @dev ERC721A subclass with convenience query functions.
 */
abstract contract ERC721AQueryable is ERC721A, IERC721AQueryable {
    /**
     * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting.
     *
     * If the `tokenId` is out of bounds:
     *
     * - `addr = address(0)`
     * - `startTimestamp = 0`
     * - `burned = false`
     * - `extraData = 0`
     *
     * If the `tokenId` is burned:
     *
     * - `addr = <Address of owner before token was burned>`
     * - `startTimestamp = <Timestamp when token was burned>`
     * - `burned = true`
     * - `extraData = <Extra data when token was burned>`
     *
     * Otherwise:
     *
     * - `addr = <Address of owner>`
     * - `startTimestamp = <Timestamp of start of ownership>`
     * - `burned = false`
     * - `extraData = <Extra data at start of ownership>`
     */
    function explicitOwnershipOf(uint256 tokenId) public view virtual override returns (TokenOwnership memory) {
        TokenOwnership memory ownership;
        if (tokenId < _startTokenId() || tokenId >= _nextTokenId()) {
            return ownership;
        }
        ownership = _ownershipAt(tokenId);
        if (ownership.burned) {
            return ownership;
        }
        return _ownershipOf(tokenId);
    }

    /**
     * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order.
     * See {ERC721AQueryable-explicitOwnershipOf}
     */
    function explicitOwnershipsOf(uint256[] calldata tokenIds)
        external
        view
        virtual
        override
        returns (TokenOwnership[] memory)
    {
        unchecked {
            uint256 tokenIdsLength = tokenIds.length;
            TokenOwnership[] memory ownerships = new TokenOwnership[](tokenIdsLength);
            for (uint256 i; i != tokenIdsLength; ++i) {
                ownerships[i] = explicitOwnershipOf(tokenIds[i]);
            }
            return ownerships;
        }
    }

    /**
     * @dev Returns an array of token IDs owned by `owner`,
     * in the range [`start`, `stop`)
     * (i.e. `start <= tokenId < stop`).
     *
     * This function allows for tokens to be queried if the collection
     * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
     *
     * Requirements:
     *
     * - `start < stop`
     */
    function tokensOfOwnerIn(
        address owner,
        uint256 start,
        uint256 stop
    ) external view virtual override returns (uint256[] memory) {
        unchecked {
            if (start >= stop) revert InvalidQueryRange();
            uint256 tokenIdsIdx;
            uint256 stopLimit = _nextTokenId();
            // Set `start = max(start, _startTokenId())`.
            if (start < _startTokenId()) {
                start = _startTokenId();
            }
            // Set `stop = min(stop, stopLimit)`.
            if (stop > stopLimit) {
                stop = stopLimit;
            }
            uint256 tokenIdsMaxLength = balanceOf(owner);
            // Set `tokenIdsMaxLength = min(balanceOf(owner), stop - start)`,
            // to cater for cases where `balanceOf(owner)` is too big.
            if (start < stop) {
                uint256 rangeLength = stop - start;
                if (rangeLength < tokenIdsMaxLength) {
                    tokenIdsMaxLength = rangeLength;
                }
            } else {
                tokenIdsMaxLength = 0;
            }
            uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength);
            if (tokenIdsMaxLength == 0) {
                return tokenIds;
            }
            // We need to call `explicitOwnershipOf(start)`,
            // because the slot at `start` may not be initialized.
            TokenOwnership memory ownership = explicitOwnershipOf(start);
            address currOwnershipAddr;
            // If the starting slot exists (i.e. not burned), initialize `currOwnershipAddr`.
            // `ownership.address` will not be zero, as `start` is clamped to the valid token ID range.
            if (!ownership.burned) {
                currOwnershipAddr = ownership.addr;
            }
            for (uint256 i = start; i != stop && tokenIdsIdx != tokenIdsMaxLength; ++i) {
                ownership = _ownershipAt(i);
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    tokenIds[tokenIdsIdx++] = i;
                }
            }
            // Downsize the array to fit.
            assembly {
                mstore(tokenIds, tokenIdsIdx)
            }
            return tokenIds;
        }
    }

    /**
     * @dev Returns an array of token IDs owned by `owner`.
     *
     * This function scans the ownership mapping and is O(`totalSupply`) in complexity.
     * It is meant to be called off-chain.
     *
     * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
     * multiple smaller scans if the collection is large enough to cause
     * an out-of-gas error (10K collections should be fine).
     */
    function tokensOfOwner(address owner) external view virtual override returns (uint256[] memory) {
        unchecked {
            uint256 tokenIdsIdx;
            address currOwnershipAddr;
            uint256 tokenIdsLength = balanceOf(owner);
            uint256[] memory tokenIds = new uint256[](tokenIdsLength);
            TokenOwnership memory ownership;
            for (uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ++i) {
                ownership = _ownershipAt(i);
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    tokenIds[tokenIdsIdx++] = i;
                }
            }
            return tokenIds;
        }
    }
}

File 8 of 15: IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

File 9 of 15: IERC2981.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;

import "IERC165.sol";

/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

File 10 of 15: IERC721A.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.2.3
// Creator: Chiru Labs

pragma solidity ^0.8.4;

/**
 * @dev Interface of ERC721A.
 */
interface IERC721A {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the
     * ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();

    /**
     * The `quantity` minted with ERC2309 exceeds the safety limit.
     */
    error MintERC2309QuantityExceedsLimit();

    /**
     * The `extraData` cannot be set on an unintialized ownership slot.
     */
    error OwnershipNotInitializedForExtraData();

    // =============================================================
    //                            STRUCTS
    // =============================================================

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Stores the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
        // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}.
        uint24 extraData;
    }

    // =============================================================
    //                         TOKEN COUNTERS
    // =============================================================

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see {_totalMinted}.
     */
    function totalSupply() external view returns (uint256);

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);

    // =============================================================
    //                            IERC721
    // =============================================================

    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables
     * (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in `owner`'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`,
     * checking first that contract recipients are aware of the ERC721 protocol
     * to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move
     * this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement
     * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external payable;

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external payable;

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom}
     * whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token
     * by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external payable;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the
     * zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external payable;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom}
     * for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    // =============================================================
    //                        IERC721Metadata
    // =============================================================

    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);

    // =============================================================
    //                           IERC2309
    // =============================================================

    /**
     * @dev Emitted when tokens in `fromTokenId` to `toTokenId`
     * (inclusive) is transferred from `from` to `to`, as defined in the
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard.
     *
     * See {_mintERC2309} for more details.
     */
    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}

File 11 of 15: IERC721ABurnable.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.2.3
// Creator: Chiru Labs

pragma solidity ^0.8.4;

import '../IERC721A.sol';

/**
 * @dev Interface of ERC721ABurnable.
 */
interface IERC721ABurnable is IERC721A {
    /**
     * @dev Burns `tokenId`. See {ERC721A-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) external;
}

File 12 of 15: IERC721AQueryable.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.2.3
// Creator: Chiru Labs

pragma solidity ^0.8.4;

import '../IERC721A.sol';

/**
 * @dev Interface of ERC721AQueryable.
 */
interface IERC721AQueryable is IERC721A {
    /**
     * Invalid query range (`start` >= `stop`).
     */
    error InvalidQueryRange();

    /**
     * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting.
     *
     * If the `tokenId` is out of bounds:
     *
     * - `addr = address(0)`
     * - `startTimestamp = 0`
     * - `burned = false`
     * - `extraData = 0`
     *
     * If the `tokenId` is burned:
     *
     * - `addr = <Address of owner before token was burned>`
     * - `startTimestamp = <Timestamp when token was burned>`
     * - `burned = true`
     * - `extraData = <Extra data when token was burned>`
     *
     * Otherwise:
     *
     * - `addr = <Address of owner>`
     * - `startTimestamp = <Timestamp of start of ownership>`
     * - `burned = false`
     * - `extraData = <Extra data at start of ownership>`
     */
    function explicitOwnershipOf(uint256 tokenId) external view returns (TokenOwnership memory);

    /**
     * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order.
     * See {ERC721AQueryable-explicitOwnershipOf}
     */
    function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory);

    /**
     * @dev Returns an array of token IDs owned by `owner`,
     * in the range [`start`, `stop`)
     * (i.e. `start <= tokenId < stop`).
     *
     * This function allows for tokens to be queried if the collection
     * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
     *
     * Requirements:
     *
     * - `start < stop`
     */
    function tokensOfOwnerIn(
        address owner,
        uint256 start,
        uint256 stop
    ) external view returns (uint256[] memory);

    /**
     * @dev Returns an array of token IDs owned by `owner`.
     *
     * This function scans the ownership mapping and is O(`totalSupply`) in complexity.
     * It is meant to be called off-chain.
     *
     * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
     * multiple smaller scans if the collection is large enough to cause
     * an out-of-gas error (10K collections should be fine).
     */
    function tokensOfOwner(address owner) external view returns (uint256[] memory);
}

File 13 of 15: MerkleProof.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Tree proofs.
 *
 * The tree and the proofs can be generated using our
 * https://github.com/OpenZeppelin/merkle-tree[JavaScript library].
 * You will find a quickstart guide in the readme.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 * OpenZeppelin's JavaScript library generates merkle trees that are safe
 * against this attack out of the box.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Calldata version of {verify}
     *
     * _Available since v4.7._
     */
    function verifyCalldata(
        bytes32[] calldata proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Calldata version of {processProof}
     *
     * _Available since v4.7._
     */
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction
     * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another
     * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false
     * respectively.
     *
     * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree
     * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the
     * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Calldata version of {processMultiProof}.
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

File 14 of 15: OperatorFilterer.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

/// @notice Optimized and flexible operator filterer to abide to OpenSea's
/// mandatory on-chain royalty enforcement in order for new collections to
/// receive royalties.
/// For more information, see:
/// See: https://github.com/ProjectOpenSea/operator-filter-registry
abstract contract OperatorFilterer {
    /// @dev The default OpenSea operator blocklist subscription.
    address internal constant _DEFAULT_SUBSCRIPTION = 0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6;

    /// @dev The OpenSea operator filter registry.
    address internal constant _OPERATOR_FILTER_REGISTRY = 0x000000000000AAeB6D7670E522A718067333cd4E;

    /// @dev Registers the current contract to OpenSea's operator filter,
    /// and subscribe to the default OpenSea operator blocklist.
    /// Note: Will not revert nor update existing settings for repeated registration.
    function _registerForOperatorFiltering() internal virtual {
        _registerForOperatorFiltering(_DEFAULT_SUBSCRIPTION, true);
    }

    /// @dev Registers the current contract to OpenSea's operator filter.
    /// Note: Will not revert nor update existing settings for repeated registration.
    function _registerForOperatorFiltering(address subscriptionOrRegistrantToCopy, bool subscribe)
        internal
        virtual
    {
        /// @solidity memory-safe-assembly
        assembly {
            let functionSelector := 0x7d3e3dbe // `registerAndSubscribe(address,address)`.

            // Clean the upper 96 bits of `subscriptionOrRegistrantToCopy` in case they are dirty.
            subscriptionOrRegistrantToCopy := shr(96, shl(96, subscriptionOrRegistrantToCopy))

            for {} iszero(subscribe) {} {
                if iszero(subscriptionOrRegistrantToCopy) {
                    functionSelector := 0x4420e486 // `register(address)`.
                    break
                }
                functionSelector := 0xa0af2903 // `registerAndCopyEntries(address,address)`.
                break
            }
            // Store the function selector.
            mstore(0x00, shl(224, functionSelector))
            // Store the `address(this)`.
            mstore(0x04, address())
            // Store the `subscriptionOrRegistrantToCopy`.
            mstore(0x24, subscriptionOrRegistrantToCopy)
            // Register into the registry.
            if iszero(call(gas(), _OPERATOR_FILTER_REGISTRY, 0, 0x00, 0x44, 0x00, 0x04)) {
                // If the function selector has not been overwritten,
                // it is an out-of-gas error.
                if eq(shr(224, mload(0x00)), functionSelector) {
                    // To prevent gas under-estimation.
                    revert(0, 0)
                }
            }
            // Restore the part of the free memory pointer that was overwritten,
            // which is guaranteed to be zero, because of Solidity's memory size limits.
            mstore(0x24, 0)
        }
    }

    /// @dev Modifier to guard a function and revert if the caller is a blocked operator.
    modifier onlyAllowedOperator(address from) virtual {
        if (from != msg.sender) {
            if (!_isPriorityOperator(msg.sender)) {
                if (_operatorFilteringEnabled()) _revertIfBlocked(msg.sender);
            }
        }
        _;
    }

    /// @dev Modifier to guard a function from approving a blocked operator..
    modifier onlyAllowedOperatorApproval(address operator) virtual {
        if (!_isPriorityOperator(operator)) {
            if (_operatorFilteringEnabled()) _revertIfBlocked(operator);
        }
        _;
    }

    /// @dev Helper function that reverts if the `operator` is blocked by the registry.
    function _revertIfBlocked(address operator) private view {
        /// @solidity memory-safe-assembly
        assembly {
            // Store the function selector of `isOperatorAllowed(address,address)`,
            // shifted left by 6 bytes, which is enough for 8tb of memory.
            // We waste 6-3 = 3 bytes to save on 6 runtime gas (PUSH1 0x224 SHL).
            mstore(0x00, 0xc6171134001122334455)
            // Store the `address(this)`.
            mstore(0x1a, address())
            // Store the `operator`.
            mstore(0x3a, operator)

            // `isOperatorAllowed` always returns true if it does not revert.
            if iszero(staticcall(gas(), _OPERATOR_FILTER_REGISTRY, 0x16, 0x44, 0x00, 0x00)) {
                // Bubble up the revert if the staticcall reverts.
                returndatacopy(0x00, 0x00, returndatasize())
                revert(0x00, returndatasize())
            }

            // We'll skip checking if `from` is inside the blacklist.
            // Even though that can block transferring out of wrapper contracts,
            // we don't want tokens to be stuck.

            // Restore the part of the free memory pointer that was overwritten,
            // which is guaranteed to be zero, if less than 8tb of memory is used.
            mstore(0x3a, 0)
        }
    }

    /// @dev For deriving contracts to override, so that operator filtering
    /// can be turned on / off.
    /// Returns true by default.
    function _operatorFilteringEnabled() internal view virtual returns (bool) {
        return true;
    }

    /// @dev For deriving contracts to override, so that preferred marketplaces can
    /// skip operator filtering, helping users save gas.
    /// Returns false for all inputs by default.
    function _isPriorityOperator(address) internal view virtual returns (bool) {
        return false;
    }
}

File 15 of 15: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

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

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"deployer","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MaxPerTransactionReached","type":"error"},{"inputs":[],"name":"MaxPerWalletReached","type":"error"},{"inputs":[],"name":"MaxSupplyReached","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"MintingPaused","type":"error"},{"inputs":[],"name":"NoWL","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"},{"inputs":[],"name":"WithdrawalFailed","type":"error"},{"inputs":[],"name":"WrongEtherAmount","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":"MAX_PER_TRANSACTION_PUBLIC","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_WALLET_WL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","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":[{"internalType":"address","name":"","type":"address"}],"name":"NFTsperWalletWL","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WL_MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","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":[{"internalType":"uint16","name":"quantity","type":"uint16"}],"name":"collectReserves","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintPrice","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":"merkleRootWL","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"quantity","type":"uint8"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operatorFilteringEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"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":[],"name":"sellingStep","outputs":[{"internalType":"enum FlameHeads.Step","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseUri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"setDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMintPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setOperatorFilteringEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"step","type":"uint8"}],"name":"setStep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newWLMaxSupply","type":"uint256"}],"name":"setWLMaxSupply","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":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"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":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"wlmint","outputs":[],"stateMutability":"payable","type":"function"}]

6080604052661550f7dca70000600c55610457600d556001600e60006101000a81548160ff02191690831515021790555060405180602001604052806000815250601190816200005091906200076a565b503480156200005e57600080fd5b506040516200539b3803806200539b8339818101604052810190620000849190620008bb565b6040518060400160405280600a81526020017f466c616d654865616473000000000000000000000000000000000000000000008152506040518060400160405280600281526020017f46480000000000000000000000000000000000000000000000000000000000008152506200011062000104620001cb60201b60201c565b620001d360201b60201c565b81600390816200012191906200076a565b5080600490816200013391906200076a565b50620001446200029760201b60201c565b600181905550505060006002811115620001635762000162620008ed565b5b600b60006101000a81548160ff021916908360028111156200018a5762000189620008ed565b5b0217905550620001a081620001d360201b60201c565b620001b0620002a060201b60201c565b620001c48161012c620002c960201b60201c565b5062000a37565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006001905090565b620002c7733cc6cdda760b79bafa08df41ecfa224f810dceb660016200046c60201b60201c565b565b620002d9620004e660201b60201c565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff1611156200033a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200033190620009a3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620003ac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003a39062000a15565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600960008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b637d3e3dbe8260601b60601c9250816200049b57826200049357634420e48690506200049b565b63a0af290390505b8060e01b60005230600452826024526004600060446000806daaeb6d7670e522a718067333cd4e5af1620004dc578060005160e01c03620004db57600080fd5b5b6000602452505050565b6000612710905090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200057257607f821691505b6020821081036200058857620005876200052a565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620005f27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620005b3565b620005fe8683620005b3565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200064b620006456200063f8462000616565b62000620565b62000616565b9050919050565b6000819050919050565b62000667836200062a565b6200067f620006768262000652565b848454620005c0565b825550505050565b600090565b6200069662000687565b620006a38184846200065c565b505050565b5b81811015620006cb57620006bf6000826200068c565b600181019050620006a9565b5050565b601f8211156200071a57620006e4816200058e565b620006ef84620005a3565b81016020851015620006ff578190505b620007176200070e85620005a3565b830182620006a8565b50505b505050565b600082821c905092915050565b60006200073f600019846008026200071f565b1980831691505092915050565b60006200075a83836200072c565b9150826002028217905092915050565b6200077582620004f0565b67ffffffffffffffff811115620007915762000790620004fb565b5b6200079d825462000559565b620007aa828285620006cf565b600060209050601f831160018114620007e25760008415620007cd578287015190505b620007d985826200074c565b86555062000849565b601f198416620007f2866200058e565b60005b828110156200081c57848901518255600182019150602085019450602081019050620007f5565b868310156200083c578489015162000838601f8916826200072c565b8355505b6001600288020188555050505b505050505050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620008838262000856565b9050919050565b620008958162000876565b8114620008a157600080fd5b50565b600081519050620008b5816200088a565b92915050565b600060208284031215620008d457620008d362000851565b5b6000620008e484828501620008a4565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600082825260208201905092915050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b60006200098b602a836200091c565b915062000998826200092d565b604082019050919050565b60006020820190508181036000830152620009be816200097c565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b6000620009fd6019836200091c565b915062000a0a82620009c5565b602082019050919050565b6000602082019050818103600083015262000a3081620009ee565b9050919050565b6149548062000a476000396000f3fe6080604052600436106102675760003560e01c80637cb6475911610144578063b88d4fde116100b6578063d6492d811161007a578063d6492d8114610903578063e985e9c51461092e578063f2fde38b1461096b578063f4a0a52814610994578063f8b89dfb146109bd578063fb796e6c146109e657610267565b8063b88d4fde14610817578063c002d23d14610833578063c23dc68f1461085e578063c87b56dd1461089b578063cbccefb2146108d857610267565b806399a2557a1161010857806399a2557a14610718578063a22cb46514610755578063a7f93ebd1461077e578063ae7a9b0c146107a9578063b53cff0f146107c5578063b7c0b8e8146107ee57610267565b80637cb6475914610631578063828122ab1461065a5780638462151c146106855780638da5cb5b146106c257806395d89b41146106ed57610267565b80633ccfd60b116101dd5780635ade26c6116101a15780635ade26c61461051c5780635bbb2177146105475780636352211e146105845780636ecd2306146105c157806370a08231146105dd578063715018a61461061a57610267565b80633ccfd60b1461046c57806342842e0e1461048357806342966c681461049f57806350c96509146104c857806355f804b3146104f357610267565b806318160ddd1161022f57806318160ddd146103565780631ac08c1f146103815780631b1f4019146103be57806323b872dd146103e75780632a55205a1461040357806332cb6b0c1461044157610267565b806301ffc9a71461026c57806304634d8d146102a957806306fdde03146102d2578063081812fc146102fd578063095ea7b31461033a575b600080fd5b34801561027857600080fd5b50610293600480360381019061028e91906132d1565b610a11565b6040516102a09190613319565b60405180910390f35b3480156102b557600080fd5b506102d060048036038101906102cb91906133d6565b610a33565b005b3480156102de57600080fd5b506102e7610a49565b6040516102f491906134a6565b60405180910390f35b34801561030957600080fd5b50610324600480360381019061031f91906134fe565b610adb565b604051610331919061353a565b60405180910390f35b610354600480360381019061034f9190613555565b610b5a565b005b34801561036257600080fd5b5061036b610b8f565b60405161037891906135a4565b60405180910390f35b34801561038d57600080fd5b506103a860048036038101906103a391906135bf565b610ba6565b6040516103b59190613608565b60405180910390f35b3480156103ca57600080fd5b506103e560048036038101906103e0919061365d565b610bc6565b005b61040160048036038101906103fc919061368a565b610c31565b005b34801561040f57600080fd5b5061042a600480360381019061042591906136dd565b610c9c565b60405161043892919061371d565b60405180910390f35b34801561044d57600080fd5b50610456610e86565b60405161046391906135a4565b60405180910390f35b34801561047857600080fd5b50610481610e8c565b005b61049d6004803603810190610498919061368a565b610f41565b005b3480156104ab57600080fd5b506104c660048036038101906104c191906134fe565b610fac565b005b3480156104d457600080fd5b506104dd610fba565b6040516104ea91906135a4565b60405180910390f35b3480156104ff57600080fd5b5061051a600480360381019061051591906137ab565b610fc0565b005b34801561052857600080fd5b50610531610fde565b60405161053e91906135a4565b60405180910390f35b34801561055357600080fd5b5061056e6004803603810190610569919061384e565b610fe3565b60405161057b91906139fe565b60405180910390f35b34801561059057600080fd5b506105ab60048036038101906105a691906134fe565b6110a6565b6040516105b8919061353a565b60405180910390f35b6105db60048036038101906105d69190613a4c565b6110b8565b005b3480156105e957600080fd5b5061060460048036038101906105ff91906135bf565b61122c565b60405161061191906135a4565b60405180910390f35b34801561062657600080fd5b5061062f6112e4565b005b34801561063d57600080fd5b5061065860048036038101906106539190613aaf565b6112f8565b005b34801561066657600080fd5b5061066f61130a565b60405161067c91906135a4565b60405180910390f35b34801561069157600080fd5b506106ac60048036038101906106a791906135bf565b61130f565b6040516106b99190613b9a565b60405180910390f35b3480156106ce57600080fd5b506106d7611452565b6040516106e4919061353a565b60405180910390f35b3480156106f957600080fd5b5061070261147b565b60405161070f91906134a6565b60405180910390f35b34801561072457600080fd5b5061073f600480360381019061073a9190613bbc565b61150d565b60405161074c9190613b9a565b60405180910390f35b34801561076157600080fd5b5061077c60048036038101906107779190613c3b565b611719565b005b34801561078a57600080fd5b5061079361174e565b6040516107a091906135a4565b60405180910390f35b6107c360048036038101906107be9190613cd1565b611758565b005b3480156107d157600080fd5b506107ec60048036038101906107e791906134fe565b61197a565b005b3480156107fa57600080fd5b5061081560048036038101906108109190613d1e565b61198c565b005b610831600480360381019061082c9190613e7b565b6119b1565b005b34801561083f57600080fd5b50610848611a1e565b60405161085591906135a4565b60405180910390f35b34801561086a57600080fd5b50610885600480360381019061088091906134fe565b611a24565b6040516108929190613f53565b60405180910390f35b3480156108a757600080fd5b506108c260048036038101906108bd91906134fe565b611a8e565b6040516108cf91906134a6565b60405180910390f35b3480156108e457600080fd5b506108ed611b2c565b6040516108fa9190613fe5565b60405180910390f35b34801561090f57600080fd5b50610918611b3f565b604051610925919061400f565b60405180910390f35b34801561093a57600080fd5b506109556004803603810190610950919061402a565b611b45565b6040516109629190613319565b60405180910390f35b34801561097757600080fd5b50610992600480360381019061098d91906135bf565b611bd9565b005b3480156109a057600080fd5b506109bb60048036038101906109b691906134fe565b611c5c565b005b3480156109c957600080fd5b506109e460048036038101906109df9190613a4c565b611c6e565b005b3480156109f257600080fd5b506109fb611cb8565b604051610a089190613319565b60405180910390f35b6000610a1c82611ccb565b80610a2c5750610a2b82611d5d565b5b9050919050565b610a3b611dd7565b610a458282611e55565b5050565b606060038054610a5890614099565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8490614099565b8015610ad15780601f10610aa657610100808354040283529160200191610ad1565b820191906000526020600020905b815481529060010190602001808311610ab457829003601f168201915b5050505050905090565b6000610ae682611fea565b610b1c576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81610b6481612049565b610b8057610b70612095565b15610b7f57610b7e816120ac565b5b5b610b8a83836120f0565b505050565b6000610b99612234565b6002546001540303905090565b60106020528060005260406000206000915054906101000a900460ff1681565b610bce611dd7565b611a0a8161ffff16610bde61223d565b610be891906140f9565b1115610c20576040517fd05cb60900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c2e338261ffff16612250565b50565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c8b57610c6e33612049565b610c8a57610c7a612095565b15610c8957610c88336120ac565b5b5b5b610c9684848461240c565b50505050565b6000806000600a60008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610e315760096040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610e3b61272e565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610e67919061412d565b610e71919061419e565b90508160000151819350935050509250929050565b611a0a81565b610e94611dd7565b6000610e9e611452565b73ffffffffffffffffffffffffffffffffffffffff1647604051610ec190614200565b60006040518083038185875af1925050503d8060008114610efe576040519150601f19603f3d011682016040523d82523d6000602084013e610f03565b606091505b5050905080610f3e576040517f27fcd9d100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610f9b57610f7e33612049565b610f9a57610f8a612095565b15610f9957610f98336120ac565b5b5b5b610fa6848484612738565b50505050565b610fb7816001612758565b50565b600d5481565b610fc8611dd7565b818160119182610fd99291906143cc565b505050565b600681565b6060600083839050905060008167ffffffffffffffff81111561100957611008613d50565b5b60405190808252806020026020018201604052801561104257816020015b61102f613216565b8152602001906001900390816110275790505b50905060005b82811461109a576110718686838181106110655761106461449c565b5b90506020020135611a24565b8282815181106110845761108361449c565b5b6020026020010181905250806001019050611048565b50809250505092915050565b60006110b1826129aa565b9050919050565b6002808111156110cb576110ca613f6e565b5b60028111156110dd576110dc613f6e565b5b600b60009054906101000a900460ff1660028111156110ff576110fe613f6e565b5b14611136576040517feb56075600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600d54611a0a61114691906144cb565b8160ff1661115261223d565b61115c91906140f9565b1115611194576040517fd05cb60900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60068160ff1611156111d2576040517f4b231f9500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600c548160ff166111e3919061412d565b34101561121c576040517f31fc877f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611229338260ff16612250565b50565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611293576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6112ec611dd7565b6112f66000612a76565b565b611300611dd7565b80600f8190555050565b600181565b6060600080600061131f8561122c565b905060008167ffffffffffffffff81111561133d5761133c613d50565b5b60405190808252806020026020018201604052801561136b5781602001602082028036833780820191505090505b509050611376613216565b6000611380612234565b90505b8386146114445761139381612b3a565b9150816040015161143957600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146113de57816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611438578083878060010198508151811061142b5761142a61449c565b5b6020026020010181815250505b5b806001019050611383565b508195505050505050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461148a90614099565b80601f01602080910402602001604051908101604052809291908181526020018280546114b690614099565b80156115035780601f106114d857610100808354040283529160200191611503565b820191906000526020600020905b8154815290600101906020018083116114e657829003601f168201915b5050505050905090565b6060818310611548576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611553612b65565b905061155d612234565b85101561156f5761156c612234565b94505b8084111561157b578093505b60006115868761122c565b9050848610156115a95760008686039050818110156115a3578091505b506115ae565b600090505b60008167ffffffffffffffff8111156115ca576115c9613d50565b5b6040519080825280602002602001820160405280156115f85781602001602082028036833780820191505090505b5090506000820361160f5780945050505050611712565b600061161a88611a24565b90506000816040015161162f57816000015190505b60008990505b8881141580156116455750848714155b156117045761165381612b3a565b925082604001516116f957600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff161461169e57826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036116f857808488806001019950815181106116eb576116ea61449c565b5b6020026020010181815250505b5b806001019050611635565b508583528296505050505050505b9392505050565b8161172381612049565b61173f5761172f612095565b1561173e5761173d816120ac565b5b5b6117498383612b6f565b505050565b6000600c54905090565b6001600281111561176c5761176b613f6e565b5b600281111561177e5761177d613f6e565b5b600b60009054906101000a900460ff1660028111156117a05761179f613f6e565b5b146117d7576040517feb56075600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600115156117e6338484612c7a565b15151461181f576040517f9114b24300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611a0a600161182c61223d565b61183691906140f9565b111561186e576040517fd05cb60900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff16036118f7576040517fd330f98500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900460ff1661195391906144ff565b92506101000a81548160ff021916908360ff160217905550611976336001612250565b5050565b611982611dd7565b80600d8190555050565b611994611dd7565b80600e60006101000a81548160ff02191690831515021790555050565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611a0b576119ee33612049565b611a0a576119fa612095565b15611a0957611a08336120ac565b5b5b5b611a1785858585612cf9565b5050505050565b600c5481565b611a2c613216565b611a34613216565b611a3c612234565b831080611a505750611a4c612b65565b8310155b15611a5e5780915050611a89565b611a6783612b3a565b9050806040015115611a7c5780915050611a89565b611a8583612d6c565b9150505b919050565b6060611a9982611fea565b611acf576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611ad9612d8c565b90506000815103611af95760405180602001604052806000815250611b24565b80611b0384612e1e565b604051602001611b14929190614570565b6040516020818303038152906040525b915050919050565b600b60009054906101000a900460ff1681565b600f5481565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611be1611dd7565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611c50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4790614606565b60405180910390fd5b611c5981612a76565b50565b611c64611dd7565b80600c8190555050565b611c76611dd7565b8060ff166002811115611c8c57611c8b613f6e565b5b600b60006101000a81548160ff02191690836002811115611cb057611caf613f6e565b5b021790555050565b600e60009054906101000a900460ff1681565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611d2657506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611d565750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611dd05750611dcf82611ccb565b5b9050919050565b611ddf612e6e565b73ffffffffffffffffffffffffffffffffffffffff16611dfd611452565b73ffffffffffffffffffffffffffffffffffffffff1614611e53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4a90614672565b60405180910390fd5b565b611e5d61272e565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115611ebb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb290614704565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2190614770565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600960008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b600081611ff5612234565b11158015612004575060015482105b8015612042575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b6000731e0049783f008a0085193e00003d00cd54003c7173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b6000600e60009054906101000a900460ff16905090565b69c617113400112233445560005230601a5280603a52600080604460166daaeb6d7670e522a718067333cd4e5afa6120e8573d6000803e3d6000fd5b6000603a5250565b60006120fb826110a6565b90508073ffffffffffffffffffffffffffffffffffffffff1661211c612e76565b73ffffffffffffffffffffffffffffffffffffffff161461217f5761214881612143612e76565b611b45565b61217e576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b6000612247612234565b60015403905090565b6000600154905060008203612291576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61229e6000848385612e7e565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612315836123066000866000612e84565b61230f85612eac565b17612ebc565b6005600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b8181146123b657808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460018101905061237b565b50600082036123f1576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060018190555050506124076000848385612ee7565b505050565b6000612417826129aa565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461247e576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061248a84612eed565b915091506124a0818761249b612e76565b612f14565b6124ec576124b5866124b0612e76565b611b45565b6124eb576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612552576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61255f8686866001612e7e565b801561256a57600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061263885612614888887612e84565b7c020000000000000000000000000000000000000000000000000000000017612ebc565b600560008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036126be57600060018501905060006005600083815260200190815260200160002054036126bc5760015481146126bb578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46127268686866001612ee7565b505050505050565b6000612710905090565b612753838383604051806020016040528060008152506119b1565b505050565b6000612763836129aa565b9050600081905060008061277686612eed565b9150915084156127df57612792818461278d612e76565b612f14565b6127de576127a7836127a2612e76565b611b45565b6127dd576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b6127ed836000886001612e7e565b80156127f857600082555b600160806001901b03600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506128a08361285d85600088612e84565b7c02000000000000000000000000000000000000000000000000000000007c01000000000000000000000000000000000000000000000000000000001717612ebc565b600560008881526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008516036129265760006001870190506000600560008381526020019081526020016000205403612924576001548114612923578460056000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612990836000886001612ee7565b600260008154809291906001019190505550505050505050565b600080829050806129b9612234565b11612a3f57600154811015612a3e5760006005600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612a3c575b60008103612a32576005600083600190039350838152602001908152602001600020549050612a08565b8092505050612a71565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612b42613216565b612b5e6005600084815260200190815260200160002054612f58565b9050919050565b6000600154905090565b8060086000612b7c612e76565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612c29612e76565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612c6e9190613319565b60405180910390a35050565b6000612cf0838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600f5486604051602001612cd591906147d8565b6040516020818303038152906040528051906020012061300e565b90509392505050565b612d04848484610c31565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612d6657612d2f84848484613025565b612d65576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b612d74613216565b612d85612d80836129aa565b612f58565b9050919050565b606060118054612d9b90614099565b80601f0160208091040260200160405190810160405280929190818152602001828054612dc790614099565b8015612e145780601f10612de957610100808354040283529160200191612e14565b820191906000526020600020905b815481529060010190602001808311612df757829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b600115612e5957600184039350600a81066030018453600a8104905080612e37575b50828103602084039350808452505050919050565b600033905090565b600033905090565b50505050565b60008060e883901c905060e8612e9b868684613175565b62ffffff16901b9150509392505050565b60006001821460e11b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60008060006007600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b612f60613216565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b60008261301b858461317e565b1490509392505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261304b612e76565b8786866040518563ffffffff1660e01b815260040161306d9493929190614848565b6020604051808303816000875af19250505080156130a957506040513d601f19601f820116820180604052508101906130a691906148a9565b60015b613122573d80600081146130d9576040519150601f19603f3d011682016040523d82523d6000602084013e6130de565b606091505b50600081510361311a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60009392505050565b60008082905060005b84518110156131c9576131b4828683815181106131a7576131a661449c565b5b60200260200101516131d4565b915080806131c1906148d6565b915050613187565b508091505092915050565b60008183106131ec576131e782846131ff565b6131f7565b6131f683836131ff565b5b905092915050565b600082600052816020526040600020905092915050565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6132ae81613279565b81146132b957600080fd5b50565b6000813590506132cb816132a5565b92915050565b6000602082840312156132e7576132e661326f565b5b60006132f5848285016132bc565b91505092915050565b60008115159050919050565b613313816132fe565b82525050565b600060208201905061332e600083018461330a565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061335f82613334565b9050919050565b61336f81613354565b811461337a57600080fd5b50565b60008135905061338c81613366565b92915050565b60006bffffffffffffffffffffffff82169050919050565b6133b381613392565b81146133be57600080fd5b50565b6000813590506133d0816133aa565b92915050565b600080604083850312156133ed576133ec61326f565b5b60006133fb8582860161337d565b925050602061340c858286016133c1565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613450578082015181840152602081019050613435565b60008484015250505050565b6000601f19601f8301169050919050565b600061347882613416565b6134828185613421565b9350613492818560208601613432565b61349b8161345c565b840191505092915050565b600060208201905081810360008301526134c0818461346d565b905092915050565b6000819050919050565b6134db816134c8565b81146134e657600080fd5b50565b6000813590506134f8816134d2565b92915050565b6000602082840312156135145761351361326f565b5b6000613522848285016134e9565b91505092915050565b61353481613354565b82525050565b600060208201905061354f600083018461352b565b92915050565b6000806040838503121561356c5761356b61326f565b5b600061357a8582860161337d565b925050602061358b858286016134e9565b9150509250929050565b61359e816134c8565b82525050565b60006020820190506135b96000830184613595565b92915050565b6000602082840312156135d5576135d461326f565b5b60006135e38482850161337d565b91505092915050565b600060ff82169050919050565b613602816135ec565b82525050565b600060208201905061361d60008301846135f9565b92915050565b600061ffff82169050919050565b61363a81613623565b811461364557600080fd5b50565b60008135905061365781613631565b92915050565b6000602082840312156136735761367261326f565b5b600061368184828501613648565b91505092915050565b6000806000606084860312156136a3576136a261326f565b5b60006136b18682870161337d565b93505060206136c28682870161337d565b92505060406136d3868287016134e9565b9150509250925092565b600080604083850312156136f4576136f361326f565b5b6000613702858286016134e9565b9250506020613713858286016134e9565b9150509250929050565b6000604082019050613732600083018561352b565b61373f6020830184613595565b9392505050565b600080fd5b600080fd5b600080fd5b60008083601f84011261376b5761376a613746565b5b8235905067ffffffffffffffff8111156137885761378761374b565b5b6020830191508360018202830111156137a4576137a3613750565b5b9250929050565b600080602083850312156137c2576137c161326f565b5b600083013567ffffffffffffffff8111156137e0576137df613274565b5b6137ec85828601613755565b92509250509250929050565b60008083601f84011261380e5761380d613746565b5b8235905067ffffffffffffffff81111561382b5761382a61374b565b5b60208301915083602082028301111561384757613846613750565b5b9250929050565b600080602083850312156138655761386461326f565b5b600083013567ffffffffffffffff81111561388357613882613274565b5b61388f858286016137f8565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6138d081613354565b82525050565b600067ffffffffffffffff82169050919050565b6138f3816138d6565b82525050565b613902816132fe565b82525050565b600062ffffff82169050919050565b61392081613908565b82525050565b60808201600082015161393c60008501826138c7565b50602082015161394f60208501826138ea565b50604082015161396260408501826138f9565b5060608201516139756060850182613917565b50505050565b60006139878383613926565b60808301905092915050565b6000602082019050919050565b60006139ab8261389b565b6139b581856138a6565b93506139c0836138b7565b8060005b838110156139f15781516139d8888261397b565b97506139e383613993565b9250506001810190506139c4565b5085935050505092915050565b60006020820190508181036000830152613a1881846139a0565b905092915050565b613a29816135ec565b8114613a3457600080fd5b50565b600081359050613a4681613a20565b92915050565b600060208284031215613a6257613a6161326f565b5b6000613a7084828501613a37565b91505092915050565b6000819050919050565b613a8c81613a79565b8114613a9757600080fd5b50565b600081359050613aa981613a83565b92915050565b600060208284031215613ac557613ac461326f565b5b6000613ad384828501613a9a565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613b11816134c8565b82525050565b6000613b238383613b08565b60208301905092915050565b6000602082019050919050565b6000613b4782613adc565b613b518185613ae7565b9350613b5c83613af8565b8060005b83811015613b8d578151613b748882613b17565b9750613b7f83613b2f565b925050600181019050613b60565b5085935050505092915050565b60006020820190508181036000830152613bb48184613b3c565b905092915050565b600080600060608486031215613bd557613bd461326f565b5b6000613be38682870161337d565b9350506020613bf4868287016134e9565b9250506040613c05868287016134e9565b9150509250925092565b613c18816132fe565b8114613c2357600080fd5b50565b600081359050613c3581613c0f565b92915050565b60008060408385031215613c5257613c5161326f565b5b6000613c608582860161337d565b9250506020613c7185828601613c26565b9150509250929050565b60008083601f840112613c9157613c90613746565b5b8235905067ffffffffffffffff811115613cae57613cad61374b565b5b602083019150836020820283011115613cca57613cc9613750565b5b9250929050565b60008060208385031215613ce857613ce761326f565b5b600083013567ffffffffffffffff811115613d0657613d05613274565b5b613d1285828601613c7b565b92509250509250929050565b600060208284031215613d3457613d3361326f565b5b6000613d4284828501613c26565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613d888261345c565b810181811067ffffffffffffffff82111715613da757613da6613d50565b5b80604052505050565b6000613dba613265565b9050613dc68282613d7f565b919050565b600067ffffffffffffffff821115613de657613de5613d50565b5b613def8261345c565b9050602081019050919050565b82818337600083830152505050565b6000613e1e613e1984613dcb565b613db0565b905082815260208101848484011115613e3a57613e39613d4b565b5b613e45848285613dfc565b509392505050565b600082601f830112613e6257613e61613746565b5b8135613e72848260208601613e0b565b91505092915050565b60008060008060808587031215613e9557613e9461326f565b5b6000613ea38782880161337d565b9450506020613eb48782880161337d565b9350506040613ec5878288016134e9565b925050606085013567ffffffffffffffff811115613ee657613ee5613274565b5b613ef287828801613e4d565b91505092959194509250565b608082016000820151613f1460008501826138c7565b506020820151613f2760208501826138ea565b506040820151613f3a60408501826138f9565b506060820151613f4d6060850182613917565b50505050565b6000608082019050613f686000830184613efe565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60038110613fae57613fad613f6e565b5b50565b6000819050613fbf82613f9d565b919050565b6000613fcf82613fb1565b9050919050565b613fdf81613fc4565b82525050565b6000602082019050613ffa6000830184613fd6565b92915050565b61400981613a79565b82525050565b60006020820190506140246000830184614000565b92915050565b600080604083850312156140415761404061326f565b5b600061404f8582860161337d565b92505060206140608582860161337d565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806140b157607f821691505b6020821081036140c4576140c361406a565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614104826134c8565b915061410f836134c8565b9250828201905080821115614127576141266140ca565b5b92915050565b6000614138826134c8565b9150614143836134c8565b9250828202614151816134c8565b91508282048414831517614168576141676140ca565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006141a9826134c8565b91506141b4836134c8565b9250826141c4576141c361416f565b5b828204905092915050565b600081905092915050565b50565b60006141ea6000836141cf565b91506141f5826141da565b600082019050919050565b600061420b826141dd565b9150819050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026142827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614245565b61428c8683614245565b95508019841693508086168417925050509392505050565b6000819050919050565b60006142c96142c46142bf846134c8565b6142a4565b6134c8565b9050919050565b6000819050919050565b6142e3836142ae565b6142f76142ef826142d0565b848454614252565b825550505050565b600090565b61430c6142ff565b6143178184846142da565b505050565b5b8181101561433b57614330600082614304565b60018101905061431d565b5050565b601f8211156143805761435181614220565b61435a84614235565b81016020851015614369578190505b61437d61437585614235565b83018261431c565b50505b505050565b600082821c905092915050565b60006143a360001984600802614385565b1980831691505092915050565b60006143bc8383614392565b9150826002028217905092915050565b6143d68383614215565b67ffffffffffffffff8111156143ef576143ee613d50565b5b6143f98254614099565b61440482828561433f565b6000601f8311600181146144335760008415614421578287013590505b61442b85826143b0565b865550614493565b601f19841661444186614220565b60005b8281101561446957848901358255600182019150602085019450602081019050614444565b868310156144865784890135614482601f891682614392565b8355505b6001600288020188555050505b50505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006144d6826134c8565b91506144e1836134c8565b92508282039050818111156144f9576144f86140ca565b5b92915050565b600061450a826135ec565b9150614515836135ec565b9250828201905060ff81111561452e5761452d6140ca565b5b92915050565b600081905092915050565b600061454a82613416565b6145548185614534565b9350614564818560208601613432565b80840191505092915050565b600061457c828561453f565b9150614588828461453f565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006145f0602683613421565b91506145fb82614594565b604082019050919050565b6000602082019050818103600083015261461f816145e3565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061465c602083613421565b915061466782614626565b602082019050919050565b6000602082019050818103600083015261468b8161464f565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b60006146ee602a83613421565b91506146f982614692565b604082019050919050565b6000602082019050818103600083015261471d816146e1565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b600061475a601983613421565b915061476582614724565b602082019050919050565b600060208201905081810360008301526147898161474d565b9050919050565b60008160601b9050919050565b60006147a882614790565b9050919050565b60006147ba8261479d565b9050919050565b6147d26147cd82613354565b6147af565b82525050565b60006147e482846147c1565b60148201915081905092915050565b600081519050919050565b600082825260208201905092915050565b600061481a826147f3565b61482481856147fe565b9350614834818560208601613432565b61483d8161345c565b840191505092915050565b600060808201905061485d600083018761352b565b61486a602083018661352b565b6148776040830185613595565b8181036060830152614889818461480f565b905095945050505050565b6000815190506148a3816132a5565b92915050565b6000602082840312156148bf576148be61326f565b5b60006148cd84828501614894565b91505092915050565b60006148e1826134c8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614913576149126140ca565b5b60018201905091905056fea264697066735822122085d62f6a368ec92493ef5996262b2a8c6dfdbd34294b238a6bb3ce91d02921ef64736f6c63430008130033000000000000000000000000f2cdc1347f450fb3540423c41f5d1505e4f9f5bb

Deployed Bytecode

0x6080604052600436106102675760003560e01c80637cb6475911610144578063b88d4fde116100b6578063d6492d811161007a578063d6492d8114610903578063e985e9c51461092e578063f2fde38b1461096b578063f4a0a52814610994578063f8b89dfb146109bd578063fb796e6c146109e657610267565b8063b88d4fde14610817578063c002d23d14610833578063c23dc68f1461085e578063c87b56dd1461089b578063cbccefb2146108d857610267565b806399a2557a1161010857806399a2557a14610718578063a22cb46514610755578063a7f93ebd1461077e578063ae7a9b0c146107a9578063b53cff0f146107c5578063b7c0b8e8146107ee57610267565b80637cb6475914610631578063828122ab1461065a5780638462151c146106855780638da5cb5b146106c257806395d89b41146106ed57610267565b80633ccfd60b116101dd5780635ade26c6116101a15780635ade26c61461051c5780635bbb2177146105475780636352211e146105845780636ecd2306146105c157806370a08231146105dd578063715018a61461061a57610267565b80633ccfd60b1461046c57806342842e0e1461048357806342966c681461049f57806350c96509146104c857806355f804b3146104f357610267565b806318160ddd1161022f57806318160ddd146103565780631ac08c1f146103815780631b1f4019146103be57806323b872dd146103e75780632a55205a1461040357806332cb6b0c1461044157610267565b806301ffc9a71461026c57806304634d8d146102a957806306fdde03146102d2578063081812fc146102fd578063095ea7b31461033a575b600080fd5b34801561027857600080fd5b50610293600480360381019061028e91906132d1565b610a11565b6040516102a09190613319565b60405180910390f35b3480156102b557600080fd5b506102d060048036038101906102cb91906133d6565b610a33565b005b3480156102de57600080fd5b506102e7610a49565b6040516102f491906134a6565b60405180910390f35b34801561030957600080fd5b50610324600480360381019061031f91906134fe565b610adb565b604051610331919061353a565b60405180910390f35b610354600480360381019061034f9190613555565b610b5a565b005b34801561036257600080fd5b5061036b610b8f565b60405161037891906135a4565b60405180910390f35b34801561038d57600080fd5b506103a860048036038101906103a391906135bf565b610ba6565b6040516103b59190613608565b60405180910390f35b3480156103ca57600080fd5b506103e560048036038101906103e0919061365d565b610bc6565b005b61040160048036038101906103fc919061368a565b610c31565b005b34801561040f57600080fd5b5061042a600480360381019061042591906136dd565b610c9c565b60405161043892919061371d565b60405180910390f35b34801561044d57600080fd5b50610456610e86565b60405161046391906135a4565b60405180910390f35b34801561047857600080fd5b50610481610e8c565b005b61049d6004803603810190610498919061368a565b610f41565b005b3480156104ab57600080fd5b506104c660048036038101906104c191906134fe565b610fac565b005b3480156104d457600080fd5b506104dd610fba565b6040516104ea91906135a4565b60405180910390f35b3480156104ff57600080fd5b5061051a600480360381019061051591906137ab565b610fc0565b005b34801561052857600080fd5b50610531610fde565b60405161053e91906135a4565b60405180910390f35b34801561055357600080fd5b5061056e6004803603810190610569919061384e565b610fe3565b60405161057b91906139fe565b60405180910390f35b34801561059057600080fd5b506105ab60048036038101906105a691906134fe565b6110a6565b6040516105b8919061353a565b60405180910390f35b6105db60048036038101906105d69190613a4c565b6110b8565b005b3480156105e957600080fd5b5061060460048036038101906105ff91906135bf565b61122c565b60405161061191906135a4565b60405180910390f35b34801561062657600080fd5b5061062f6112e4565b005b34801561063d57600080fd5b5061065860048036038101906106539190613aaf565b6112f8565b005b34801561066657600080fd5b5061066f61130a565b60405161067c91906135a4565b60405180910390f35b34801561069157600080fd5b506106ac60048036038101906106a791906135bf565b61130f565b6040516106b99190613b9a565b60405180910390f35b3480156106ce57600080fd5b506106d7611452565b6040516106e4919061353a565b60405180910390f35b3480156106f957600080fd5b5061070261147b565b60405161070f91906134a6565b60405180910390f35b34801561072457600080fd5b5061073f600480360381019061073a9190613bbc565b61150d565b60405161074c9190613b9a565b60405180910390f35b34801561076157600080fd5b5061077c60048036038101906107779190613c3b565b611719565b005b34801561078a57600080fd5b5061079361174e565b6040516107a091906135a4565b60405180910390f35b6107c360048036038101906107be9190613cd1565b611758565b005b3480156107d157600080fd5b506107ec60048036038101906107e791906134fe565b61197a565b005b3480156107fa57600080fd5b5061081560048036038101906108109190613d1e565b61198c565b005b610831600480360381019061082c9190613e7b565b6119b1565b005b34801561083f57600080fd5b50610848611a1e565b60405161085591906135a4565b60405180910390f35b34801561086a57600080fd5b50610885600480360381019061088091906134fe565b611a24565b6040516108929190613f53565b60405180910390f35b3480156108a757600080fd5b506108c260048036038101906108bd91906134fe565b611a8e565b6040516108cf91906134a6565b60405180910390f35b3480156108e457600080fd5b506108ed611b2c565b6040516108fa9190613fe5565b60405180910390f35b34801561090f57600080fd5b50610918611b3f565b604051610925919061400f565b60405180910390f35b34801561093a57600080fd5b506109556004803603810190610950919061402a565b611b45565b6040516109629190613319565b60405180910390f35b34801561097757600080fd5b50610992600480360381019061098d91906135bf565b611bd9565b005b3480156109a057600080fd5b506109bb60048036038101906109b691906134fe565b611c5c565b005b3480156109c957600080fd5b506109e460048036038101906109df9190613a4c565b611c6e565b005b3480156109f257600080fd5b506109fb611cb8565b604051610a089190613319565b60405180910390f35b6000610a1c82611ccb565b80610a2c5750610a2b82611d5d565b5b9050919050565b610a3b611dd7565b610a458282611e55565b5050565b606060038054610a5890614099565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8490614099565b8015610ad15780601f10610aa657610100808354040283529160200191610ad1565b820191906000526020600020905b815481529060010190602001808311610ab457829003601f168201915b5050505050905090565b6000610ae682611fea565b610b1c576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81610b6481612049565b610b8057610b70612095565b15610b7f57610b7e816120ac565b5b5b610b8a83836120f0565b505050565b6000610b99612234565b6002546001540303905090565b60106020528060005260406000206000915054906101000a900460ff1681565b610bce611dd7565b611a0a8161ffff16610bde61223d565b610be891906140f9565b1115610c20576040517fd05cb60900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c2e338261ffff16612250565b50565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c8b57610c6e33612049565b610c8a57610c7a612095565b15610c8957610c88336120ac565b5b5b5b610c9684848461240c565b50505050565b6000806000600a60008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610e315760096040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610e3b61272e565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610e67919061412d565b610e71919061419e565b90508160000151819350935050509250929050565b611a0a81565b610e94611dd7565b6000610e9e611452565b73ffffffffffffffffffffffffffffffffffffffff1647604051610ec190614200565b60006040518083038185875af1925050503d8060008114610efe576040519150601f19603f3d011682016040523d82523d6000602084013e610f03565b606091505b5050905080610f3e576040517f27fcd9d100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610f9b57610f7e33612049565b610f9a57610f8a612095565b15610f9957610f98336120ac565b5b5b5b610fa6848484612738565b50505050565b610fb7816001612758565b50565b600d5481565b610fc8611dd7565b818160119182610fd99291906143cc565b505050565b600681565b6060600083839050905060008167ffffffffffffffff81111561100957611008613d50565b5b60405190808252806020026020018201604052801561104257816020015b61102f613216565b8152602001906001900390816110275790505b50905060005b82811461109a576110718686838181106110655761106461449c565b5b90506020020135611a24565b8282815181106110845761108361449c565b5b6020026020010181905250806001019050611048565b50809250505092915050565b60006110b1826129aa565b9050919050565b6002808111156110cb576110ca613f6e565b5b60028111156110dd576110dc613f6e565b5b600b60009054906101000a900460ff1660028111156110ff576110fe613f6e565b5b14611136576040517feb56075600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600d54611a0a61114691906144cb565b8160ff1661115261223d565b61115c91906140f9565b1115611194576040517fd05cb60900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60068160ff1611156111d2576040517f4b231f9500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600c548160ff166111e3919061412d565b34101561121c576040517f31fc877f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611229338260ff16612250565b50565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611293576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6112ec611dd7565b6112f66000612a76565b565b611300611dd7565b80600f8190555050565b600181565b6060600080600061131f8561122c565b905060008167ffffffffffffffff81111561133d5761133c613d50565b5b60405190808252806020026020018201604052801561136b5781602001602082028036833780820191505090505b509050611376613216565b6000611380612234565b90505b8386146114445761139381612b3a565b9150816040015161143957600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146113de57816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611438578083878060010198508151811061142b5761142a61449c565b5b6020026020010181815250505b5b806001019050611383565b508195505050505050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461148a90614099565b80601f01602080910402602001604051908101604052809291908181526020018280546114b690614099565b80156115035780601f106114d857610100808354040283529160200191611503565b820191906000526020600020905b8154815290600101906020018083116114e657829003601f168201915b5050505050905090565b6060818310611548576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611553612b65565b905061155d612234565b85101561156f5761156c612234565b94505b8084111561157b578093505b60006115868761122c565b9050848610156115a95760008686039050818110156115a3578091505b506115ae565b600090505b60008167ffffffffffffffff8111156115ca576115c9613d50565b5b6040519080825280602002602001820160405280156115f85781602001602082028036833780820191505090505b5090506000820361160f5780945050505050611712565b600061161a88611a24565b90506000816040015161162f57816000015190505b60008990505b8881141580156116455750848714155b156117045761165381612b3a565b925082604001516116f957600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff161461169e57826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036116f857808488806001019950815181106116eb576116ea61449c565b5b6020026020010181815250505b5b806001019050611635565b508583528296505050505050505b9392505050565b8161172381612049565b61173f5761172f612095565b1561173e5761173d816120ac565b5b5b6117498383612b6f565b505050565b6000600c54905090565b6001600281111561176c5761176b613f6e565b5b600281111561177e5761177d613f6e565b5b600b60009054906101000a900460ff1660028111156117a05761179f613f6e565b5b146117d7576040517feb56075600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600115156117e6338484612c7a565b15151461181f576040517f9114b24300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611a0a600161182c61223d565b61183691906140f9565b111561186e576040517fd05cb60900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff16036118f7576040517fd330f98500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900460ff1661195391906144ff565b92506101000a81548160ff021916908360ff160217905550611976336001612250565b5050565b611982611dd7565b80600d8190555050565b611994611dd7565b80600e60006101000a81548160ff02191690831515021790555050565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611a0b576119ee33612049565b611a0a576119fa612095565b15611a0957611a08336120ac565b5b5b5b611a1785858585612cf9565b5050505050565b600c5481565b611a2c613216565b611a34613216565b611a3c612234565b831080611a505750611a4c612b65565b8310155b15611a5e5780915050611a89565b611a6783612b3a565b9050806040015115611a7c5780915050611a89565b611a8583612d6c565b9150505b919050565b6060611a9982611fea565b611acf576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611ad9612d8c565b90506000815103611af95760405180602001604052806000815250611b24565b80611b0384612e1e565b604051602001611b14929190614570565b6040516020818303038152906040525b915050919050565b600b60009054906101000a900460ff1681565b600f5481565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611be1611dd7565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611c50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4790614606565b60405180910390fd5b611c5981612a76565b50565b611c64611dd7565b80600c8190555050565b611c76611dd7565b8060ff166002811115611c8c57611c8b613f6e565b5b600b60006101000a81548160ff02191690836002811115611cb057611caf613f6e565b5b021790555050565b600e60009054906101000a900460ff1681565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611d2657506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611d565750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611dd05750611dcf82611ccb565b5b9050919050565b611ddf612e6e565b73ffffffffffffffffffffffffffffffffffffffff16611dfd611452565b73ffffffffffffffffffffffffffffffffffffffff1614611e53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4a90614672565b60405180910390fd5b565b611e5d61272e565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115611ebb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb290614704565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2190614770565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600960008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b600081611ff5612234565b11158015612004575060015482105b8015612042575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b6000731e0049783f008a0085193e00003d00cd54003c7173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b6000600e60009054906101000a900460ff16905090565b69c617113400112233445560005230601a5280603a52600080604460166daaeb6d7670e522a718067333cd4e5afa6120e8573d6000803e3d6000fd5b6000603a5250565b60006120fb826110a6565b90508073ffffffffffffffffffffffffffffffffffffffff1661211c612e76565b73ffffffffffffffffffffffffffffffffffffffff161461217f5761214881612143612e76565b611b45565b61217e576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b6000612247612234565b60015403905090565b6000600154905060008203612291576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61229e6000848385612e7e565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612315836123066000866000612e84565b61230f85612eac565b17612ebc565b6005600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b8181146123b657808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460018101905061237b565b50600082036123f1576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060018190555050506124076000848385612ee7565b505050565b6000612417826129aa565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461247e576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061248a84612eed565b915091506124a0818761249b612e76565b612f14565b6124ec576124b5866124b0612e76565b611b45565b6124eb576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612552576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61255f8686866001612e7e565b801561256a57600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061263885612614888887612e84565b7c020000000000000000000000000000000000000000000000000000000017612ebc565b600560008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036126be57600060018501905060006005600083815260200190815260200160002054036126bc5760015481146126bb578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46127268686866001612ee7565b505050505050565b6000612710905090565b612753838383604051806020016040528060008152506119b1565b505050565b6000612763836129aa565b9050600081905060008061277686612eed565b9150915084156127df57612792818461278d612e76565b612f14565b6127de576127a7836127a2612e76565b611b45565b6127dd576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b6127ed836000886001612e7e565b80156127f857600082555b600160806001901b03600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506128a08361285d85600088612e84565b7c02000000000000000000000000000000000000000000000000000000007c01000000000000000000000000000000000000000000000000000000001717612ebc565b600560008881526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008516036129265760006001870190506000600560008381526020019081526020016000205403612924576001548114612923578460056000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612990836000886001612ee7565b600260008154809291906001019190505550505050505050565b600080829050806129b9612234565b11612a3f57600154811015612a3e5760006005600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612a3c575b60008103612a32576005600083600190039350838152602001908152602001600020549050612a08565b8092505050612a71565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612b42613216565b612b5e6005600084815260200190815260200160002054612f58565b9050919050565b6000600154905090565b8060086000612b7c612e76565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612c29612e76565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612c6e9190613319565b60405180910390a35050565b6000612cf0838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600f5486604051602001612cd591906147d8565b6040516020818303038152906040528051906020012061300e565b90509392505050565b612d04848484610c31565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612d6657612d2f84848484613025565b612d65576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b612d74613216565b612d85612d80836129aa565b612f58565b9050919050565b606060118054612d9b90614099565b80601f0160208091040260200160405190810160405280929190818152602001828054612dc790614099565b8015612e145780601f10612de957610100808354040283529160200191612e14565b820191906000526020600020905b815481529060010190602001808311612df757829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b600115612e5957600184039350600a81066030018453600a8104905080612e37575b50828103602084039350808452505050919050565b600033905090565b600033905090565b50505050565b60008060e883901c905060e8612e9b868684613175565b62ffffff16901b9150509392505050565b60006001821460e11b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60008060006007600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b612f60613216565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b60008261301b858461317e565b1490509392505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261304b612e76565b8786866040518563ffffffff1660e01b815260040161306d9493929190614848565b6020604051808303816000875af19250505080156130a957506040513d601f19601f820116820180604052508101906130a691906148a9565b60015b613122573d80600081146130d9576040519150601f19603f3d011682016040523d82523d6000602084013e6130de565b606091505b50600081510361311a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60009392505050565b60008082905060005b84518110156131c9576131b4828683815181106131a7576131a661449c565b5b60200260200101516131d4565b915080806131c1906148d6565b915050613187565b508091505092915050565b60008183106131ec576131e782846131ff565b6131f7565b6131f683836131ff565b5b905092915050565b600082600052816020526040600020905092915050565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6132ae81613279565b81146132b957600080fd5b50565b6000813590506132cb816132a5565b92915050565b6000602082840312156132e7576132e661326f565b5b60006132f5848285016132bc565b91505092915050565b60008115159050919050565b613313816132fe565b82525050565b600060208201905061332e600083018461330a565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061335f82613334565b9050919050565b61336f81613354565b811461337a57600080fd5b50565b60008135905061338c81613366565b92915050565b60006bffffffffffffffffffffffff82169050919050565b6133b381613392565b81146133be57600080fd5b50565b6000813590506133d0816133aa565b92915050565b600080604083850312156133ed576133ec61326f565b5b60006133fb8582860161337d565b925050602061340c858286016133c1565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613450578082015181840152602081019050613435565b60008484015250505050565b6000601f19601f8301169050919050565b600061347882613416565b6134828185613421565b9350613492818560208601613432565b61349b8161345c565b840191505092915050565b600060208201905081810360008301526134c0818461346d565b905092915050565b6000819050919050565b6134db816134c8565b81146134e657600080fd5b50565b6000813590506134f8816134d2565b92915050565b6000602082840312156135145761351361326f565b5b6000613522848285016134e9565b91505092915050565b61353481613354565b82525050565b600060208201905061354f600083018461352b565b92915050565b6000806040838503121561356c5761356b61326f565b5b600061357a8582860161337d565b925050602061358b858286016134e9565b9150509250929050565b61359e816134c8565b82525050565b60006020820190506135b96000830184613595565b92915050565b6000602082840312156135d5576135d461326f565b5b60006135e38482850161337d565b91505092915050565b600060ff82169050919050565b613602816135ec565b82525050565b600060208201905061361d60008301846135f9565b92915050565b600061ffff82169050919050565b61363a81613623565b811461364557600080fd5b50565b60008135905061365781613631565b92915050565b6000602082840312156136735761367261326f565b5b600061368184828501613648565b91505092915050565b6000806000606084860312156136a3576136a261326f565b5b60006136b18682870161337d565b93505060206136c28682870161337d565b92505060406136d3868287016134e9565b9150509250925092565b600080604083850312156136f4576136f361326f565b5b6000613702858286016134e9565b9250506020613713858286016134e9565b9150509250929050565b6000604082019050613732600083018561352b565b61373f6020830184613595565b9392505050565b600080fd5b600080fd5b600080fd5b60008083601f84011261376b5761376a613746565b5b8235905067ffffffffffffffff8111156137885761378761374b565b5b6020830191508360018202830111156137a4576137a3613750565b5b9250929050565b600080602083850312156137c2576137c161326f565b5b600083013567ffffffffffffffff8111156137e0576137df613274565b5b6137ec85828601613755565b92509250509250929050565b60008083601f84011261380e5761380d613746565b5b8235905067ffffffffffffffff81111561382b5761382a61374b565b5b60208301915083602082028301111561384757613846613750565b5b9250929050565b600080602083850312156138655761386461326f565b5b600083013567ffffffffffffffff81111561388357613882613274565b5b61388f858286016137f8565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6138d081613354565b82525050565b600067ffffffffffffffff82169050919050565b6138f3816138d6565b82525050565b613902816132fe565b82525050565b600062ffffff82169050919050565b61392081613908565b82525050565b60808201600082015161393c60008501826138c7565b50602082015161394f60208501826138ea565b50604082015161396260408501826138f9565b5060608201516139756060850182613917565b50505050565b60006139878383613926565b60808301905092915050565b6000602082019050919050565b60006139ab8261389b565b6139b581856138a6565b93506139c0836138b7565b8060005b838110156139f15781516139d8888261397b565b97506139e383613993565b9250506001810190506139c4565b5085935050505092915050565b60006020820190508181036000830152613a1881846139a0565b905092915050565b613a29816135ec565b8114613a3457600080fd5b50565b600081359050613a4681613a20565b92915050565b600060208284031215613a6257613a6161326f565b5b6000613a7084828501613a37565b91505092915050565b6000819050919050565b613a8c81613a79565b8114613a9757600080fd5b50565b600081359050613aa981613a83565b92915050565b600060208284031215613ac557613ac461326f565b5b6000613ad384828501613a9a565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613b11816134c8565b82525050565b6000613b238383613b08565b60208301905092915050565b6000602082019050919050565b6000613b4782613adc565b613b518185613ae7565b9350613b5c83613af8565b8060005b83811015613b8d578151613b748882613b17565b9750613b7f83613b2f565b925050600181019050613b60565b5085935050505092915050565b60006020820190508181036000830152613bb48184613b3c565b905092915050565b600080600060608486031215613bd557613bd461326f565b5b6000613be38682870161337d565b9350506020613bf4868287016134e9565b9250506040613c05868287016134e9565b9150509250925092565b613c18816132fe565b8114613c2357600080fd5b50565b600081359050613c3581613c0f565b92915050565b60008060408385031215613c5257613c5161326f565b5b6000613c608582860161337d565b9250506020613c7185828601613c26565b9150509250929050565b60008083601f840112613c9157613c90613746565b5b8235905067ffffffffffffffff811115613cae57613cad61374b565b5b602083019150836020820283011115613cca57613cc9613750565b5b9250929050565b60008060208385031215613ce857613ce761326f565b5b600083013567ffffffffffffffff811115613d0657613d05613274565b5b613d1285828601613c7b565b92509250509250929050565b600060208284031215613d3457613d3361326f565b5b6000613d4284828501613c26565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613d888261345c565b810181811067ffffffffffffffff82111715613da757613da6613d50565b5b80604052505050565b6000613dba613265565b9050613dc68282613d7f565b919050565b600067ffffffffffffffff821115613de657613de5613d50565b5b613def8261345c565b9050602081019050919050565b82818337600083830152505050565b6000613e1e613e1984613dcb565b613db0565b905082815260208101848484011115613e3a57613e39613d4b565b5b613e45848285613dfc565b509392505050565b600082601f830112613e6257613e61613746565b5b8135613e72848260208601613e0b565b91505092915050565b60008060008060808587031215613e9557613e9461326f565b5b6000613ea38782880161337d565b9450506020613eb48782880161337d565b9350506040613ec5878288016134e9565b925050606085013567ffffffffffffffff811115613ee657613ee5613274565b5b613ef287828801613e4d565b91505092959194509250565b608082016000820151613f1460008501826138c7565b506020820151613f2760208501826138ea565b506040820151613f3a60408501826138f9565b506060820151613f4d6060850182613917565b50505050565b6000608082019050613f686000830184613efe565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60038110613fae57613fad613f6e565b5b50565b6000819050613fbf82613f9d565b919050565b6000613fcf82613fb1565b9050919050565b613fdf81613fc4565b82525050565b6000602082019050613ffa6000830184613fd6565b92915050565b61400981613a79565b82525050565b60006020820190506140246000830184614000565b92915050565b600080604083850312156140415761404061326f565b5b600061404f8582860161337d565b92505060206140608582860161337d565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806140b157607f821691505b6020821081036140c4576140c361406a565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614104826134c8565b915061410f836134c8565b9250828201905080821115614127576141266140ca565b5b92915050565b6000614138826134c8565b9150614143836134c8565b9250828202614151816134c8565b91508282048414831517614168576141676140ca565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006141a9826134c8565b91506141b4836134c8565b9250826141c4576141c361416f565b5b828204905092915050565b600081905092915050565b50565b60006141ea6000836141cf565b91506141f5826141da565b600082019050919050565b600061420b826141dd565b9150819050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026142827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614245565b61428c8683614245565b95508019841693508086168417925050509392505050565b6000819050919050565b60006142c96142c46142bf846134c8565b6142a4565b6134c8565b9050919050565b6000819050919050565b6142e3836142ae565b6142f76142ef826142d0565b848454614252565b825550505050565b600090565b61430c6142ff565b6143178184846142da565b505050565b5b8181101561433b57614330600082614304565b60018101905061431d565b5050565b601f8211156143805761435181614220565b61435a84614235565b81016020851015614369578190505b61437d61437585614235565b83018261431c565b50505b505050565b600082821c905092915050565b60006143a360001984600802614385565b1980831691505092915050565b60006143bc8383614392565b9150826002028217905092915050565b6143d68383614215565b67ffffffffffffffff8111156143ef576143ee613d50565b5b6143f98254614099565b61440482828561433f565b6000601f8311600181146144335760008415614421578287013590505b61442b85826143b0565b865550614493565b601f19841661444186614220565b60005b8281101561446957848901358255600182019150602085019450602081019050614444565b868310156144865784890135614482601f891682614392565b8355505b6001600288020188555050505b50505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006144d6826134c8565b91506144e1836134c8565b92508282039050818111156144f9576144f86140ca565b5b92915050565b600061450a826135ec565b9150614515836135ec565b9250828201905060ff81111561452e5761452d6140ca565b5b92915050565b600081905092915050565b600061454a82613416565b6145548185614534565b9350614564818560208601613432565b80840191505092915050565b600061457c828561453f565b9150614588828461453f565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006145f0602683613421565b91506145fb82614594565b604082019050919050565b6000602082019050818103600083015261461f816145e3565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061465c602083613421565b915061466782614626565b602082019050919050565b6000602082019050818103600083015261468b8161464f565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b60006146ee602a83613421565b91506146f982614692565b604082019050919050565b6000602082019050818103600083015261471d816146e1565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b600061475a601983613421565b915061476582614724565b602082019050919050565b600060208201905081810360008301526147898161474d565b9050919050565b60008160601b9050919050565b60006147a882614790565b9050919050565b60006147ba8261479d565b9050919050565b6147d26147cd82613354565b6147af565b82525050565b60006147e482846147c1565b60148201915081905092915050565b600081519050919050565b600082825260208201905092915050565b600061481a826147f3565b61482481856147fe565b9350614834818560208601613432565b61483d8161345c565b840191505092915050565b600060808201905061485d600083018761352b565b61486a602083018661352b565b6148776040830185613595565b8181036060830152614889818461480f565b905095945050505050565b6000815190506148a3816132a5565b92915050565b6000602082840312156148bf576148be61326f565b5b60006148cd84828501614894565b91505092915050565b60006148e1826134c8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614913576149126140ca565b5b60018201905091905056fea264697066735822122085d62f6a368ec92493ef5996262b2a8c6dfdbd34294b238a6bb3ce91d02921ef64736f6c63430008130033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000f2cdc1347f450fb3540423c41f5d1505e4f9f5bb

-----Decoded View---------------
Arg [0] : deployer (address): 0xF2CdC1347F450fB3540423c41F5d1505e4F9f5bB

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000f2cdc1347f450fb3540423c41f5d1505e4f9f5bb


Deployed Bytecode Sourcemap

687:5004:6:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4028:243;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3064:153;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10312:100:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16803:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4796:216:6;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6063:323:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1235:48:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3451:179;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5018:204;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1670:442:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;916:41:6;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3636:188;;;;;;;;;;;;;:::i;:::-;;5228:212;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;532:94:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1115:35:6;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3340:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1012:54;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1696:528:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11705:152:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1532:392:6;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7247:233:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1882:103:14;;;;;;;;;;;;;:::i;:::-;;2552:102:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;962:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5572:900:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1234:87:14;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10488:104:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2612:2513:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4586:204:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2858:84;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1930:415;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2948:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3223:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5446:242;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1071:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1109:428:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10698:318:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;888:23:6;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1203:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17752:164:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2140:201:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2751:101:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2660:85;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1155:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4028:243;4151:4;4178:38;4204:11;4178:25;:38::i;:::-;:87;;;;4227:38;4253:11;4227:25;:38::i;:::-;4178:87;4164:101;;4028:243;;;:::o;3064:153::-;1120:13:14;:11;:13::i;:::-;3169:42:6::1;3188:8;3198:12;3169:18;:42::i;:::-;3064:153:::0;;:::o;10312:100:3:-;10366:13;10399:5;10392:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10312:100;:::o;16803:218::-;16879:7;16904:16;16912:7;16904;:16::i;:::-;16899:64;;16929:34;;;;;;;;;;;;;;16899:64;16983:15;:24;16999:7;16983:24;;;;;;;;;;;:30;;;;;;;;;;;;16976:37;;16803:218;;;:::o;4796:216:6:-;4954:8;3578:29:13;3598:8;3578:19;:29::i;:::-;3573:122;;3628:27;:25;:27::i;:::-;3624:59;;;3657:26;3674:8;3657:16;:26::i;:::-;3624:59;3573:122;4974:32:6::1;4988:8;4998:7;4974:13;:32::i;:::-;4796:216:::0;;;:::o;6063:323:3:-;6124:7;6352:15;:13;:15::i;:::-;6337:12;;6321:13;;:28;:46;6314:53;;6063:323;:::o;1235:48:6:-;;;;;;;;;;;;;;;;;;;;;;:::o;3451:179::-;1120:13:14;:11;:13::i;:::-;953:4:6::1;3540:8;3523:25;;:14;:12;:14::i;:::-;:25;;;;:::i;:::-;:38;3519:69;;;3570:18;;;;;;;;;;;;;;3519:69;3597:27;3603:10;3615:8;3597:27;;:5;:27::i;:::-;3451:179:::0;:::o;5018:204::-;5166:4;3221:10:13;3213:18;;:4;:18;;;3209:184;;3253:31;3273:10;3253:19;:31::i;:::-;3248:134;;3309:27;:25;:27::i;:::-;3305:61;;;3338:28;3355:10;3338:16;:28::i;:::-;3305:61;3248:134;3209:184;5179:37:6::1;5198:4;5204:2;5208:7;5179:18;:37::i;:::-;5018:204:::0;;;;:::o;1670:442:2:-;1767:7;1776;1796:26;1825:17;:27;1843:8;1825:27;;;;;;;;;;;1796:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1897:1;1869:30;;:7;:16;;;:30;;;1865:92;;1926:19;1916:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1865:92;1969:21;2034:17;:15;:17::i;:::-;1993:58;;2007:7;:23;;;1994:36;;:10;:36;;;;:::i;:::-;1993:58;;;;:::i;:::-;1969:82;;2072:7;:16;;;2090:13;2064:40;;;;;;1670:442;;;;;:::o;916:41:6:-;953:4;916:41;:::o;3636:188::-;1120:13:14;:11;:13::i;:::-;3681:12:6::1;3707:7;:5;:7::i;:::-;3699:21;;3728;3699:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3680:74;;;3768:7;3763:56;;3793:18;;;;;;;;;;;;;;3763:56;3673:151;3636:188::o:0;5228:212::-;5380:4;3221:10:13;3213:18;;:4;:18;;;3209:184;;3253:31;3273:10;3253:19;:31::i;:::-;3248:134;;3309:27;:25;:27::i;:::-;3305:61;;;3338:28;3355:10;3338:16;:28::i;:::-;3305:61;3248:134;3209:184;5393:41:6::1;5416:4;5422:2;5426:7;5393:22;:41::i;:::-;5228:212:::0;;;;:::o;532:94:4:-;598:20;604:7;613:4;598:5;:20::i;:::-;532:94;:::o;1115:35:6:-;;;;:::o;3340:105::-;1120:13:14;:11;:13::i;:::-;3429:10:6::1;;3414:12;:25;;;;;;;:::i;:::-;;3340:105:::0;;:::o;1012:54::-;1065:1;1012:54;:::o;1696:528:5:-;1840:23;1906:22;1931:8;;:15;;1906:40;;1961:34;2019:14;1998:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;1961:73;;2054:9;2049:125;2070:14;2065:1;:19;2049:125;;2126:32;2146:8;;2155:1;2146:11;;;;;;;:::i;:::-;;;;;;;;2126:19;:32::i;:::-;2110:10;2121:1;2110:13;;;;;;;;:::i;:::-;;;;;;;:48;;;;2086:3;;;;;2049:125;;;;2195:10;2188:17;;;;1696:528;;;;:::o;11705:152:3:-;11777:7;11820:27;11839:7;11820:18;:27::i;:::-;11797:52;;11705:152;;;:::o;1532:392:6:-;1610:1;1605:7;;;;;;;;:::i;:::-;;1590:22;;;;;;;;:::i;:::-;;:11;;;;;;;;;;;:22;;;;;;;;:::i;:::-;;;1586:50;;1621:15;;;;;;;;;;;;;;1586:50;1688:13;;953:4;1675:26;;;;:::i;:::-;1664:8;1647:25;;:14;:12;:14::i;:::-;:25;;;;:::i;:::-;:54;1643:85;;;1710:18;;;;;;;;;;;;;;1643:85;1065:1;1739:8;:37;;;1735:76;;;1785:26;;;;;;;;;;;;;;1735:76;1845:10;;1834:8;:21;;;;;;:::i;:::-;1822:9;:33;1818:64;;;1864:18;;;;;;;;;;;;;;1818:64;1891:27;1897:10;1909:8;1891:27;;:5;:27::i;:::-;1532:392;:::o;7247:233:3:-;7319:7;7360:1;7343:19;;:5;:19;;;7339:60;;7371:28;;;;;;;;;;;;;;7339:60;1406:13;7417:18;:25;7436:5;7417:25;;;;;;;;;;;;;;;;:55;7410:62;;7247:233;;;:::o;1882:103:14:-;1120:13;:11;:13::i;:::-;1947:30:::1;1974:1;1947:18;:30::i;:::-;1882:103::o:0;2552:102:6:-;1120:13:14;:11;:13::i;:::-;2637:11:6::1;2622:12;:26;;;;2552:102:::0;:::o;962:45::-;1006:1;962:45;:::o;5572:900:5:-;5650:16;5704:19;5738:25;5778:22;5803:16;5813:5;5803:9;:16::i;:::-;5778:41;;5834:25;5876:14;5862:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5834:57;;5906:31;;:::i;:::-;5957:9;5969:15;:13;:15::i;:::-;5957:27;;5952:472;6001:14;5986:11;:29;5952:472;;6053:15;6066:1;6053:12;:15::i;:::-;6041:27;;6091:9;:16;;;6132:8;6087:73;6208:1;6182:28;;:9;:14;;;:28;;;6178:111;;6255:9;:14;;;6235:34;;6178:111;6332:5;6311:26;;:17;:26;;;6307:102;;6388:1;6362:8;6371:13;;;;;;6362:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;6307:102;5952:472;6017:3;;;;;5952:472;;;;6445:8;6438:15;;;;;;;5572:900;;;:::o;1234:87:14:-;1280:7;1307:6;;;;;;;;;;;1300:13;;1234:87;:::o;10488:104:3:-;10544:13;10577:7;10570:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10488:104;:::o;2612:2513:5:-;2755:16;2822:4;2813:5;:13;2809:45;;2835:19;;;;;;;;;;;;;;2809:45;2869:19;2903:17;2923:14;:12;:14::i;:::-;2903:34;;3023:15;:13;:15::i;:::-;3015:5;:23;3011:87;;;3067:15;:13;:15::i;:::-;3059:23;;3011:87;3174:9;3167:4;:16;3163:73;;;3211:9;3204:16;;3163:73;3250:25;3278:16;3288:5;3278:9;:16::i;:::-;3250:44;;3472:4;3464:5;:12;3460:278;;;3497:19;3526:5;3519:4;:12;3497:34;;3568:17;3554:11;:31;3550:111;;;3630:11;3610:31;;3550:111;3478:198;3460:278;;;3721:1;3701:21;;3460:278;3752:25;3794:17;3780:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3752:60;;3852:1;3831:17;:22;3827:78;;3881:8;3874:15;;;;;;;;3827:78;4049:31;4083:26;4103:5;4083:19;:26::i;:::-;4049:60;;4124:25;4369:9;:16;;;4364:92;;4426:9;:14;;;4406:34;;4364:92;4475:9;4487:5;4475:17;;4470:478;4499:4;4494:1;:9;;:45;;;;;4522:17;4507:11;:32;;4494:45;4470:478;;;4577:15;4590:1;4577:12;:15::i;:::-;4565:27;;4615:9;:16;;;4656:8;4611:73;4732:1;4706:28;;:9;:14;;;:28;;;4702:111;;4779:9;:14;;;4759:34;;4702:111;4856:5;4835:26;;:17;:26;;;4831:102;;4912:1;4886:8;4895:13;;;;;;4886:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;4831:102;4470:478;4541:3;;;;;4470:478;;;;5050:11;5040:8;5033:29;5098:8;5091:15;;;;;;;;2612:2513;;;;;;:::o;4586:204:6:-;4724:8;3578:29:13;3598:8;3578:19;:29::i;:::-;3573:122;;3628:27;:25;:27::i;:::-;3624:59;;;3657:26;3674:8;3657:16;:26::i;:::-;3624:59;3573:122;4741:43:6::1;4765:8;4775;4741:23;:43::i;:::-;4586:204:::0;;;:::o;2858:84::-;2903:7;2926:10;;2919:17;;2858:84;:::o;1930:415::-;2021:1;2016:7;;;;;;;;:::i;:::-;;2001:22;;;;;;;;:::i;:::-;;:11;;;;;;;;;;;:22;;;;;;;;:::i;:::-;;;1997:50;;2032:15;;;;;;;;;;;;;;1997:50;2095:4;2058:41;;:33;2072:10;2084:6;;2058:13;:33::i;:::-;:41;;;2054:60;;2108:6;;;;;;;;;;;;;;2054:60;953:4;2142:1;2125:14;:12;:14::i;:::-;:18;;;;:::i;:::-;:31;2121:62;;;2165:18;;;;;;;;;;;;;;2121:62;1006:1;2193:15;:27;2209:10;2193:27;;;;;;;;;;;;;;;;;;;;;;;;;:48;;;2190:81;;2250:21;;;;;;;;;;;;;;2190:81;2309:1;2278:15;:27;2294:10;2278:27;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;2319:20;2325:10;2337:1;2319:5;:20::i;:::-;1930:415;;:::o;2948:110::-;1120:13:14;:11;:13::i;:::-;3038:14:6::1;3022:13;:30;;;;2948:110:::0;:::o;3223:111::-;1120:13:14;:11;:13::i;:::-;3323:5:6::1;3296:24;;:32;;;;;;;;;;;;;;;;;;3223:111:::0;:::o;5446:242::-;5622:4;3221:10:13;3213:18;;:4;:18;;;3209:184;;3253:31;3273:10;3253:19;:31::i;:::-;3248:134;;3309:27;:25;:27::i;:::-;3305:61;;;3338:28;3355:10;3338:16;:28::i;:::-;3305:61;3248:134;3209:184;5635:47:6::1;5658:4;5664:2;5668:7;5677:4;5635:22;:47::i;:::-;5446:242:::0;;;;;:::o;1071:39::-;;;;:::o;1109:428:5:-;1193:21;;:::i;:::-;1227:31;;:::i;:::-;1283:15;:13;:15::i;:::-;1273:7;:25;:54;;;;1313:14;:12;:14::i;:::-;1302:7;:25;;1273:54;1269:103;;;1351:9;1344:16;;;;;1269:103;1394:21;1407:7;1394:12;:21::i;:::-;1382:33;;1430:9;:16;;;1426:65;;;1470:9;1463:16;;;;;1426:65;1508:21;1521:7;1508:12;:21::i;:::-;1501:28;;;1109:428;;;;:::o;10698:318:3:-;10771:13;10802:16;10810:7;10802;:16::i;:::-;10797:59;;10827:29;;;;;;;;;;;;;;10797:59;10869:21;10893:10;:8;:10::i;:::-;10869:34;;10946:1;10927:7;10921:21;:26;:87;;;;;;;;;;;;;;;;;10974:7;10983:18;10993:7;10983:9;:18::i;:::-;10957:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;10921:87;10914:94;;;10698:318;;;:::o;888:23:6:-;;;;;;;;;;;;;:::o;1203:27::-;;;;:::o;17752:164:3:-;17849:4;17873:18;:25;17892:5;17873:25;;;;;;;;;;;;;;;:35;17899:8;17873:35;;;;;;;;;;;;;;;;;;;;;;;;;17866:42;;17752:164;;;;:::o;2140:201:14:-;1120:13;:11;:13::i;:::-;2249:1:::1;2229:22;;:8;:22;;::::0;2221:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2305:28;2324:8;2305:18;:28::i;:::-;2140:201:::0;:::o;2751:101:6:-;1120:13:14;:11;:13::i;:::-;2834:12:6::1;2821:10;:25;;;;2751:101:::0;:::o;2660:85::-;1120:13:14;:11;:13::i;:::-;2734:4:6::1;2729:10;;;;;;;;;;:::i;:::-;;2715:11;;:24;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;2660:85:::0;:::o;1155:43::-;;;;;;;;;;;;;:::o;9410:639:3:-;9495:4;9834:10;9819:25;;:11;:25;;;;:102;;;;9911:10;9896:25;;:11;:25;;;;9819:102;:179;;;;9988:10;9973:25;;:11;:25;;;;9819:179;9799:199;;9410:639;;;:::o;1400:215:2:-;1502:4;1541:26;1526:41;;;:11;:41;;;;:81;;;;1571:36;1595:11;1571:23;:36::i;:::-;1526:81;1519:88;;1400:215;;;:::o;1399:132:14:-;1474:12;:10;:12::i;:::-;1463:23;;:7;:5;:7::i;:::-;:23;;;1455:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1399:132::o;2762:332:2:-;2881:17;:15;:17::i;:::-;2865:33;;:12;:33;;;;2857:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;2984:1;2964:22;;:8;:22;;;2956:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;3051:35;;;;;;;;3063:8;3051:35;;;;;;3073:12;3051:35;;;;;3029:19;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2762:332;;:::o;18174:282:3:-;18239:4;18295:7;18276:15;:13;:15::i;:::-;:26;;:66;;;;;18329:13;;18319:7;:23;18276:66;:153;;;;;18428:1;2182:8;18380:17;:26;18398:7;18380:26;;;;;;;;;;;;:44;:49;18276:153;18256:173;;18174:282;;;:::o;4402:178:6:-;4491:4;4531:42;4511:63;;:8;:63;;;4504:70;;4402:178;;;:::o;4277:119::-;4346:4;4366:24;;;;;;;;;;;4359:31;;4277:119;:::o;3811:1359:13:-;4204:22;4198:4;4191:36;4297:9;4291:4;4284:23;4372:8;4366:4;4359:22;4549:4;4543;4537;4531;4504:25;4497:5;4486:68;4476:274;;4670:16;4664:4;4658;4643:44;4718:16;4712:4;4705:30;4476:274;5150:1;5144:4;5137:15;3811:1359;:::o;16236:408:3:-;16325:13;16341:16;16349:7;16341;:16::i;:::-;16325:32;;16397:5;16374:28;;:19;:17;:19::i;:::-;:28;;;16370:175;;16422:44;16439:5;16446:19;:17;:19::i;:::-;16422:16;:44::i;:::-;16417:128;;16494:35;;;;;;;;;;;;;;16417:128;16370:175;16590:2;16557:15;:24;16573:7;16557:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;16628:7;16624:2;16608:28;;16617:5;16608:28;;;;;;;;;;;;16314:330;16236:408;;:::o;3830:87:6:-;3887:7;3910:1;3903:8;;3830:87;:::o;6484:296:3:-;6539:7;6746:15;:13;:15::i;:::-;6730:13;;:31;6723:38;;6484:296;:::o;27823:2966::-;27896:20;27919:13;;27896:36;;27959:1;27947:8;:13;27943:44;;27969:18;;;;;;;;;;;;;;27943:44;28000:61;28030:1;28034:2;28038:12;28052:8;28000:21;:61::i;:::-;28544:1;1544:2;28514:1;:26;;28513:32;28501:8;:45;28475:18;:22;28494:2;28475:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;28823:139;28860:2;28914:33;28937:1;28941:2;28945:1;28914:14;:33::i;:::-;28881:30;28902:8;28881:20;:30::i;:::-;:66;28823:18;:139::i;:::-;28789:17;:31;28807:12;28789:31;;;;;;;;;;;:173;;;;28979:16;29010:11;29039:8;29024:12;:23;29010:37;;29560:16;29556:2;29552:25;29540:37;;29932:12;29892:8;29851:1;29789:25;29730:1;29669;29642:335;30303:1;30289:12;30285:20;30243:346;30344:3;30335:7;30332:16;30243:346;;30562:7;30552:8;30549:1;30522:25;30519:1;30516;30511:59;30397:1;30388:7;30384:15;30373:26;;30243:346;;;30247:77;30634:1;30622:8;:13;30618:45;;30644:19;;;;;;;;;;;;;;30618:45;30696:3;30680:13;:19;;;;28249:2462;;30721:60;30750:1;30754:2;30758:12;30772:8;30721:20;:60::i;:::-;27885:2904;27823:2966;;:::o;20442:2825::-;20584:27;20614;20633:7;20614:18;:27::i;:::-;20584:57;;20699:4;20658:45;;20674:19;20658:45;;;20654:86;;20712:28;;;;;;;;;;;;;;20654:86;20754:27;20783:23;20810:35;20837:7;20810:26;:35::i;:::-;20753:92;;;;20945:68;20970:15;20987:4;20993:19;:17;:19::i;:::-;20945:24;:68::i;:::-;20940:180;;21033:43;21050:4;21056:19;:17;:19::i;:::-;21033:16;:43::i;:::-;21028:92;;21085:35;;;;;;;;;;;;;;21028:92;20940:180;21151:1;21137:16;;:2;:16;;;21133:52;;21162:23;;;;;;;;;;;;;;21133:52;21198:43;21220:4;21226:2;21230:7;21239:1;21198:21;:43::i;:::-;21334:15;21331:160;;;21474:1;21453:19;21446:30;21331:160;21871:18;:24;21890:4;21871:24;;;;;;;;;;;;;;;;21869:26;;;;;;;;;;;;21940:18;:22;21959:2;21940:22;;;;;;;;;;;;;;;;21938:24;;;;;;;;;;;22262:146;22299:2;22348:45;22363:4;22369:2;22373:19;22348:14;:45::i;:::-;2462:8;22320:73;22262:18;:146::i;:::-;22233:17;:26;22251:7;22233:26;;;;;;;;;;;:175;;;;22579:1;2462:8;22528:19;:47;:52;22524:627;;22601:19;22633:1;22623:7;:11;22601:33;;22790:1;22756:17;:30;22774:11;22756:30;;;;;;;;;;;;:35;22752:384;;22894:13;;22879:11;:28;22875:242;;23074:19;23041:17;:30;23059:11;23041:30;;;;;;;;;;;:52;;;;22875:242;22752:384;22582:569;22524:627;23198:7;23194:2;23179:27;;23188:4;23179:27;;;;;;;;;;;;23217:42;23238:4;23244:2;23248:7;23257:1;23217:20;:42::i;:::-;20573:2694;;;20442:2825;;;:::o;2394:97:2:-;2452:6;2478:5;2471:12;;2394:97;:::o;23363:193:3:-;23509:39;23526:4;23532:2;23536:7;23509:39;;;;;;;;;;;;:16;:39::i;:::-;23363:193;;;:::o;35011:3081::-;35091:27;35121;35140:7;35121:18;:27::i;:::-;35091:57;;35161:12;35192:19;35161:52;;35227:27;35256:23;35283:35;35310:7;35283:26;:35::i;:::-;35226:92;;;;35335:13;35331:316;;;35456:68;35481:15;35498:4;35504:19;:17;:19::i;:::-;35456:24;:68::i;:::-;35451:184;;35548:43;35565:4;35571:19;:17;:19::i;:::-;35548:16;:43::i;:::-;35543:92;;35600:35;;;;;;;;;;;;;;35543:92;35451:184;35331:316;35659:51;35681:4;35695:1;35699:7;35708:1;35659:21;:51::i;:::-;35803:15;35800:160;;;35943:1;35922:19;35915:30;35800:160;36621:1;1671:3;36591:1;:26;;36590:32;36562:18;:24;36581:4;36562:24;;;;;;;;;;;;;;;;:60;;;;;;;;;;;36889:176;36926:4;36997:53;37012:4;37026:1;37030:19;36997:14;:53::i;:::-;2462:8;2182;36950:43;36949:101;36889:18;:176::i;:::-;36860:17;:26;36878:7;36860:26;;;;;;;;;;;:205;;;;37236:1;2462:8;37185:19;:47;:52;37181:627;;37258:19;37290:1;37280:7;:11;37258:33;;37447:1;37413:17;:30;37431:11;37413:30;;;;;;;;;;;;:35;37409:384;;37551:13;;37536:11;:28;37532:242;;37731:19;37698:17;:30;37716:11;37698:30;;;;;;;;;;;:52;;;;37532:242;37409:384;37239:569;37181:627;37863:7;37859:1;37836:35;;37845:4;37836:35;;;;;;;;;;;;37882:50;37903:4;37917:1;37921:7;37930:1;37882:20;:50::i;:::-;38059:12;;:14;;;;;;;;;;;;;35080:3012;;;;35011:3081;;:::o;12860:1275::-;12927:7;12947:12;12962:7;12947:22;;13030:4;13011:15;:13;:15::i;:::-;:23;13007:1061;;13064:13;;13057:4;:20;13053:1015;;;13102:14;13119:17;:23;13137:4;13119:23;;;;;;;;;;;;13102:40;;13236:1;2182:8;13208:6;:24;:29;13204:845;;13873:113;13890:1;13880:6;:11;13873:113;;13933:17;:25;13951:6;;;;;;;13933:25;;;;;;;;;;;;13924:34;;13873:113;;;14019:6;14012:13;;;;;;13204:845;13079:989;13053:1015;13007:1061;14096:31;;;;;;;;;;;;;;12860:1275;;;;:::o;2501:191:14:-;2575:16;2594:6;;;;;;;;;;;2575:25;;2620:8;2611:6;;:17;;;;;;;;;;;;;;;;;;2675:8;2644:40;;2665:8;2644:40;;;;;;;;;;;;2564:128;2501:191;:::o;12308:161:3:-;12376:21;;:::i;:::-;12417:44;12436:17;:24;12454:5;12436:24;;;;;;;;;;;;12417:18;:44::i;:::-;12410:51;;12308:161;;;:::o;5750:103::-;5805:7;5832:13;;5825:20;;5750:103;:::o;17361:234::-;17508:8;17456:18;:39;17475:19;:17;:19::i;:::-;17456:39;;;;;;;;;;;;;;;:49;17496:8;17456:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;17568:8;17532:55;;17547:19;:17;:19::i;:::-;17532:55;;;17578:8;17532:55;;;;;;:::i;:::-;;;;;;;;17361:234;;:::o;2351:195:6:-;2441:4;2461:79;2480:6;;2461:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2488:12;;2529:8;2512:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;2502:37;;;;;;2461:18;:79::i;:::-;2454:86;;2351:195;;;;;:::o;24154:407:3:-;24329:31;24342:4;24348:2;24352:7;24329:12;:31::i;:::-;24393:1;24375:2;:14;;;:19;24371:183;;24414:56;24445:4;24451:2;24455:7;24464:5;24414:30;:56::i;:::-;24409:145;;24498:40;;;;;;;;;;;;;;24409:145;24371:183;24154:407;;;;:::o;12046:166::-;12116:21;;:::i;:::-;12157:47;12176:27;12195:7;12176:18;:27::i;:::-;12157:18;:47::i;:::-;12150:54;;12046:166;;;:::o;3923:99:6:-;3975:13;4004:12;3997:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3923:99;:::o;40689:1745:3:-;40754:17;41188:4;41181;41175:11;41171:22;41280:1;41274:4;41267:15;41355:4;41352:1;41348:12;41341:19;;41437:1;41432:3;41425:14;41541:3;41780:5;41762:428;41788:1;41762:428;;;41828:1;41823:3;41819:11;41812:18;;41999:2;41993:4;41989:13;41985:2;41981:22;41976:3;41968:36;42093:2;42087:4;42083:13;42075:21;;42160:4;41762:428;42150:25;41762:428;41766:21;42229:3;42224;42220:13;42344:4;42339:3;42335:14;42328:21;;42409:6;42404:3;42397:19;40793:1634;;;40689:1745;;;:::o;656:98:0:-;709:7;736:10;729:17;;656:98;:::o;40482:105:3:-;40542:7;40569:10;40562:17;;40482:105;:::o;25223:159::-;;;;;:::o;39791:311::-;39926:7;39946:16;2586:3;39972:19;:41;;39946:68;;2586:3;40040:31;40051:4;40057:2;40061:9;40040:10;:31::i;:::-;40032:40;;:62;;40025:69;;;39791:311;;;;;:::o;15235:324::-;15305:14;15538:1;15528:8;15525:15;15499:24;15495:46;15485:56;;15235:324;;;:::o;14683:450::-;14763:14;14931:16;14924:5;14920:28;14911:37;;15108:5;15094:11;15069:23;15065:41;15062:52;15055:5;15052:63;15042:73;;14683:450;;;;:::o;26047:158::-;;;;;:::o;19337:485::-;19439:27;19468:23;19509:38;19550:15;:24;19566:7;19550:24;;;;;;;;;;;19509:65;;19727:18;19704:41;;19784:19;19778:26;19759:45;;19689:126;19337:485;;;:::o;18565:659::-;18714:11;18879:16;18872:5;18868:28;18859:37;;19039:16;19028:9;19024:32;19011:45;;19189:15;19178:9;19175:30;19167:5;19156:9;19153:20;19150:56;19140:66;;18565:659;;;;;:::o;14234:366::-;14300:31;;:::i;:::-;14377:6;14344:9;:14;;:41;;;;;;;;;;;2065:3;14430:6;:33;;14396:9;:24;;:68;;;;;;;;;;;14522:1;2182:8;14494:6;:24;:29;;14475:9;:16;;:48;;;;;;;;;;;2586:3;14563:6;:28;;14534:9;:19;;:58;;;;;;;;;;;14234:366;;;:::o;1163:190:12:-;1288:4;1341;1312:25;1325:5;1332:4;1312:12;:25::i;:::-;:33;1305:40;;1163:190;;;;;:::o;26645:716:3:-;26808:4;26854:2;26829:45;;;26875:19;:17;:19::i;:::-;26896:4;26902:7;26911:5;26829:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;26825:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27129:1;27112:6;:13;:18;27108:235;;27158:40;;;;;;;;;;;;;;27108:235;27301:6;27295:13;27286:6;27282:2;27278:15;27271:38;26825:529;26998:54;;;26988:64;;;:6;:64;;;;26981:71;;;26645:716;;;;;;:::o;39492:147::-;39629:6;39492:147;;;;;:::o;2030:296:12:-;2113:7;2133:20;2156:4;2133:27;;2176:9;2171:118;2195:5;:12;2191:1;:16;2171:118;;;2244:33;2254:12;2268:5;2274:1;2268:8;;;;;;;;:::i;:::-;;;;;;;;2244:9;:33::i;:::-;2229:48;;2209:3;;;;;:::i;:::-;;;;2171:118;;;;2306:12;2299:19;;;2030:296;;;;:::o;9070:149::-;9133:7;9164:1;9160;:5;:51;;9191:20;9206:1;9209;9191:14;:20::i;:::-;9160:51;;;9168:20;9183:1;9186;9168:14;:20::i;:::-;9160:51;9153:58;;9070:149;;;;:::o;9227:268::-;9295:13;9402:1;9396:4;9389:15;9431:1;9425:4;9418:15;9472:4;9466;9456:21;9447:30;;9227:268;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:75:15:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:126::-;1555:7;1595:42;1588:5;1584:54;1573:65;;1518:126;;;:::o;1650:96::-;1687:7;1716:24;1734:5;1716:24;:::i;:::-;1705:35;;1650:96;;;:::o;1752:122::-;1825:24;1843:5;1825:24;:::i;:::-;1818:5;1815:35;1805:63;;1864:1;1861;1854:12;1805:63;1752:122;:::o;1880:139::-;1926:5;1964:6;1951:20;1942:29;;1980:33;2007:5;1980:33;:::i;:::-;1880:139;;;;:::o;2025:109::-;2061:7;2101:26;2094:5;2090:38;2079:49;;2025:109;;;:::o;2140:120::-;2212:23;2229:5;2212:23;:::i;:::-;2205:5;2202:34;2192:62;;2250:1;2247;2240:12;2192:62;2140:120;:::o;2266:137::-;2311:5;2349:6;2336:20;2327:29;;2365:32;2391:5;2365:32;:::i;:::-;2266:137;;;;:::o;2409:472::-;2476:6;2484;2533:2;2521:9;2512:7;2508:23;2504:32;2501:119;;;2539:79;;:::i;:::-;2501:119;2659:1;2684:53;2729:7;2720:6;2709:9;2705:22;2684:53;:::i;:::-;2674:63;;2630:117;2786:2;2812:52;2856:7;2847:6;2836:9;2832:22;2812:52;:::i;:::-;2802:62;;2757:117;2409:472;;;;;:::o;2887:99::-;2939:6;2973:5;2967:12;2957:22;;2887:99;;;:::o;2992:169::-;3076:11;3110:6;3105:3;3098:19;3150:4;3145:3;3141:14;3126:29;;2992:169;;;;:::o;3167:246::-;3248:1;3258:113;3272:6;3269:1;3266:13;3258:113;;;3357:1;3352:3;3348:11;3342:18;3338:1;3333:3;3329:11;3322:39;3294:2;3291:1;3287:10;3282:15;;3258:113;;;3405:1;3396:6;3391:3;3387:16;3380:27;3229:184;3167:246;;;:::o;3419:102::-;3460:6;3511:2;3507:7;3502:2;3495:5;3491:14;3487:28;3477:38;;3419:102;;;:::o;3527:377::-;3615:3;3643:39;3676:5;3643:39;:::i;:::-;3698:71;3762:6;3757:3;3698:71;:::i;:::-;3691:78;;3778:65;3836:6;3831:3;3824:4;3817:5;3813:16;3778:65;:::i;:::-;3868:29;3890:6;3868:29;:::i;:::-;3863:3;3859:39;3852:46;;3619:285;3527:377;;;;:::o;3910:313::-;4023:4;4061:2;4050:9;4046:18;4038:26;;4110:9;4104:4;4100:20;4096:1;4085:9;4081:17;4074:47;4138:78;4211:4;4202:6;4138:78;:::i;:::-;4130:86;;3910:313;;;;:::o;4229:77::-;4266:7;4295:5;4284:16;;4229:77;;;:::o;4312:122::-;4385:24;4403:5;4385:24;:::i;:::-;4378:5;4375:35;4365:63;;4424:1;4421;4414:12;4365:63;4312:122;:::o;4440:139::-;4486:5;4524:6;4511:20;4502:29;;4540:33;4567:5;4540:33;:::i;:::-;4440:139;;;;:::o;4585:329::-;4644:6;4693:2;4681:9;4672:7;4668:23;4664:32;4661:119;;;4699:79;;:::i;:::-;4661:119;4819:1;4844:53;4889:7;4880:6;4869:9;4865:22;4844:53;:::i;:::-;4834:63;;4790:117;4585:329;;;;:::o;4920:118::-;5007:24;5025:5;5007:24;:::i;:::-;5002:3;4995:37;4920:118;;:::o;5044:222::-;5137:4;5175:2;5164:9;5160:18;5152:26;;5188:71;5256:1;5245:9;5241:17;5232:6;5188:71;:::i;:::-;5044:222;;;;:::o;5272:474::-;5340:6;5348;5397:2;5385:9;5376:7;5372:23;5368:32;5365:119;;;5403:79;;:::i;:::-;5365:119;5523:1;5548:53;5593:7;5584:6;5573:9;5569:22;5548:53;:::i;:::-;5538:63;;5494:117;5650:2;5676:53;5721:7;5712:6;5701:9;5697:22;5676:53;:::i;:::-;5666:63;;5621:118;5272:474;;;;;:::o;5752:118::-;5839:24;5857:5;5839:24;:::i;:::-;5834:3;5827:37;5752:118;;:::o;5876:222::-;5969:4;6007:2;5996:9;5992:18;5984:26;;6020:71;6088:1;6077:9;6073:17;6064:6;6020:71;:::i;:::-;5876:222;;;;:::o;6104:329::-;6163:6;6212:2;6200:9;6191:7;6187:23;6183:32;6180:119;;;6218:79;;:::i;:::-;6180:119;6338:1;6363:53;6408:7;6399:6;6388:9;6384:22;6363:53;:::i;:::-;6353:63;;6309:117;6104:329;;;;:::o;6439:86::-;6474:7;6514:4;6507:5;6503:16;6492:27;;6439:86;;;:::o;6531:112::-;6614:22;6630:5;6614:22;:::i;:::-;6609:3;6602:35;6531:112;;:::o;6649:214::-;6738:4;6776:2;6765:9;6761:18;6753:26;;6789:67;6853:1;6842:9;6838:17;6829:6;6789:67;:::i;:::-;6649:214;;;;:::o;6869:89::-;6905:7;6945:6;6938:5;6934:18;6923:29;;6869:89;;;:::o;6964:120::-;7036:23;7053:5;7036:23;:::i;:::-;7029:5;7026:34;7016:62;;7074:1;7071;7064:12;7016:62;6964:120;:::o;7090:137::-;7135:5;7173:6;7160:20;7151:29;;7189:32;7215:5;7189:32;:::i;:::-;7090:137;;;;:::o;7233:327::-;7291:6;7340:2;7328:9;7319:7;7315:23;7311:32;7308:119;;;7346:79;;:::i;:::-;7308:119;7466:1;7491:52;7535:7;7526:6;7515:9;7511:22;7491:52;:::i;:::-;7481:62;;7437:116;7233:327;;;;:::o;7566:619::-;7643:6;7651;7659;7708:2;7696:9;7687:7;7683:23;7679:32;7676:119;;;7714:79;;:::i;:::-;7676:119;7834:1;7859:53;7904:7;7895:6;7884:9;7880:22;7859:53;:::i;:::-;7849:63;;7805:117;7961:2;7987:53;8032:7;8023:6;8012:9;8008:22;7987:53;:::i;:::-;7977:63;;7932:118;8089:2;8115:53;8160:7;8151:6;8140:9;8136:22;8115:53;:::i;:::-;8105:63;;8060:118;7566:619;;;;;:::o;8191:474::-;8259:6;8267;8316:2;8304:9;8295:7;8291:23;8287:32;8284:119;;;8322:79;;:::i;:::-;8284:119;8442:1;8467:53;8512:7;8503:6;8492:9;8488:22;8467:53;:::i;:::-;8457:63;;8413:117;8569:2;8595:53;8640:7;8631:6;8620:9;8616:22;8595:53;:::i;:::-;8585:63;;8540:118;8191:474;;;;;:::o;8671:332::-;8792:4;8830:2;8819:9;8815:18;8807:26;;8843:71;8911:1;8900:9;8896:17;8887:6;8843:71;:::i;:::-;8924:72;8992:2;8981:9;8977:18;8968:6;8924:72;:::i;:::-;8671:332;;;;;:::o;9009:117::-;9118:1;9115;9108:12;9132:117;9241:1;9238;9231:12;9255:117;9364:1;9361;9354:12;9392:553;9450:8;9460:6;9510:3;9503:4;9495:6;9491:17;9487:27;9477:122;;9518:79;;:::i;:::-;9477:122;9631:6;9618:20;9608:30;;9661:18;9653:6;9650:30;9647:117;;;9683:79;;:::i;:::-;9647:117;9797:4;9789:6;9785:17;9773:29;;9851:3;9843:4;9835:6;9831:17;9821:8;9817:32;9814:41;9811:128;;;9858:79;;:::i;:::-;9811:128;9392:553;;;;;:::o;9951:529::-;10022:6;10030;10079:2;10067:9;10058:7;10054:23;10050:32;10047:119;;;10085:79;;:::i;:::-;10047:119;10233:1;10222:9;10218:17;10205:31;10263:18;10255:6;10252:30;10249:117;;;10285:79;;:::i;:::-;10249:117;10398:65;10455:7;10446:6;10435:9;10431:22;10398:65;:::i;:::-;10380:83;;;;10176:297;9951:529;;;;;:::o;10503:568::-;10576:8;10586:6;10636:3;10629:4;10621:6;10617:17;10613:27;10603:122;;10644:79;;:::i;:::-;10603:122;10757:6;10744:20;10734:30;;10787:18;10779:6;10776:30;10773:117;;;10809:79;;:::i;:::-;10773:117;10923:4;10915:6;10911:17;10899:29;;10977:3;10969:4;10961:6;10957:17;10947:8;10943:32;10940:41;10937:128;;;10984:79;;:::i;:::-;10937:128;10503:568;;;;;:::o;11077:559::-;11163:6;11171;11220:2;11208:9;11199:7;11195:23;11191:32;11188:119;;;11226:79;;:::i;:::-;11188:119;11374:1;11363:9;11359:17;11346:31;11404:18;11396:6;11393:30;11390:117;;;11426:79;;:::i;:::-;11390:117;11539:80;11611:7;11602:6;11591:9;11587:22;11539:80;:::i;:::-;11521:98;;;;11317:312;11077:559;;;;;:::o;11642:146::-;11741:6;11775:5;11769:12;11759:22;;11642:146;;;:::o;11794:216::-;11925:11;11959:6;11954:3;11947:19;11999:4;11994:3;11990:14;11975:29;;11794:216;;;;:::o;12016:164::-;12115:4;12138:3;12130:11;;12168:4;12163:3;12159:14;12151:22;;12016:164;;;:::o;12186:108::-;12263:24;12281:5;12263:24;:::i;:::-;12258:3;12251:37;12186:108;;:::o;12300:101::-;12336:7;12376:18;12369:5;12365:30;12354:41;;12300:101;;;:::o;12407:105::-;12482:23;12499:5;12482:23;:::i;:::-;12477:3;12470:36;12407:105;;:::o;12518:99::-;12589:21;12604:5;12589:21;:::i;:::-;12584:3;12577:34;12518:99;;:::o;12623:91::-;12659:7;12699:8;12692:5;12688:20;12677:31;;12623:91;;;:::o;12720:105::-;12795:23;12812:5;12795:23;:::i;:::-;12790:3;12783:36;12720:105;;:::o;12903:866::-;13054:4;13049:3;13045:14;13141:4;13134:5;13130:16;13124:23;13160:63;13217:4;13212:3;13208:14;13194:12;13160:63;:::i;:::-;13069:164;13325:4;13318:5;13314:16;13308:23;13344:61;13399:4;13394:3;13390:14;13376:12;13344:61;:::i;:::-;13243:172;13499:4;13492:5;13488:16;13482:23;13518:57;13569:4;13564:3;13560:14;13546:12;13518:57;:::i;:::-;13425:160;13672:4;13665:5;13661:16;13655:23;13691:61;13746:4;13741:3;13737:14;13723:12;13691:61;:::i;:::-;13595:167;13023:746;12903:866;;:::o;13775:307::-;13908:10;13929:110;14035:3;14027:6;13929:110;:::i;:::-;14071:4;14066:3;14062:14;14048:28;;13775:307;;;;:::o;14088:145::-;14190:4;14222;14217:3;14213:14;14205:22;;14088:145;;;:::o;14315:988::-;14498:3;14527:86;14607:5;14527:86;:::i;:::-;14629:118;14740:6;14735:3;14629:118;:::i;:::-;14622:125;;14771:88;14853:5;14771:88;:::i;:::-;14882:7;14913:1;14898:380;14923:6;14920:1;14917:13;14898:380;;;14999:6;14993:13;15026:127;15149:3;15134:13;15026:127;:::i;:::-;15019:134;;15176:92;15261:6;15176:92;:::i;:::-;15166:102;;14958:320;14945:1;14942;14938:9;14933:14;;14898:380;;;14902:14;15294:3;15287:10;;14503:800;;;14315:988;;;;:::o;15309:501::-;15516:4;15554:2;15543:9;15539:18;15531:26;;15603:9;15597:4;15593:20;15589:1;15578:9;15574:17;15567:47;15631:172;15798:4;15789:6;15631:172;:::i;:::-;15623:180;;15309:501;;;;:::o;15816:118::-;15887:22;15903:5;15887:22;:::i;:::-;15880:5;15877:33;15867:61;;15924:1;15921;15914:12;15867:61;15816:118;:::o;15940:135::-;15984:5;16022:6;16009:20;16000:29;;16038:31;16063:5;16038:31;:::i;:::-;15940:135;;;;:::o;16081:325::-;16138:6;16187:2;16175:9;16166:7;16162:23;16158:32;16155:119;;;16193:79;;:::i;:::-;16155:119;16313:1;16338:51;16381:7;16372:6;16361:9;16357:22;16338:51;:::i;:::-;16328:61;;16284:115;16081:325;;;;:::o;16412:77::-;16449:7;16478:5;16467:16;;16412:77;;;:::o;16495:122::-;16568:24;16586:5;16568:24;:::i;:::-;16561:5;16558:35;16548:63;;16607:1;16604;16597:12;16548:63;16495:122;:::o;16623:139::-;16669:5;16707:6;16694:20;16685:29;;16723:33;16750:5;16723:33;:::i;:::-;16623:139;;;;:::o;16768:329::-;16827:6;16876:2;16864:9;16855:7;16851:23;16847:32;16844:119;;;16882:79;;:::i;:::-;16844:119;17002:1;17027:53;17072:7;17063:6;17052:9;17048:22;17027:53;:::i;:::-;17017:63;;16973:117;16768:329;;;;:::o;17103:114::-;17170:6;17204:5;17198:12;17188:22;;17103:114;;;:::o;17223:184::-;17322:11;17356:6;17351:3;17344:19;17396:4;17391:3;17387:14;17372:29;;17223:184;;;;:::o;17413:132::-;17480:4;17503:3;17495:11;;17533:4;17528:3;17524:14;17516:22;;17413:132;;;:::o;17551:108::-;17628:24;17646:5;17628:24;:::i;:::-;17623:3;17616:37;17551:108;;:::o;17665:179::-;17734:10;17755:46;17797:3;17789:6;17755:46;:::i;:::-;17833:4;17828:3;17824:14;17810:28;;17665:179;;;;:::o;17850:113::-;17920:4;17952;17947:3;17943:14;17935:22;;17850:113;;;:::o;17999:732::-;18118:3;18147:54;18195:5;18147:54;:::i;:::-;18217:86;18296:6;18291:3;18217:86;:::i;:::-;18210:93;;18327:56;18377:5;18327:56;:::i;:::-;18406:7;18437:1;18422:284;18447:6;18444:1;18441:13;18422:284;;;18523:6;18517:13;18550:63;18609:3;18594:13;18550:63;:::i;:::-;18543:70;;18636:60;18689:6;18636:60;:::i;:::-;18626:70;;18482:224;18469:1;18466;18462:9;18457:14;;18422:284;;;18426:14;18722:3;18715:10;;18123:608;;;17999:732;;;;:::o;18737:373::-;18880:4;18918:2;18907:9;18903:18;18895:26;;18967:9;18961:4;18957:20;18953:1;18942:9;18938:17;18931:47;18995:108;19098:4;19089:6;18995:108;:::i;:::-;18987:116;;18737:373;;;;:::o;19116:619::-;19193:6;19201;19209;19258:2;19246:9;19237:7;19233:23;19229:32;19226:119;;;19264:79;;:::i;:::-;19226:119;19384:1;19409:53;19454:7;19445:6;19434:9;19430:22;19409:53;:::i;:::-;19399:63;;19355:117;19511:2;19537:53;19582:7;19573:6;19562:9;19558:22;19537:53;:::i;:::-;19527:63;;19482:118;19639:2;19665:53;19710:7;19701:6;19690:9;19686:22;19665:53;:::i;:::-;19655:63;;19610:118;19116:619;;;;;:::o;19741:116::-;19811:21;19826:5;19811:21;:::i;:::-;19804:5;19801:32;19791:60;;19847:1;19844;19837:12;19791:60;19741:116;:::o;19863:133::-;19906:5;19944:6;19931:20;19922:29;;19960:30;19984:5;19960:30;:::i;:::-;19863:133;;;;:::o;20002:468::-;20067:6;20075;20124:2;20112:9;20103:7;20099:23;20095:32;20092:119;;;20130:79;;:::i;:::-;20092:119;20250:1;20275:53;20320:7;20311:6;20300:9;20296:22;20275:53;:::i;:::-;20265:63;;20221:117;20377:2;20403:50;20445:7;20436:6;20425:9;20421:22;20403:50;:::i;:::-;20393:60;;20348:115;20002:468;;;;;:::o;20493:568::-;20566:8;20576:6;20626:3;20619:4;20611:6;20607:17;20603:27;20593:122;;20634:79;;:::i;:::-;20593:122;20747:6;20734:20;20724:30;;20777:18;20769:6;20766:30;20763:117;;;20799:79;;:::i;:::-;20763:117;20913:4;20905:6;20901:17;20889:29;;20967:3;20959:4;20951:6;20947:17;20937:8;20933:32;20930:41;20927:128;;;20974:79;;:::i;:::-;20927:128;20493:568;;;;;:::o;21067:559::-;21153:6;21161;21210:2;21198:9;21189:7;21185:23;21181:32;21178:119;;;21216:79;;:::i;:::-;21178:119;21364:1;21353:9;21349:17;21336:31;21394:18;21386:6;21383:30;21380:117;;;21416:79;;:::i;:::-;21380:117;21529:80;21601:7;21592:6;21581:9;21577:22;21529:80;:::i;:::-;21511:98;;;;21307:312;21067:559;;;;;:::o;21632:323::-;21688:6;21737:2;21725:9;21716:7;21712:23;21708:32;21705:119;;;21743:79;;:::i;:::-;21705:119;21863:1;21888:50;21930:7;21921:6;21910:9;21906:22;21888:50;:::i;:::-;21878:60;;21834:114;21632:323;;;;:::o;21961:117::-;22070:1;22067;22060:12;22084:180;22132:77;22129:1;22122:88;22229:4;22226:1;22219:15;22253:4;22250:1;22243:15;22270:281;22353:27;22375:4;22353:27;:::i;:::-;22345:6;22341:40;22483:6;22471:10;22468:22;22447:18;22435:10;22432:34;22429:62;22426:88;;;22494:18;;:::i;:::-;22426:88;22534:10;22530:2;22523:22;22313:238;22270:281;;:::o;22557:129::-;22591:6;22618:20;;:::i;:::-;22608:30;;22647:33;22675:4;22667:6;22647:33;:::i;:::-;22557:129;;;:::o;22692:307::-;22753:4;22843:18;22835:6;22832:30;22829:56;;;22865:18;;:::i;:::-;22829:56;22903:29;22925:6;22903:29;:::i;:::-;22895:37;;22987:4;22981;22977:15;22969:23;;22692:307;;;:::o;23005:146::-;23102:6;23097:3;23092;23079:30;23143:1;23134:6;23129:3;23125:16;23118:27;23005:146;;;:::o;23157:423::-;23234:5;23259:65;23275:48;23316:6;23275:48;:::i;:::-;23259:65;:::i;:::-;23250:74;;23347:6;23340:5;23333:21;23385:4;23378:5;23374:16;23423:3;23414:6;23409:3;23405:16;23402:25;23399:112;;;23430:79;;:::i;:::-;23399:112;23520:54;23567:6;23562:3;23557;23520:54;:::i;:::-;23240:340;23157:423;;;;;:::o;23599:338::-;23654:5;23703:3;23696:4;23688:6;23684:17;23680:27;23670:122;;23711:79;;:::i;:::-;23670:122;23828:6;23815:20;23853:78;23927:3;23919:6;23912:4;23904:6;23900:17;23853:78;:::i;:::-;23844:87;;23660:277;23599:338;;;;:::o;23943:943::-;24038:6;24046;24054;24062;24111:3;24099:9;24090:7;24086:23;24082:33;24079:120;;;24118:79;;:::i;:::-;24079:120;24238:1;24263:53;24308:7;24299:6;24288:9;24284:22;24263:53;:::i;:::-;24253:63;;24209:117;24365:2;24391:53;24436:7;24427:6;24416:9;24412:22;24391:53;:::i;:::-;24381:63;;24336:118;24493:2;24519:53;24564:7;24555:6;24544:9;24540:22;24519:53;:::i;:::-;24509:63;;24464:118;24649:2;24638:9;24634:18;24621:32;24680:18;24672:6;24669:30;24666:117;;;24702:79;;:::i;:::-;24666:117;24807:62;24861:7;24852:6;24841:9;24837:22;24807:62;:::i;:::-;24797:72;;24592:287;23943:943;;;;;;;:::o;24964:876::-;25125:4;25120:3;25116:14;25212:4;25205:5;25201:16;25195:23;25231:63;25288:4;25283:3;25279:14;25265:12;25231:63;:::i;:::-;25140:164;25396:4;25389:5;25385:16;25379:23;25415:61;25470:4;25465:3;25461:14;25447:12;25415:61;:::i;:::-;25314:172;25570:4;25563:5;25559:16;25553:23;25589:57;25640:4;25635:3;25631:14;25617:12;25589:57;:::i;:::-;25496:160;25743:4;25736:5;25732:16;25726:23;25762:61;25817:4;25812:3;25808:14;25794:12;25762:61;:::i;:::-;25666:167;25094:746;24964:876;;:::o;25846:351::-;26003:4;26041:3;26030:9;26026:19;26018:27;;26055:135;26187:1;26176:9;26172:17;26163:6;26055:135;:::i;:::-;25846:351;;;;:::o;26203:180::-;26251:77;26248:1;26241:88;26348:4;26345:1;26338:15;26372:4;26369:1;26362:15;26389:114;26471:1;26464:5;26461:12;26451:46;;26477:18;;:::i;:::-;26451:46;26389:114;:::o;26509:129::-;26555:7;26584:5;26573:16;;26590:42;26626:5;26590:42;:::i;:::-;26509:129;;;:::o;26644:::-;26701:9;26734:33;26761:5;26734:33;:::i;:::-;26721:46;;26644:129;;;:::o;26779:145::-;26873:44;26911:5;26873:44;:::i;:::-;26868:3;26861:57;26779:145;;:::o;26930:236::-;27030:4;27068:2;27057:9;27053:18;27045:26;;27081:78;27156:1;27145:9;27141:17;27132:6;27081:78;:::i;:::-;26930:236;;;;:::o;27172:118::-;27259:24;27277:5;27259:24;:::i;:::-;27254:3;27247:37;27172:118;;:::o;27296:222::-;27389:4;27427:2;27416:9;27412:18;27404:26;;27440:71;27508:1;27497:9;27493:17;27484:6;27440:71;:::i;:::-;27296:222;;;;:::o;27524:474::-;27592:6;27600;27649:2;27637:9;27628:7;27624:23;27620:32;27617:119;;;27655:79;;:::i;:::-;27617:119;27775:1;27800:53;27845:7;27836:6;27825:9;27821:22;27800:53;:::i;:::-;27790:63;;27746:117;27902:2;27928:53;27973:7;27964:6;27953:9;27949:22;27928:53;:::i;:::-;27918:63;;27873:118;27524:474;;;;;:::o;28004:180::-;28052:77;28049:1;28042:88;28149:4;28146:1;28139:15;28173:4;28170:1;28163:15;28190:320;28234:6;28271:1;28265:4;28261:12;28251:22;;28318:1;28312:4;28308:12;28339:18;28329:81;;28395:4;28387:6;28383:17;28373:27;;28329:81;28457:2;28449:6;28446:14;28426:18;28423:38;28420:84;;28476:18;;:::i;:::-;28420:84;28241:269;28190:320;;;:::o;28516:180::-;28564:77;28561:1;28554:88;28661:4;28658:1;28651:15;28685:4;28682:1;28675:15;28702:191;28742:3;28761:20;28779:1;28761:20;:::i;:::-;28756:25;;28795:20;28813:1;28795:20;:::i;:::-;28790:25;;28838:1;28835;28831:9;28824:16;;28859:3;28856:1;28853:10;28850:36;;;28866:18;;:::i;:::-;28850:36;28702:191;;;;:::o;28899:410::-;28939:7;28962:20;28980:1;28962:20;:::i;:::-;28957:25;;28996:20;29014:1;28996:20;:::i;:::-;28991:25;;29051:1;29048;29044:9;29073:30;29091:11;29073:30;:::i;:::-;29062:41;;29252:1;29243:7;29239:15;29236:1;29233:22;29213:1;29206:9;29186:83;29163:139;;29282:18;;:::i;:::-;29163:139;28947:362;28899:410;;;;:::o;29315:180::-;29363:77;29360:1;29353:88;29460:4;29457:1;29450:15;29484:4;29481:1;29474:15;29501:185;29541:1;29558:20;29576:1;29558:20;:::i;:::-;29553:25;;29592:20;29610:1;29592:20;:::i;:::-;29587:25;;29631:1;29621:35;;29636:18;;:::i;:::-;29621:35;29678:1;29675;29671:9;29666:14;;29501:185;;;;:::o;29692:147::-;29793:11;29830:3;29815:18;;29692:147;;;;:::o;29845:114::-;;:::o;29965:398::-;30124:3;30145:83;30226:1;30221:3;30145:83;:::i;:::-;30138:90;;30237:93;30326:3;30237:93;:::i;:::-;30355:1;30350:3;30346:11;30339:18;;29965:398;;;:::o;30369:379::-;30553:3;30575:147;30718:3;30575:147;:::i;:::-;30568:154;;30739:3;30732:10;;30369:379;;;:::o;30754:97::-;30813:6;30841:3;30831:13;;30754:97;;;;:::o;30857:141::-;30906:4;30929:3;30921:11;;30952:3;30949:1;30942:14;30986:4;30983:1;30973:18;30965:26;;30857:141;;;:::o;31004:93::-;31041:6;31088:2;31083;31076:5;31072:14;31068:23;31058:33;;31004:93;;;:::o;31103:107::-;31147:8;31197:5;31191:4;31187:16;31166:37;;31103:107;;;;:::o;31216:393::-;31285:6;31335:1;31323:10;31319:18;31358:97;31388:66;31377:9;31358:97;:::i;:::-;31476:39;31506:8;31495:9;31476:39;:::i;:::-;31464:51;;31548:4;31544:9;31537:5;31533:21;31524:30;;31597:4;31587:8;31583:19;31576:5;31573:30;31563:40;;31292:317;;31216:393;;;;;:::o;31615:60::-;31643:3;31664:5;31657:12;;31615:60;;;:::o;31681:142::-;31731:9;31764:53;31782:34;31791:24;31809:5;31791:24;:::i;:::-;31782:34;:::i;:::-;31764:53;:::i;:::-;31751:66;;31681:142;;;:::o;31829:75::-;31872:3;31893:5;31886:12;;31829:75;;;:::o;31910:269::-;32020:39;32051:7;32020:39;:::i;:::-;32081:91;32130:41;32154:16;32130:41;:::i;:::-;32122:6;32115:4;32109:11;32081:91;:::i;:::-;32075:4;32068:105;31986:193;31910:269;;;:::o;32185:73::-;32230:3;32185:73;:::o;32264:189::-;32341:32;;:::i;:::-;32382:65;32440:6;32432;32426:4;32382:65;:::i;:::-;32317:136;32264:189;;:::o;32459:186::-;32519:120;32536:3;32529:5;32526:14;32519:120;;;32590:39;32627:1;32620:5;32590:39;:::i;:::-;32563:1;32556:5;32552:13;32543:22;;32519:120;;;32459:186;;:::o;32651:543::-;32752:2;32747:3;32744:11;32741:446;;;32786:38;32818:5;32786:38;:::i;:::-;32870:29;32888:10;32870:29;:::i;:::-;32860:8;32856:44;33053:2;33041:10;33038:18;33035:49;;;33074:8;33059:23;;33035:49;33097:80;33153:22;33171:3;33153:22;:::i;:::-;33143:8;33139:37;33126:11;33097:80;:::i;:::-;32756:431;;32741:446;32651:543;;;:::o;33200:117::-;33254:8;33304:5;33298:4;33294:16;33273:37;;33200:117;;;;:::o;33323:169::-;33367:6;33400:51;33448:1;33444:6;33436:5;33433:1;33429:13;33400:51;:::i;:::-;33396:56;33481:4;33475;33471:15;33461:25;;33374:118;33323:169;;;;:::o;33497:295::-;33573:4;33719:29;33744:3;33738:4;33719:29;:::i;:::-;33711:37;;33781:3;33778:1;33774:11;33768:4;33765:21;33757:29;;33497:295;;;;:::o;33797:1403::-;33921:44;33961:3;33956;33921:44;:::i;:::-;34030:18;34022:6;34019:30;34016:56;;;34052:18;;:::i;:::-;34016:56;34096:38;34128:4;34122:11;34096:38;:::i;:::-;34181:67;34241:6;34233;34227:4;34181:67;:::i;:::-;34275:1;34304:2;34296:6;34293:14;34321:1;34316:632;;;;34992:1;35009:6;35006:84;;;35065:9;35060:3;35056:19;35043:33;35034:42;;35006:84;35116:67;35176:6;35169:5;35116:67;:::i;:::-;35110:4;35103:81;34965:229;34286:908;;34316:632;34368:4;34364:9;34356:6;34352:22;34402:37;34434:4;34402:37;:::i;:::-;34461:1;34475:215;34489:7;34486:1;34483:14;34475:215;;;34575:9;34570:3;34566:19;34553:33;34545:6;34538:49;34626:1;34618:6;34614:14;34604:24;;34673:2;34662:9;34658:18;34645:31;;34512:4;34509:1;34505:12;34500:17;;34475:215;;;34718:6;34709:7;34706:19;34703:186;;;34783:9;34778:3;34774:19;34761:33;34826:48;34868:4;34860:6;34856:17;34845:9;34826:48;:::i;:::-;34818:6;34811:64;34726:163;34703:186;34935:1;34931;34923:6;34919:14;34915:22;34909:4;34902:36;34323:625;;;34286:908;;33896:1304;;;33797:1403;;;:::o;35206:180::-;35254:77;35251:1;35244:88;35351:4;35348:1;35341:15;35375:4;35372:1;35365:15;35392:194;35432:4;35452:20;35470:1;35452:20;:::i;:::-;35447:25;;35486:20;35504:1;35486:20;:::i;:::-;35481:25;;35530:1;35527;35523:9;35515:17;;35554:1;35548:4;35545:11;35542:37;;;35559:18;;:::i;:::-;35542:37;35392:194;;;;:::o;35592:188::-;35630:3;35649:18;35665:1;35649:18;:::i;:::-;35644:23;;35681:18;35697:1;35681:18;:::i;:::-;35676:23;;35722:1;35719;35715:9;35708:16;;35745:4;35740:3;35737:13;35734:39;;;35753:18;;:::i;:::-;35734:39;35592:188;;;;:::o;35786:148::-;35888:11;35925:3;35910:18;;35786:148;;;;:::o;35940:390::-;36046:3;36074:39;36107:5;36074:39;:::i;:::-;36129:89;36211:6;36206:3;36129:89;:::i;:::-;36122:96;;36227:65;36285:6;36280:3;36273:4;36266:5;36262:16;36227:65;:::i;:::-;36317:6;36312:3;36308:16;36301:23;;36050:280;35940:390;;;;:::o;36336:435::-;36516:3;36538:95;36629:3;36620:6;36538:95;:::i;:::-;36531:102;;36650:95;36741:3;36732:6;36650:95;:::i;:::-;36643:102;;36762:3;36755:10;;36336:435;;;;;:::o;36777:225::-;36917:34;36913:1;36905:6;36901:14;36894:58;36986:8;36981:2;36973:6;36969:15;36962:33;36777:225;:::o;37008:366::-;37150:3;37171:67;37235:2;37230:3;37171:67;:::i;:::-;37164:74;;37247:93;37336:3;37247:93;:::i;:::-;37365:2;37360:3;37356:12;37349:19;;37008:366;;;:::o;37380:419::-;37546:4;37584:2;37573:9;37569:18;37561:26;;37633:9;37627:4;37623:20;37619:1;37608:9;37604:17;37597:47;37661:131;37787:4;37661:131;:::i;:::-;37653:139;;37380:419;;;:::o;37805:182::-;37945:34;37941:1;37933:6;37929:14;37922:58;37805:182;:::o;37993:366::-;38135:3;38156:67;38220:2;38215:3;38156:67;:::i;:::-;38149:74;;38232:93;38321:3;38232:93;:::i;:::-;38350:2;38345:3;38341:12;38334:19;;37993:366;;;:::o;38365:419::-;38531:4;38569:2;38558:9;38554:18;38546:26;;38618:9;38612:4;38608:20;38604:1;38593:9;38589:17;38582:47;38646:131;38772:4;38646:131;:::i;:::-;38638:139;;38365:419;;;:::o;38790:229::-;38930:34;38926:1;38918:6;38914:14;38907:58;38999:12;38994:2;38986:6;38982:15;38975:37;38790:229;:::o;39025:366::-;39167:3;39188:67;39252:2;39247:3;39188:67;:::i;:::-;39181:74;;39264:93;39353:3;39264:93;:::i;:::-;39382:2;39377:3;39373:12;39366:19;;39025:366;;;:::o;39397:419::-;39563:4;39601:2;39590:9;39586:18;39578:26;;39650:9;39644:4;39640:20;39636:1;39625:9;39621:17;39614:47;39678:131;39804:4;39678:131;:::i;:::-;39670:139;;39397:419;;;:::o;39822:175::-;39962:27;39958:1;39950:6;39946:14;39939:51;39822:175;:::o;40003:366::-;40145:3;40166:67;40230:2;40225:3;40166:67;:::i;:::-;40159:74;;40242:93;40331:3;40242:93;:::i;:::-;40360:2;40355:3;40351:12;40344:19;;40003:366;;;:::o;40375:419::-;40541:4;40579:2;40568:9;40564:18;40556:26;;40628:9;40622:4;40618:20;40614:1;40603:9;40599:17;40592:47;40656:131;40782:4;40656:131;:::i;:::-;40648:139;;40375:419;;;:::o;40800:94::-;40833:8;40881:5;40877:2;40873:14;40852:35;;40800:94;;;:::o;40900:::-;40939:7;40968:20;40982:5;40968:20;:::i;:::-;40957:31;;40900:94;;;:::o;41000:100::-;41039:7;41068:26;41088:5;41068:26;:::i;:::-;41057:37;;41000:100;;;:::o;41106:157::-;41211:45;41231:24;41249:5;41231:24;:::i;:::-;41211:45;:::i;:::-;41206:3;41199:58;41106:157;;:::o;41269:256::-;41381:3;41396:75;41467:3;41458:6;41396:75;:::i;:::-;41496:2;41491:3;41487:12;41480:19;;41516:3;41509:10;;41269:256;;;;:::o;41531:98::-;41582:6;41616:5;41610:12;41600:22;;41531:98;;;:::o;41635:168::-;41718:11;41752:6;41747:3;41740:19;41792:4;41787:3;41783:14;41768:29;;41635:168;;;;:::o;41809:373::-;41895:3;41923:38;41955:5;41923:38;:::i;:::-;41977:70;42040:6;42035:3;41977:70;:::i;:::-;41970:77;;42056:65;42114:6;42109:3;42102:4;42095:5;42091:16;42056:65;:::i;:::-;42146:29;42168:6;42146:29;:::i;:::-;42141:3;42137:39;42130:46;;41899:283;41809:373;;;;:::o;42188:640::-;42383:4;42421:3;42410:9;42406:19;42398:27;;42435:71;42503:1;42492:9;42488:17;42479:6;42435:71;:::i;:::-;42516:72;42584:2;42573:9;42569:18;42560:6;42516:72;:::i;:::-;42598;42666:2;42655:9;42651:18;42642:6;42598:72;:::i;:::-;42717:9;42711:4;42707:20;42702:2;42691:9;42687:18;42680:48;42745:76;42816:4;42807:6;42745:76;:::i;:::-;42737:84;;42188:640;;;;;;;:::o;42834:141::-;42890:5;42921:6;42915:13;42906:22;;42937:32;42963:5;42937:32;:::i;:::-;42834:141;;;;:::o;42981:349::-;43050:6;43099:2;43087:9;43078:7;43074:23;43070:32;43067:119;;;43105:79;;:::i;:::-;43067:119;43225:1;43250:63;43305:7;43296:6;43285:9;43281:22;43250:63;:::i;:::-;43240:73;;43196:127;42981:349;;;;:::o;43336:233::-;43375:3;43398:24;43416:5;43398:24;:::i;:::-;43389:33;;43444:66;43437:5;43434:77;43431:103;;43514:18;;:::i;:::-;43431:103;43561:1;43554:5;43550:13;43543:20;;43336:233;;;:::o

Swarm Source

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