ETH Price: $3,388.73 (-1.54%)
Gas: 2 Gwei

Token

Anonymous Ape Yacht Club (AAYC)
 

Overview

Max Total Supply

10,000 AAYC

Holders

3,231

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 AAYC
0xbf11349b63c396fc77f525ebb3c06d6a01deed84
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:
AAYC

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license
File 1 of 13 : AAYC.sol
// SPDX-License-Identifier: MIT
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&#BP5YJ?7!!~~^^^^^^^^~!!7?J5PG#&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#PJ!^:.                             .^~?5B@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@P~.                                         ^Y&@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@&!                                              :B@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@!                                                :&@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@P                                                  ?@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@~       .::::..                      .:^~^^:       .#@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@B    .75GB##&&&#B5?^              ^?5B&@@&&&#B57.    5@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@J  .7Y?~:~5GB####@@@B?.        .?B@@@&###BBP~:~?Y7.  7@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@!  ^^     .:^!5##GG#@@&^      :#@@#GB##57~:.     ^^  ~@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@^              .7G&BPGP^      :PP5B&B?:              :@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@&.                 ~G@G~        :P&P~                 .&@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@#.     .~7JY55YJ!^   Y@@7       GP^   ^7J5555Y?~.     .#@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@B    :Y#@@@@@@@@@@#5!.#@&:      .  !5#@@@@@@@@@@&5^.   B@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@B  :B@@@@@@@@@@@@@@@B^B@@7        :G@&&&&#########PYJ7!#@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@G  ^G5J?7!!~~~^^^^:. .#@@?          .:...........   ..:B@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@B                    :&@@?                             B@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@Y                   7@@@?                             #@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@5                  P@@@7                            7@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@BGB~              .?@@@@!       .                  ^5@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@#:Y@G?~^^~~~!!!^^5#@@@@@^       7Y7    :....  .:^7GJ#@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@P 5@B#@B!!!~^: 5@@Y!@@B          JJ   !?JJJP#&G#@Y^@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@Y 5#!B@5:     :PP !@@Y           :       !&@5^&P G@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@Y ?B!G@@5!:      .5@?      :          ^P@@? PG ?@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@Y ~BYY#@@&B5?~^^7G@&PYJJYB@P~   .:~JG@@#~~#P 7@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@5 .P#Y?5#@@@@@@@@@@@P?G@@@@@#BB&@@@@B?~P@J ?@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@G. ?@#J^^7YG#&&@@&7. .!B@@@@@@&B5?^ ^#&~ Y@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#^ ^#@&Y^   .::^!!77?7??7!~^:.    .5P..G@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@7 .G@@#7!~^:.                  :P? ~#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@5  P@G  .:^~75GPPPPP!        !5^ J@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@B: PB       .#@@@@5.       ?? :G@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&7 5~      .#@@@@^       :^ !&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@P^       P@@@@@P        .5@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@J     .&@@##@&.      ~B@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@G^    5@@@@@P     :5@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&J:  :&@@@@~   ^Y&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&P?!B@@@#~!JG@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "./ERC721Anon.sol";

contract AAYC is ERC721Anon, Ownable, ReentrancyGuard {

    mapping (address => uint256) public walletAAYC;
    string public baseURI;  
    bool public mintPublicAAYCEnabled  = false;
    bytes32 public merkleRoot;
    uint public freeAAYC = 3;
    uint public maxAAYCPerTx = 20;  
    uint public maxPerWallet = 40;
    uint public maxAAYC = 10000;
    uint public AAYCPrice = 2000000000000000; //0.002 ETH

    constructor() ERC721Anon("Anonymous Ape Yacht Club", "AAYC",100,10000){}

    function mint(uint256 qty) external payable
    {
        require(mintPublicAAYCEnabled , "AAYC : Minting Public Pause");
        require(walletAAYC[msg.sender] + qty <= maxPerWallet,"AAYC : Max Per Wallet");
        require(qty <= maxAAYCPerTx, "AAYC : Limit Per Transaction");
        require(totalSupply() + qty <= maxAAYC,"AAYC : Soldout");
        _mint(qty);
    }

    function _mint(uint qty) internal {
        if(walletAAYC[msg.sender] < freeAAYC) 
        {
            if(qty < freeAAYC) qty = freeAAYC;
           require(msg.value >= (qty - freeAAYC) * AAYCPrice,"AAYC : Claim Free NFT");
            walletAAYC[msg.sender] += qty;
           _safeMint(msg.sender, qty);
        }
        else
        {
           require(msg.value >= qty * AAYCPrice,"AAYC : Fund not enough");
            walletAAYC[msg.sender] += qty;
           _safeMint(msg.sender, qty);
        }
    }

    function numberMinted(address owner) public view returns (uint256) {
        return _numberMinted(owner);
    }

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

    function airdropAAYC(address to ,uint256 qty) external onlyOwner
    {
        _safeMint(to, qty);
    }

    function OwnerBatchMint(uint256 qty) external onlyOwner
    {
        _safeMint(msg.sender, qty);
    }

    function setPublicAAYCMinting() external onlyOwner {
        mintPublicAAYCEnabled  = !mintPublicAAYCEnabled ;
    }
    
    function setBaseURI(string calldata baseURI_) external onlyOwner {
        baseURI = baseURI_;
    }

    function setPrice(uint256 price_) external onlyOwner {
        AAYCPrice = price_;
    }

    function setmaxAAYCPerTx(uint256 maxAAYCPerTx_) external onlyOwner {
        maxAAYCPerTx = maxAAYCPerTx_;
    }

    function setmaxFreeAAYCPerTx(uint256 freeAAYC_) external onlyOwner {
        freeAAYC = freeAAYC_;
    }

    function setMaxPerWallet(uint256 maxPerWallet_) external onlyOwner {
        maxPerWallet = maxPerWallet_;
    }

    function setmaxAAYC(uint256 maxAAYC_) external onlyOwner {
        maxAAYC = maxAAYC_;
    }

    function withdraw() public onlyOwner {
        payable(msg.sender).transfer(payable(address(this)).balance);
    }

}

File 2 of 13 : ERC721Anon.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol";
import "@openzeppelin/contracts/utils/Address.sol";
import "@openzeppelin/contracts/utils/Context.sol";
import "@openzeppelin/contracts/utils/Strings.sol";
import "@openzeppelin/contracts/utils/introspection/ERC165.sol";

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Assumes the number of issuable tokens (collection size) is capped and fits in a uint128.
 *
 * Does not support burning tokens to address(0).
 */
