ETH Price: $3,884.22 (+0.95%)

Flameheads (FH)
 

Overview

TokenID

189

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

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

Click here to update the token information / general information
# 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 constant MINT_PRICE = 0.006 ether;
  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 - 666) 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 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":[{"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":[{"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":"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":"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"}]

60806040526001600b60016101000a81548160ff02191690831515021790555060405180602001604052806000815250600e90816200003f919062000759565b503480156200004d57600080fd5b506040516200528c3803806200528c8339818101604052810190620000739190620008aa565b6040518060400160405280600a81526020017f466c616d656865616473000000000000000000000000000000000000000000008152506040518060400160405280600281526020017f4648000000000000000000000000000000000000000000000000000000000000815250620000ff620000f3620001ba60201b60201c565b620001c260201b60201c565b816003908162000110919062000759565b50806004908162000122919062000759565b50620001336200028660201b60201c565b600181905550505060006002811115620001525762000151620008dc565b5b600b60006101000a81548160ff02191690836002811115620001795762000178620008dc565b5b02179055506200018f81620001c260201b60201c565b6200019f6200028f60201b60201c565b620001b38161012c620002b860201b60201c565b5062000a26565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006001905090565b620002b6733cc6cdda760b79bafa08df41ecfa224f810dceb660016200045b60201b60201c565b565b620002c8620004d560201b60201c565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff16111562000329576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003209062000992565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200039b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003929062000a04565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600960008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b637d3e3dbe8260601b60601c9250816200048a57826200048257634420e48690506200048a565b63a0af290390505b8060e01b60005230600452826024526004600060446000806daaeb6d7670e522a718067333cd4e5af1620004cb578060005160e01c03620004ca57600080fd5b5b6000602452505050565b6000612710905090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200056157607f821691505b60208210810362000577576200057662000519565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620005e17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620005a2565b620005ed8683620005a2565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200063a620006346200062e8462000605565b6200060f565b62000605565b9050919050565b6000819050919050565b620006568362000619565b6200066e620006658262000641565b848454620005af565b825550505050565b600090565b6200068562000676565b620006928184846200064b565b505050565b5b81811015620006ba57620006ae6000826200067b565b60018101905062000698565b5050565b601f8211156200070957620006d3816200057d565b620006de8462000592565b81016020851015620006ee578190505b62000706620006fd8562000592565b83018262000697565b50505b505050565b600082821c905092915050565b60006200072e600019846008026200070e565b1980831691505092915050565b60006200074983836200071b565b9150826002028217905092915050565b6200076482620004df565b67ffffffffffffffff81111562000780576200077f620004ea565b5b6200078c825462000548565b62000799828285620006be565b600060209050601f831160018114620007d15760008415620007bc578287015190505b620007c885826200073b565b86555062000838565b601f198416620007e1866200057d565b60005b828110156200080b57848901518255600182019150602085019450602081019050620007e4565b868310156200082b578489015162000827601f8916826200071b565b8355505b6001600288020188555050505b505050505050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620008728262000845565b9050919050565b620008848162000865565b81146200089057600080fd5b50565b600081519050620008a48162000879565b92915050565b600060208284031215620008c357620008c262000840565b5b6000620008d38482850162000893565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600082825260208201905092915050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b60006200097a602a836200090b565b915062000987826200091c565b604082019050919050565b60006020820190508181036000830152620009ad816200096b565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b6000620009ec6019836200090b565b9150620009f982620009b4565b602082019050919050565b6000602082019050818103600083015262000a1f81620009dd565b9050919050565b6148568062000a366000396000f3fe60806040526004361061023b5760003560e01c8063715018a61161012e578063b88d4fde116100ab578063d6492d811161006f578063d6492d8114610858578063e985e9c514610883578063f2fde38b146108c0578063f8b89dfb146108e9578063fb796e6c146109125761023b565b8063b88d4fde1461076c578063c002d23d14610788578063c23dc68f146107b3578063c87b56dd146107f0578063cbccefb21461082d5761023b565b806395d89b41116100f257806395d89b411461069657806399a2557a146106c1578063a22cb465146106fe578063ae7a9b0c14610727578063b7c0b8e8146107435761023b565b8063715018a6146105c35780637cb64759146105da578063828122ab146106035780638462151c1461062e5780638da5cb5b1461066b5761023b565b806332cb6b0c116101bc5780635ade26c6116101805780635ade26c6146104c55780635bbb2177146104f05780636352211e1461052d5780636ecd23061461056a57806370a08231146105865761023b565b806332cb6b0c146104155780633ccfd60b1461044057806342842e0e1461045757806342966c681461047357806355f804b31461049c5761023b565b806318160ddd1161020357806318160ddd1461032a5780631ac08c1f146103555780631b1f40191461039257806323b872dd146103bb5780632a55205a146103d75761023b565b806301ffc9a71461024057806304634d8d1461027d57806306fdde03146102a6578063081812fc146102d1578063095ea7b31461030e575b600080fd5b34801561024c57600080fd5b50610267600480360381019061026291906131d3565b61093d565b604051610274919061321b565b60405180910390f35b34801561028957600080fd5b506102a4600480360381019061029f91906132d8565b61095f565b005b3480156102b257600080fd5b506102bb610975565b6040516102c891906133a8565b60405180910390f35b3480156102dd57600080fd5b506102f860048036038101906102f39190613400565b610a07565b604051610305919061343c565b60405180910390f35b61032860048036038101906103239190613457565b610a86565b005b34801561033657600080fd5b5061033f610abb565b60405161034c91906134a6565b60405180910390f35b34801561036157600080fd5b5061037c600480360381019061037791906134c1565b610ad2565b604051610389919061350a565b60405180910390f35b34801561039e57600080fd5b506103b960048036038101906103b4919061355f565b610af2565b005b6103d560048036038101906103d0919061358c565b610b5d565b005b3480156103e357600080fd5b506103fe60048036038101906103f991906135df565b610bc8565b60405161040c92919061361f565b60405180910390f35b34801561042157600080fd5b5061042a610db2565b60405161043791906134a6565b60405180910390f35b34801561044c57600080fd5b50610455610db8565b005b610471600480360381019061046c919061358c565b610e6d565b005b34801561047f57600080fd5b5061049a60048036038101906104959190613400565b610ed8565b005b3480156104a857600080fd5b506104c360048036038101906104be91906136ad565b610ee6565b005b3480156104d157600080fd5b506104da610f04565b6040516104e791906134a6565b60405180910390f35b3480156104fc57600080fd5b5061051760048036038101906105129190613750565b610f09565b6040516105249190613900565b60405180910390f35b34801561053957600080fd5b50610554600480360381019061054f9190613400565b610fcc565b604051610561919061343c565b60405180910390f35b610584600480360381019061057f919061394e565b610fde565b005b34801561059257600080fd5b506105ad60048036038101906105a891906134c1565b611157565b6040516105ba91906134a6565b60405180910390f35b3480156105cf57600080fd5b506105d861120f565b005b3480156105e657600080fd5b5061060160048036038101906105fc91906139b1565b611223565b005b34801561060f57600080fd5b50610618611235565b60405161062591906134a6565b60405180910390f35b34801561063a57600080fd5b50610655600480360381019061065091906134c1565b61123a565b6040516106629190613a9c565b60405180910390f35b34801561067757600080fd5b5061068061137d565b60405161068d919061343c565b60405180910390f35b3480156106a257600080fd5b506106ab6113a6565b6040516106b891906133a8565b60405180910390f35b3480156106cd57600080fd5b506106e860048036038101906106e39190613abe565b611438565b6040516106f59190613a9c565b60405180910390f35b34801561070a57600080fd5b5061072560048036038101906107209190613b3d565b611644565b005b610741600480360381019061073c9190613bd3565b611679565b005b34801561074f57600080fd5b5061076a60048036038101906107659190613c20565b61189b565b005b61078660048036038101906107819190613d7d565b6118c0565b005b34801561079457600080fd5b5061079d61192d565b6040516107aa91906134a6565b60405180910390f35b3480156107bf57600080fd5b506107da60048036038101906107d59190613400565b611938565b6040516107e79190613e55565b60405180910390f35b3480156107fc57600080fd5b5061081760048036038101906108129190613400565b6119a2565b60405161082491906133a8565b60405180910390f35b34801561083957600080fd5b50610842611a40565b60405161084f9190613ee7565b60405180910390f35b34801561086457600080fd5b5061086d611a53565b60405161087a9190613f11565b60405180910390f35b34801561088f57600080fd5b506108aa60048036038101906108a59190613f2c565b611a59565b6040516108b7919061321b565b60405180910390f35b3480156108cc57600080fd5b506108e760048036038101906108e291906134c1565b611aed565b005b3480156108f557600080fd5b50610910600480360381019061090b919061394e565b611b70565b005b34801561091e57600080fd5b50610927611bba565b604051610934919061321b565b60405180910390f35b600061094882611bcd565b80610958575061095782611c5f565b5b9050919050565b610967611cd9565b6109718282611d57565b5050565b60606003805461098490613f9b565b80601f01602080910402602001604051908101604052809291908181526020018280546109b090613f9b565b80156109fd5780601f106109d2576101008083540402835291602001916109fd565b820191906000526020600020905b8154815290600101906020018083116109e057829003601f168201915b5050505050905090565b6000610a1282611eec565b610a48576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81610a9081611f4b565b610aac57610a9c611f97565b15610aab57610aaa81611fae565b5b5b610ab68383611ff2565b505050565b6000610ac5612136565b6002546001540303905090565b600d6020528060005260406000206000915054906101000a900460ff1681565b610afa611cd9565b611a0a8161ffff16610b0a61213f565b610b149190613ffb565b1115610b4c576040517fd05cb60900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b5a338261ffff16612152565b50565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610bb757610b9a33611f4b565b610bb657610ba6611f97565b15610bb557610bb433611fae565b5b5b5b610bc284848461230e565b50505050565b6000806000600a60008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610d5d5760096040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610d67612630565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610d93919061402f565b610d9d91906140a0565b90508160000151819350935050509250929050565b611a0a81565b610dc0611cd9565b6000610dca61137d565b73ffffffffffffffffffffffffffffffffffffffff1647604051610ded90614102565b60006040518083038185875af1925050503d8060008114610e2a576040519150601f19603f3d011682016040523d82523d6000602084013e610e2f565b606091505b5050905080610e6a576040517f27fcd9d100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ec757610eaa33611f4b565b610ec657610eb6611f97565b15610ec557610ec433611fae565b5b5b5b610ed284848461263a565b50505050565b610ee381600161265a565b50565b610eee611cd9565b8181600e9182610eff9291906142ce565b505050565b600681565b6060600083839050905060008167ffffffffffffffff811115610f2f57610f2e613c52565b5b604051908082528060200260200182016040528015610f6857816020015b610f55613118565b815260200190600190039081610f4d5790505b50905060005b828114610fc057610f97868683818110610f8b57610f8a61439e565b5b90506020020135611938565b828281518110610faa57610fa961439e565b5b6020026020010181905250806001019050610f6e565b50809250505092915050565b6000610fd7826128ac565b9050919050565b600280811115610ff157610ff0613e70565b5b600281111561100357611002613e70565b5b600b60009054906101000a900460ff16600281111561102557611024613e70565b5b1461105c576040517feb56075600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61029a611a0a61106c91906143cd565b8160ff1661107861213f565b6110829190613ffb565b11156110ba576040517fd05cb60900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60068160ff1611156110f8576040517f4b231f9500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b661550f7dca700008160ff1661110e919061402f565b341015611147576040517f31fc877f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611154338260ff16612152565b50565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036111be576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611217611cd9565b6112216000612978565b565b61122b611cd9565b80600c8190555050565b600181565b6060600080600061124a85611157565b905060008167ffffffffffffffff81111561126857611267613c52565b5b6040519080825280602002602001820160405280156112965781602001602082028036833780820191505090505b5090506112a1613118565b60006112ab612136565b90505b83861461136f576112be81612a3c565b9150816040015161136457600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461130957816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361136357808387806001019850815181106113565761135561439e565b5b6020026020010181815250505b5b8060010190506112ae565b508195505050505050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546113b590613f9b565b80601f01602080910402602001604051908101604052809291908181526020018280546113e190613f9b565b801561142e5780601f106114035761010080835404028352916020019161142e565b820191906000526020600020905b81548152906001019060200180831161141157829003601f168201915b5050505050905090565b6060818310611473576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061147e612a67565b9050611488612136565b85101561149a57611497612136565b94505b808411156114a6578093505b60006114b187611157565b9050848610156114d45760008686039050818110156114ce578091505b506114d9565b600090505b60008167ffffffffffffffff8111156114f5576114f4613c52565b5b6040519080825280602002602001820160405280156115235781602001602082028036833780820191505090505b5090506000820361153a578094505050505061163d565b600061154588611938565b90506000816040015161155a57816000015190505b60008990505b8881141580156115705750848714155b1561162f5761157e81612a3c565b9250826040015161162457600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff16146115c957826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361162357808488806001019950815181106116165761161561439e565b5b6020026020010181815250505b5b806001019050611560565b508583528296505050505050505b9392505050565b8161164e81611f4b565b61166a5761165a611f97565b156116695761166881611fae565b5b5b6116748383612a71565b505050565b6001600281111561168d5761168c613e70565b5b600281111561169f5761169e613e70565b5b600b60009054906101000a900460ff1660028111156116c1576116c0613e70565b5b146116f8576040517feb56075600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60011515611707338484612b7c565b151514611740576040517f9114b24300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611a0a600161174d61213f565b6117579190613ffb565b111561178f576040517fd05cb60900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1603611818576040517fd330f98500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900460ff166118749190614401565b92506101000a81548160ff021916908360ff160217905550611897336001612152565b5050565b6118a3611cd9565b80600b60016101000a81548160ff02191690831515021790555050565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461191a576118fd33611f4b565b61191957611909611f97565b156119185761191733611fae565b5b5b5b61192685858585612bfb565b5050505050565b661550f7dca7000081565b611940613118565b611948613118565b611950612136565b8310806119645750611960612a67565b8310155b15611972578091505061199d565b61197b83612a3c565b9050806040015115611990578091505061199d565b61199983612c6e565b9150505b919050565b60606119ad82611eec565b6119e3576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006119ed612c8e565b90506000815103611a0d5760405180602001604052806000815250611a38565b80611a1784612d20565b604051602001611a28929190614472565b6040516020818303038152906040525b915050919050565b600b60009054906101000a900460ff1681565b600c5481565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611af5611cd9565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5b90614508565b60405180910390fd5b611b6d81612978565b50565b611b78611cd9565b8060ff166002811115611b8e57611b8d613e70565b5b600b60006101000a81548160ff02191690836002811115611bb257611bb1613e70565b5b021790555050565b600b60019054906101000a900460ff1681565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611c2857506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611c585750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611cd25750611cd182611bcd565b5b9050919050565b611ce1612d70565b73ffffffffffffffffffffffffffffffffffffffff16611cff61137d565b73ffffffffffffffffffffffffffffffffffffffff1614611d55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4c90614574565b60405180910390fd5b565b611d5f612630565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115611dbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db490614606565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611e2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2390614672565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600960008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b600081611ef7612136565b11158015611f06575060015482105b8015611f44575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b6000731e0049783f008a0085193e00003d00cd54003c7173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b6000600b60019054906101000a900460ff16905090565b69c617113400112233445560005230601a5280603a52600080604460166daaeb6d7670e522a718067333cd4e5afa611fea573d6000803e3d6000fd5b6000603a5250565b6000611ffd82610fcc565b90508073ffffffffffffffffffffffffffffffffffffffff1661201e612d78565b73ffffffffffffffffffffffffffffffffffffffff16146120815761204a81612045612d78565b611a59565b612080576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b6000612149612136565b60015403905090565b6000600154905060008203612193576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6121a06000848385612d80565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612217836122086000866000612d86565b61221185612dae565b17612dbe565b6005600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b8181146122b857808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460018101905061227d565b50600082036122f3576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060018190555050506123096000848385612de9565b505050565b6000612319826128ac565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612380576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061238c84612def565b915091506123a2818761239d612d78565b612e16565b6123ee576123b7866123b2612d78565b611a59565b6123ed576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612454576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6124618686866001612d80565b801561246c57600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061253a85612516888887612d86565b7c020000000000000000000000000000000000000000000000000000000017612dbe565b600560008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036125c057600060018501905060006005600083815260200190815260200160002054036125be5760015481146125bd578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46126288686866001612de9565b505050505050565b6000612710905090565b612655838383604051806020016040528060008152506118c0565b505050565b6000612665836128ac565b9050600081905060008061267886612def565b9150915084156126e157612694818461268f612d78565b612e16565b6126e0576126a9836126a4612d78565b611a59565b6126df576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b6126ef836000886001612d80565b80156126fa57600082555b600160806001901b03600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506127a28361275f85600088612d86565b7c02000000000000000000000000000000000000000000000000000000007c01000000000000000000000000000000000000000000000000000000001717612dbe565b600560008881526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008516036128285760006001870190506000600560008381526020019081526020016000205403612826576001548114612825578460056000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612892836000886001612de9565b600260008154809291906001019190505550505050505050565b600080829050806128bb612136565b11612941576001548110156129405760006005600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082160361293e575b6000810361293457600560008360019003935083815260200190815260200160002054905061290a565b8092505050612973565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612a44613118565b612a606005600084815260200190815260200160002054612e5a565b9050919050565b6000600154905090565b8060086000612a7e612d78565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612b2b612d78565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612b70919061321b565b60405180910390a35050565b6000612bf2838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600c5486604051602001612bd791906146da565b60405160208183030381529060405280519060200120612f10565b90509392505050565b612c06848484610b5d565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612c6857612c3184848484612f27565b612c67576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b612c76613118565b612c87612c82836128ac565b612e5a565b9050919050565b6060600e8054612c9d90613f9b565b80601f0160208091040260200160405190810160405280929190818152602001828054612cc990613f9b565b8015612d165780601f10612ceb57610100808354040283529160200191612d16565b820191906000526020600020905b815481529060010190602001808311612cf957829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b600115612d5b57600184039350600a81066030018453600a8104905080612d39575b50828103602084039350808452505050919050565b600033905090565b600033905090565b50505050565b60008060e883901c905060e8612d9d868684613077565b62ffffff16901b9150509392505050565b60006001821460e11b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60008060006007600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b612e62613118565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b600082612f1d8584613080565b1490509392505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612f4d612d78565b8786866040518563ffffffff1660e01b8152600401612f6f949392919061474a565b6020604051808303816000875af1925050508015612fab57506040513d601f19601f82011682018060405250810190612fa891906147ab565b60015b613024573d8060008114612fdb576040519150601f19603f3d011682016040523d82523d6000602084013e612fe0565b606091505b50600081510361301c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60009392505050565b60008082905060005b84518110156130cb576130b6828683815181106130a9576130a861439e565b5b60200260200101516130d6565b915080806130c3906147d8565b915050613089565b508091505092915050565b60008183106130ee576130e98284613101565b6130f9565b6130f88383613101565b5b905092915050565b600082600052816020526040600020905092915050565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6131b08161317b565b81146131bb57600080fd5b50565b6000813590506131cd816131a7565b92915050565b6000602082840312156131e9576131e8613171565b5b60006131f7848285016131be565b91505092915050565b60008115159050919050565b61321581613200565b82525050565b6000602082019050613230600083018461320c565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061326182613236565b9050919050565b61327181613256565b811461327c57600080fd5b50565b60008135905061328e81613268565b92915050565b60006bffffffffffffffffffffffff82169050919050565b6132b581613294565b81146132c057600080fd5b50565b6000813590506132d2816132ac565b92915050565b600080604083850312156132ef576132ee613171565b5b60006132fd8582860161327f565b925050602061330e858286016132c3565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613352578082015181840152602081019050613337565b60008484015250505050565b6000601f19601f8301169050919050565b600061337a82613318565b6133848185613323565b9350613394818560208601613334565b61339d8161335e565b840191505092915050565b600060208201905081810360008301526133c2818461336f565b905092915050565b6000819050919050565b6133dd816133ca565b81146133e857600080fd5b50565b6000813590506133fa816133d4565b92915050565b60006020828403121561341657613415613171565b5b6000613424848285016133eb565b91505092915050565b61343681613256565b82525050565b6000602082019050613451600083018461342d565b92915050565b6000806040838503121561346e5761346d613171565b5b600061347c8582860161327f565b925050602061348d858286016133eb565b9150509250929050565b6134a0816133ca565b82525050565b60006020820190506134bb6000830184613497565b92915050565b6000602082840312156134d7576134d6613171565b5b60006134e58482850161327f565b91505092915050565b600060ff82169050919050565b613504816134ee565b82525050565b600060208201905061351f60008301846134fb565b92915050565b600061ffff82169050919050565b61353c81613525565b811461354757600080fd5b50565b60008135905061355981613533565b92915050565b60006020828403121561357557613574613171565b5b60006135838482850161354a565b91505092915050565b6000806000606084860312156135a5576135a4613171565b5b60006135b38682870161327f565b93505060206135c48682870161327f565b92505060406135d5868287016133eb565b9150509250925092565b600080604083850312156135f6576135f5613171565b5b6000613604858286016133eb565b9250506020613615858286016133eb565b9150509250929050565b6000604082019050613634600083018561342d565b6136416020830184613497565b9392505050565b600080fd5b600080fd5b600080fd5b60008083601f84011261366d5761366c613648565b5b8235905067ffffffffffffffff81111561368a5761368961364d565b5b6020830191508360018202830111156136a6576136a5613652565b5b9250929050565b600080602083850312156136c4576136c3613171565b5b600083013567ffffffffffffffff8111156136e2576136e1613176565b5b6136ee85828601613657565b92509250509250929050565b60008083601f8401126137105761370f613648565b5b8235905067ffffffffffffffff81111561372d5761372c61364d565b5b60208301915083602082028301111561374957613748613652565b5b9250929050565b6000806020838503121561376757613766613171565b5b600083013567ffffffffffffffff81111561378557613784613176565b5b613791858286016136fa565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6137d281613256565b82525050565b600067ffffffffffffffff82169050919050565b6137f5816137d8565b82525050565b61380481613200565b82525050565b600062ffffff82169050919050565b6138228161380a565b82525050565b60808201600082015161383e60008501826137c9565b50602082015161385160208501826137ec565b50604082015161386460408501826137fb565b5060608201516138776060850182613819565b50505050565b60006138898383613828565b60808301905092915050565b6000602082019050919050565b60006138ad8261379d565b6138b781856137a8565b93506138c2836137b9565b8060005b838110156138f35781516138da888261387d565b97506138e583613895565b9250506001810190506138c6565b5085935050505092915050565b6000602082019050818103600083015261391a81846138a2565b905092915050565b61392b816134ee565b811461393657600080fd5b50565b60008135905061394881613922565b92915050565b60006020828403121561396457613963613171565b5b600061397284828501613939565b91505092915050565b6000819050919050565b61398e8161397b565b811461399957600080fd5b50565b6000813590506139ab81613985565b92915050565b6000602082840312156139c7576139c6613171565b5b60006139d58482850161399c565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613a13816133ca565b82525050565b6000613a258383613a0a565b60208301905092915050565b6000602082019050919050565b6000613a49826139de565b613a5381856139e9565b9350613a5e836139fa565b8060005b83811015613a8f578151613a768882613a19565b9750613a8183613a31565b925050600181019050613a62565b5085935050505092915050565b60006020820190508181036000830152613ab68184613a3e565b905092915050565b600080600060608486031215613ad757613ad6613171565b5b6000613ae58682870161327f565b9350506020613af6868287016133eb565b9250506040613b07868287016133eb565b9150509250925092565b613b1a81613200565b8114613b2557600080fd5b50565b600081359050613b3781613b11565b92915050565b60008060408385031215613b5457613b53613171565b5b6000613b628582860161327f565b9250506020613b7385828601613b28565b9150509250929050565b60008083601f840112613b9357613b92613648565b5b8235905067ffffffffffffffff811115613bb057613baf61364d565b5b602083019150836020820283011115613bcc57613bcb613652565b5b9250929050565b60008060208385031215613bea57613be9613171565b5b600083013567ffffffffffffffff811115613c0857613c07613176565b5b613c1485828601613b7d565b92509250509250929050565b600060208284031215613c3657613c35613171565b5b6000613c4484828501613b28565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613c8a8261335e565b810181811067ffffffffffffffff82111715613ca957613ca8613c52565b5b80604052505050565b6000613cbc613167565b9050613cc88282613c81565b919050565b600067ffffffffffffffff821115613ce857613ce7613c52565b5b613cf18261335e565b9050602081019050919050565b82818337600083830152505050565b6000613d20613d1b84613ccd565b613cb2565b905082815260208101848484011115613d3c57613d3b613c4d565b5b613d47848285613cfe565b509392505050565b600082601f830112613d6457613d63613648565b5b8135613d74848260208601613d0d565b91505092915050565b60008060008060808587031215613d9757613d96613171565b5b6000613da58782880161327f565b9450506020613db68782880161327f565b9350506040613dc7878288016133eb565b925050606085013567ffffffffffffffff811115613de857613de7613176565b5b613df487828801613d4f565b91505092959194509250565b608082016000820151613e1660008501826137c9565b506020820151613e2960208501826137ec565b506040820151613e3c60408501826137fb565b506060820151613e4f6060850182613819565b50505050565b6000608082019050613e6a6000830184613e00565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60038110613eb057613eaf613e70565b5b50565b6000819050613ec182613e9f565b919050565b6000613ed182613eb3565b9050919050565b613ee181613ec6565b82525050565b6000602082019050613efc6000830184613ed8565b92915050565b613f0b8161397b565b82525050565b6000602082019050613f266000830184613f02565b92915050565b60008060408385031215613f4357613f42613171565b5b6000613f518582860161327f565b9250506020613f628582860161327f565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613fb357607f821691505b602082108103613fc657613fc5613f6c565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614006826133ca565b9150614011836133ca565b925082820190508082111561402957614028613fcc565b5b92915050565b600061403a826133ca565b9150614045836133ca565b9250828202614053816133ca565b9150828204841483151761406a57614069613fcc565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006140ab826133ca565b91506140b6836133ca565b9250826140c6576140c5614071565b5b828204905092915050565b600081905092915050565b50565b60006140ec6000836140d1565b91506140f7826140dc565b600082019050919050565b600061410d826140df565b9150819050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026141847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614147565b61418e8683614147565b95508019841693508086168417925050509392505050565b6000819050919050565b60006141cb6141c66141c1846133ca565b6141a6565b6133ca565b9050919050565b6000819050919050565b6141e5836141b0565b6141f96141f1826141d2565b848454614154565b825550505050565b600090565b61420e614201565b6142198184846141dc565b505050565b5b8181101561423d57614232600082614206565b60018101905061421f565b5050565b601f8211156142825761425381614122565b61425c84614137565b8101602085101561426b578190505b61427f61427785614137565b83018261421e565b50505b505050565b600082821c905092915050565b60006142a560001984600802614287565b1980831691505092915050565b60006142be8383614294565b9150826002028217905092915050565b6142d88383614117565b67ffffffffffffffff8111156142f1576142f0613c52565b5b6142fb8254613f9b565b614306828285614241565b6000601f8311600181146143355760008415614323578287013590505b61432d85826142b2565b865550614395565b601f19841661434386614122565b60005b8281101561436b57848901358255600182019150602085019450602081019050614346565b868310156143885784890135614384601f891682614294565b8355505b6001600288020188555050505b50505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006143d8826133ca565b91506143e3836133ca565b92508282039050818111156143fb576143fa613fcc565b5b92915050565b600061440c826134ee565b9150614417836134ee565b9250828201905060ff8111156144305761442f613fcc565b5b92915050565b600081905092915050565b600061444c82613318565b6144568185614436565b9350614466818560208601613334565b80840191505092915050565b600061447e8285614441565b915061448a8284614441565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006144f2602683613323565b91506144fd82614496565b604082019050919050565b60006020820190508181036000830152614521816144e5565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061455e602083613323565b915061456982614528565b602082019050919050565b6000602082019050818103600083015261458d81614551565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b60006145f0602a83613323565b91506145fb82614594565b604082019050919050565b6000602082019050818103600083015261461f816145e3565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b600061465c601983613323565b915061466782614626565b602082019050919050565b6000602082019050818103600083015261468b8161464f565b9050919050565b60008160601b9050919050565b60006146aa82614692565b9050919050565b60006146bc8261469f565b9050919050565b6146d46146cf82613256565b6146b1565b82525050565b60006146e682846146c3565b60148201915081905092915050565b600081519050919050565b600082825260208201905092915050565b600061471c826146f5565b6147268185614700565b9350614736818560208601613334565b61473f8161335e565b840191505092915050565b600060808201905061475f600083018761342d565b61476c602083018661342d565b6147796040830185613497565b818103606083015261478b8184614711565b905095945050505050565b6000815190506147a5816131a7565b92915050565b6000602082840312156147c1576147c0613171565b5b60006147cf84828501614796565b91505092915050565b60006147e3826133ca565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361481557614814613fcc565b5b60018201905091905056fea26469706673582212206d2ad3be7d39a7df939ccdd359678acc3633cb25fbfa6865f02f145839d2719264736f6c63430008130033000000000000000000000000f2cdc1347f450fb3540423c41f5d1505e4f9f5bb