contract ERC721Anon is
  Context,
  ERC165,
  IERC721,
  IERC721Metadata,
  IERC721Enumerable
{
  using Address for address;
  using Strings for uint256;

  struct TokenOwnership {
    address addr;
    uint64 startTimestamp;
  }

  struct AddressData {
    uint128 balance;
    uint128 numberMinted;
  }

  uint256 private currentIndex = 0;

  uint256 internal immutable collectionSize;
  uint256 internal immutable maxBatchSize;

  // 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 ownershipOf implementation for details.
  mapping(uint256 => TokenOwnership) private _ownerships;

  // Mapping owner address to address data
  mapping(address => AddressData) private _addressData;

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

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

  /**
   * @dev
   * `maxBatchSize` refers to how much a minter can mint at a time.
   * `collectionSize_` refers to how many tokens are in the collection.
   */
  constructor(
    string memory name_,
    string memory symbol_,
    uint256 maxBatchSize_,
    uint256 collectionSize_
  ) {
    require(
      collectionSize_ > 0,
      "ERC721Anon: collection must have a nonzero supply"
    );
    require(maxBatchSize_ > 0, "ERC721Anon: max batch size must be nonzero");
    _name = name_;
    _symbol = symbol_;
    maxBatchSize = maxBatchSize_;
    collectionSize = collectionSize_;
  }

  /**
   * @dev See {IERC721Enumerable-totalSupply}.
   */
  function totalSupply() public view override returns (uint256) {
    return currentIndex;
  }

  /**
   * @dev See {IERC721Enumerable-tokenByIndex}.
   */
  function tokenByIndex(uint256 index) public view override returns (uint256) {
    require(index < totalSupply(), "ERC721Anon: global index out of bounds");
    return index;
  }

  /**
   * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
   * This read function is O(collectionSize). If calling from a separate contract, be sure to test gas first.
   * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
   */
  function tokenOfOwnerByIndex(address owner, uint256 index)
    public
    view
    override
    returns (uint256)
  {
    require(index < balanceOf(owner), "ERC721Anon: owner index out of bounds");
    uint256 numMintedSoFar = totalSupply();
    uint256 tokenIdsIdx = 0;
    address currOwnershipAddr = address(0);
    for (uint256 i = 0; i < numMintedSoFar; i++) {
      TokenOwnership memory ownership = _ownerships[i];
      if (ownership.addr != address(0)) {
        currOwnershipAddr = ownership.addr;
      }
      if (currOwnershipAddr == owner) {
        if (tokenIdsIdx == index) {
          return i;
        }
        tokenIdsIdx++;
      }
    }
    revert("ERC721Anon: unable to get token of owner by index");
  }

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

  /**
   * @dev See {IERC721-balanceOf}.
   */
  function balanceOf(address owner) public view override returns (uint256) {
    require(owner != address(0), "ERC721Anon: balance query for the zero address");
    return uint256(_addressData[owner].balance);
  }

  function _numberMinted(address owner) internal view returns (uint256) {
    require(
      owner != address(0),
      "ERC721Anon: number minted query for the zero address"
    );
    return uint256(_addressData[owner].numberMinted);
  }

  function ownershipOf(uint256 tokenId)
    internal
    view
    returns (TokenOwnership memory)
  {
    require(_exists(tokenId), "ERC721Anon: owner query for nonexistent token");

    uint256 lowestTokenToCheck;
    if (tokenId >= maxBatchSize) {
      lowestTokenToCheck = tokenId - maxBatchSize + 1;
    }

    for (uint256 curr = tokenId; curr >= lowestTokenToCheck; curr--) {
      TokenOwnership memory ownership = _ownerships[curr];
      if (ownership.addr != address(0)) {
        return ownership;
      }
    }

    revert("ERC721Anon: unable to determine the owner of token");
  }

  /**
   * @dev See {IERC721-ownerOf}.
   */
  function ownerOf(uint256 tokenId) public view override returns (address) {
    return ownershipOf(tokenId).addr;
  }

  /**
   * @dev See {IERC721Metadata-name}.
   */
  function name() public view virtual override returns (string memory) {
    return _name;
  }

  /**
   * @dev See {IERC721Metadata-symbol}.
   */
  function symbol() public view virtual override returns (string memory) {
    return _symbol;
  }

  /**
   * @dev See {IERC721Metadata-tokenURI}.
   */
  function tokenURI(uint256 tokenId)
    public
    view
    virtual
    override
    returns (string memory)
  {
    require(
      _exists(tokenId),
      "ERC721Metadata: URI query for nonexistent token"
    );

    string memory baseURI = _baseURI();
    return
      bytes(baseURI).length > 0
        ? string(abi.encodePacked(baseURI, tokenId.toString()))
        : "";
  }

  /**
   * @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, can be overriden in child contracts.
   */
  function _baseURI() internal view virtual returns (string memory) {
    return "";
  }

  /**
   * @dev See {IERC721-approve}.
   */
  function approve(address to, uint256 tokenId) public override {
    address owner = ERC721Anon.ownerOf(tokenId);
    require(to != owner, "ERC721Anon: approval to current owner");

    require(
      _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
      "ERC721Anon: approve caller is not owner nor approved for all"
    );

    _approve(to, tokenId, owner);
  }

  /**
   * @dev See {IERC721-getApproved}.
   */
  function getApproved(uint256 tokenId) public view override returns (address) {
    require(_exists(tokenId), "ERC721Anon: approved query for nonexistent token");

    return _tokenApprovals[tokenId];
  }

  /**
   * @dev See {IERC721-setApprovalForAll}.
   */
  function setApprovalForAll(address operator, bool approved) public override {
    require(operator != _msgSender(), "ERC721Anon: approve to caller");

    _operatorApprovals[_msgSender()][operator] = approved;
    emit ApprovalForAll(_msgSender(), operator, approved);
  }

  /**
   * @dev See {IERC721-isApprovedForAll}.
   */
  function isApprovedForAll(address owner, address operator)
    public
    view
    virtual
    override
    returns (bool)
  {
    return _operatorApprovals[owner][operator];
  }

  /**
   * @dev See {IERC721-transferFrom}.
   */
  function transferFrom(
    address from,
    address to,
    uint256 tokenId
  ) public override {
    _transfer(from, to, tokenId);
  }

  /**
   * @dev See {IERC721-safeTransferFrom}.
   */
  function safeTransferFrom(
    address from,
    address to,
    uint256 tokenId
  ) public override {
    safeTransferFrom(from, to, tokenId, "");
  }

  /**
   * @dev See {IERC721-safeTransferFrom}.
   */
  function safeTransferFrom(
    address from,
    address to,
    uint256 tokenId,
    bytes memory _data
  ) public override {
    _transfer(from, to, tokenId);
    require(
      _checkOnERC721Received(from, to, tokenId, _data),
      "ERC721Anon: transfer to non ERC721Receiver implementer"
    );
  }

  /**
   * @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 (`_mint`),
   */
  function _exists(uint256 tokenId) internal view returns (bool) {
    return tokenId < currentIndex;
  }

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

  /**
   * @dev Mints `quantity` tokens and transfers them to `to`.
   *
   * Requirements:
   *
   * - there must be `quantity` tokens remaining unminted in the total collection.
   * - `to` cannot be the zero address.
   * - `quantity` cannot be larger than the max batch size.
   *
   * Emits a {Transfer} event.
   */
  function _safeMint(
    address to,
    uint256 quantity,
    bytes memory _data
  ) internal {
    uint256 startTokenId = currentIndex;
    require(to != address(0), "ERC721Anon: mint to the zero address");
    // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering.
    require(!_exists(startTokenId), "ERC721Anon: token already minted");
    require(quantity <= maxBatchSize, "ERC721Anon: quantity to mint too high");

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

    AddressData memory addressData = _addressData[to];
    _addressData[to] = AddressData(
      addressData.balance + uint128(quantity),
      addressData.numberMinted + uint128(quantity)
    );
    _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp));

    uint256 updatedIndex = startTokenId;

    for (uint256 i = 0; i < quantity; i++) {
      emit Transfer(address(0), to, updatedIndex);
      require(
        _checkOnERC721Received(address(0), to, updatedIndex, _data),
        "ERC721Anon: transfer to non ERC721Receiver implementer"
      );
      updatedIndex++;
    }

    currentIndex = updatedIndex;
    _afterTokenTransfers(address(0), to, startTokenId, quantity);
  }

  /**
   * @dev Transfers `tokenId` from `from` to `to`.
   *
   * Requirements:
   *
   * - `to` cannot be the zero address.
   * - `tokenId` token must be owned by `from`.
   *
   * Emits a {Transfer} event.
   */
  function _transfer(
    address from,
    address to,
    uint256 tokenId
  ) private {
    TokenOwnership memory prevOwnership = ownershipOf(tokenId);

    bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
      getApproved(tokenId) == _msgSender() ||
      isApprovedForAll(prevOwnership.addr, _msgSender()));

    require(
      isApprovedOrOwner,
      "ERC721Anon: transfer caller is not owner nor approved"
    );

    require(
      prevOwnership.addr == from,
      "ERC721Anon: transfer from incorrect owner"
    );
    require(to != address(0), "ERC721Anon: transfer to the zero address");

    _beforeTokenTransfers(from, to, tokenId, 1);

    // Clear approvals from the previous owner
    _approve(address(0), tokenId, prevOwnership.addr);

    _addressData[from].balance -= 1;
    _addressData[to].balance += 1;
    _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp));

    // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
    // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
    uint256 nextTokenId = tokenId + 1;
    if (_ownerships[nextTokenId].addr == address(0)) {
      if (_exists(nextTokenId)) {
        _ownerships[nextTokenId] = TokenOwnership(
          prevOwnership.addr,
          prevOwnership.startTimestamp
        );
      }
    }

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

  /**
   * @dev Approve `to` to operate on `tokenId`
   *
   * Emits a {Approval} event.
   */
  function _approve(
    address to,
    uint256 tokenId,
    address owner
  ) private {
    _tokenApprovals[tokenId] = to;
    emit Approval(owner, to, tokenId);
  }

  uint256 public nextOwnerToExplicitlySet = 0;

  /**
   * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf().
   */
  function _setOwnersExplicit(uint256 quantity) internal {
    uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet;
    require(quantity > 0, "quantity must be nonzero");
    uint256 endIndex = oldNextOwnerToSet + quantity - 1;
    if (endIndex > collectionSize - 1) {
      endIndex = collectionSize - 1;
    }
    // We know if the last one in the group exists, all in the group exist, due to serial ordering.
    require(_exists(endIndex), "not enough minted yet for this cleanup");
    for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) {
      if (_ownerships[i].addr == address(0)) {
        TokenOwnership memory ownership = ownershipOf(i);
        _ownerships[i] = TokenOwnership(
          ownership.addr,
          ownership.startTimestamp
        );
      }
    }
    nextOwnerToExplicitlySet = endIndex + 1;
  }

  /**
   * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
   * The call is not executed if the target address is not a contract.
   *
   * @param from address representing the previous owner of the given token ID
   * @param to target address that will receive the tokens
   * @param tokenId uint256 ID of the token to be transferred
   * @param _data bytes optional data to send along with the call
   * @return bool whether the call correctly returned the expected magic value
   */
  function _checkOnERC721Received(
    address from,
    address to,
    uint256 tokenId,
    bytes memory _data
  ) private returns (bool) {
    if (to.isContract()) {
      try
        IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data)
      returns (bytes4 retval) {
        return retval == IERC721Receiver(to).onERC721Received.selector;
      } catch (bytes memory reason) {
        if (reason.length == 0) {
          revert("ERC721Anon: transfer to non ERC721Receiver implementer");
        } else {
          assembly {
            revert(add(32, reason), mload(reason))
          }
        }
      }
    } else {
      return true;
    }
  }

  /**
   * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
   *
   * 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`.
   */
  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.
   *
   * 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` and `to` are never both zero.
   */
  function _afterTokenTransfers(
    address from,
    address to,
    uint256 startTokenId,
    uint256 quantity
  ) internal virtual {}
}

File 3 of 13 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

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

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

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

pragma solidity ^0.8.0;

import "../utils/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);
    }
}

File 5 of 13 : ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/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 6 of 13 : Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

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

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

File 7 of 13 : 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 8 of 13 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly
                /// @solidity memory-safe-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 9 of 13 : IERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

import "../IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

File 10 of 13 : IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

import "../IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @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);
}

File 11 of 13 : IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

File 12 of 13 : IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @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`.
     *
     * 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 calldata data
    ) external;

    /**
     * @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 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
    ) external;

    /**
     * @dev Transfers `tokenId` token 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;

    /**
     * @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;

    /**
     * @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);
}

File 13 of 13 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/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);
}

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"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":"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":"AAYCPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"OwnerBatchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"airdropAAYC","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeAAYC","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"maxAAYC","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxAAYCPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPublicAAYCEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","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":"nonpayable","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":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxPerWallet_","type":"uint256"}],"name":"setMaxPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price_","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setPublicAAYCMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxAAYC_","type":"uint256"}],"name":"setmaxAAYC","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxAAYCPerTx_","type":"uint256"}],"name":"setmaxAAYCPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"freeAAYC_","type":"uint256"}],"name":"setmaxFreeAAYCPerTx","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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"walletAAYC","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c06040526000805560006007556000600c60006101000a81548160ff0219169083151502179055506003600e556014600f55602860105561271060115566071afd498d00006012553480156200005557600080fd5b506040518060400160405280601881526020017f416e6f6e796d6f75732041706520596163687420436c756200000000000000008152506040518060400160405280600481526020017f41415943000000000000000000000000000000000000000000000000000000008152506064612710600081116200010d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001049062000393565b60405180910390fd5b6000821162000153576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200014a90620003b5565b60405180910390fd5b83600190805190602001906200016b92919062000295565b5082600290805190602001906200018492919062000295565b508160a08181525050806080818152505050505050620001b9620001ad620001c760201b60201c565b620001cf60201b60201c565b6001600981905550620004eb565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002a390620003e8565b90600052602060002090601f016020900481019282620002c7576000855562000313565b82601f10620002e257805160ff191683800117855562000313565b8280016001018555821562000313579182015b8281111562000312578251825591602001919060010190620002f5565b5b50905062000322919062000326565b5090565b5b808211156200034157600081600090555060010162000327565b5090565b600062000354603183620003d7565b915062000361826200044d565b604082019050919050565b60006200037b602a83620003d7565b915062000388826200049c565b604082019050919050565b60006020820190508181036000830152620003ae8162000345565b9050919050565b60006020820190508181036000830152620003d0816200036c565b9050919050565b600082825260208201905092915050565b600060028204905060018216806200040157607f821691505b602082108114156200041857620004176200041e565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f455243373231416e6f6e3a20636f6c6c656374696f6e206d757374206861766560008201527f2061206e6f6e7a65726f20737570706c79000000000000000000000000000000602082015250565b7f455243373231416e6f6e3a206d61782062617463682073697a65206d7573742060008201527f6265206e6f6e7a65726f00000000000000000000000000000000000000000000602082015250565b60805160a0516148896200051c6000396000818161207d015281816120a601526129f50152600050506148896000f3fe6080604052600436106102455760003560e01c806370a0823111610139578063b88d4fde116100b6578063dc33e6811161007a578063dc33e68114610846578063e268e4d314610883578063e985e9c5146108ac578063f2fde38b146108e9578063f3ecca7714610912578063fc4bacaf1461094f57610245565b8063b88d4fde14610761578063c87b56dd1461078a578063d321ba27146107c7578063d7224ba0146107f0578063dab039611461081b57610245565b80638da5cb5b116100fd5780638da5cb5b1461069d57806391b7f5ed146106c857806395d89b41146106f1578063a0712d681461071c578063a22cb4651461073857610245565b806370a08231146105cc578063715018a61461060957806371bb7068146106205780638171609b1461064957806389dc4fd61461067257610245565b80632eb4a7ab116101c75780634f6ccce71161018b5780634f6ccce7146104d3578063530d43fd1461051057806355f804b31461053b5780636352211e146105645780636c0360eb146105a157610245565b80632eb4a7ab146104005780632f745c591461042b5780633ccfd60b1461046857806342842e0e1461047f578063453c2310146104a857610245565b806317f7aa191161020e57806317f7aa191461032f57806318160ddd14610358578063235ebc221461038357806323b872dd146103ae5780632745b288146103d757610245565b80629af76e1461024a57806301ffc9a71461026157806306fdde031461029e578063081812fc146102c9578063095ea7b314610306575b600080fd5b34801561025657600080fd5b5061025f61097a565b005b34801561026d57600080fd5b5061028860048036038101906102839190613211565b6109ae565b6040516102959190613800565b60405180910390f35b3480156102aa57600080fd5b506102b3610af8565b6040516102c09190613836565b60405180910390f35b3480156102d557600080fd5b506102f060048036038101906102eb91906132b8565b610b8a565b6040516102fd9190613799565b60405180910390f35b34801561031257600080fd5b5061032d600480360381019061032891906131d1565b610c0f565b005b34801561033b57600080fd5b50610356600480360381019061035191906131d1565b610d28565b005b34801561036457600080fd5b5061036d610d3e565b60405161037a9190613bb8565b60405180910390f35b34801561038f57600080fd5b50610398610d47565b6040516103a59190613bb8565b60405180910390f35b3480156103ba57600080fd5b506103d560048036038101906103d091906130bb565b610d4d565b005b3480156103e357600080fd5b506103fe60048036038101906103f991906132b8565b610d5d565b005b34801561040c57600080fd5b50610415610d6f565b604051610422919061381b565b60405180910390f35b34801561043757600080fd5b50610452600480360381019061044d91906131d1565b610d75565b60405161045f9190613bb8565b60405180910390f35b34801561047457600080fd5b5061047d610f73565b005b34801561048b57600080fd5b506104a660048036038101906104a191906130bb565b610fdb565b005b3480156104b457600080fd5b506104bd610ffb565b6040516104ca9190613bb8565b60405180910390f35b3480156104df57600080fd5b506104fa60048036038101906104f591906132b8565b611001565b6040516105079190613bb8565b60405180910390f35b34801561051c57600080fd5b50610525611054565b6040516105329190613bb8565b60405180910390f35b34801561054757600080fd5b50610562600480360381019061055d919061326b565b61105a565b005b34801561057057600080fd5b5061058b600480360381019061058691906132b8565b611078565b6040516105989190613799565b60405180910390f35b3480156105ad57600080fd5b506105b661108e565b6040516105c39190613836565b60405180910390f35b3480156105d857600080fd5b506105f360048036038101906105ee919061304e565b61111c565b6040516106009190613bb8565b60405180910390f35b34801561061557600080fd5b5061061e611205565b005b34801561062c57600080fd5b50610647600480360381019061064291906132b8565b611219565b005b34801561065557600080fd5b50610670600480360381019061066b91906132b8565b61122b565b005b34801561067e57600080fd5b50610687611240565b6040516106949190613800565b60405180910390f35b3480156106a957600080fd5b506106b2611253565b6040516106bf9190613799565b60405180910390f35b3480156106d457600080fd5b506106ef60048036038101906106ea91906132b8565b61127d565b005b3480156106fd57600080fd5b5061070661128f565b6040516107139190613836565b60405180910390f35b610736600480360381019061073191906132b8565b611321565b005b34801561074457600080fd5b5061075f600480360381019061075a9190613191565b6114a7565b005b34801561076d57600080fd5b506107886004803603810190610783919061310e565b611628565b005b34801561079657600080fd5b506107b160048036038101906107ac91906132b8565b611684565b6040516107be9190613836565b60405180910390f35b3480156107d357600080fd5b506107ee60048036038101906107e991906132b8565b61172b565b005b3480156107fc57600080fd5b5061080561173d565b6040516108129190613bb8565b60405180910390f35b34801561082757600080fd5b50610830611743565b60405161083d9190613bb8565b60405180910390f35b34801561085257600080fd5b5061086d6004803603810190610868919061304e565b611749565b60405161087a9190613bb8565b60405180910390f35b34801561088f57600080fd5b506108aa60048036038101906108a591906132b8565b61175b565b005b3480156108b857600080fd5b506108d360048036038101906108ce919061307b565b61176d565b6040516108e09190613800565b60405180910390f35b3480156108f557600080fd5b50610910600480360381019061090b919061304e565b611801565b005b34801561091e57600080fd5b506109396004803603810190610934919061304e565b611885565b6040516109469190613bb8565b60405180910390f35b34801561095b57600080fd5b5061096461189d565b6040516109719190613bb8565b60405180910390f35b6109826118a3565b600c60009054906101000a900460ff1615600c60006101000a81548160ff021916908315150217905550565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a7957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ae157507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610af15750610af082611921565b5b9050919050565b606060018054610b0790613f01565b80601f0160208091040260200160405190810160405280929190818152602001828054610b3390613f01565b8015610b805780601f10610b5557610100808354040283529160200191610b80565b820191906000526020600020905b815481529060010190602001808311610b6357829003601f168201915b5050505050905090565b6000610b958261198b565b610bd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcb90613ab8565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c1a82611078565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8290613b58565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610caa611998565b73ffffffffffffffffffffffffffffffffffffffff161480610cd95750610cd881610cd3611998565b61176d565b5b610d18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0f90613a98565b60405180910390fd5b610d238383836119a0565b505050565b610d306118a3565b610d3a8282611a52565b5050565b60008054905090565b60115481565b610d58838383611a70565b505050565b610d656118a3565b80600e8190555050565b600d5481565b6000610d808361111c565b8210610dc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db8906138f8565b60405180910390fd5b6000610dcb610d3e565b905060008060005b83811015610f31576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610ec557806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f1d5786841415610f0e578195505050505050610f6d565b8380610f1990613f64565b9450505b508080610f2990613f64565b915050610dd3565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6490613af8565b60405180910390fd5b92915050565b610f7b6118a3565b3373ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f19350505050158015610fd8573d6000803e3d6000fd5b50565b610ff683838360405180602001604052806000815250611628565b505050565b60105481565b600061100b610d3e565b821061104c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104390613a18565b60405180910390fd5b819050919050565b600e5481565b6110626118a3565b8181600b9190611073929190612e42565b505050565b600061108382612029565b600001519050919050565b600b805461109b90613f01565b80601f01602080910402602001604051908101604052809291908181526020018280546110c790613f01565b80156111145780601f106110e957610100808354040283529160200191611114565b820191906000526020600020905b8154815290600101906020018083116110f757829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561118d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118490613938565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b61120d6118a3565b611217600061222c565b565b6112216118a3565b8060118190555050565b6112336118a3565b61123d3382611a52565b50565b600c60009054906101000a900460ff1681565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6112856118a3565b8060128190555050565b60606002805461129e90613f01565b80601f01602080910402602001604051908101604052809291908181526020018280546112ca90613f01565b80156113175780601f106112ec57610100808354040283529160200191611317565b820191906000526020600020905b8154815290600101906020018083116112fa57829003601f168201915b5050505050905090565b600c60009054906101000a900460ff16611370576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136790613918565b60405180910390fd5b60105481600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546113be9190613cb2565b11156113ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f690613898565b60405180910390fd5b600f54811115611444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143b90613a78565b60405180910390fd5b60115481611450610d3e565b61145a9190613cb2565b111561149b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149290613ad8565b60405180910390fd5b6114a4816122f2565b50565b6114af611998565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561151d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151490613978565b60405180910390fd5b806006600061152a611998565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166115d7611998565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161161c9190613800565b60405180910390a35050565b611633848484611a70565b61163f848484846124c1565b61167e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167590613858565b60405180910390fd5b50505050565b606061168f8261198b565b6116ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c5906139f8565b60405180910390fd5b60006116d8612658565b905060008151116116f85760405180602001604052806000815250611723565b80611702846126ea565b604051602001611713929190613775565b6040516020818303038152906040525b915050919050565b6117336118a3565b80600f8190555050565b60075481565b60125481565b60006117548261284b565b9050919050565b6117636118a3565b8060108190555050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6118096118a3565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611879576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187090613878565b60405180910390fd5b6118828161222c565b50565b600a6020528060005260406000206000915090505481565b600f5481565b6118ab611998565b73ffffffffffffffffffffffffffffffffffffffff166118c9611253565b73ffffffffffffffffffffffffffffffffffffffff161461191f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611916906139b8565b60405180910390fd5b565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b611a6c828260405180602001604052806000815250612934565b5050565b6000611a7b82612029565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611aa2611998565b73ffffffffffffffffffffffffffffffffffffffff161480611afe5750611ac7611998565b73ffffffffffffffffffffffffffffffffffffffff16611ae684610b8a565b73ffffffffffffffffffffffffffffffffffffffff16145b80611b1a5750611b198260000151611b14611998565b61176d565b5b905080611b5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b53906138d8565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611bce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc590613b78565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611c3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3590613b98565b60405180910390fd5b611c4b8585856001612e13565b611c5b60008484600001516119a0565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16611cc99190613d93565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16611d6d9190613c6c565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050506000600184611e739190613cb2565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611fb957611ee98161198b565b15611fb8576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46120218686866001612e19565b505050505050565b612031612ec8565b61203a8261198b565b612079576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207090613b18565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000083106120dd5760017f0000000000000000000000000000000000000000000000000000000000000000846120d09190613dc7565b6120da9190613cb2565b90505b60008390505b8181106121eb576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146121d757809350505050612227565b5080806121e390613ed7565b9150506120e3565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221e906139d8565b60405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600e54600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561240d57600e5481101561234b57600e5490505b601254600e548261235c9190613dc7565b6123669190613d39565b3410156123a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239f90613958565b60405180910390fd5b80600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123f79190613cb2565b925050819055506124083382611a52565b6124be565b6012548161241b9190613d39565b34101561245d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245490613a38565b60405180910390fd5b80600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124ac9190613cb2565b925050819055506124bd3382611a52565b5b50565b60006124e28473ffffffffffffffffffffffffffffffffffffffff16612e1f565b1561264b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261250b611998565b8786866040518563ffffffff1660e01b815260040161252d94939291906137b4565b602060405180830381600087803b15801561254757600080fd5b505af192505050801561257857506040513d601f19601f82011682018060405250810190612575919061323e565b60015b6125fb573d80600081146125a8576040519150601f19603f3d011682016040523d82523d6000602084013e6125ad565b606091505b506000815114156125f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ea90613858565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612650565b600190505b949350505050565b6060600b805461266790613f01565b80601f016020809104026020016040519081016040528092919081815260200182805461269390613f01565b80156126e05780601f106126b5576101008083540402835291602001916126e0565b820191906000526020600020905b8154815290600101906020018083116126c357829003601f168201915b5050505050905090565b60606000821415612732576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612846565b600082905060005b6000821461276457808061274d90613f64565b915050600a8261275d9190613d08565b915061273a565b60008167ffffffffffffffff8111156127805761277f61409a565b5b6040519080825280601f01601f1916602001820160405280156127b25781602001600182028036833780820191505090505b5090505b6000851461283f576001826127cb9190613dc7565b9150600a856127da9190613fad565b60306127e69190613cb2565b60f81b8183815181106127fc576127fb61406b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856128389190613d08565b94506127b6565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b3906138b8565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156129aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129a190613998565b60405180910390fd5b6129b38161198b565b156129f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129ea90613a58565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000831115612a56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4d90613b38565b60405180910390fd5b612a636000858386612e13565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506040518060400160405280858360000151612b609190613c6c565b6fffffffffffffffffffffffffffffffff168152602001858360200151612b879190613c6c565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b85811015612df657818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612d9660008884886124c1565b612dd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dcc90613858565b60405180910390fd5b8180612de090613f64565b9250508080612dee90613f64565b915050612d25565b5080600081905550612e0b6000878588612e19565b505050505050565b50505050565b50505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054612e4e90613f01565b90600052602060002090601f016020900481019282612e705760008555612eb7565b82601f10612e8957803560ff1916838001178555612eb7565b82800160010185558215612eb7579182015b82811115612eb6578235825591602001919060010190612e9b565b5b509050612ec49190612f02565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115612f1b576000816000905550600101612f03565b5090565b6000612f32612f2d84613bf8565b613bd3565b905082815260208101848484011115612f4e57612f4d6140d8565b5b612f59848285613e95565b509392505050565b600081359050612f70816147f7565b92915050565b600081359050612f858161480e565b92915050565b600081359050612f9a81614825565b92915050565b600081519050612faf81614825565b92915050565b600082601f830112612fca57612fc96140ce565b5b8135612fda848260208601612f1f565b91505092915050565b60008083601f840112612ff957612ff86140ce565b5b8235905067ffffffffffffffff811115613016576130156140c9565b5b602083019150836001820283011115613032576130316140d3565b5b9250929050565b6000813590506130488161483c565b92915050565b600060208284031215613064576130636140e2565b5b600061307284828501612f61565b91505092915050565b60008060408385031215613092576130916140e2565b5b60006130a085828601612f61565b92505060206130b185828601612f61565b9150509250929050565b6000806000606084860312156130d4576130d36140e2565b5b60006130e286828701612f61565b93505060206130f386828701612f61565b925050604061310486828701613039565b9150509250925092565b60008060008060808587031215613128576131276140e2565b5b600061313687828801612f61565b945050602061314787828801612f61565b935050604061315887828801613039565b925050606085013567ffffffffffffffff811115613179576131786140dd565b5b61318587828801612fb5565b91505092959194509250565b600080604083850312156131a8576131a76140e2565b5b60006131b685828601612f61565b92505060206131c785828601612f76565b9150509250929050565b600080604083850312156131e8576131e76140e2565b5b60006131f685828601612f61565b925050602061320785828601613039565b9150509250929050565b600060208284031215613227576132266140e2565b5b600061323584828501612f8b565b91505092915050565b600060208284031215613254576132536140e2565b5b600061326284828501612fa0565b91505092915050565b60008060208385031215613282576132816140e2565b5b600083013567ffffffffffffffff8111156132a05761329f6140dd565b5b6132ac85828601612fe3565b92509250509250929050565b6000602082840312156132ce576132cd6140e2565b5b60006132dc84828501613039565b91505092915050565b6132ee81613dfb565b82525050565b6132fd81613e0d565b82525050565b61330c81613e19565b82525050565b600061331d82613c29565b6133278185613c3f565b9350613337818560208601613ea4565b613340816140e7565b840191505092915050565b600061335682613c34565b6133608185613c50565b9350613370818560208601613ea4565b613379816140e7565b840191505092915050565b600061338f82613c34565b6133998185613c61565b93506133a9818560208601613ea4565b80840191505092915050565b60006133c2603683613c50565b91506133cd826140f8565b604082019050919050565b60006133e5602683613c50565b91506133f082614147565b604082019050919050565b6000613408601583613c50565b915061341382614196565b602082019050919050565b600061342b603483613c50565b9150613436826141bf565b604082019050919050565b600061344e603583613c50565b91506134598261420e565b604082019050919050565b6000613471602583613c50565b915061347c8261425d565b604082019050919050565b6000613494601b83613c50565b915061349f826142ac565b602082019050919050565b60006134b7602e83613c50565b91506134c2826142d5565b604082019050919050565b60006134da601583613c50565b91506134e582614324565b602082019050919050565b60006134fd601d83613c50565b91506135088261434d565b602082019050919050565b6000613520602483613c50565b915061352b82614376565b604082019050919050565b6000613543602083613c50565b915061354e826143c5565b602082019050919050565b6000613566603283613c50565b9150613571826143ee565b604082019050919050565b6000613589602f83613c50565b91506135948261443d565b604082019050919050565b60006135ac602683613c50565b91506135b78261448c565b604082019050919050565b60006135cf601683613c50565b91506135da826144db565b602082019050919050565b60006135f2602083613c50565b91506135fd82614504565b602082019050919050565b6000613615601c83613c50565b91506136208261452d565b602082019050919050565b6000613638603c83613c50565b915061364382614556565b604082019050919050565b600061365b603083613c50565b9150613666826145a5565b604082019050919050565b600061367e600e83613c50565b9150613689826145f4565b602082019050919050565b60006136a1603183613c50565b91506136ac8261461d565b604082019050919050565b60006136c4602d83613c50565b91506136cf8261466c565b604082019050919050565b60006136e7602583613c50565b91506136f2826146bb565b604082019050919050565b600061370a602583613c50565b91506137158261470a565b604082019050919050565b600061372d602983613c50565b915061373882614759565b604082019050919050565b6000613750602883613c50565b915061375b826147a8565b604082019050919050565b61376f81613e8b565b82525050565b60006137818285613384565b915061378d8284613384565b91508190509392505050565b60006020820190506137ae60008301846132e5565b92915050565b60006080820190506137c960008301876132e5565b6137d660208301866132e5565b6137e36040830185613766565b81810360608301526137f58184613312565b905095945050505050565b600060208201905061381560008301846132f4565b92915050565b60006020820190506138306000830184613303565b92915050565b60006020820190508181036000830152613850818461334b565b905092915050565b60006020820190508181036000830152613871816133b5565b9050919050565b60006020820190508181036000830152613891816133d8565b9050919050565b600060208201905081810360008301526138b1816133fb565b9050919050565b600060208201905081810360008301526138d18161341e565b9050919050565b600060208201905081810360008301526138f181613441565b9050919050565b6000602082019050818103600083015261391181613464565b9050919050565b6000602082019050818103600083015261393181613487565b9050919050565b60006020820190508181036000830152613951816134aa565b9050919050565b60006020820190508181036000830152613971816134cd565b9050919050565b60006020820190508181036000830152613991816134f0565b9050919050565b600060208201905081810360008301526139b181613513565b9050919050565b600060208201905081810360008301526139d181613536565b9050919050565b600060208201905081810360008301526139f181613559565b9050919050565b60006020820190508181036000830152613a118161357c565b9050919050565b60006020820190508181036000830152613a318161359f565b9050919050565b60006020820190508181036000830152613a51816135c2565b9050919050565b60006020820190508181036000830152613a71816135e5565b9050919050565b60006020820190508181036000830152613a9181613608565b9050919050565b60006020820190508181036000830152613ab18161362b565b9050919050565b60006020820190508181036000830152613ad18161364e565b9050919050565b60006020820190508181036000830152613af181613671565b9050919050565b60006020820190508181036000830152613b1181613694565b9050919050565b60006020820190508181036000830152613b31816136b7565b9050919050565b60006020820190508181036000830152613b51816136da565b9050919050565b60006020820190508181036000830152613b71816136fd565b9050919050565b60006020820190508181036000830152613b9181613720565b9050919050565b60006020820190508181036000830152613bb181613743565b9050919050565b6000602082019050613bcd6000830184613766565b92915050565b6000613bdd613bee565b9050613be98282613f33565b919050565b6000604051905090565b600067ffffffffffffffff821115613c1357613c1261409a565b5b613c1c826140e7565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613c7782613e4f565b9150613c8283613e4f565b9250826fffffffffffffffffffffffffffffffff03821115613ca757613ca6613fde565b5b828201905092915050565b6000613cbd82613e8b565b9150613cc883613e8b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613cfd57613cfc613fde565b5b828201905092915050565b6000613d1382613e8b565b9150613d1e83613e8b565b925082613d2e57613d2d61400d565b5b828204905092915050565b6000613d4482613e8b565b9150613d4f83613e8b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613d8857613d87613fde565b5b828202905092915050565b6000613d9e82613e4f565b9150613da983613e4f565b925082821015613dbc57613dbb613fde565b5b828203905092915050565b6000613dd282613e8b565b9150613ddd83613e8b565b925082821015613df057613def613fde565b5b828203905092915050565b6000613e0682613e6b565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613ec2578082015181840152602081019050613ea7565b83811115613ed1576000848401525b50505050565b6000613ee282613e8b565b91506000821415613ef657613ef5613fde565b5b600182039050919050565b60006002820490506001821680613f1957607f821691505b60208210811415613f2d57613f2c61403c565b5b50919050565b613f3c826140e7565b810181811067ffffffffffffffff82111715613f5b57613f5a61409a565b5b80604052505050565b6000613f6f82613e8b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613fa257613fa1613fde565b5b600182019050919050565b6000613fb882613e8b565b9150613fc383613e8b565b925082613fd357613fd261400d565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231416e6f6e3a207472616e7366657220746f206e6f6e204552433760008201527f3231526563656976657220696d706c656d656e74657200000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f41415943203a204d6178205065722057616c6c65740000000000000000000000600082015250565b7f455243373231416e6f6e3a206e756d626572206d696e7465642071756572792060008201527f666f7220746865207a65726f2061646472657373000000000000000000000000602082015250565b7f455243373231416e6f6e3a207472616e736665722063616c6c6572206973206e60008201527f6f74206f776e6572206e6f7220617070726f7665640000000000000000000000602082015250565b7f455243373231416e6f6e3a206f776e657220696e646578206f7574206f66206260008201527f6f756e6473000000000000000000000000000000000000000000000000000000602082015250565b7f41415943203a204d696e74696e67205075626c69632050617573650000000000600082015250565b7f455243373231416e6f6e3a2062616c616e636520717565727920666f7220746860008201527f65207a65726f2061646472657373000000000000000000000000000000000000602082015250565b7f41415943203a20436c61696d2046726565204e46540000000000000000000000600082015250565b7f455243373231416e6f6e3a20617070726f766520746f2063616c6c6572000000600082015250565b7f455243373231416e6f6e3a206d696e7420746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f455243373231416e6f6e3a20756e61626c6520746f2064657465726d696e652060008201527f746865206f776e6572206f6620746f6b656e0000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231416e6f6e3a20676c6f62616c20696e646578206f7574206f662060008201527f626f756e64730000000000000000000000000000000000000000000000000000602082015250565b7f41415943203a2046756e64206e6f7420656e6f75676800000000000000000000600082015250565b7f455243373231416e6f6e3a20746f6b656e20616c7265616479206d696e746564600082015250565b7f41415943203a204c696d697420506572205472616e73616374696f6e00000000600082015250565b7f455243373231416e6f6e3a20617070726f76652063616c6c6572206973206e6f60008201527f74206f776e6572206e6f7220617070726f76656420666f7220616c6c00000000602082015250565b7f455243373231416e6f6e3a20617070726f76656420717565727920666f72206e60008201527f6f6e6578697374656e7420746f6b656e00000000000000000000000000000000602082015250565b7f41415943203a20536f6c646f7574000000000000000000000000000000000000600082015250565b7f455243373231416e6f6e3a20756e61626c6520746f2067657420746f6b656e2060008201527f6f66206f776e657220627920696e646578000000000000000000000000000000602082015250565b7f455243373231416e6f6e3a206f776e657220717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f455243373231416e6f6e3a207175616e7469747920746f206d696e7420746f6f60008201527f2068696768000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231416e6f6e3a20617070726f76616c20746f2063757272656e742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231416e6f6e3a207472616e736665722066726f6d20696e636f727260008201527f656374206f776e65720000000000000000000000000000000000000000000000602082015250565b7f455243373231416e6f6e3a207472616e7366657220746f20746865207a65726f60008201527f2061646472657373000000000000000000000000000000000000000000000000602082015250565b61480081613dfb565b811461480b57600080fd5b50565b61481781613e0d565b811461482257600080fd5b50565b61482e81613e23565b811461483957600080fd5b50565b61484581613e8b565b811461485057600080fd5b5056fea264697066735822122030da3435edaa1980334b860124067a80b07f4c083aaf19bcb6ce6e55499694fb64736f6c63430008070033

Deployed Bytecode

0x6080604052600436106102455760003560e01c806370a0823111610139578063b88d4fde116100b6578063dc33e6811161007a578063dc33e68114610846578063e268e4d314610883578063e985e9c5146108ac578063f2fde38b146108e9578063f3ecca7714610912578063fc4bacaf1461094f57610245565b8063b88d4fde14610761578063c87b56dd1461078a578063d321ba27146107c7578063d7224ba0146107f0578063dab039611461081b57610245565b80638da5cb5b116100fd5780638da5cb5b1461069d57806391b7f5ed146106c857806395d89b41146106f1578063a0712d681461071c578063a22cb4651461073857610245565b806370a08231146105cc578063715018a61461060957806371bb7068146106205780638171609b1461064957806389dc4fd61461067257610245565b80632eb4a7ab116101c75780634f6ccce71161018b5780634f6ccce7146104d3578063530d43fd1461051057806355f804b31461053b5780636352211e146105645780636c0360eb146105a157610245565b80632eb4a7ab146104005780632f745c591461042b5780633ccfd60b1461046857806342842e0e1461047f578063453c2310146104a857610245565b806317f7aa191161020e57806317f7aa191461032f57806318160ddd14610358578063235ebc221461038357806323b872dd146103ae5780632745b288146103d757610245565b80629af76e1461024a57806301ffc9a71461026157806306fdde031461029e578063081812fc146102c9578063095ea7b314610306575b600080fd5b34801561025657600080fd5b5061025f61097a565b005b34801561026d57600080fd5b5061028860048036038101906102839190613211565b6109ae565b6040516102959190613800565b60405180910390f35b3480156102aa57600080fd5b506102b3610af8565b6040516102c09190613836565b60405180910390f35b3480156102d557600080fd5b506102f060048036038101906102eb91906132b8565b610b8a565b6040516102fd9190613799565b60405180910390f35b34801561031257600080fd5b5061032d600480360381019061032891906131d1565b610c0f565b005b34801561033b57600080fd5b50610356600480360381019061035191906131d1565b610d28565b005b34801561036457600080fd5b5061036d610d3e565b60405161037a9190613bb8565b60405180910390f35b34801561038f57600080fd5b50610398610d47565b6040516103a59190613bb8565b60405180910390f35b3480156103ba57600080fd5b506103d560048036038101906103d091906130bb565b610d4d565b005b3480156103e357600080fd5b506103fe60048036038101906103f991906132b8565b610d5d565b005b34801561040c57600080fd5b50610415610d6f565b604051610422919061381b565b60405180910390f35b34801561043757600080fd5b50610452600480360381019061044d91906131d1565b610d75565b60405161045f9190613bb8565b60405180910390f35b34801561047457600080fd5b5061047d610f73565b005b34801561048b57600080fd5b506104a660048036038101906104a191906130bb565b610fdb565b005b3480156104b457600080fd5b506104bd610ffb565b6040516104ca9190613bb8565b60405180910390f35b3480156104df57600080fd5b506104fa60048036038101906104f591906132b8565b611001565b6040516105079190613bb8565b60405180910390f35b34801561051c57600080fd5b50610525611054565b6040516105329190613bb8565b60405180910390f35b34801561054757600080fd5b50610562600480360381019061055d919061326b565b61105a565b005b34801561057057600080fd5b5061058b600480360381019061058691906132b8565b611078565b6040516105989190613799565b60405180910390f35b3480156105ad57600080fd5b506105b661108e565b6040516105c39190613836565b60405180910390f35b3480156105d857600080fd5b506105f360048036038101906105ee919061304e565b61111c565b6040516106009190613bb8565b60405180910390f35b34801561061557600080fd5b5061061e611205565b005b34801561062c57600080fd5b50610647600480360381019061064291906132b8565b611219565b005b34801561065557600080fd5b50610670600480360381019061066b91906132b8565b61122b565b005b34801561067e57600080fd5b50610687611240565b6040516106949190613800565b60405180910390f35b3480156106a957600080fd5b506106b2611253565b6040516106bf9190613799565b60405180910390f35b3480156106d457600080fd5b506106ef60048036038101906106ea91906132b8565b61127d565b005b3480156106fd57600080fd5b5061070661128f565b6040516107139190613836565b60405180910390f35b610736600480360381019061073191906132b8565b611321565b005b34801561074457600080fd5b5061075f600480360381019061075a9190613191565b6114a7565b005b34801561076d57600080fd5b506107886004803603810190610783919061310e565b611628565b005b34801561079657600080fd5b506107b160048036038101906107ac91906132b8565b611684565b6040516107be9190613836565b60405180910390f35b3480156107d357600080fd5b506107ee60048036038101906107e991906132b8565b61172b565b005b3480156107fc57600080fd5b5061080561173d565b6040516108129190613bb8565b60405180910390f35b34801561082757600080fd5b50610830611743565b60405161083d9190613bb8565b60405180910390f35b34801561085257600080fd5b5061086d6004803603810190610868919061304e565b611749565b60405161087a9190613bb8565b60405180910390f35b34801561088f57600080fd5b506108aa60048036038101906108a591906132b8565b61175b565b005b3480156108b857600080fd5b506108d360048036038101906108ce919061307b565b61176d565b6040516108e09190613800565b60405180910390f35b3480156108f557600080fd5b50610910600480360381019061090b919061304e565b611801565b005b34801561091e57600080fd5b506109396004803603810190610934919061304e565b611885565b6040516109469190613bb8565b60405180910390f35b34801561095b57600080fd5b5061096461189d565b6040516109719190613bb8565b60405180910390f35b6109826118a3565b600c60009054906101000a900460ff1615600c60006101000a81548160ff021916908315150217905550565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a7957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ae157507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610af15750610af082611921565b5b9050919050565b606060018054610b0790613f01565b80601f0160208091040260200160405190810160405280929190818152602001828054610b3390613f01565b8015610b805780601f10610b5557610100808354040283529160200191610b80565b820191906000526020600020905b815481529060010190602001808311610b6357829003601f168201915b5050505050905090565b6000610b958261198b565b610bd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcb90613ab8565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c1a82611078565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8290613b58565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610caa611998565b73ffffffffffffffffffffffffffffffffffffffff161480610cd95750610cd881610cd3611998565b61176d565b5b610d18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0f90613a98565b60405180910390fd5b610d238383836119a0565b505050565b610d306118a3565b610d3a8282611a52565b5050565b60008054905090565b60115481565b610d58838383611a70565b505050565b610d656118a3565b80600e8190555050565b600d5481565b6000610d808361111c565b8210610dc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db8906138f8565b60405180910390fd5b6000610dcb610d3e565b905060008060005b83811015610f31576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610ec557806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f1d5786841415610f0e578195505050505050610f6d565b8380610f1990613f64565b9450505b508080610f2990613f64565b915050610dd3565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6490613af8565b60405180910390fd5b92915050565b610f7b6118a3565b3373ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f19350505050158015610fd8573d6000803e3d6000fd5b50565b610ff683838360405180602001604052806000815250611628565b505050565b60105481565b600061100b610d3e565b821061104c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104390613a18565b60405180910390fd5b819050919050565b600e5481565b6110626118a3565b8181600b9190611073929190612e42565b505050565b600061108382612029565b600001519050919050565b600b805461109b90613f01565b80601f01602080910402602001604051908101604052809291908181526020018280546110c790613f01565b80156111145780601f106110e957610100808354040283529160200191611114565b820191906000526020600020905b8154815290600101906020018083116110f757829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561118d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118490613938565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b61120d6118a3565b611217600061222c565b565b6112216118a3565b8060118190555050565b6112336118a3565b61123d3382611a52565b50565b600c60009054906101000a900460ff1681565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6112856118a3565b8060128190555050565b60606002805461129e90613f01565b80601f01602080910402602001604051908101604052809291908181526020018280546112ca90613f01565b80156113175780601f106112ec57610100808354040283529160200191611317565b820191906000526020600020905b8154815290600101906020018083116112fa57829003601f168201915b5050505050905090565b600c60009054906101000a900460ff16611370576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136790613918565b60405180910390fd5b60105481600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546113be9190613cb2565b11156113ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f690613898565b60405180910390fd5b600f54811115611444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143b90613a78565b60405180910390fd5b60115481611450610d3e565b61145a9190613cb2565b111561149b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149290613ad8565b60405180910390fd5b6114a4816122f2565b50565b6114af611998565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561151d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151490613978565b60405180910390fd5b806006600061152a611998565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166115d7611998565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161161c9190613800565b60405180910390a35050565b611633848484611a70565b61163f848484846124c1565b61167e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167590613858565b60405180910390fd5b50505050565b606061168f8261198b565b6116ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c5906139f8565b60405180910390fd5b60006116d8612658565b905060008151116116f85760405180602001604052806000815250611723565b80611702846126ea565b604051602001611713929190613775565b6040516020818303038152906040525b915050919050565b6117336118a3565b80600f8190555050565b60075481565b60125481565b60006117548261284b565b9050919050565b6117636118a3565b8060108190555050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6118096118a3565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611879576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187090613878565b60405180910390fd5b6118828161222c565b50565b600a6020528060005260406000206000915090505481565b600f5481565b6118ab611998565b73ffffffffffffffffffffffffffffffffffffffff166118c9611253565b73ffffffffffffffffffffffffffffffffffffffff161461191f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611916906139b8565b60405180910390fd5b565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b611a6c828260405180602001604052806000815250612934565b5050565b6000611a7b82612029565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611aa2611998565b73ffffffffffffffffffffffffffffffffffffffff161480611afe5750611ac7611998565b73ffffffffffffffffffffffffffffffffffffffff16611ae684610b8a565b73ffffffffffffffffffffffffffffffffffffffff16145b80611b1a5750611b198260000151611b14611998565b61176d565b5b905080611b5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b53906138d8565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611bce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc590613b78565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611c3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3590613b98565b60405180910390fd5b611c4b8585856001612e13565b611c5b60008484600001516119a0565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16611cc99190613d93565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16611d6d9190613c6c565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050506000600184611e739190613cb2565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611fb957611ee98161198b565b15611fb8576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46120218686866001612e19565b505050505050565b612031612ec8565b61203a8261198b565b612079576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207090613b18565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000006483106120dd5760017f0000000000000000000000000000000000000000000000000000000000000064846120d09190613dc7565b6120da9190613cb2565b90505b60008390505b8181106121eb576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146121d757809350505050612227565b5080806121e390613ed7565b9150506120e3565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221e906139d8565b60405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600e54600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561240d57600e5481101561234b57600e5490505b601254600e548261235c9190613dc7565b6123669190613d39565b3410156123a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239f90613958565b60405180910390fd5b80600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123f79190613cb2565b925050819055506124083382611a52565b6124be565b6012548161241b9190613d39565b34101561245d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245490613a38565b60405180910390fd5b80600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124ac9190613cb2565b925050819055506124bd3382611a52565b5b50565b60006124e28473ffffffffffffffffffffffffffffffffffffffff16612e1f565b1561264b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261250b611998565b8786866040518563ffffffff1660e01b815260040161252d94939291906137b4565b602060405180830381600087803b15801561254757600080fd5b505af192505050801561257857506040513d601f19601f82011682018060405250810190612575919061323e565b60015b6125fb573d80600081146125a8576040519150601f19603f3d011682016040523d82523d6000602084013e6125ad565b606091505b506000815114156125f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ea90613858565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612650565b600190505b949350505050565b6060600b805461266790613f01565b80601f016020809104026020016040519081016040528092919081815260200182805461269390613f01565b80156126e05780601f106126b5576101008083540402835291602001916126e0565b820191906000526020600020905b8154815290600101906020018083116126c357829003601f168201915b5050505050905090565b60606000821415612732576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612846565b600082905060005b6000821461276457808061274d90613f64565b915050600a8261275d9190613d08565b915061273a565b60008167ffffffffffffffff8111156127805761277f61409a565b5b6040519080825280601f01601f1916602001820160405280156127b25781602001600182028036833780820191505090505b5090505b6000851461283f576001826127cb9190613dc7565b9150600a856127da9190613fad565b60306127e69190613cb2565b60f81b8183815181106127fc576127fb61406b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856128389190613d08565b94506127b6565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b3906138b8565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156129aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129a190613998565b60405180910390fd5b6129b38161198b565b156129f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129ea90613a58565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000064831115612a56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4d90613b38565b60405180910390fd5b612a636000858386612e13565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506040518060400160405280858360000151612b609190613c6c565b6fffffffffffffffffffffffffffffffff168152602001858360200151612b879190613c6c565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b85811015612df657818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612d9660008884886124c1565b612dd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dcc90613858565b60405180910390fd5b8180612de090613f64565b9250508080612dee90613f64565b915050612d25565b5080600081905550612e0b6000878588612e19565b505050505050565b50505050565b50505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054612e4e90613f01565b90600052602060002090601f016020900481019282612e705760008555612eb7565b82601f10612e8957803560ff1916838001178555612eb7565b82800160010185558215612eb7579182015b82811115612eb6578235825591602001919060010190612e9b565b5b509050612ec49190612f02565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115612f1b576000816000905550600101612f03565b5090565b6000612f32612f2d84613bf8565b613bd3565b905082815260208101848484011115612f4e57612f4d6140d8565b5b612f59848285613e95565b509392505050565b600081359050612f70816147f7565b92915050565b600081359050612f858161480e565b92915050565b600081359050612f9a81614825565b92915050565b600081519050612faf81614825565b92915050565b600082601f830112612fca57612fc96140ce565b5b8135612fda848260208601612f1f565b91505092915050565b60008083601f840112612ff957612ff86140ce565b5b8235905067ffffffffffffffff811115613016576130156140c9565b5b602083019150836001820283011115613032576130316140d3565b5b9250929050565b6000813590506130488161483c565b92915050565b600060208284031215613064576130636140e2565b5b600061307284828501612f61565b91505092915050565b60008060408385031215613092576130916140e2565b5b60006130a085828601612f61565b92505060206130b185828601612f61565b9150509250929050565b6000806000606084860312156130d4576130d36140e2565b5b60006130e286828701612f61565b93505060206130f386828701612f61565b925050604061310486828701613039565b9150509250925092565b60008060008060808587031215613128576131276140e2565b5b600061313687828801612f61565b945050602061314787828801612f61565b935050604061315887828801613039565b925050606085013567ffffffffffffffff811115613179576131786140dd565b5b61318587828801612fb5565b91505092959194509250565b600080604083850312156131a8576131a76140e2565b5b60006131b685828601612f61565b92505060206131c785828601612f76565b9150509250929050565b600080604083850312156131e8576131e76140e2565b5b60006131f685828601612f61565b925050602061320785828601613039565b9150509250929050565b600060208284031215613227576132266140e2565b5b600061323584828501612f8b565b91505092915050565b600060208284031215613254576132536140e2565b5b600061326284828501612fa0565b91505092915050565b60008060208385031215613282576132816140e2565b5b600083013567ffffffffffffffff8111156132a05761329f6140dd565b5b6132ac85828601612fe3565b92509250509250929050565b6000602082840312156132ce576132cd6140e2565b5b60006132dc84828501613039565b91505092915050565b6132ee81613dfb565b82525050565b6132fd81613e0d565b82525050565b61330c81613e19565b82525050565b600061331d82613c29565b6133278185613c3f565b9350613337818560208601613ea4565b613340816140e7565b840191505092915050565b600061335682613c34565b6133608185613c50565b9350613370818560208601613ea4565b613379816140e7565b840191505092915050565b600061338f82613c34565b6133998185613c61565b93506133a9818560208601613ea4565b80840191505092915050565b60006133c2603683613c50565b91506133cd826140f8565b604082019050919050565b60006133e5602683613c50565b91506133f082614147565b604082019050919050565b6000613408601583613c50565b915061341382614196565b602082019050919050565b600061342b603483613c50565b9150613436826141bf565b604082019050919050565b600061344e603583613c50565b91506134598261420e565b604082019050919050565b6000613471602583613c50565b915061347c8261425d565b604082019050919050565b6000613494601b83613c50565b915061349f826142ac565b602082019050919050565b60006134b7602e83613c50565b91506134c2826142d5565b604082019050919050565b60006134da601583613c50565b91506134e582614324565b602082019050919050565b60006134fd601d83613c50565b91506135088261434d565b602082019050919050565b6000613520602483613c50565b915061352b82614376565b604082019050919050565b6000613543602083613c50565b915061354e826143c5565b602082019050919050565b6000613566603283613c50565b9150613571826143ee565b604082019050919050565b6000613589602f83613c50565b91506135948261443d565b604082019050919050565b60006135ac602683613c50565b91506135b78261448c565b604082019050919050565b60006135cf601683613c50565b91506135da826144db565b602082019050919050565b60006135f2602083613c50565b91506135fd82614504565b602082019050919050565b6000613615601c83613c50565b91506136208261452d565b602082019050919050565b6000613638603c83613c50565b915061364382614556565b604082019050919050565b600061365b603083613c50565b9150613666826145a5565b604082019050919050565b600061367e600e83613c50565b9150613689826145f4565b602082019050919050565b60006136a1603183613c50565b91506136ac8261461d565b604082019050919050565b60006136c4602d83613c50565b91506136cf8261466c565b604082019050919050565b60006136e7602583613c50565b91506136f2826146bb565b604082019050919050565b600061370a602583613c50565b91506137158261470a565b604082019050919050565b600061372d602983613c50565b915061373882614759565b604082019050919050565b6000613750602883613c50565b915061375b826147a8565b604082019050919050565b61376f81613e8b565b82525050565b60006137818285613384565b915061378d8284613384565b91508190509392505050565b60006020820190506137ae60008301846132e5565b92915050565b60006080820190506137c960008301876132e5565b6137d660208301866132e5565b6137e36040830185613766565b81810360608301526137f58184613312565b905095945050505050565b600060208201905061381560008301846132f4565b92915050565b60006020820190506138306000830184613303565b92915050565b60006020820190508181036000830152613850818461334b565b905092915050565b60006020820190508181036000830152613871816133b5565b9050919050565b60006020820190508181036000830152613891816133d8565b9050919050565b600060208201905081810360008301526138b1816133fb565b9050919050565b600060208201905081810360008301526138d18161341e565b9050919050565b600060208201905081810360008301526138f181613441565b9050919050565b6000602082019050818103600083015261391181613464565b9050919050565b6000602082019050818103600083015261393181613487565b9050919050565b60006020820190508181036000830152613951816134aa565b9050919050565b60006020820190508181036000830152613971816134cd565b9050919050565b60006020820190508181036000830152613991816134f0565b9050919050565b600060208201905081810360008301526139b181613513565b9050919050565b600060208201905081810360008301526139d181613536565b9050919050565b600060208201905081810360008301526139f181613559565b9050919050565b60006020820190508181036000830152613a118161357c565b9050919050565b60006020820190508181036000830152613a318161359f565b9050919050565b60006020820190508181036000830152613a51816135c2565b9050919050565b60006020820190508181036000830152613a71816135e5565b9050919050565b60006020820190508181036000830152613a9181613608565b9050919050565b60006020820190508181036000830152613ab18161362b565b9050919050565b60006020820190508181036000830152613ad18161364e565b9050919050565b60006020820190508181036000830152613af181613671565b9050919050565b60006020820190508181036000830152613b1181613694565b9050919050565b60006020820190508181036000830152613b31816136b7565b9050919050565b60006020820190508181036000830152613b51816136da565b9050919050565b60006020820190508181036000830152613b71816136fd565b9050919050565b60006020820190508181036000830152613b9181613720565b9050919050565b60006020820190508181036000830152613bb181613743565b9050919050565b6000602082019050613bcd6000830184613766565b92915050565b6000613bdd613bee565b9050613be98282613f33565b919050565b6000604051905090565b600067ffffffffffffffff821115613c1357613c1261409a565b5b613c1c826140e7565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613c7782613e4f565b9150613c8283613e4f565b9250826fffffffffffffffffffffffffffffffff03821115613ca757613ca6613fde565b5b828201905092915050565b6000613cbd82613e8b565b9150613cc883613e8b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613cfd57613cfc613fde565b5b828201905092915050565b6000613d1382613e8b565b9150613d1e83613e8b565b925082613d2e57613d2d61400d565b5b828204905092915050565b6000613d4482613e8b565b9150613d4f83613e8b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613d8857613d87613fde565b5b828202905092915050565b6000613d9e82613e4f565b9150613da983613e4f565b925082821015613dbc57613dbb613fde565b5b828203905092915050565b6000613dd282613e8b565b9150613ddd83613e8b565b925082821015613df057613def613fde565b5b828203905092915050565b6000613e0682613e6b565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613ec2578082015181840152602081019050613ea7565b83811115613ed1576000848401525b50505050565b6000613ee282613e8b565b91506000821415613ef657613ef5613fde565b5b600182039050919050565b60006002820490506001821680613f1957607f821691505b60208210811415613f2d57613f2c61403c565b5b50919050565b613f3c826140e7565b810181811067ffffffffffffffff82111715613f5b57613f5a61409a565b5b80604052505050565b6000613f6f82613e8b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613fa257613fa1613fde565b5b600182019050919050565b6000613fb882613e8b565b9150613fc383613e8b565b925082613fd357613fd261400d565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231416e6f6e3a207472616e7366657220746f206e6f6e204552433760008201527f3231526563656976657220696d706c656d656e74657200000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f41415943203a204d6178205065722057616c6c65740000000000000000000000600082015250565b7f455243373231416e6f6e3a206e756d626572206d696e7465642071756572792060008201527f666f7220746865207a65726f2061646472657373000000000000000000000000602082015250565b7f455243373231416e6f6e3a207472616e736665722063616c6c6572206973206e60008201527f6f74206f776e6572206e6f7220617070726f7665640000000000000000000000602082015250565b7f455243373231416e6f6e3a206f776e657220696e646578206f7574206f66206260008201527f6f756e6473000000000000000000000000000000000000000000000000000000602082015250565b7f41415943203a204d696e74696e67205075626c69632050617573650000000000600082015250565b7f455243373231416e6f6e3a2062616c616e636520717565727920666f7220746860008201527f65207a65726f2061646472657373000000000000000000000000000000000000602082015250565b7f41415943203a20436c61696d2046726565204e46540000000000000000000000600082015250565b7f455243373231416e6f6e3a20617070726f766520746f2063616c6c6572000000600082015250565b7f455243373231416e6f6e3a206d696e7420746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f455243373231416e6f6e3a20756e61626c6520746f2064657465726d696e652060008201527f746865206f776e6572206f6620746f6b656e0000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231416e6f6e3a20676c6f62616c20696e646578206f7574206f662060008201527f626f756e64730000000000000000000000000000000000000000000000000000602082015250565b7f41415943203a2046756e64206e6f7420656e6f75676800000000000000000000600082015250565b7f455243373231416e6f6e3a20746f6b656e20616c7265616479206d696e746564600082015250565b7f41415943203a204c696d697420506572205472616e73616374696f6e00000000600082015250565b7f455243373231416e6f6e3a20617070726f76652063616c6c6572206973206e6f60008201527f74206f776e6572206e6f7220617070726f76656420666f7220616c6c00000000602082015250565b7f455243373231416e6f6e3a20617070726f76656420717565727920666f72206e60008201527f6f6e6578697374656e7420746f6b656e00000000000000000000000000000000602082015250565b7f41415943203a20536f6c646f7574000000000000000000000000000000000000600082015250565b7f455243373231416e6f6e3a20756e61626c6520746f2067657420746f6b656e2060008201527f6f66206f776e657220627920696e646578000000000000000000000000000000602082015250565b7f455243373231416e6f6e3a206f776e657220717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f455243373231416e6f6e3a207175616e7469747920746f206d696e7420746f6f60008201527f2068696768000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231416e6f6e3a20617070726f76616c20746f2063757272656e742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231416e6f6e3a207472616e736665722066726f6d20696e636f727260008201527f656374206f776e65720000000000000000000000000000000000000000000000602082015250565b7f455243373231416e6f6e3a207472616e7366657220746f20746865207a65726f60008201527f2061646472657373000000000000000000000000000000000000000000000000602082015250565b61480081613dfb565b811461480b57600080fd5b50565b61481781613e0d565b811461482257600080fd5b50565b61482e81613e23565b811461483957600080fd5b50565b61484581613e8b565b811461485057600080fd5b5056fea264697066735822122030da3435edaa1980334b860124067a80b07f4c083aaf19bcb6ce6e55499694fb64736f6c63430008070033

Deployed Bytecode Sourcemap

5096:2813:11:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6990:118;;;;;;;;;;;;;:::i;:::-;;4269:370:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6007:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7541:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7095:388;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6761:107:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2821:94:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5428:27:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8397:142:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7450:106:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5291:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3455:750:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7788:116:11;;;;;;;;;;;;;:::i;:::-;;8602:157:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5392:29:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2984:180:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5323:24:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7120:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5830:118:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5212:21:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4695:214:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1831:101:0;;;;;;;;;;;;;:::i;:::-;;7686:94:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6876:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5242:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1201:85:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7230:90:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6162:98:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5603:377:11;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7812:277:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8822:314;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6323:394;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7328:114:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13261:43:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5462:40:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6524:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7564:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8152:186:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2081:198:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5159:46:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5354:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6990:118;1094:13:0;:11;:13::i;:::-;7078:21:11::1;;;;;;;;;;;7077:22;7052:21;;:47;;;;;;;;;;;;;;;;;;6990:118::o:0;4269:370:12:-;4396:4;4441:25;4426:40;;;:11;:40;;;;:99;;;;4492:33;4477:48;;;:11;:48;;;;4426:99;:160;;;;4551:35;4536:50;;;:11;:50;;;;4426:160;:207;;;;4597:36;4621:11;4597:23;:36::i;:::-;4426:207;4412:221;;4269:370;;;:::o;6007:94::-;6061:13;6090:5;6083:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6007:94;:::o;7541:207::-;7609:7;7633:16;7641:7;7633;:16::i;:::-;7625:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;7718:15;:24;7734:7;7718:24;;;;;;;;;;;;;;;;;;;;;7711:31;;7541:207;;;:::o;7095:388::-;7164:13;7180:27;7199:7;7180:18;:27::i;:::-;7164:43;;7228:5;7222:11;;:2;:11;;;;7214:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;7316:5;7300:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;7325:37;7342:5;7349:12;:10;:12::i;:::-;7325:16;:37::i;:::-;7300:62;7284:156;;;;;;;;;;;;:::i;:::-;;;;;;;;;7449:28;7458:2;7462:7;7471:5;7449:8;:28::i;:::-;7157:326;7095:388;;:::o;6761:107:11:-;1094:13:0;:11;:13::i;:::-;6842:18:11::1;6852:2;6856:3;6842:9;:18::i;:::-;6761:107:::0;;:::o;2821:94:12:-;2874:7;2897:12;;2890:19;;2821:94;:::o;5428:27:11:-;;;;:::o;8397:142:12:-;8505:28;8515:4;8521:2;8525:7;8505:9;:28::i;:::-;8397:142;;;:::o;7450:106:11:-;1094:13:0;:11;:13::i;:::-;7539:9:11::1;7528:8;:20;;;;7450:106:::0;:::o;5291:25::-;;;;:::o;3455:750:12:-;3564:7;3599:16;3609:5;3599:9;:16::i;:::-;3591:5;:24;3583:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;3664:22;3689:13;:11;:13::i;:::-;3664:38;;3709:19;3739:25;3789:9;3784:350;3808:14;3804:1;:18;3784:350;;;3838:31;3872:11;:14;3884:1;3872:14;;;;;;;;;;;3838:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3925:1;3899:28;;:9;:14;;;:28;;;3895:89;;3960:9;:14;;;3940:34;;3895:89;4017:5;3996:26;;:17;:26;;;3992:135;;;4054:5;4039:11;:20;4035:59;;;4081:1;4074:8;;;;;;;;;4035:59;4104:13;;;;;:::i;:::-;;;;3992:135;3829:305;3824:3;;;;;:::i;:::-;;;;3784:350;;;;4140:59;;;;;;;;;;:::i;:::-;;;;;;;;3455:750;;;;;:::o;7788:116:11:-;1094:13:0;:11;:13::i;:::-;7844:10:11::1;7836:28;;:60;7881:4;7865:30;;;7836:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;7788:116::o:0;8602:157:12:-;8714:39;8731:4;8737:2;8741:7;8714:39;;;;;;;;;;;;:16;:39::i;:::-;8602:157;;;:::o;5392:29:11:-;;;;:::o;2984:180:12:-;3051:7;3083:13;:11;:13::i;:::-;3075:5;:21;3067:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;3153:5;3146:12;;2984:180;;;:::o;5323:24:11:-;;;;:::o;7120:102::-;1094:13:0;:11;:13::i;:::-;7206:8:11::1;;7196:7;:18;;;;;;;:::i;:::-;;7120:102:::0;;:::o;5830:118:12:-;5894:7;5917:20;5929:7;5917:11;:20::i;:::-;:25;;;5910:32;;5830:118;;;:::o;5212:21:11:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4695:214:12:-;4759:7;4800:1;4783:19;;:5;:19;;;;4775:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;4875:12;:19;4888:5;4875:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;4867:36;;4860:43;;4695:214;;;:::o;1831:101:0:-;1094:13;:11;:13::i;:::-;1895:30:::1;1922:1;1895:18;:30::i;:::-;1831:101::o:0;7686:94:11:-;1094:13:0;:11;:13::i;:::-;7764:8:11::1;7754:7;:18;;;;7686:94:::0;:::o;6876:106::-;1094:13:0;:11;:13::i;:::-;6948:26:11::1;6958:10;6970:3;6948:9;:26::i;:::-;6876:106:::0;:::o;5242:42::-;;;;;;;;;;;;;:::o;1201:85:0:-;1247:7;1273:6;;;;;;;;;;;1266:13;;1201:85;:::o;7230:90:11:-;1094:13:0;:11;:13::i;:::-;7306:6:11::1;7294:9;:18;;;;7230:90:::0;:::o;6162:98:12:-;6218:13;6247:7;6240:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6162:98;:::o;5603:377:11:-;5671:21;;;;;;;;;;;5663:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;5776:12;;5769:3;5744:10;:22;5755:10;5744:22;;;;;;;;;;;;;;;;:28;;;;:::i;:::-;:44;;5736:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;5839:12;;5832:3;:19;;5824:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;5926:7;;5919:3;5903:13;:11;:13::i;:::-;:19;;;;:::i;:::-;:30;;5895:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;5962:10;5968:3;5962:5;:10::i;:::-;5603:377;:::o;7812:277:12:-;7915:12;:10;:12::i;:::-;7903:24;;:8;:24;;;;7895:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;8015:8;7970:18;:32;7989:12;:10;:12::i;:::-;7970:32;;;;;;;;;;;;;;;:42;8003:8;7970:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;8064:8;8035:48;;8050:12;:10;:12::i;:::-;8035:48;;;8074:8;8035:48;;;;;;:::i;:::-;;;;;;;;7812:277;;:::o;8822:314::-;8959:28;8969:4;8975:2;8979:7;8959:9;:28::i;:::-;9010:48;9033:4;9039:2;9043:7;9052:5;9010:22;:48::i;:::-;8994:136;;;;;;;;;;;;:::i;:::-;;;;;;;;;8822:314;;;;:::o;6323:394::-;6421:13;6462:16;6470:7;6462;:16::i;:::-;6446:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;6552:21;6576:10;:8;:10::i;:::-;6552:34;;6631:1;6613:7;6607:21;:25;:104;;;;;;;;;;;;;;;;;6668:7;6677:18;:7;:16;:18::i;:::-;6651:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;6607:104;6593:118;;;6323:394;;;:::o;7328:114:11:-;1094:13:0;:11;:13::i;:::-;7421::11::1;7406:12;:28;;;;7328:114:::0;:::o;13261:43:12:-;;;;:::o;5462:40:11:-;;;;:::o;6524:113::-;6582:7;6609:20;6623:5;6609:13;:20::i;:::-;6602:27;;6524:113;;;:::o;7564:114::-;1094:13:0;:11;:13::i;:::-;7657::11::1;7642:12;:28;;;;7564:114:::0;:::o;8152:186:12:-;8274:4;8297:18;:25;8316:5;8297:25;;;;;;;;;;;;;;;:35;8323:8;8297:35;;;;;;;;;;;;;;;;;;;;;;;;;8290:42;;8152:186;;;;:::o;2081:198:0:-;1094:13;:11;:13::i;:::-;2189:1:::1;2169:22;;:8;:22;;;;2161:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2244:28;2263:8;2244:18;:28::i;:::-;2081:198:::0;:::o;5159:46:11:-;;;;;;;;;;;;;;;;;:::o;5354:29::-;;;;:::o;1359:130:0:-;1433:12;:10;:12::i;:::-;1422:23;;:7;:5;:7::i;:::-;:23;;;1414:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1359:130::o;829:155:9:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;9375:105:12:-;9432:4;9462:12;;9452:7;:22;9445:29;;9375:105;;;:::o;640:96:7:-;693:7;719:10;712:17;;640:96;:::o;13083:172:12:-;13207:2;13180:15;:24;13196:7;13180:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;13241:7;13237:2;13221:28;;13230:5;13221:28;;;;;;;;;;;;13083:172;;;:::o;9486:98::-;9551:27;9561:2;9565:8;9551:27;;;;;;;;;;;;:9;:27::i;:::-;9486:98;;:::o;11439:1538::-;11536:35;11574:20;11586:7;11574:11;:20::i;:::-;11536:58;;11603:22;11645:13;:18;;;11629:34;;:12;:10;:12::i;:::-;:34;;;:81;;;;11698:12;:10;:12::i;:::-;11674:36;;:20;11686:7;11674:11;:20::i;:::-;:36;;;11629:81;:142;;;;11721:50;11738:13;:18;;;11758:12;:10;:12::i;:::-;11721:16;:50::i;:::-;11629:142;11603:169;;11797:17;11781:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;11932:4;11910:26;;:13;:18;;;:26;;;11894:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;12024:1;12010:16;;:2;:16;;;;12002:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;12080:43;12102:4;12108:2;12112:7;12121:1;12080:21;:43::i;:::-;12180:49;12197:1;12201:7;12210:13;:18;;;12180:8;:49::i;:::-;12268:1;12238:12;:18;12251:4;12238:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;12304:1;12276:12;:16;12289:2;12276:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;12335:43;;;;;;;;12350:2;12335:43;;;;;;12361:15;12335:43;;;;;12312:11;:20;12324:7;12312:20;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12606:19;12638:1;12628:7;:11;;;;:::i;:::-;12606:33;;12691:1;12650:43;;:11;:24;12662:11;12650:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;12646:236;;;12708:20;12716:11;12708:7;:20::i;:::-;12704:171;;;12768:97;;;;;;;;12795:13;:18;;;12768:97;;;;;;12826:13;:28;;;12768:97;;;;;12741:11;:24;12753:11;12741:24;;;;;;;;;;;:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12704:171;12646:236;12914:7;12910:2;12895:27;;12904:4;12895:27;;;;;;;;;;;;12929:42;12950:4;12956:2;12960:7;12969:1;12929:20;:42::i;:::-;11529:1448;;;11439:1538;;;:::o;5164:612::-;5240:21;;:::i;:::-;5281:16;5289:7;5281;:16::i;:::-;5273:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;5356:26;5404:12;5393:7;:23;5389:93;;5473:1;5458:12;5448:7;:22;;;;:::i;:::-;:26;;;;:::i;:::-;5427:47;;5389:93;5495:12;5510:7;5495:22;;5490:212;5527:18;5519:4;:26;5490:212;;5564:31;5598:11;:17;5610:4;5598:17;;;;;;;;;;;5564:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5654:1;5628:28;;:9;:14;;;:28;;;5624:71;;5676:9;5669:16;;;;;;;5624:71;5555:147;5547:6;;;;;:::i;:::-;;;;5490:212;;;;5710:60;;;;;;;;;;:::i;:::-;;;;;;;;5164:612;;;;:::o;2433:187:0:-;2506:16;2525:6;;;;;;;;;;;2506:25;;2550:8;2541:6;;:17;;;;;;;;;;;;;;;;;;2604:8;2573:40;;2594:8;2573:40;;;;;;;;;;;;2496:124;2433:187;:::o;5988:528:11:-;6061:8;;6036:10;:22;6047:10;6036:22;;;;;;;;;;;;;;;;:33;6033:476;;;6105:8;;6099:3;:14;6096:33;;;6121:8;;6115:14;;6096:33;6183:9;;6171:8;;6165:3;:14;;;;:::i;:::-;6164:28;;;;:::i;:::-;6151:9;:41;;6143:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;6258:3;6232:10;:22;6243:10;6232:22;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;6275:26;6285:10;6297:3;6275:9;:26::i;:::-;6033:476;;;6378:9;;6372:3;:15;;;;:::i;:::-;6359:9;:28;;6351:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;6454:3;6428:10;:22;6439:10;6428:22;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;6471:26;6481:10;6493:3;6471:9;:26::i;:::-;6033:476;5988:528;:::o;14798:693:12:-;14935:4;14952:15;:2;:13;;;:15::i;:::-;14948:538;;;15007:2;14991:36;;;15028:12;:10;:12::i;:::-;15042:4;15048:7;15057:5;14991:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;14978:467;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15239:1;15222:6;:13;:18;15218:218;;;15255:64;;;;;;;;;;:::i;:::-;;;;;;;;15218:218;15404:6;15398:13;15389:6;15385:2;15381:15;15374:38;14978:467;15123:45;;;15113:55;;;:6;:55;;;;15106:62;;;;;14948:538;15474:4;15467:11;;14798:693;;;;;;;:::o;6645:108:11:-;6705:13;6738:7;6731:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6645:108;:::o;392:703:8:-;448:13;674:1;665:5;:10;661:51;;;691:10;;;;;;;;;;;;;;;;;;;;;661:51;721:12;736:5;721:20;;751:14;775:75;790:1;782:4;:9;775:75;;807:8;;;;;:::i;:::-;;;;837:2;829:10;;;;;:::i;:::-;;;775:75;;;859:19;891:6;881:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;859:39;;908:150;924:1;915:5;:10;908:150;;951:1;941:11;;;;;:::i;:::-;;;1017:2;1009:5;:10;;;;:::i;:::-;996:2;:24;;;;:::i;:::-;983:39;;966:6;973;966:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1045:2;1036:11;;;;;:::i;:::-;;;908:150;;;1081:6;1067:21;;;;;392:703;;;;:::o;4915:243:12:-;4976:7;5025:1;5008:19;;:5;:19;;;;4992:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;5119:12;:19;5132:5;5119:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;5111:41;;5104:48;;4915:243;;;:::o;9923:1284::-;10028:20;10051:12;;10028:35;;10092:1;10078:16;;:2;:16;;;;10070:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10272:21;10280:12;10272:7;:21::i;:::-;10271:22;10263:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;10357:12;10345:8;:24;;10337:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;10420:61;10450:1;10454:2;10458:12;10472:8;10420:21;:61::i;:::-;10490:30;10523:12;:16;10536:2;10523:16;;;;;;;;;;;;;;;10490:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10565:119;;;;;;;;10615:8;10585:11;:19;;;:39;;;;:::i;:::-;10565:119;;;;;;10668:8;10633:11;:24;;;:44;;;;:::i;:::-;10565:119;;;;;10546:12;:16;10559:2;10546:16;;;;;;;;;;;;;;;:138;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10719:43;;;;;;;;10734:2;10719:43;;;;;;10745:15;10719:43;;;;;10691:11;:25;10703:12;10691:25;;;;;;;;;;;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10771:20;10794:12;10771:35;;10820:9;10815:284;10839:8;10835:1;:12;10815:284;;;10893:12;10889:2;10868:38;;10885:1;10868:38;;;;;;;;;;;;10933:59;10964:1;10968:2;10972:12;10986:5;10933:22;:59::i;:::-;10915:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;11077:14;;;;;:::i;:::-;;;;10849:3;;;;;:::i;:::-;;;;10815:284;;;;11122:12;11107;:27;;;;11141:60;11170:1;11174:2;11178:12;11192:8;11141:20;:60::i;:::-;10021:1186;;;9923:1284;;;:::o;15953:141::-;;;;;:::o;16480:140::-;;;;;:::o;1175:320:6:-;1235:4;1487:1;1465:7;:19;;;:23;1458:30;;1175:320;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:13:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;568:133::-;611:5;649:6;636:20;627:29;;665:30;689:5;665:30;:::i;:::-;568:133;;;;:::o;707:137::-;752:5;790:6;777:20;768:29;;806:32;832:5;806:32;:::i;:::-;707:137;;;;:::o;850:141::-;906:5;937:6;931:13;922:22;;953:32;979:5;953:32;:::i;:::-;850:141;;;;:::o;1010:338::-;1065:5;1114:3;1107:4;1099:6;1095:17;1091:27;1081:122;;1122:79;;:::i;:::-;1081:122;1239:6;1226:20;1264:78;1338:3;1330:6;1323:4;1315:6;1311:17;1264:78;:::i;:::-;1255:87;;1071:277;1010:338;;;;:::o;1368:553::-;1426:8;1436:6;1486:3;1479:4;1471:6;1467:17;1463:27;1453:122;;1494:79;;:::i;:::-;1453:122;1607:6;1594:20;1584:30;;1637:18;1629:6;1626:30;1623:117;;;1659:79;;:::i;:::-;1623:117;1773:4;1765:6;1761:17;1749:29;;1827:3;1819:4;1811:6;1807:17;1797:8;1793:32;1790:41;1787:128;;;1834:79;;:::i;:::-;1787:128;1368:553;;;;;:::o;1927:139::-;1973:5;2011:6;1998:20;1989:29;;2027:33;2054:5;2027:33;:::i;:::-;1927:139;;;;:::o;2072:329::-;2131:6;2180:2;2168:9;2159:7;2155:23;2151:32;2148:119;;;2186:79;;:::i;:::-;2148:119;2306:1;2331:53;2376:7;2367:6;2356:9;2352:22;2331:53;:::i;:::-;2321:63;;2277:117;2072:329;;;;:::o;2407:474::-;2475:6;2483;2532:2;2520:9;2511:7;2507:23;2503:32;2500:119;;;2538:79;;:::i;:::-;2500:119;2658:1;2683:53;2728:7;2719:6;2708:9;2704:22;2683:53;:::i;:::-;2673:63;;2629:117;2785:2;2811:53;2856:7;2847:6;2836:9;2832:22;2811:53;:::i;:::-;2801:63;;2756:118;2407:474;;;;;:::o;2887:619::-;2964:6;2972;2980;3029:2;3017:9;3008:7;3004:23;3000:32;2997:119;;;3035:79;;:::i;:::-;2997:119;3155:1;3180:53;3225:7;3216:6;3205:9;3201:22;3180:53;:::i;:::-;3170:63;;3126:117;3282:2;3308:53;3353:7;3344:6;3333:9;3329:22;3308:53;:::i;:::-;3298:63;;3253:118;3410:2;3436:53;3481:7;3472:6;3461:9;3457:22;3436:53;:::i;:::-;3426:63;;3381:118;2887:619;;;;;:::o;3512:943::-;3607:6;3615;3623;3631;3680:3;3668:9;3659:7;3655:23;3651:33;3648:120;;;3687:79;;:::i;:::-;3648:120;3807:1;3832:53;3877:7;3868:6;3857:9;3853:22;3832:53;:::i;:::-;3822:63;;3778:117;3934:2;3960:53;4005:7;3996:6;3985:9;3981:22;3960:53;:::i;:::-;3950:63;;3905:118;4062:2;4088:53;4133:7;4124:6;4113:9;4109:22;4088:53;:::i;:::-;4078:63;;4033:118;4218:2;4207:9;4203:18;4190:32;4249:18;4241:6;4238:30;4235:117;;;4271:79;;:::i;:::-;4235:117;4376:62;4430:7;4421:6;4410:9;4406:22;4376:62;:::i;:::-;4366:72;;4161:287;3512:943;;;;;;;:::o;4461:468::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:50;4904:7;4895:6;4884:9;4880:22;4862:50;:::i;:::-;4852:60;;4807:115;4461:468;;;;;:::o;4935:474::-;5003:6;5011;5060:2;5048:9;5039:7;5035:23;5031:32;5028:119;;;5066:79;;:::i;:::-;5028:119;5186:1;5211:53;5256:7;5247:6;5236:9;5232:22;5211:53;:::i;:::-;5201:63;;5157:117;5313:2;5339:53;5384:7;5375:6;5364:9;5360:22;5339:53;:::i;:::-;5329:63;;5284:118;4935:474;;;;;:::o;5415:327::-;5473:6;5522:2;5510:9;5501:7;5497:23;5493:32;5490:119;;;5528:79;;:::i;:::-;5490:119;5648:1;5673:52;5717:7;5708:6;5697:9;5693:22;5673:52;:::i;:::-;5663:62;;5619:116;5415:327;;;;:::o;5748:349::-;5817:6;5866:2;5854:9;5845:7;5841:23;5837:32;5834:119;;;5872:79;;:::i;:::-;5834:119;5992:1;6017:63;6072:7;6063:6;6052:9;6048:22;6017:63;:::i;:::-;6007:73;;5963:127;5748:349;;;;:::o;6103:529::-;6174:6;6182;6231:2;6219:9;6210:7;6206:23;6202:32;6199:119;;;6237:79;;:::i;:::-;6199:119;6385:1;6374:9;6370:17;6357:31;6415:18;6407:6;6404:30;6401:117;;;6437:79;;:::i;:::-;6401:117;6550:65;6607:7;6598:6;6587:9;6583:22;6550:65;:::i;:::-;6532:83;;;;6328:297;6103:529;;;;;:::o;6638:329::-;6697:6;6746:2;6734:9;6725:7;6721:23;6717:32;6714:119;;;6752:79;;:::i;:::-;6714:119;6872:1;6897:53;6942:7;6933:6;6922:9;6918:22;6897:53;:::i;:::-;6887:63;;6843:117;6638:329;;;;:::o;6973:118::-;7060:24;7078:5;7060:24;:::i;:::-;7055:3;7048:37;6973:118;;:::o;7097:109::-;7178:21;7193:5;7178:21;:::i;:::-;7173:3;7166:34;7097:109;;:::o;7212:118::-;7299:24;7317:5;7299:24;:::i;:::-;7294:3;7287:37;7212:118;;:::o;7336:360::-;7422:3;7450:38;7482:5;7450:38;:::i;:::-;7504:70;7567:6;7562:3;7504:70;:::i;:::-;7497:77;;7583:52;7628:6;7623:3;7616:4;7609:5;7605:16;7583:52;:::i;:::-;7660:29;7682:6;7660:29;:::i;:::-;7655:3;7651:39;7644:46;;7426:270;7336:360;;;;:::o;7702:364::-;7790:3;7818:39;7851:5;7818:39;:::i;:::-;7873:71;7937:6;7932:3;7873:71;:::i;:::-;7866:78;;7953:52;7998:6;7993:3;7986:4;7979:5;7975:16;7953:52;:::i;:::-;8030:29;8052:6;8030:29;:::i;:::-;8025:3;8021:39;8014:46;;7794:272;7702:364;;;;:::o;8072:377::-;8178:3;8206:39;8239:5;8206:39;:::i;:::-;8261:89;8343:6;8338:3;8261:89;:::i;:::-;8254:96;;8359:52;8404:6;8399:3;8392:4;8385:5;8381:16;8359:52;:::i;:::-;8436:6;8431:3;8427:16;8420:23;;8182:267;8072:377;;;;:::o;8455:366::-;8597:3;8618:67;8682:2;8677:3;8618:67;:::i;:::-;8611:74;;8694:93;8783:3;8694:93;:::i;:::-;8812:2;8807:3;8803:12;8796:19;;8455:366;;;:::o;8827:::-;8969:3;8990:67;9054:2;9049:3;8990:67;:::i;:::-;8983:74;;9066:93;9155:3;9066:93;:::i;:::-;9184:2;9179:3;9175:12;9168:19;;8827:366;;;:::o;9199:::-;9341:3;9362:67;9426:2;9421:3;9362:67;:::i;:::-;9355:74;;9438:93;9527:3;9438:93;:::i;:::-;9556:2;9551:3;9547:12;9540:19;;9199:366;;;:::o;9571:::-;9713:3;9734:67;9798:2;9793:3;9734:67;:::i;:::-;9727:74;;9810:93;9899:3;9810:93;:::i;:::-;9928:2;9923:3;9919:12;9912:19;;9571:366;;;:::o;9943:::-;10085:3;10106:67;10170:2;10165:3;10106:67;:::i;:::-;10099:74;;10182:93;10271:3;10182:93;:::i;:::-;10300:2;10295:3;10291:12;10284:19;;9943:366;;;:::o;10315:::-;10457:3;10478:67;10542:2;10537:3;10478:67;:::i;:::-;10471:74;;10554:93;10643:3;10554:93;:::i;:::-;10672:2;10667:3;10663:12;10656:19;;10315:366;;;:::o;10687:::-;10829:3;10850:67;10914:2;10909:3;10850:67;:::i;:::-;10843:74;;10926:93;11015:3;10926:93;:::i;:::-;11044:2;11039:3;11035:12;11028:19;;10687:366;;;:::o;11059:::-;11201:3;11222:67;11286:2;11281:3;11222:67;:::i;:::-;11215:74;;11298:93;11387:3;11298:93;:::i;:::-;11416:2;11411:3;11407:12;11400:19;;11059:366;;;:::o;11431:::-;11573:3;11594:67;11658:2;11653:3;11594:67;:::i;:::-;11587:74;;11670:93;11759:3;11670:93;:::i;:::-;11788:2;11783:3;11779:12;11772:19;;11431:366;;;:::o;11803:::-;11945:3;11966:67;12030:2;12025:3;11966:67;:::i;:::-;11959:74;;12042:93;12131:3;12042:93;:::i;:::-;12160:2;12155:3;12151:12;12144:19;;11803:366;;;:::o;12175:::-;12317:3;12338:67;12402:2;12397:3;12338:67;:::i;:::-;12331:74;;12414:93;12503:3;12414:93;:::i;:::-;12532:2;12527:3;12523:12;12516:19;;12175:366;;;:::o;12547:::-;12689:3;12710:67;12774:2;12769:3;12710:67;:::i;:::-;12703:74;;12786:93;12875:3;12786:93;:::i;:::-;12904:2;12899:3;12895:12;12888:19;;12547:366;;;:::o;12919:::-;13061:3;13082:67;13146:2;13141:3;13082:67;:::i;:::-;13075:74;;13158:93;13247:3;13158:93;:::i;:::-;13276:2;13271:3;13267:12;13260:19;;12919:366;;;:::o;13291:::-;13433:3;13454:67;13518:2;13513:3;13454:67;:::i;:::-;13447:74;;13530:93;13619:3;13530:93;:::i;:::-;13648:2;13643:3;13639:12;13632:19;;13291:366;;;:::o;13663:::-;13805:3;13826:67;13890:2;13885:3;13826:67;:::i;:::-;13819:74;;13902:93;13991:3;13902:93;:::i;:::-;14020:2;14015:3;14011:12;14004:19;;13663:366;;;:::o;14035:::-;14177:3;14198:67;14262:2;14257:3;14198:67;:::i;:::-;14191:74;;14274:93;14363:3;14274:93;:::i;:::-;14392:2;14387:3;14383:12;14376:19;;14035:366;;;:::o;14407:::-;14549:3;14570:67;14634:2;14629:3;14570:67;:::i;:::-;14563:74;;14646:93;14735:3;14646:93;:::i;:::-;14764:2;14759:3;14755:12;14748:19;;14407:366;;;:::o;14779:::-;14921:3;14942:67;15006:2;15001:3;14942:67;:::i;:::-;14935:74;;15018:93;15107:3;15018:93;:::i;:::-;15136:2;15131:3;15127:12;15120:19;;14779:366;;;:::o;15151:::-;15293:3;15314:67;15378:2;15373:3;15314:67;:::i;:::-;15307:74;;15390:93;15479:3;15390:93;:::i;:::-;15508:2;15503:3;15499:12;15492:19;;15151:366;;;:::o;15523:::-;15665:3;15686:67;15750:2;15745:3;15686:67;:::i;:::-;15679:74;;15762:93;15851:3;15762:93;:::i;:::-;15880:2;15875:3;15871:12;15864:19;;15523:366;;;:::o;15895:::-;16037:3;16058:67;16122:2;16117:3;16058:67;:::i;:::-;16051:74;;16134:93;16223:3;16134:93;:::i;:::-;16252:2;16247:3;16243:12;16236:19;;15895:366;;;:::o;16267:::-;16409:3;16430:67;16494:2;16489:3;16430:67;:::i;:::-;16423:74;;16506:93;16595:3;16506:93;:::i;:::-;16624:2;16619:3;16615:12;16608:19;;16267:366;;;:::o;16639:::-;16781:3;16802:67;16866:2;16861:3;16802:67;:::i;:::-;16795:74;;16878:93;16967:3;16878:93;:::i;:::-;16996:2;16991:3;16987:12;16980:19;;16639:366;;;:::o;17011:::-;17153:3;17174:67;17238:2;17233:3;17174:67;:::i;:::-;17167:74;;17250:93;17339:3;17250:93;:::i;:::-;17368:2;17363:3;17359:12;17352:19;;17011:366;;;:::o;17383:::-;17525:3;17546:67;17610:2;17605:3;17546:67;:::i;:::-;17539:74;;17622:93;17711:3;17622:93;:::i;:::-;17740:2;17735:3;17731:12;17724:19;;17383:366;;;:::o;17755:::-;17897:3;17918:67;17982:2;17977:3;17918:67;:::i;:::-;17911:74;;17994:93;18083:3;17994:93;:::i;:::-;18112:2;18107:3;18103:12;18096:19;;17755:366;;;:::o;18127:::-;18269:3;18290:67;18354:2;18349:3;18290:67;:::i;:::-;18283:74;;18366:93;18455:3;18366:93;:::i;:::-;18484:2;18479:3;18475:12;18468:19;;18127:366;;;:::o;18499:118::-;18586:24;18604:5;18586:24;:::i;:::-;18581:3;18574:37;18499:118;;:::o;18623:435::-;18803:3;18825:95;18916:3;18907:6;18825:95;:::i;:::-;18818:102;;18937:95;19028:3;19019:6;18937:95;:::i;:::-;18930:102;;19049:3;19042:10;;18623:435;;;;;:::o;19064:222::-;19157:4;19195:2;19184:9;19180:18;19172:26;;19208:71;19276:1;19265:9;19261:17;19252:6;19208:71;:::i;:::-;19064:222;;;;:::o;19292:640::-;19487:4;19525:3;19514:9;19510:19;19502:27;;19539:71;19607:1;19596:9;19592:17;19583:6;19539:71;:::i;:::-;19620:72;19688:2;19677:9;19673:18;19664:6;19620:72;:::i;:::-;19702;19770:2;19759:9;19755:18;19746:6;19702:72;:::i;:::-;19821:9;19815:4;19811:20;19806:2;19795:9;19791:18;19784:48;19849:76;19920:4;19911:6;19849:76;:::i;:::-;19841:84;;19292:640;;;;;;;:::o;19938:210::-;20025:4;20063:2;20052:9;20048:18;20040:26;;20076:65;20138:1;20127:9;20123:17;20114:6;20076:65;:::i;:::-;19938:210;;;;:::o;20154:222::-;20247:4;20285:2;20274:9;20270:18;20262:26;;20298:71;20366:1;20355:9;20351:17;20342:6;20298:71;:::i;:::-;20154:222;;;;:::o;20382:313::-;20495:4;20533:2;20522:9;20518:18;20510:26;;20582:9;20576:4;20572:20;20568:1;20557:9;20553:17;20546:47;20610:78;20683:4;20674:6;20610:78;:::i;:::-;20602:86;;20382:313;;;;:::o;20701:419::-;20867:4;20905:2;20894:9;20890:18;20882:26;;20954:9;20948:4;20944:20;20940:1;20929:9;20925:17;20918:47;20982:131;21108:4;20982:131;:::i;:::-;20974:139;;20701:419;;;:::o;21126:::-;21292:4;21330:2;21319:9;21315:18;21307:26;;21379:9;21373:4;21369:20;21365:1;21354:9;21350:17;21343:47;21407:131;21533:4;21407:131;:::i;:::-;21399:139;;21126:419;;;:::o;21551:::-;21717:4;21755:2;21744:9;21740:18;21732:26;;21804:9;21798:4;21794:20;21790:1;21779:9;21775:17;21768:47;21832:131;21958:4;21832:131;:::i;:::-;21824:139;;21551:419;;;:::o;21976:::-;22142:4;22180:2;22169:9;22165:18;22157:26;;22229:9;22223:4;22219:20;22215:1;22204:9;22200:17;22193:47;22257:131;22383:4;22257:131;:::i;:::-;22249:139;;21976:419;;;:::o;22401:::-;22567:4;22605:2;22594:9;22590:18;22582:26;;22654:9;22648:4;22644:20;22640:1;22629:9;22625:17;22618:47;22682:131;22808:4;22682:131;:::i;:::-;22674:139;;22401:419;;;:::o;22826:::-;22992:4;23030:2;23019:9;23015:18;23007:26;;23079:9;23073:4;23069:20;23065:1;23054:9;23050:17;23043:47;23107:131;23233:4;23107:131;:::i;:::-;23099:139;;22826:419;;;:::o;23251:::-;23417:4;23455:2;23444:9;23440:18;23432:26;;23504:9;23498:4;23494:20;23490:1;23479:9;23475:17;23468:47;23532:131;23658:4;23532:131;:::i;:::-;23524:139;;23251:419;;;:::o;23676:::-;23842:4;23880:2;23869:9;23865:18;23857:26;;23929:9;23923:4;23919:20;23915:1;23904:9;23900:17;23893:47;23957:131;24083:4;23957:131;:::i;:::-;23949:139;;23676:419;;;:::o;24101:::-;24267:4;24305:2;24294:9;24290:18;24282:26;;24354:9;24348:4;24344:20;24340:1;24329:9;24325:17;24318:47;24382:131;24508:4;24382:131;:::i;:::-;24374:139;;24101:419;;;:::o;24526:::-;24692:4;24730:2;24719:9;24715:18;24707:26;;24779:9;24773:4;24769:20;24765:1;24754:9;24750:17;24743:47;24807:131;24933:4;24807:131;:::i;:::-;24799:139;;24526:419;;;:::o;24951:::-;25117:4;25155:2;25144:9;25140:18;25132:26;;25204:9;25198:4;25194:20;25190:1;25179:9;25175:17;25168:47;25232:131;25358:4;25232:131;:::i;:::-;25224:139;;24951:419;;;:::o;25376:::-;25542:4;25580:2;25569:9;25565:18;25557:26;;25629:9;25623:4;25619:20;25615:1;25604:9;25600:17;25593:47;25657:131;25783:4;25657:131;:::i;:::-;25649:139;;25376:419;;;:::o;25801:::-;25967:4;26005:2;25994:9;25990:18;25982:26;;26054:9;26048:4;26044:20;26040:1;26029:9;26025:17;26018:47;26082:131;26208:4;26082:131;:::i;:::-;26074:139;;25801:419;;;:::o;26226:::-;26392:4;26430:2;26419:9;26415:18;26407:26;;26479:9;26473:4;26469:20;26465:1;26454:9;26450:17;26443:47;26507:131;26633:4;26507:131;:::i;:::-;26499:139;;26226:419;;;:::o;26651:::-;26817:4;26855:2;26844:9;26840:18;26832:26;;26904:9;26898:4;26894:20;26890:1;26879:9;26875:17;26868:47;26932:131;27058:4;26932:131;:::i;:::-;26924:139;;26651:419;;;:::o;27076:::-;27242:4;27280:2;27269:9;27265:18;27257:26;;27329:9;27323:4;27319:20;27315:1;27304:9;27300:17;27293:47;27357:131;27483:4;27357:131;:::i;:::-;27349:139;;27076:419;;;:::o;27501:::-;27667:4;27705:2;27694:9;27690:18;27682:26;;27754:9;27748:4;27744:20;27740:1;27729:9;27725:17;27718:47;27782:131;27908:4;27782:131;:::i;:::-;27774:139;;27501:419;;;:::o;27926:::-;28092:4;28130:2;28119:9;28115:18;28107:26;;28179:9;28173:4;28169:20;28165:1;28154:9;28150:17;28143:47;28207:131;28333:4;28207:131;:::i;:::-;28199:139;;27926:419;;;:::o;28351:::-;28517:4;28555:2;28544:9;28540:18;28532:26;;28604:9;28598:4;28594:20;28590:1;28579:9;28575:17;28568:47;28632:131;28758:4;28632:131;:::i;:::-;28624:139;;28351:419;;;:::o;28776:::-;28942:4;28980:2;28969:9;28965:18;28957:26;;29029:9;29023:4;29019:20;29015:1;29004:9;29000:17;28993:47;29057:131;29183:4;29057:131;:::i;:::-;29049:139;;28776:419;;;:::o;29201:::-;29367:4;29405:2;29394:9;29390:18;29382:26;;29454:9;29448:4;29444:20;29440:1;29429:9;29425:17;29418:47;29482:131;29608:4;29482:131;:::i;:::-;29474:139;;29201:419;;;:::o;29626:::-;29792:4;29830:2;29819:9;29815:18;29807:26;;29879:9;29873:4;29869:20;29865:1;29854:9;29850:17;29843:47;29907:131;30033:4;29907:131;:::i;:::-;29899:139;;29626:419;;;:::o;30051:::-;30217:4;30255:2;30244:9;30240:18;30232:26;;30304:9;30298:4;30294:20;30290:1;30279:9;30275:17;30268:47;30332:131;30458:4;30332:131;:::i;:::-;30324:139;;30051:419;;;:::o;30476:::-;30642:4;30680:2;30669:9;30665:18;30657:26;;30729:9;30723:4;30719:20;30715:1;30704:9;30700:17;30693:47;30757:131;30883:4;30757:131;:::i;:::-;30749:139;;30476:419;;;:::o;30901:::-;31067:4;31105:2;31094:9;31090:18;31082:26;;31154:9;31148:4;31144:20;31140:1;31129:9;31125:17;31118:47;31182:131;31308:4;31182:131;:::i;:::-;31174:139;;30901:419;;;:::o;31326:::-;31492:4;31530:2;31519:9;31515:18;31507:26;;31579:9;31573:4;31569:20;31565:1;31554:9;31550:17;31543:47;31607:131;31733:4;31607:131;:::i;:::-;31599:139;;31326:419;;;:::o;31751:::-;31917:4;31955:2;31944:9;31940:18;31932:26;;32004:9;31998:4;31994:20;31990:1;31979:9;31975:17;31968:47;32032:131;32158:4;32032:131;:::i;:::-;32024:139;;31751:419;;;:::o;32176:222::-;32269:4;32307:2;32296:9;32292:18;32284:26;;32320:71;32388:1;32377:9;32373:17;32364:6;32320:71;:::i;:::-;32176:222;;;;:::o;32404:129::-;32438:6;32465:20;;:::i;:::-;32455:30;;32494:33;32522:4;32514:6;32494:33;:::i;:::-;32404:129;;;:::o;32539:75::-;32572:6;32605:2;32599:9;32589:19;;32539:75;:::o;32620:307::-;32681:4;32771:18;32763:6;32760:30;32757:56;;;32793:18;;:::i;:::-;32757:56;32831:29;32853:6;32831:29;:::i;:::-;32823:37;;32915:4;32909;32905:15;32897:23;;32620:307;;;:::o;32933:98::-;32984:6;33018:5;33012:12;33002:22;;32933:98;;;:::o;33037:99::-;33089:6;33123:5;33117:12;33107:22;;33037:99;;;:::o;33142:168::-;33225:11;33259:6;33254:3;33247:19;33299:4;33294:3;33290:14;33275:29;;33142:168;;;;:::o;33316:169::-;33400:11;33434:6;33429:3;33422:19;33474:4;33469:3;33465:14;33450:29;;33316:169;;;;:::o;33491:148::-;33593:11;33630:3;33615:18;;33491:148;;;;:::o;33645:273::-;33685:3;33704:20;33722:1;33704:20;:::i;:::-;33699:25;;33738:20;33756:1;33738:20;:::i;:::-;33733:25;;33860:1;33824:34;33820:42;33817:1;33814:49;33811:75;;;33866:18;;:::i;:::-;33811:75;33910:1;33907;33903:9;33896:16;;33645:273;;;;:::o;33924:305::-;33964:3;33983:20;34001:1;33983:20;:::i;:::-;33978:25;;34017:20;34035:1;34017:20;:::i;:::-;34012:25;;34171:1;34103:66;34099:74;34096:1;34093:81;34090:107;;;34177:18;;:::i;:::-;34090:107;34221:1;34218;34214:9;34207:16;;33924:305;;;;:::o;34235:185::-;34275:1;34292:20;34310:1;34292:20;:::i;:::-;34287:25;;34326:20;34344:1;34326:20;:::i;:::-;34321:25;;34365:1;34355:35;;34370:18;;:::i;:::-;34355:35;34412:1;34409;34405:9;34400:14;;34235:185;;;;:::o;34426:348::-;34466:7;34489:20;34507:1;34489:20;:::i;:::-;34484:25;;34523:20;34541:1;34523:20;:::i;:::-;34518:25;;34711:1;34643:66;34639:74;34636:1;34633:81;34628:1;34621:9;34614:17;34610:105;34607:131;;;34718:18;;:::i;:::-;34607:131;34766:1;34763;34759:9;34748:20;;34426:348;;;;:::o;34780:191::-;34820:4;34840:20;34858:1;34840:20;:::i;:::-;34835:25;;34874:20;34892:1;34874:20;:::i;:::-;34869:25;;34913:1;34910;34907:8;34904:34;;;34918:18;;:::i;:::-;34904:34;34963:1;34960;34956:9;34948:17;;34780:191;;;;:::o;34977:::-;35017:4;35037:20;35055:1;35037:20;:::i;:::-;35032:25;;35071:20;35089:1;35071:20;:::i;:::-;35066:25;;35110:1;35107;35104:8;35101:34;;;35115:18;;:::i;:::-;35101:34;35160:1;35157;35153:9;35145:17;;34977:191;;;;:::o;35174:96::-;35211:7;35240:24;35258:5;35240:24;:::i;:::-;35229:35;;35174:96;;;:::o;35276:90::-;35310:7;35353:5;35346:13;35339:21;35328:32;;35276:90;;;:::o;35372:77::-;35409:7;35438:5;35427:16;;35372:77;;;:::o;35455:149::-;35491:7;35531:66;35524:5;35520:78;35509:89;;35455:149;;;:::o;35610:118::-;35647:7;35687:34;35680:5;35676:46;35665:57;;35610:118;;;:::o;35734:126::-;35771:7;35811:42;35804:5;35800:54;35789:65;;35734:126;;;:::o;35866:77::-;35903:7;35932:5;35921:16;;35866:77;;;:::o;35949:154::-;36033:6;36028:3;36023;36010:30;36095:1;36086:6;36081:3;36077:16;36070:27;35949:154;;;:::o;36109:307::-;36177:1;36187:113;36201:6;36198:1;36195:13;36187:113;;;36286:1;36281:3;36277:11;36271:18;36267:1;36262:3;36258:11;36251:39;36223:2;36220:1;36216:10;36211:15;;36187:113;;;36318:6;36315:1;36312:13;36309:101;;;36398:1;36389:6;36384:3;36380:16;36373:27;36309:101;36158:258;36109:307;;;:::o;36422:171::-;36461:3;36484:24;36502:5;36484:24;:::i;:::-;36475:33;;36530:4;36523:5;36520:15;36517:41;;;36538:18;;:::i;:::-;36517:41;36585:1;36578:5;36574:13;36567:20;;36422:171;;;:::o;36599:320::-;36643:6;36680:1;36674:4;36670:12;36660:22;;36727:1;36721:4;36717:12;36748:18;36738:81;;36804:4;36796:6;36792:17;36782:27;;36738:81;36866:2;36858:6;36855:14;36835:18;36832:38;36829:84;;;36885:18;;:::i;:::-;36829:84;36650:269;36599:320;;;:::o;36925:281::-;37008:27;37030:4;37008:27;:::i;:::-;37000:6;36996:40;37138:6;37126:10;37123:22;37102:18;37090:10;37087:34;37084:62;37081:88;;;37149:18;;:::i;:::-;37081:88;37189:10;37185:2;37178:22;36968:238;36925:281;;:::o;37212:233::-;37251:3;37274:24;37292:5;37274:24;:::i;:::-;37265:33;;37320:66;37313:5;37310:77;37307:103;;;37390:18;;:::i;:::-;37307:103;37437:1;37430:5;37426:13;37419:20;;37212:233;;;:::o;37451:176::-;37483:1;37500:20;37518:1;37500:20;:::i;:::-;37495:25;;37534:20;37552:1;37534:20;:::i;:::-;37529:25;;37573:1;37563:35;;37578:18;;:::i;:::-;37563:35;37619:1;37616;37612:9;37607:14;;37451:176;;;;:::o;37633:180::-;37681:77;37678:1;37671:88;37778:4;37775:1;37768:15;37802:4;37799:1;37792:15;37819:180;37867:77;37864:1;37857:88;37964:4;37961:1;37954:15;37988:4;37985:1;37978:15;38005:180;38053:77;38050:1;38043:88;38150:4;38147:1;38140:15;38174:4;38171:1;38164:15;38191:180;38239:77;38236:1;38229:88;38336:4;38333:1;38326:15;38360:4;38357:1;38350:15;38377:180;38425:77;38422:1;38415:88;38522:4;38519:1;38512:15;38546:4;38543:1;38536:15;38563:117;38672:1;38669;38662:12;38686:117;38795:1;38792;38785:12;38809:117;38918:1;38915;38908:12;38932:117;39041:1;39038;39031:12;39055:117;39164:1;39161;39154:12;39178:117;39287:1;39284;39277:12;39301:102;39342:6;39393:2;39389:7;39384:2;39377:5;39373:14;39369:28;39359:38;;39301:102;;;:::o;39409:241::-;39549:34;39545:1;39537:6;39533:14;39526:58;39618:24;39613:2;39605:6;39601:15;39594:49;39409:241;:::o;39656:225::-;39796:34;39792:1;39784:6;39780:14;39773:58;39865:8;39860:2;39852:6;39848:15;39841:33;39656:225;:::o;39887:171::-;40027:23;40023:1;40015:6;40011:14;40004:47;39887:171;:::o;40064:239::-;40204:34;40200:1;40192:6;40188:14;40181:58;40273:22;40268:2;40260:6;40256:15;40249:47;40064:239;:::o;40309:240::-;40449:34;40445:1;40437:6;40433:14;40426:58;40518:23;40513:2;40505:6;40501:15;40494:48;40309:240;:::o;40555:224::-;40695:34;40691:1;40683:6;40679:14;40672:58;40764:7;40759:2;40751:6;40747:15;40740:32;40555:224;:::o;40785:177::-;40925:29;40921:1;40913:6;40909:14;40902:53;40785:177;:::o;40968:233::-;41108:34;41104:1;41096:6;41092:14;41085:58;41177:16;41172:2;41164:6;41160:15;41153:41;40968:233;:::o;41207:171::-;41347:23;41343:1;41335:6;41331:14;41324:47;41207:171;:::o;41384:179::-;41524:31;41520:1;41512:6;41508:14;41501:55;41384:179;:::o;41569:223::-;41709:34;41705:1;41697:6;41693:14;41686:58;41778:6;41773:2;41765:6;41761:15;41754:31;41569:223;:::o;41798:182::-;41938:34;41934:1;41926:6;41922:14;41915:58;41798:182;:::o;41986:237::-;42126:34;42122:1;42114:6;42110:14;42103:58;42195:20;42190:2;42182:6;42178:15;42171:45;41986:237;:::o;42229:234::-;42369:34;42365:1;42357:6;42353:14;42346:58;42438:17;42433:2;42425:6;42421:15;42414:42;42229:234;:::o;42469:225::-;42609:34;42605:1;42597:6;42593:14;42586:58;42678:8;42673:2;42665:6;42661:15;42654:33;42469:225;:::o;42700:172::-;42840:24;42836:1;42828:6;42824:14;42817:48;42700:172;:::o;42878:182::-;43018:34;43014:1;43006:6;43002:14;42995:58;42878:182;:::o;43066:178::-;43206:30;43202:1;43194:6;43190:14;43183:54;43066:178;:::o;43250:247::-;43390:34;43386:1;43378:6;43374:14;43367:58;43459:30;43454:2;43446:6;43442:15;43435:55;43250:247;:::o;43503:235::-;43643:34;43639:1;43631:6;43627:14;43620:58;43712:18;43707:2;43699:6;43695:15;43688:43;43503:235;:::o;43744:164::-;43884:16;43880:1;43872:6;43868:14;43861:40;43744:164;:::o;43914:236::-;44054:34;44050:1;44042:6;44038:14;44031:58;44123:19;44118:2;44110:6;44106:15;44099:44;43914:236;:::o;44156:232::-;44296:34;44292:1;44284:6;44280:14;44273:58;44365:15;44360:2;44352:6;44348:15;44341:40;44156:232;:::o;44394:224::-;44534:34;44530:1;44522:6;44518:14;44511:58;44603:7;44598:2;44590:6;44586:15;44579:32;44394:224;:::o;44624:::-;44764:34;44760:1;44752:6;44748:14;44741:58;44833:7;44828:2;44820:6;44816:15;44809:32;44624:224;:::o;44854:228::-;44994:34;44990:1;44982:6;44978:14;44971:58;45063:11;45058:2;45050:6;45046:15;45039:36;44854:228;:::o;45088:227::-;45228:34;45224:1;45216:6;45212:14;45205:58;45297:10;45292:2;45284:6;45280:15;45273:35;45088:227;:::o;45321:122::-;45394:24;45412:5;45394:24;:::i;:::-;45387:5;45384:35;45374:63;;45433:1;45430;45423:12;45374:63;45321:122;:::o;45449:116::-;45519:21;45534:5;45519:21;:::i;:::-;45512:5;45509:32;45499:60;;45555:1;45552;45545:12;45499:60;45449:116;:::o;45571:120::-;45643:23;45660:5;45643:23;:::i;:::-;45636:5;45633:34;45623:62;;45681:1;45678;45671:12;45623:62;45571:120;:::o;45697:122::-;45770:24;45788:5;45770:24;:::i;:::-;45763:5;45760:35;45750:63;;45809:1;45806;45799:12;45750:63;45697:122;:::o

Swarm Source

ipfs://30da3435edaa1980334b860124067a80b07f4c083aaf19bcb6ce6e55499694fb
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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