Deployed Bytecode

0x60806040526004361061023b5760003560e01c8063715018a61161012e578063b88d4fde116100ab578063d6492d811161006f578063d6492d8114610858578063e985e9c514610883578063f2fde38b146108c0578063f8b89dfb146108e9578063fb796e6c146109125761023b565b8063b88d4fde1461076c578063c002d23d14610788578063c23dc68f146107b3578063c87b56dd146107f0578063cbccefb21461082d5761023b565b806395d89b41116100f257806395d89b411461069657806399a2557a146106c1578063a22cb465146106fe578063ae7a9b0c14610727578063b7c0b8e8146107435761023b565b8063715018a6146105c35780637cb64759146105da578063828122ab146106035780638462151c1461062e5780638da5cb5b1461066b5761023b565b806332cb6b0c116101bc5780635ade26c6116101805780635ade26c6146104c55780635bbb2177146104f05780636352211e1461052d5780636ecd23061461056a57806370a08231146105865761023b565b806332cb6b0c146104155780633ccfd60b1461044057806342842e0e1461045757806342966c681461047357806355f804b31461049c5761023b565b806318160ddd1161020357806318160ddd1461032a5780631ac08c1f146103555780631b1f40191461039257806323b872dd146103bb5780632a55205a146103d75761023b565b806301ffc9a71461024057806304634d8d1461027d57806306fdde03146102a6578063081812fc146102d1578063095ea7b31461030e575b600080fd5b34801561024c57600080fd5b50610267600480360381019061026291906131d3565b61093d565b604051610274919061321b565b60405180910390f35b34801561028957600080fd5b506102a4600480360381019061029f91906132d8565b61095f565b005b3480156102b257600080fd5b506102bb610975565b6040516102c891906133a8565b60405180910390f35b3480156102dd57600080fd5b506102f860048036038101906102f39190613400565b610a07565b604051610305919061343c565b60405180910390f35b61032860048036038101906103239190613457565b610a86565b005b34801561033657600080fd5b5061033f610abb565b60405161034c91906134a6565b60405180910390f35b34801561036157600080fd5b5061037c600480360381019061037791906134c1565b610ad2565b604051610389919061350a565b60405180910390f35b34801561039e57600080fd5b506103b960048036038101906103b4919061355f565b610af2565b005b6103d560048036038101906103d0919061358c565b610b5d565b005b3480156103e357600080fd5b506103fe60048036038101906103f991906135df565b610bc8565b60405161040c92919061361f565b60405180910390f35b34801561042157600080fd5b5061042a610db2565b60405161043791906134a6565b60405180910390f35b34801561044c57600080fd5b50610455610db8565b005b610471600480360381019061046c919061358c565b610e6d565b005b34801561047f57600080fd5b5061049a60048036038101906104959190613400565b610ed8565b005b3480156104a857600080fd5b506104c360048036038101906104be91906136ad565b610ee6565b005b3480156104d157600080fd5b506104da610f04565b6040516104e791906134a6565b60405180910390f35b3480156104fc57600080fd5b5061051760048036038101906105129190613750565b610f09565b6040516105249190613900565b60405180910390f35b34801561053957600080fd5b50610554600480360381019061054f9190613400565b610fcc565b604051610561919061343c565b60405180910390f35b610584600480360381019061057f919061394e565b610fde565b005b34801561059257600080fd5b506105ad60048036038101906105a891906134c1565b611157565b6040516105ba91906134a6565b60405180910390f35b3480156105cf57600080fd5b506105d861120f565b005b3480156105e657600080fd5b5061060160048036038101906105fc91906139b1565b611223565b005b34801561060f57600080fd5b50610618611235565b60405161062591906134a6565b60405180910390f35b34801561063a57600080fd5b50610655600480360381019061065091906134c1565b61123a565b6040516106629190613a9c565b60405180910390f35b34801561067757600080fd5b5061068061137d565b60405161068d919061343c565b60405180910390f35b3480156106a257600080fd5b506106ab6113a6565b6040516106b891906133a8565b60405180910390f35b3480156106cd57600080fd5b506106e860048036038101906106e39190613abe565b611438565b6040516106f59190613a9c565b60405180910390f35b34801561070a57600080fd5b5061072560048036038101906107209190613b3d565b611644565b005b610741600480360381019061073c9190613bd3565b611679565b005b34801561074f57600080fd5b5061076a60048036038101906107659190613c20565b61189b565b005b61078660048036038101906107819190613d7d565b6118c0565b005b34801561079457600080fd5b5061079d61192d565b6040516107aa91906134a6565b60405180910390f35b3480156107bf57600080fd5b506107da60048036038101906107d59190613400565b611938565b6040516107e79190613e55565b60405180910390f35b3480156107fc57600080fd5b5061081760048036038101906108129190613400565b6119a2565b60405161082491906133a8565b60405180910390f35b34801561083957600080fd5b50610842611a40565b60405161084f9190613ee7565b60405180910390f35b34801561086457600080fd5b5061086d611a53565b60405161087a9190613f11565b60405180910390f35b34801561088f57600080fd5b506108aa60048036038101906108a59190613f2c565b611a59565b6040516108b7919061321b565b60405180910390f35b3480156108cc57600080fd5b506108e760048036038101906108e291906134c1565b611aed565b005b3480156108f557600080fd5b50610910600480360381019061090b919061394e565b611b70565b005b34801561091e57600080fd5b50610927611bba565b604051610934919061321b565b60405180910390f35b600061094882611bcd565b80610958575061095782611c5f565b5b9050919050565b610967611cd9565b6109718282611d57565b5050565b60606003805461098490613f9b565b80601f01602080910402602001604051908101604052809291908181526020018280546109b090613f9b565b80156109fd5780601f106109d2576101008083540402835291602001916109fd565b820191906000526020600020905b8154815290600101906020018083116109e057829003601f168201915b5050505050905090565b6000610a1282611eec565b610a48576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81610a9081611f4b565b610aac57610a9c611f97565b15610aab57610aaa81611fae565b5b5b610ab68383611ff2565b505050565b6000610ac5612136565b6002546001540303905090565b600d6020528060005260406000206000915054906101000a900460ff1681565b610afa611cd9565b611a0a8161ffff16610b0a61213f565b610b149190613ffb565b1115610b4c576040517fd05cb60900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b5a338261ffff16612152565b50565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610bb757610b9a33611f4b565b610bb657610ba6611f97565b15610bb557610bb433611fae565b5b5b5b610bc284848461230e565b50505050565b6000806000600a60008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610d5d5760096040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610d67612630565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610d93919061402f565b610d9d91906140a0565b90508160000151819350935050509250929050565b611a0a81565b610dc0611cd9565b6000610dca61137d565b73ffffffffffffffffffffffffffffffffffffffff1647604051610ded90614102565b60006040518083038185875af1925050503d8060008114610e2a576040519150601f19603f3d011682016040523d82523d6000602084013e610e2f565b606091505b5050905080610e6a576040517f27fcd9d100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ec757610eaa33611f4b565b610ec657610eb6611f97565b15610ec557610ec433611fae565b5b5b5b610ed284848461263a565b50505050565b610ee381600161265a565b50565b610eee611cd9565b8181600e9182610eff9291906142ce565b505050565b600681565b6060600083839050905060008167ffffffffffffffff811115610f2f57610f2e613c52565b5b604051908082528060200260200182016040528015610f6857816020015b610f55613118565b815260200190600190039081610f4d5790505b50905060005b828114610fc057610f97868683818110610f8b57610f8a61439e565b5b90506020020135611938565b828281518110610faa57610fa961439e565b5b6020026020010181905250806001019050610f6e565b50809250505092915050565b6000610fd7826128ac565b9050919050565b600280811115610ff157610ff0613e70565b5b600281111561100357611002613e70565b5b600b60009054906101000a900460ff16600281111561102557611024613e70565b5b1461105c576040517feb56075600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61029a611a0a61106c91906143cd565b8160ff1661107861213f565b6110829190613ffb565b11156110ba576040517fd05cb60900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60068160ff1611156110f8576040517f4b231f9500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b661550f7dca700008160ff1661110e919061402f565b341015611147576040517f31fc877f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611154338260ff16612152565b50565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036111be576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611217611cd9565b6112216000612978565b565b61122b611cd9565b80600c8190555050565b600181565b6060600080600061124a85611157565b905060008167ffffffffffffffff81111561126857611267613c52565b5b6040519080825280602002602001820160405280156112965781602001602082028036833780820191505090505b5090506112a1613118565b60006112ab612136565b90505b83861461136f576112be81612a3c565b9150816040015161136457600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461130957816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361136357808387806001019850815181106113565761135561439e565b5b6020026020010181815250505b5b8060010190506112ae565b508195505050505050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546113b590613f9b565b80601f01602080910402602001604051908101604052809291908181526020018280546113e190613f9b565b801561142e5780601f106114035761010080835404028352916020019161142e565b820191906000526020600020905b81548152906001019060200180831161141157829003601f168201915b5050505050905090565b6060818310611473576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061147e612a67565b9050611488612136565b85101561149a57611497612136565b94505b808411156114a6578093505b60006114b187611157565b9050848610156114d45760008686039050818110156114ce578091505b506114d9565b600090505b60008167ffffffffffffffff8111156114f5576114f4613c52565b5b6040519080825280602002602001820160405280156115235781602001602082028036833780820191505090505b5090506000820361153a578094505050505061163d565b600061154588611938565b90506000816040015161155a57816000015190505b60008990505b8881141580156115705750848714155b1561162f5761157e81612a3c565b9250826040015161162457600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff16146115c957826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361162357808488806001019950815181106116165761161561439e565b5b6020026020010181815250505b5b806001019050611560565b508583528296505050505050505b9392505050565b8161164e81611f4b565b61166a5761165a611f97565b156116695761166881611fae565b5b5b6116748383612a71565b505050565b6001600281111561168d5761168c613e70565b5b600281111561169f5761169e613e70565b5b600b60009054906101000a900460ff1660028111156116c1576116c0613e70565b5b146116f8576040517feb56075600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60011515611707338484612b7c565b151514611740576040517f9114b24300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611a0a600161174d61213f565b6117579190613ffb565b111561178f576040517fd05cb60900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1603611818576040517fd330f98500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900460ff166118749190614401565b92506101000a81548160ff021916908360ff160217905550611897336001612152565b5050565b6118a3611cd9565b80600b60016101000a81548160ff02191690831515021790555050565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461191a576118fd33611f4b565b61191957611909611f97565b156119185761191733611fae565b5b5b5b61192685858585612bfb565b5050505050565b661550f7dca7000081565b611940613118565b611948613118565b611950612136565b8310806119645750611960612a67565b8310155b15611972578091505061199d565b61197b83612a3c565b9050806040015115611990578091505061199d565b61199983612c6e565b9150505b919050565b60606119ad82611eec565b6119e3576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006119ed612c8e565b90506000815103611a0d5760405180602001604052806000815250611a38565b80611a1784612d20565b604051602001611a28929190614472565b6040516020818303038152906040525b915050919050565b600b60009054906101000a900460ff1681565b600c5481565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611af5611cd9565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5b90614508565b60405180910390fd5b611b6d81612978565b50565b611b78611cd9565b8060ff166002811115611b8e57611b8d613e70565b5b600b60006101000a81548160ff02191690836002811115611bb257611bb1613e70565b5b021790555050565b600b60019054906101000a900460ff1681565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611c2857506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611c585750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611cd25750611cd182611bcd565b5b9050919050565b611ce1612d70565b73ffffffffffffffffffffffffffffffffffffffff16611cff61137d565b73ffffffffffffffffffffffffffffffffffffffff1614611d55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4c90614574565b60405180910390fd5b565b611d5f612630565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115611dbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db490614606565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611e2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2390614672565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600960008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b600081611ef7612136565b11158015611f06575060015482105b8015611f44575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b6000731e0049783f008a0085193e00003d00cd54003c7173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b6000600b60019054906101000a900460ff16905090565b69c617113400112233445560005230601a5280603a52600080604460166daaeb6d7670e522a718067333cd4e5afa611fea573d6000803e3d6000fd5b6000603a5250565b6000611ffd82610fcc565b90508073ffffffffffffffffffffffffffffffffffffffff1661201e612d78565b73ffffffffffffffffffffffffffffffffffffffff16146120815761204a81612045612d78565b611a59565b612080576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b6000612149612136565b60015403905090565b6000600154905060008203612193576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6121a06000848385612d80565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612217836122086000866000612d86565b61221185612dae565b17612dbe565b6005600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b8181146122b857808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460018101905061227d565b50600082036122f3576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060018190555050506123096000848385612de9565b505050565b6000612319826128ac565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612380576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061238c84612def565b915091506123a2818761239d612d78565b612e16565b6123ee576123b7866123b2612d78565b611a59565b6123ed576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612454576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6124618686866001612d80565b801561246c57600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061253a85612516888887612d86565b7c020000000000000000000000000000000000000000000000000000000017612dbe565b600560008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036125c057600060018501905060006005600083815260200190815260200160002054036125be5760015481146125bd578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46126288686866001612de9565b505050505050565b6000612710905090565b612655838383604051806020016040528060008152506118c0565b505050565b6000612665836128ac565b9050600081905060008061267886612def565b9150915084156126e157612694818461268f612d78565b612e16565b6126e0576126a9836126a4612d78565b611a59565b6126df576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b6126ef836000886001612d80565b80156126fa57600082555b600160806001901b03600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506127a28361275f85600088612d86565b7c02000000000000000000000000000000000000000000000000000000007c01000000000000000000000000000000000000000000000000000000001717612dbe565b600560008881526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008516036128285760006001870190506000600560008381526020019081526020016000205403612826576001548114612825578460056000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612892836000886001612de9565b600260008154809291906001019190505550505050505050565b600080829050806128bb612136565b11612941576001548110156129405760006005600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082160361293e575b6000810361293457600560008360019003935083815260200190815260200160002054905061290a565b8092505050612973565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612a44613118565b612a606005600084815260200190815260200160002054612e5a565b9050919050565b6000600154905090565b8060086000612a7e612d78565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612b2b612d78565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612b70919061321b565b60405180910390a35050565b6000612bf2838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600c5486604051602001612bd791906146da565b60405160208183030381529060405280519060200120612f10565b90509392505050565b612c06848484610b5d565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612c6857612c3184848484612f27565b612c67576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b612c76613118565b612c87612c82836128ac565b612e5a565b9050919050565b6060600e8054612c9d90613f9b565b80601f0160208091040260200160405190810160405280929190818152602001828054612cc990613f9b565b8015612d165780601f10612ceb57610100808354040283529160200191612d16565b820191906000526020600020905b815481529060010190602001808311612cf957829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b600115612d5b57600184039350600a81066030018453600a8104905080612d39575b50828103602084039350808452505050919050565b600033905090565b600033905090565b50505050565b60008060e883901c905060e8612d9d868684613077565b62ffffff16901b9150509392505050565b60006001821460e11b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60008060006007600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b612e62613118565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b600082612f1d8584613080565b1490509392505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612f4d612d78565b8786866040518563ffffffff1660e01b8152600401612f6f949392919061474a565b6020604051808303816000875af1925050508015612fab57506040513d601f19601f82011682018060405250810190612fa891906147ab565b60015b613024573d8060008114612fdb576040519150601f19603f3d011682016040523d82523d6000602084013e612fe0565b606091505b50600081510361301c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60009392505050565b60008082905060005b84518110156130cb576130b6828683815181106130a9576130a861439e565b5b60200260200101516130d6565b915080806130c3906147d8565b915050613089565b508091505092915050565b60008183106130ee576130e98284613101565b6130f9565b6130f88383613101565b5b905092915050565b600082600052816020526040600020905092915050565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6131b08161317b565b81146131bb57600080fd5b50565b6000813590506131cd816131a7565b92915050565b6000602082840312156131e9576131e8613171565b5b60006131f7848285016131be565b91505092915050565b60008115159050919050565b61321581613200565b82525050565b6000602082019050613230600083018461320c565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061326182613236565b9050919050565b61327181613256565b811461327c57600080fd5b50565b60008135905061328e81613268565b92915050565b60006bffffffffffffffffffffffff82169050919050565b6132b581613294565b81146132c057600080fd5b50565b6000813590506132d2816132ac565b92915050565b600080604083850312156132ef576132ee613171565b5b60006132fd8582860161327f565b925050602061330e858286016132c3565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613352578082015181840152602081019050613337565b60008484015250505050565b6000601f19601f8301169050919050565b600061337a82613318565b6133848185613323565b9350613394818560208601613334565b61339d8161335e565b840191505092915050565b600060208201905081810360008301526133c2818461336f565b905092915050565b6000819050919050565b6133dd816133ca565b81146133e857600080fd5b50565b6000813590506133fa816133d4565b92915050565b60006020828403121561341657613415613171565b5b6000613424848285016133eb565b91505092915050565b61343681613256565b82525050565b6000602082019050613451600083018461342d565b92915050565b6000806040838503121561346e5761346d613171565b5b600061347c8582860161327f565b925050602061348d858286016133eb565b9150509250929050565b6134a0816133ca565b82525050565b60006020820190506134bb6000830184613497565b92915050565b6000602082840312156134d7576134d6613171565b5b60006134e58482850161327f565b91505092915050565b600060ff82169050919050565b613504816134ee565b82525050565b600060208201905061351f60008301846134fb565b92915050565b600061ffff82169050919050565b61353c81613525565b811461354757600080fd5b50565b60008135905061355981613533565b92915050565b60006020828403121561357557613574613171565b5b60006135838482850161354a565b91505092915050565b6000806000606084860312156135a5576135a4613171565b5b60006135b38682870161327f565b93505060206135c48682870161327f565b92505060406135d5868287016133eb565b9150509250925092565b600080604083850312156135f6576135f5613171565b5b6000613604858286016133eb565b9250506020613615858286016133eb565b9150509250929050565b6000604082019050613634600083018561342d565b6136416020830184613497565b9392505050565b600080fd5b600080fd5b600080fd5b60008083601f84011261366d5761366c613648565b5b8235905067ffffffffffffffff81111561368a5761368961364d565b5b6020830191508360018202830111156136a6576136a5613652565b5b9250929050565b600080602083850312156136c4576136c3613171565b5b600083013567ffffffffffffffff8111156136e2576136e1613176565b5b6136ee85828601613657565b92509250509250929050565b60008083601f8401126137105761370f613648565b5b8235905067ffffffffffffffff81111561372d5761372c61364d565b5b60208301915083602082028301111561374957613748613652565b5b9250929050565b6000806020838503121561376757613766613171565b5b600083013567ffffffffffffffff81111561378557613784613176565b5b613791858286016136fa565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6137d281613256565b82525050565b600067ffffffffffffffff82169050919050565b6137f5816137d8565b82525050565b61380481613200565b82525050565b600062ffffff82169050919050565b6138228161380a565b82525050565b60808201600082015161383e60008501826137c9565b50602082015161385160208501826137ec565b50604082015161386460408501826137fb565b5060608201516138776060850182613819565b50505050565b60006138898383613828565b60808301905092915050565b6000602082019050919050565b60006138ad8261379d565b6138b781856137a8565b93506138c2836137b9565b8060005b838110156138f35781516138da888261387d565b97506138e583613895565b9250506001810190506138c6565b5085935050505092915050565b6000602082019050818103600083015261391a81846138a2565b905092915050565b61392b816134ee565b811461393657600080fd5b50565b60008135905061394881613922565b92915050565b60006020828403121561396457613963613171565b5b600061397284828501613939565b91505092915050565b6000819050919050565b61398e8161397b565b811461399957600080fd5b50565b6000813590506139ab81613985565b92915050565b6000602082840312156139c7576139c6613171565b5b60006139d58482850161399c565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613a13816133ca565b82525050565b6000613a258383613a0a565b60208301905092915050565b6000602082019050919050565b6000613a49826139de565b613a5381856139e9565b9350613a5e836139fa565b8060005b83811015613a8f578151613a768882613a19565b9750613a8183613a31565b925050600181019050613a62565b5085935050505092915050565b60006020820190508181036000830152613ab68184613a3e565b905092915050565b600080600060608486031215613ad757613ad6613171565b5b6000613ae58682870161327f565b9350506020613af6868287016133eb565b9250506040613b07868287016133eb565b9150509250925092565b613b1a81613200565b8114613b2557600080fd5b50565b600081359050613b3781613b11565b92915050565b60008060408385031215613b5457613b53613171565b5b6000613b628582860161327f565b9250506020613b7385828601613b28565b9150509250929050565b60008083601f840112613b9357613b92613648565b5b8235905067ffffffffffffffff811115613bb057613baf61364d565b5b602083019150836020820283011115613bcc57613bcb613652565b5b9250929050565b60008060208385031215613bea57613be9613171565b5b600083013567ffffffffffffffff811115613c0857613c07613176565b5b613c1485828601613b7d565b92509250509250929050565b600060208284031215613c3657613c35613171565b5b6000613c4484828501613b28565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613c8a8261335e565b810181811067ffffffffffffffff82111715613ca957613ca8613c52565b5b80604052505050565b6000613cbc613167565b9050613cc88282613c81565b919050565b600067ffffffffffffffff821115613ce857613ce7613c52565b5b613cf18261335e565b9050602081019050919050565b82818337600083830152505050565b6000613d20613d1b84613ccd565b613cb2565b905082815260208101848484011115613d3c57613d3b613c4d565b5b613d47848285613cfe565b509392505050565b600082601f830112613d6457613d63613648565b5b8135613d74848260208601613d0d565b91505092915050565b60008060008060808587031215613d9757613d96613171565b5b6000613da58782880161327f565b9450506020613db68782880161327f565b9350506040613dc7878288016133eb565b925050606085013567ffffffffffffffff811115613de857613de7613176565b5b613df487828801613d4f565b91505092959194509250565b608082016000820151613e1660008501826137c9565b506020820151613e2960208501826137ec565b506040820151613e3c60408501826137fb565b506060820151613e4f6060850182613819565b50505050565b6000608082019050613e6a6000830184613e00565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60038110613eb057613eaf613e70565b5b50565b6000819050613ec182613e9f565b919050565b6000613ed182613eb3565b9050919050565b613ee181613ec6565b82525050565b6000602082019050613efc6000830184613ed8565b92915050565b613f0b8161397b565b82525050565b6000602082019050613f266000830184613f02565b92915050565b60008060408385031215613f4357613f42613171565b5b6000613f518582860161327f565b9250506020613f628582860161327f565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613fb357607f821691505b602082108103613fc657613fc5613f6c565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614006826133ca565b9150614011836133ca565b925082820190508082111561402957614028613fcc565b5b92915050565b600061403a826133ca565b9150614045836133ca565b9250828202614053816133ca565b9150828204841483151761406a57614069613fcc565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006140ab826133ca565b91506140b6836133ca565b9250826140c6576140c5614071565b5b828204905092915050565b600081905092915050565b50565b60006140ec6000836140d1565b91506140f7826140dc565b600082019050919050565b600061410d826140df565b9150819050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026141847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614147565b61418e8683614147565b95508019841693508086168417925050509392505050565b6000819050919050565b60006141cb6141c66141c1846133ca565b6141a6565b6133ca565b9050919050565b6000819050919050565b6141e5836141b0565b6141f96141f1826141d2565b848454614154565b825550505050565b600090565b61420e614201565b6142198184846141dc565b505050565b5b8181101561423d57614232600082614206565b60018101905061421f565b5050565b601f8211156142825761425381614122565b61425c84614137565b8101602085101561426b578190505b61427f61427785614137565b83018261421e565b50505b505050565b600082821c905092915050565b60006142a560001984600802614287565b1980831691505092915050565b60006142be8383614294565b9150826002028217905092915050565b6142d88383614117565b67ffffffffffffffff8111156142f1576142f0613c52565b5b6142fb8254613f9b565b614306828285614241565b6000601f8311600181146143355760008415614323578287013590505b61432d85826142b2565b865550614395565b601f19841661434386614122565b60005b8281101561436b57848901358255600182019150602085019450602081019050614346565b868310156143885784890135614384601f891682614294565b8355505b6001600288020188555050505b50505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006143d8826133ca565b91506143e3836133ca565b92508282039050818111156143fb576143fa613fcc565b5b92915050565b600061440c826134ee565b9150614417836134ee565b9250828201905060ff8111156144305761442f613fcc565b5b92915050565b600081905092915050565b600061444c82613318565b6144568185614436565b9350614466818560208601613334565b80840191505092915050565b600061447e8285614441565b915061448a8284614441565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006144f2602683613323565b91506144fd82614496565b604082019050919050565b60006020820190508181036000830152614521816144e5565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061455e602083613323565b915061456982614528565b602082019050919050565b6000602082019050818103600083015261458d81614551565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b60006145f0602a83613323565b91506145fb82614594565b604082019050919050565b6000602082019050818103600083015261461f816145e3565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b600061465c601983613323565b915061466782614626565b602082019050919050565b6000602082019050818103600083015261468b8161464f565b9050919050565b60008160601b9050919050565b60006146aa82614692565b9050919050565b60006146bc8261469f565b9050919050565b6146d46146cf82613256565b6146b1565b82525050565b60006146e682846146c3565b60148201915081905092915050565b600081519050919050565b600082825260208201905092915050565b600061471c826146f5565b6147268185614700565b9350614736818560208601613334565b61473f8161335e565b840191505092915050565b600060808201905061475f600083018761342d565b61476c602083018661342d565b6147796040830185613497565b818103606083015261478b8184614711565b905095945050505050565b6000815190506147a5816131a7565b92915050565b6000602082840312156147c1576147c0613171565b5b60006147cf84828501614796565b91505092915050565b60006147e3826133ca565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361481557614814613fcc565b5b60018201905091905056fea26469706673582212206d2ad3be7d39a7df939ccdd359678acc3633cb25fbfa6865f02f145839d2719264736f6c63430008130033

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:4650:14:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3674:243;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2710:153;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10312:100:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16803:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4442:216:14;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6063:323:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1204:48:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3097:179;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4664:204;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1670:442:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;916:41:14;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3282:188;;;;;;;;;;;;;:::i;:::-;;4874:212;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;532:94:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2986:105:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1012:54;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1696:528:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11705:152:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1501:382:14;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7247:233:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1882:103:13;;;;;;;;;;;;;:::i;:::-;;2511:102:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;962:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5572:900:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1234:87:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10488:104:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2612:2513:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4232:204:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1889:415;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2869:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5092:242;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1071:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1109:428:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10698:318:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;888:23:14;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1172:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17752:164:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2140:201:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2619:85:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1124:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3674:243;3797:4;3824:38;3850:11;3824:25;:38::i;:::-;:87;;;;3873:38;3899:11;3873:25;:38::i;:::-;3824:87;3810:101;;3674:243;;;:::o;2710:153::-;1120:13:13;:11;:13::i;:::-;2815:42:14::1;2834:8;2844:12;2815:18;:42::i;:::-;2710: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;4442:216:14:-;4600:8;3578:29:12;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;4620:32:14::1;4634:8;4644:7;4620:13;:32::i;:::-;4442:216:::0;;;:::o;6063:323:3:-;6124:7;6352:15;:13;:15::i;:::-;6337:12;;6321:13;;:28;:46;6314:53;;6063:323;:::o;1204:48:14:-;;;;;;;;;;;;;;;;;;;;;;:::o;3097:179::-;1120:13:13;:11;:13::i;:::-;953:4:14::1;3186:8;3169:25;;:14;:12;:14::i;:::-;:25;;;;:::i;:::-;:38;3165:69;;;3216:18;;;;;;;;;;;;;;3165:69;3243:27;3249:10;3261:8;3243:27;;:5;:27::i;:::-;3097:179:::0;:::o;4664:204::-;4812:4;3221:10:12;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;4825:37:14::1;4844:4;4850:2;4854:7;4825:18;:37::i;:::-;4664: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:14:-;953:4;916:41;:::o;3282:188::-;1120:13:13;:11;:13::i;:::-;3327:12:14::1;3353:7;:5;:7::i;:::-;3345:21;;3374;3345:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3326:74;;;3414:7;3409:56;;3439:18;;;;;;;;;;;;;;3409:56;3319:151;3282:188::o:0;4874:212::-;5026:4;3221:10:12;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;5039:41:14::1;5062:4;5068:2;5072:7;5039:22;:41::i;:::-;4874:212:::0;;;;:::o;532:94:4:-;598:20;604:7;613:4;598:5;:20::i;:::-;532:94;:::o;2986:105:14:-;1120:13:13;:11;:13::i;:::-;3075:10:14::1;;3060:12;:25;;;;;;;:::i;:::-;;2986: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;1501:382:14:-;1579:1;1574:7;;;;;;;;:::i;:::-;;1559:22;;;;;;;;:::i;:::-;;:11;;;;;;;;;;;:22;;;;;;;;:::i;:::-;;;1555:50;;1590:15;;;;;;;;;;;;;;1555:50;1657:3;953:4;1644:16;;;;:::i;:::-;1633:8;1616:25;;:14;:12;:14::i;:::-;:25;;;;:::i;:::-;:44;1612:75;;;1669:18;;;;;;;;;;;;;;1612:75;1065:1;1698:8;:37;;;1694:76;;;1744:26;;;;;;;;;;;;;;1694:76;1108:11;1793:8;:21;;;;;;:::i;:::-;1781:9;:33;1777:64;;;1823:18;;;;;;;;;;;;;;1777:64;1850:27;1856:10;1868:8;1850:27;;:5;:27::i;:::-;1501:382;:::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:13:-;1120:13;:11;:13::i;:::-;1947:30:::1;1974:1;1947:18;:30::i;:::-;1882:103::o:0;2511:102:14:-;1120:13:13;:11;:13::i;:::-;2596:11:14::1;2581:12;:26;;;;2511: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:13:-;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;4232:204:14:-;4370:8;3578:29:12;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;4387:43:14::1;4411:8;4421;4387:23;:43::i;:::-;4232:204:::0;;;:::o;1889:415::-;1980:1;1975:7;;;;;;;;:::i;:::-;;1960:22;;;;;;;;:::i;:::-;;:11;;;;;;;;;;;:22;;;;;;;;:::i;:::-;;;1956:50;;1991:15;;;;;;;;;;;;;;1956:50;2054:4;2017:41;;:33;2031:10;2043:6;;2017:13;:33::i;:::-;:41;;;2013:60;;2067:6;;;;;;;;;;;;;;2013:60;953:4;2101:1;2084:14;:12;:14::i;:::-;:18;;;;:::i;:::-;:31;2080:62;;;2124:18;;;;;;;;;;;;;;2080:62;1006:1;2152:15;:27;2168:10;2152:27;;;;;;;;;;;;;;;;;;;;;;;;;:48;;;2149:81;;2209:21;;;;;;;;;;;;;;2149:81;2268:1;2237:15;:27;2253:10;2237:27;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;2278:20;2284:10;2296:1;2278:5;:20::i;:::-;1889:415;;:::o;2869:111::-;1120:13:13;:11;:13::i;:::-;2969:5:14::1;2942:24;;:32;;;;;;;;;;;;;;;;;;2869:111:::0;:::o;5092:242::-;5268:4;3221:10:12;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;5281:47:14::1;5304:4;5310:2;5314:7;5323:4;5281:22;:47::i;:::-;5092:242:::0;;;;;:::o;1071:48::-;1108:11;1071:48;:::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:14:-;;;;;;;;;;;;;:::o;1172: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:13:-;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;2619:85:14:-;1120:13:13;:11;:13::i;:::-;2693:4:14::1;2688:10;;;;;;;;;;:::i;:::-;;2674:11;;:24;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;2619:85:::0;:::o;1124: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:13:-;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;4048:178:14:-;4137:4;4177:42;4157:63;;:8;:63;;;4150:70;;4048:178;;;:::o;3923:119::-;3992:4;4012:24;;;;;;;;;;;4005:31;;3923:119;:::o;3811:1359:12:-;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;3476:87:14:-;3533:7;3556:1;3549:8;;3476: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:13:-;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;2310:195:14:-;2400:4;2420:79;2439:6;;2420:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2447:12;;2488:8;2471:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;2461:37;;;;;;2420:18;:79::i;:::-;2413:86;;2310: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;3569:99:14:-;3621:13;3650:12;3643:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3569: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:11:-;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:11:-;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://6d2ad3be7d39a7df939ccdd359678acc3633cb25fbfa6865f02f145839d27192
Loading...
Loading
Loading...
Loading
[ 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.