ETH Price: $3,396.25 (+1.44%)

Token

Blur Ape YC (Blur Ape YC)
 

Overview

Max Total Supply

10,000 Blur Ape YC

Holders

3,125

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
3 Blur Ape YC
0xF4Cf06d20e1a1D646d57016EB269D6A013F9e717
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:
BlurApeYC

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license
File 1 of 14 : BlurApeYC.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "./erc721/ERC721A.sol";

contract BlurApeYC is ERC721A, Ownable, ReentrancyGuard {

    address private key;
    using ECDSA for bytes32;
    bool public Minting  = false;
    uint256[] public freeMintArray = [2,1,0];
    uint256[] public supplyMintArray = [7500 ,9000 ,9500];
    uint256 public price = 2800000000000000;
    string public baseURIReveal;  
    string public baseURIUnrevealed;  
    uint256 public maxPerTx = 20;  
    uint256 public maxSupply = 10000;
    uint256 public teamSupply = 100;  
    mapping (address => uint256) public minted;
    mapping (uint256 => bool) public reveal;
    mapping (uint256 => string) public revealUrl;

    constructor() ERC721A("Blur Ape YC", "Blur Ape YC",100,10000){}

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

    function RevealToken(uint256 tokenId,bytes memory signature) external payable
    {
        require(ownerOf(tokenId) == msg.sender, "Blur Ape YC Not Owner!");
        require(reveal[tokenId] == false, "Blur Ape YC Revealed!");
        require(isMessageValid(signature,tokenId),"Blur Ape YC Wrong Signature!");
        bytes32 messagehash = keccak256(abi.encodePacked(key,tokenId));
        reveal[tokenId] = true;
        revealUrl[tokenId] = Strings.toHexString(uint(messagehash), 32);
    }

    function mint(uint256 qty) external payable
    {
        require(Minting , "Blur Ape YC Minting Pause !");
        require(qty <= maxPerTx, "Blur Ape YC Limit Per Tx !");
        require(totalSupply() + qty <= maxSupply-teamSupply,"Blur Ape YC Soldout !");
        _safemint(qty);
    }

    function _safemint(uint256 qty) internal  {
        uint freeMint = FreeMintBatch();
        if(minted[msg.sender] < freeMint) 
        {
            if(qty < freeMint) qty = freeMint;
           require(msg.value >= (qty - freeMint) * price,"Blur Ape YC Insufficient Funds !");
            minted[msg.sender] += qty;
           _safeMint(msg.sender, qty);
        }
        else
        {
           require(msg.value >= qty * price,"Blur Ape YC Insufficient Funds !");
            minted[msg.sender] += qty;
           _safeMint(msg.sender, qty);
        }
    }

    function FreeMintBatch() public view returns (uint256) {
        if(totalSupply() < supplyMintArray[0])
        {
            return freeMintArray[0];
        }
        else if (totalSupply() < supplyMintArray[1])
        {
            return freeMintArray[1];
        }
        else if (totalSupply() < supplyMintArray[2])
        {
            return freeMintArray[2];
        }
        else
        {
            return 0;
        }
    }
    function isMessageValid(bytes memory _signature, uint256 tokenId) public view returns (bool)
    {
        bytes32 messagehash = keccak256(abi.encodePacked(address(this),key,tokenId));
        address signer = messagehash.toEthSignedMessageHash().recover(_signature);

        if (key == signer) {
            return true;
        } else {
            return false;
        }
    }

    function _setKey(address _newOwner) external onlyOwner {
        key = _newOwner;
    }

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

    function airdrop(address[] memory listedAirdrop ,uint256[] memory qty) external onlyOwner {
        for (uint256 i = 0; i < listedAirdrop.length; i++) {
           _safeMint(listedAirdrop[i], qty[i]);
        }
    }
    
    function setPublicMinting() external onlyOwner {
        Minting  = !Minting ;
    }
    
    function setBaseURI(string memory baseURIReveal_,string memory baseURIUnrevealed_) external onlyOwner {
        baseURIReveal = baseURIReveal_;
        baseURIUnrevealed = baseURIUnrevealed_;
    }

    function setsupplyMintArray(uint256[] memory supplyMintArray_) external onlyOwner {
        supplyMintArray = supplyMintArray_;
    }
    
    function setfreeMintArray(uint256[] memory freeMintArray_) external onlyOwner {
        freeMintArray = freeMintArray_;
    }

    function setMaxSupply(uint256 maxMint_) external onlyOwner {
        maxSupply = maxMint_;
    }

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

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        if(reveal[tokenId])
        {
            return bytes(baseURIReveal).length > 0 ? string(abi.encodePacked(baseURIReveal, revealUrl[tokenId],"/json")) : "";
        }
        else
        {
            return bytes(baseURIUnrevealed).length > 0 ? string(abi.encodePacked(baseURIUnrevealed, Strings.toString(tokenId))) : "";
        }
    }

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

File 2 of 14 : ERC721A.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 ERC721A 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 = 1;

  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;

  function _startTokenId() internal view virtual returns (uint256) {
      return 0;
  }
  /**
   * @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,
      "ERC721A: collection must have a nonzero supply"
    );
    require(maxBatchSize_ > 0, "ERC721A: 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 - _startTokenId();
  }

  /**
   * @dev See {IERC721Enumerable-tokenByIndex}.
   */
  function tokenByIndex(uint256 index) public view override returns (uint256) {
    require(index < totalSupply(), "ERC721A: global index out of bounds");
    return index;
  }
  
  /**
    * @dev See {IERC721Metadata-tokenURI}.
    */
  function tokenOfOwnerByArray(address owner) 
    public 
    view 
    returns (uint256[] memory token)
    {
        uint256 amount  = balanceOf(owner); 
        uint256[] memory array = new uint256[](amount);
        for(uint i=0; i < amount; i++) {
            uint256 tokenid = tokenOfOwnerByIndex(owner,i);
            array[i] = tokenid;
        }
        return array;
    }
  /**
   * @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), "ERC721A: owner index out of bounds");
    uint256 numMintedSoFar = totalSupply();
    uint256 tokenIdsIdx = 0;
    address currOwnershipAddr = address(0);
    for (uint256 i = 1; 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("ERC721A: 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), "ERC721A: balance query for the zero address");
    return uint256(_addressData[owner].balance);
  }

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

  function ownershipOf(uint256 tokenId)
    internal
    view
    returns (TokenOwnership memory)
  {
    require(_exists(tokenId), "ERC721A: 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("ERC721A: 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 = ERC721A.ownerOf(tokenId);
    require(to != owner, "ERC721A: approval to current owner");

    require(
      _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
      "ERC721A: 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), "ERC721A: approved query for nonexistent token");

    return _tokenApprovals[tokenId];
  }

  /**
   * @dev See {IERC721-setApprovalForAll}.
   */
  function setApprovalForAll(address operator, bool approved) public override {
    require(operator != _msgSender(), "ERC721A: 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),
      "ERC721A: 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), "ERC721A: 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), "ERC721A: token already minted");
    require(quantity <= maxBatchSize, "ERC721A: 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),
        "ERC721A: 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,
      "ERC721A: transfer caller is not owner nor approved"
    );

    require(
      prevOwnership.addr == from,
      "ERC721A: transfer from incorrect owner"
    );
    require(to != address(0), "ERC721A: 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("ERC721A: 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 14 : 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 14 : 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 14 : ECDSA.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.3) (utils/cryptography/ECDSA.sol)

pragma solidity ^0.8.0;

import "../Strings.sol";

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            /// @solidity memory-safe-assembly
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        uint8 v = uint8((uint256(vs) >> 255) + 27);
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

File 6 of 14 : 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 7 of 14 : 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 8 of 14 : 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 9 of 14 : 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 10 of 14 : 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 11 of 14 : 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 12 of 14 : 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 13 of 14 : 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 14 of 14 : 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":"FreeMintBatch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Minting","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"OwnerBatchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"RevealToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"_setKey","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"listedAirdrop","type":"address[]"},{"internalType":"uint256[]","name":"qty","type":"uint256[]"}],"name":"airdrop","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":"baseURIReveal","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURIUnrevealed","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"freeMintArray","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":[{"internalType":"bytes","name":"_signature","type":"bytes"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"isMessageValid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"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":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"reveal","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"revealUrl","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"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":"baseURIReveal_","type":"string"},{"internalType":"string","name":"baseURIUnrevealed_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxMint_","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setPublicMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"freeMintArray_","type":"uint256[]"}],"name":"setfreeMintArray","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"supplyMintArray_","type":"uint256[]"}],"name":"setsupplyMintArray","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"supplyMintArray","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[],"name":"teamSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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"}],"name":"tokenOfOwnerByArray","outputs":[{"internalType":"uint256[]","name":"token","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":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c0604052600160005560006007556000600a60146101000a81548160ff0219169083151502179055506040518060600160405280600260ff168152602001600160ff168152602001600060ff16815250600b906003620000629291906200030b565b506040518060600160405280611d4c61ffff16815260200161232861ffff16815260200161251c61ffff16815250600c906003620000a292919062000362565b506609f295cd5f0000600d5560146010556127106011556064601255348015620000cb57600080fd5b506040518060400160405280600b81526020017f426c7572204170652059430000000000000000000000000000000000000000008152506040518060400160405280600b81526020017f426c75722041706520594300000000000000000000000000000000000000000081525060646127106000811162000183576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200017a90620004da565b60405180910390fd5b60008211620001c9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001c090620004b8565b60405180910390fd5b8360019080519060200190620001e1929190620003ba565b508260029080519060200190620001fa929190620003ba565b508160a081815250508060808181525050505050506200022f620002236200023d60201b60201c565b6200024560201b60201c565b600160098190555062000610565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280548282559060005260206000209081019282156200034f579160200282015b828111156200034e578251829060ff169055916020019190600101906200032c565b5b5090506200035e91906200044b565b5090565b828054828255906000526020600020908101928215620003a7579160200282015b82811115620003a6578251829061ffff1690559160200191906001019062000383565b5b509050620003b691906200044b565b5090565b828054620003c8906200050d565b90600052602060002090601f016020900481019282620003ec576000855562000438565b82601f106200040757805160ff191683800117855562000438565b8280016001018555821562000438579182015b82811115620004375782518255916020019190600101906200041a565b5b5090506200044791906200044b565b5090565b5b80821115620004665760008160009055506001016200044c565b5090565b600062000479602783620004fc565b9150620004868262000572565b604082019050919050565b6000620004a0602e83620004fc565b9150620004ad82620005c1565b604082019050919050565b60006020820190508181036000830152620004d3816200046a565b9050919050565b60006020820190508181036000830152620004f58162000491565b9050919050565b600082825260208201905092915050565b600060028204905060018216806200052657607f821691505b602082108114156200053d576200053c62000543565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f455243373231413a206d61782062617463682073697a65206d7573742062652060008201527f6e6f6e7a65726f00000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060008201527f6e6f6e7a65726f20737570706c79000000000000000000000000000000000000602082015250565b60805160a051615ee062000641600039600081816128e60152818161290f0152613575015260005050615ee06000f3fe60806040526004361061027d5760003560e01c80637eb63c661161014f578063b88d4fde116100c1578063d7224ba01161007a578063d7224ba0146109d5578063e59de6c614610a00578063e63b211f14610a1c578063e985e9c514610a45578063f2fde38b14610a82578063f968adbe14610aab5761027d565b8063b88d4fde1461089f578063b8e404cb146108c8578063c2ca0ac5146108f3578063c87b56dd14610930578063ca2047281461096d578063d5abeb01146109aa5761027d565b80638e7d556e116101135780638e7d556e146107b057806395d89b41146107ed578063a035b1fe14610818578063a0712d6814610843578063a22cb4651461085f578063ac915c06146108885761027d565b80637eb63c66146106df57806380c90d30146107085780638171609b14610733578063864e92431461075c5780638da5cb5b146107855761027d565b80632f745c59116101f35780636473af91116101ac5780636473af91146105d357806367243482146106105780636790a9de146106395780636f8b44b01461066257806370a082311461068b578063715018a6146106c85761027d565b80632f745c59146104b15780633ccfd60b146104ee57806342842e0e146105055780634f6ccce71461052e578063620f53a81461056b5780636352211e146105965761027d565b8063123eaa9011610245578063123eaa901461038d57806315da2ec9146103ca57806318160ddd146103f55780631e7269c51461042057806323b872dd1461045d5780632cfac6ec146104865761027d565b806301ffc9a714610282578063040755cb146102bf57806306fdde03146102fc578063081812fc14610327578063095ea7b314610364575b600080fd5b34801561028e57600080fd5b506102a960048036038101906102a491906140f6565b610ad6565b6040516102b69190614af5565b60405180910390f35b3480156102cb57600080fd5b506102e660048036038101906102e19190614224565b610c20565b6040516102f39190614f77565b60405180910390f35b34801561030857600080fd5b50610311610c44565b60405161031e9190614b55565b60405180910390f35b34801561033357600080fd5b5061034e60048036038101906103499190614224565b610cd6565b60405161035b9190614a6c565b60405180910390f35b34801561037057600080fd5b5061038b60048036038101906103869190613ff5565b610d5b565b005b34801561039957600080fd5b506103b460048036038101906103af9190614150565b610e74565b6040516103c19190614af5565b60405180910390f35b3480156103d657600080fd5b506103df610f53565b6040516103ec9190614f77565b60405180910390f35b34801561040157600080fd5b5061040a61105c565b6040516104179190614f77565b60405180910390f35b34801561042c57600080fd5b5061044760048036038101906104429190613e72565b611078565b6040516104549190614f77565b60405180910390f35b34801561046957600080fd5b50610484600480360381019061047f9190613edf565b611090565b005b34801561049257600080fd5b5061049b6110a0565b6040516104a89190614f77565b60405180910390f35b3480156104bd57600080fd5b506104d860048036038101906104d39190613ff5565b6110a6565b6040516104e59190614f77565b60405180910390f35b3480156104fa57600080fd5b506105036112a7565b005b34801561051157600080fd5b5061052c60048036038101906105279190613edf565b61130f565b005b34801561053a57600080fd5b5061055560048036038101906105509190614224565b61132f565b6040516105629190614f77565b60405180910390f35b34801561057757600080fd5b50610580611382565b60405161058d9190614b55565b60405180910390f35b3480156105a257600080fd5b506105bd60048036038101906105b89190614224565b611410565b6040516105ca9190614a6c565b60405180910390f35b3480156105df57600080fd5b506105fa60048036038101906105f59190613e72565b611426565b6040516106079190614ad3565b60405180910390f35b34801561061c57600080fd5b5061063760048036038101906106329190614035565b6114da565b005b34801561064557600080fd5b50610660600480360381019061065b91906141ac565b611544565b005b34801561066e57600080fd5b5061068960048036038101906106849190614224565b61157e565b005b34801561069757600080fd5b506106b260048036038101906106ad9190613e72565b611590565b6040516106bf9190614f77565b60405180910390f35b3480156106d457600080fd5b506106dd611679565b005b3480156106eb57600080fd5b50610706600480360381019061070191906140ad565b61168d565b005b34801561071457600080fd5b5061071d6116af565b60405161072a9190614af5565b60405180910390f35b34801561073f57600080fd5b5061075a60048036038101906107559190614224565b6116c2565b005b34801561076857600080fd5b50610783600480360381019061077e9190613e72565b6116d7565b005b34801561079157600080fd5b5061079a611723565b6040516107a79190614a6c565b60405180910390f35b3480156107bc57600080fd5b506107d760048036038101906107d29190614224565b61174d565b6040516107e49190614f77565b60405180910390f35b3480156107f957600080fd5b50610802611771565b60405161080f9190614b55565b60405180910390f35b34801561082457600080fd5b5061082d611803565b60405161083a9190614f77565b60405180910390f35b61085d60048036038101906108589190614224565b611809565b005b34801561086b57600080fd5b5061088660048036038101906108819190613fb5565b61190d565b005b34801561089457600080fd5b5061089d611a8e565b005b3480156108ab57600080fd5b506108c660048036038101906108c19190613f32565b611ac2565b005b3480156108d457600080fd5b506108dd611b1e565b6040516108ea9190614b55565b60405180910390f35b3480156108ff57600080fd5b5061091a60048036038101906109159190614224565b611bac565b6040516109279190614af5565b60405180910390f35b34801561093c57600080fd5b5061095760048036038101906109529190614224565b611bcc565b6040516109649190614b55565b60405180910390f35b34801561097957600080fd5b50610994600480360381019061098f9190614224565b611d03565b6040516109a19190614b55565b60405180910390f35b3480156109b657600080fd5b506109bf611da3565b6040516109cc9190614f77565b60405180910390f35b3480156109e157600080fd5b506109ea611da9565b6040516109f79190614f77565b60405180910390f35b610a1a6004803603810190610a159190614251565b611daf565b005b348015610a2857600080fd5b50610a436004803603810190610a3e91906140ad565b611f8a565b005b348015610a5157600080fd5b50610a6c6004803603810190610a679190613e9f565b611fac565b604051610a799190614af5565b60405180910390f35b348015610a8e57600080fd5b50610aa96004803603810190610aa49190613e72565b612040565b005b348015610ab757600080fd5b50610ac06120c4565b604051610acd9190614f77565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ba157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610c0957507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610c195750610c18826120ca565b5b9050919050565b600b8181548110610c3057600080fd5b906000526020600020016000915090505481565b606060018054610c53906153a4565b80601f0160208091040260200160405190810160405280929190818152602001828054610c7f906153a4565b8015610ccc5780601f10610ca157610100808354040283529160200191610ccc565b820191906000526020600020905b815481529060010190602001808311610caf57829003601f168201915b5050505050905090565b6000610ce182612134565b610d20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1790614f37565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d6682611410565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610dd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dce90614e77565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610df6612141565b73ffffffffffffffffffffffffffffffffffffffff161480610e255750610e2481610e1f612141565b611fac565b5b610e64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5b90614cf7565b60405180910390fd5b610e6f838383612149565b505050565b60008030600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684604051602001610eae9392919061498a565b6040516020818303038152906040528051906020012090506000610ee385610ed5846121fb565b61222b90919063ffffffff16565b90508073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610f4657600192505050610f4d565b6000925050505b92915050565b6000600c600081548110610f6a57610f69615575565b5b9060005260206000200154610f7d61105c565b1015610faa57600b600081548110610f9857610f97615575565b5b90600052602060002001549050611059565b600c600181548110610fbf57610fbe615575565b5b9060005260206000200154610fd261105c565b1015610fff57600b600181548110610fed57610fec615575565b5b90600052602060002001549050611059565b600c60028154811061101457611013615575565b5b906000526020600020015461102761105c565b101561105457600b60028154811061104257611041615575565b5b90600052602060002001549050611059565b600090505b90565b6000611066612252565b600054611073919061525d565b905090565b60136020528060005260406000206000915090505481565b61109b83838361225b565b505050565b60125481565b60006110b183611590565b82106110f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e990614b97565b60405180910390fd5b60006110fc61105c565b90506000806000600190505b838111611265576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146111f957806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561125157868414156112425781955050505050506112a1565b838061124d90615407565b9450505b50808061125d90615407565b915050611108565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129890614ef7565b60405180910390fd5b92915050565b6112af612814565b3373ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f1935050505015801561130c573d6000803e3d6000fd5b50565b61132a83838360405180602001604052806000815250611ac2565b505050565b600061133961105c565b821061137a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137190614c57565b60405180910390fd5b819050919050565b600f805461138f906153a4565b80601f01602080910402602001604051908101604052809291908181526020018280546113bb906153a4565b80156114085780601f106113dd57610100808354040283529160200191611408565b820191906000526020600020905b8154815290600101906020018083116113eb57829003601f168201915b505050505081565b600061141b82612892565b600001519050919050565b6060600061143383611590565b905060008167ffffffffffffffff811115611451576114506155a4565b5b60405190808252806020026020018201604052801561147f5781602001602082028036833780820191505090505b50905060005b828110156114cf57600061149986836110a6565b9050808383815181106114af576114ae615575565b5b6020026020010181815250505080806114c790615407565b915050611485565b508092505050919050565b6114e2612814565b60005b825181101561153f5761152c83828151811061150457611503615575565b5b602002602001015183838151811061151f5761151e615575565b5b6020026020010151612a95565b808061153790615407565b9150506114e5565b505050565b61154c612814565b81600e9080519060200190611562929190613ac3565b5080600f9080519060200190611579929190613ac3565b505050565b611586612814565b8060118190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611601576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f890614d37565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b611681612814565b61168b6000612ab3565b565b611695612814565b80600c90805190602001906116ab929190613b49565b5050565b600a60149054906101000a900460ff1681565b6116ca612814565b6116d43382612a95565b50565b6116df612814565b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600c818154811061175d57600080fd5b906000526020600020016000915090505481565b606060028054611780906153a4565b80601f01602080910402602001604051908101604052809291908181526020018280546117ac906153a4565b80156117f95780601f106117ce576101008083540402835291602001916117f9565b820191906000526020600020905b8154815290600101906020018083116117dc57829003601f168201915b5050505050905090565b600d5481565b600a60149054906101000a900460ff16611858576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184f90614cd7565b60405180910390fd5b60105481111561189d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189490614db7565b60405180910390fd5b6012546011546118ad919061525d565b816118b661105c565b6118c09190615148565b1115611901576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f890614e37565b60405180910390fd5b61190a81612b79565b50565b611915612141565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611983576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197a90614df7565b60405180910390fd5b8060066000611990612141565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a3d612141565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a829190614af5565b60405180910390a35050565b611a96612814565b600a60149054906101000a900460ff1615600a60146101000a81548160ff021916908315150217905550565b611acd84848461225b565b611ad984848484612d4d565b611b18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0f90614e97565b60405180910390fd5b50505050565b600e8054611b2b906153a4565b80601f0160208091040260200160405190810160405280929190818152602001828054611b57906153a4565b8015611ba45780601f10611b7957610100808354040283529160200191611ba4565b820191906000526020600020905b815481529060010190602001808311611b8757829003601f168201915b505050505081565b60146020528060005260406000206000915054906101000a900460ff1681565b6060611bd782612134565b611c16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0d90614dd7565b60405180910390fd5b6014600083815260200190815260200160002060009054906101000a900460ff1615611ca4576000600e8054611c4b906153a4565b905011611c675760405180602001604052806000815250611c9d565b600e60156000848152602001908152602001600020604051602001611c8d929190614a17565b6040516020818303038152906040525b9050611cfe565b6000600f8054611cb3906153a4565b905011611ccf5760405180602001604052806000815250611cfb565b600f611cda83612ee4565b604051602001611ceb9291906149f3565b6040516020818303038152906040525b90505b919050565b60156020528060005260406000206000915090508054611d22906153a4565b80601f0160208091040260200160405190810160405280929190818152602001828054611d4e906153a4565b8015611d9b5780601f10611d7057610100808354040283529160200191611d9b565b820191906000526020600020905b815481529060010190602001808311611d7e57829003601f168201915b505050505081565b60115481565b60075481565b3373ffffffffffffffffffffffffffffffffffffffff16611dcf83611410565b73ffffffffffffffffffffffffffffffffffffffff1614611e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1c90614d17565b60405180910390fd5b600015156014600084815260200190815260200160002060009054906101000a900460ff16151514611e8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8390614bf7565b60405180910390fd5b611e968183610e74565b611ed5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ecc90614c97565b60405180910390fd5b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683604051602001611f0c9291906149c7565b60405160208183030381529060405280519060200120905060016014600085815260200190815260200160002060006101000a81548160ff021916908315150217905550611f5e8160001c6020613045565b601560008581526020019081526020016000209080519060200190611f84929190613ac3565b50505050565b611f92612814565b80600b9080519060200190611fa8929190613b49565b5050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612048612814565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156120b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120af90614c17565b60405180910390fd5b6120c181612ab3565b50565b60105481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60008160405160200161220e9190614a46565b604051602081830303815290604052805190602001209050919050565b600080600061223a8585613281565b91509150612247816132d3565b819250505092915050565b60006001905090565b600061226682612892565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661228d612141565b73ffffffffffffffffffffffffffffffffffffffff1614806122e957506122b2612141565b73ffffffffffffffffffffffffffffffffffffffff166122d184610cd6565b73ffffffffffffffffffffffffffffffffffffffff16145b80612305575061230482600001516122ff612141565b611fac565b5b905080612347576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233e90614e17565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146123b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b090614d77565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612429576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242090614c77565b60405180910390fd5b61243685858560016134a8565b6124466000848460000151612149565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166124b49190615229565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166125589190615102565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600060018461265e9190615148565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156127a4576126d481612134565b156127a3576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461280c86868660016134ae565b505050505050565b61281c612141565b73ffffffffffffffffffffffffffffffffffffffff1661283a611723565b73ffffffffffffffffffffffffffffffffffffffff1614612890576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288790614d97565b60405180910390fd5b565b61289a613b96565b6128a382612134565b6128e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d990614c37565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000083106129465760017f000000000000000000000000000000000000000000000000000000000000000084612939919061525d565b6129439190615148565b90505b60008390505b818110612a54576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612a4057809350505050612a90565b508080612a4c9061537a565b91505061294c565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8790614f17565b60405180910390fd5b919050565b612aaf8282604051806020016040528060008152506134b4565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000612b83610f53565b905080601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015612c985780821015612bd8578091505b600d548183612be7919061525d565b612bf191906151cf565b341015612c33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2a90614e57565b60405180910390fd5b81601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c829190615148565b92505081905550612c933383612a95565b612d49565b600d5482612ca691906151cf565b341015612ce8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cdf90614e57565b60405180910390fd5b81601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d379190615148565b92505081905550612d483383612a95565b5b5050565b6000612d6e8473ffffffffffffffffffffffffffffffffffffffff16613993565b15612ed7578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d97612141565b8786866040518563ffffffff1660e01b8152600401612db99493929190614a87565b602060405180830381600087803b158015612dd357600080fd5b505af1925050508015612e0457506040513d601f19601f82011682018060405250810190612e019190614123565b60015b612e87573d8060008114612e34576040519150601f19603f3d011682016040523d82523d6000602084013e612e39565b606091505b50600081511415612e7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e7690614e97565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612edc565b600190505b949350505050565b60606000821415612f2c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613040565b600082905060005b60008214612f5e578080612f4790615407565b915050600a82612f57919061519e565b9150612f34565b60008167ffffffffffffffff811115612f7a57612f796155a4565b5b6040519080825280601f01601f191660200182016040528015612fac5781602001600182028036833780820191505090505b5090505b6000851461303957600182612fc5919061525d565b9150600a85612fd49190615488565b6030612fe09190615148565b60f81b818381518110612ff657612ff5615575565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85613032919061519e565b9450612fb0565b8093505050505b919050565b60606000600283600261305891906151cf565b6130629190615148565b67ffffffffffffffff81111561307b5761307a6155a4565b5b6040519080825280601f01601f1916602001820160405280156130ad5781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106130e5576130e4615575565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061314957613148615575565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000600184600261318991906151cf565b6131939190615148565b90505b6001811115613233577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106131d5576131d4615575565b5b1a60f81b8282815181106131ec576131eb615575565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061322c9061537a565b9050613196565b5060008414613277576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161326e90614bb7565b60405180910390fd5b8091505092915050565b6000806041835114156132c35760008060006020860151925060408601519150606086015160001a90506132b7878285856139b6565b945094505050506132cc565b60006002915091505b9250929050565b600060048111156132e7576132e6615517565b5b8160048111156132fa576132f9615517565b5b1415613305576134a5565b6001600481111561331957613318615517565b5b81600481111561332c5761332b615517565b5b141561336d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161336490614b77565b60405180910390fd5b6002600481111561338157613380615517565b5b81600481111561339457613393615517565b5b14156133d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133cc90614bd7565b60405180910390fd5b600360048111156133e9576133e8615517565b5b8160048111156133fc576133fb615517565b5b141561343d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161343490614cb7565b60405180910390fd5b6004808111156134505761344f615517565b5b81600481111561346357613462615517565b5b14156134a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161349b90614d57565b60405180910390fd5b5b50565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561352a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161352190614ed7565b60405180910390fd5b61353381612134565b15613573576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161356a90614eb7565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000008311156135d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135cd90614f57565b60405180910390fd5b6135e360008583866134a8565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905060405180604001604052808583600001516136e09190615102565b6fffffffffffffffffffffffffffffffff1681526020018583602001516137079190615102565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b8581101561397657818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46139166000888488612d4d565b613955576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161394c90614e97565b60405180910390fd5b818061396090615407565b925050808061396e90615407565b9150506138a5565b508060008190555061398b60008785886134ae565b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156139f1576000600391509150613aba565b601b8560ff1614158015613a095750601c8560ff1614155b15613a1b576000600491509150613aba565b600060018787878760405160008152602001604052604051613a409493929190614b10565b6020604051602081039080840390855afa158015613a62573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613ab157600060019250925050613aba565b80600092509250505b94509492505050565b828054613acf906153a4565b90600052602060002090601f016020900481019282613af15760008555613b38565b82601f10613b0a57805160ff1916838001178555613b38565b82800160010185558215613b38579182015b82811115613b37578251825591602001919060010190613b1c565b5b509050613b459190613bd0565b5090565b828054828255906000526020600020908101928215613b85579160200282015b82811115613b84578251825591602001919060010190613b69565b5b509050613b929190613bd0565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115613be9576000816000905550600101613bd1565b5090565b6000613c00613bfb84614fb7565b614f92565b90508083825260208201905082856020860282011115613c2357613c226155d8565b5b60005b85811015613c535781613c398882613d51565b845260208401935060208301925050600181019050613c26565b5050509392505050565b6000613c70613c6b84614fe3565b614f92565b90508083825260208201905082856020860282011115613c9357613c926155d8565b5b60005b85811015613cc35781613ca98882613e5d565b845260208401935060208301925050600181019050613c96565b5050509392505050565b6000613ce0613cdb8461500f565b614f92565b905082815260208101848484011115613cfc57613cfb6155dd565b5b613d07848285615338565b509392505050565b6000613d22613d1d84615040565b614f92565b905082815260208101848484011115613d3e57613d3d6155dd565b5b613d49848285615338565b509392505050565b600081359050613d6081615e4e565b92915050565b600082601f830112613d7b57613d7a6155d3565b5b8135613d8b848260208601613bed565b91505092915050565b600082601f830112613da957613da86155d3565b5b8135613db9848260208601613c5d565b91505092915050565b600081359050613dd181615e65565b92915050565b600081359050613de681615e7c565b92915050565b600081519050613dfb81615e7c565b92915050565b600082601f830112613e1657613e156155d3565b5b8135613e26848260208601613ccd565b91505092915050565b600082601f830112613e4457613e436155d3565b5b8135613e54848260208601613d0f565b91505092915050565b600081359050613e6c81615e93565b92915050565b600060208284031215613e8857613e876155e7565b5b6000613e9684828501613d51565b91505092915050565b60008060408385031215613eb657613eb56155e7565b5b6000613ec485828601613d51565b9250506020613ed585828601613d51565b9150509250929050565b600080600060608486031215613ef857613ef76155e7565b5b6000613f0686828701613d51565b9350506020613f1786828701613d51565b9250506040613f2886828701613e5d565b9150509250925092565b60008060008060808587031215613f4c57613f4b6155e7565b5b6000613f5a87828801613d51565b9450506020613f6b87828801613d51565b9350506040613f7c87828801613e5d565b925050606085013567ffffffffffffffff811115613f9d57613f9c6155e2565b5b613fa987828801613e01565b91505092959194509250565b60008060408385031215613fcc57613fcb6155e7565b5b6000613fda85828601613d51565b9250506020613feb85828601613dc2565b9150509250929050565b6000806040838503121561400c5761400b6155e7565b5b600061401a85828601613d51565b925050602061402b85828601613e5d565b9150509250929050565b6000806040838503121561404c5761404b6155e7565b5b600083013567ffffffffffffffff81111561406a576140696155e2565b5b61407685828601613d66565b925050602083013567ffffffffffffffff811115614097576140966155e2565b5b6140a385828601613d94565b9150509250929050565b6000602082840312156140c3576140c26155e7565b5b600082013567ffffffffffffffff8111156140e1576140e06155e2565b5b6140ed84828501613d94565b91505092915050565b60006020828403121561410c5761410b6155e7565b5b600061411a84828501613dd7565b91505092915050565b600060208284031215614139576141386155e7565b5b600061414784828501613dec565b91505092915050565b60008060408385031215614167576141666155e7565b5b600083013567ffffffffffffffff811115614185576141846155e2565b5b61419185828601613e01565b92505060206141a285828601613e5d565b9150509250929050565b600080604083850312156141c3576141c26155e7565b5b600083013567ffffffffffffffff8111156141e1576141e06155e2565b5b6141ed85828601613e2f565b925050602083013567ffffffffffffffff81111561420e5761420d6155e2565b5b61421a85828601613e2f565b9150509250929050565b60006020828403121561423a576142396155e7565b5b600061424884828501613e5d565b91505092915050565b60008060408385031215614268576142676155e7565b5b600061427685828601613e5d565b925050602083013567ffffffffffffffff811115614297576142966155e2565b5b6142a385828601613e01565b9150509250929050565b60006142b98383614946565b60208301905092915050565b6142ce81615291565b82525050565b6142e56142e082615291565b615450565b82525050565b60006142f682615096565b61430081856150c4565b935061430b83615071565b8060005b8381101561433c57815161432388826142ad565b975061432e836150b7565b92505060018101905061430f565b5085935050505092915050565b614352816152a3565b82525050565b614361816152af565b82525050565b614378614373826152af565b615462565b82525050565b6000614389826150a1565b61439381856150d5565b93506143a3818560208601615347565b6143ac816155ec565b840191505092915050565b60006143c2826150ac565b6143cc81856150e6565b93506143dc818560208601615347565b6143e5816155ec565b840191505092915050565b60006143fb826150ac565b61440581856150f7565b9350614415818560208601615347565b80840191505092915050565b6000815461442e816153a4565b61443881866150f7565b94506001821660008114614453576001811461446457614497565b60ff19831686528186019350614497565b61446d85615081565b60005b8381101561448f57815481890152600182019150602081019050614470565b838801955050505b50505092915050565b60006144ad6018836150e6565b91506144b88261560a565b602082019050919050565b60006144d06022836150e6565b91506144db82615633565b604082019050919050565b60006144f36020836150e6565b91506144fe82615682565b602082019050919050565b6000614516601f836150e6565b9150614521826156ab565b602082019050919050565b6000614539601c836150f7565b9150614544826156d4565b601c82019050919050565b600061455c6015836150e6565b9150614567826156fd565b602082019050919050565b600061457f6026836150e6565b915061458a82615726565b604082019050919050565b60006145a2602a836150e6565b91506145ad82615775565b604082019050919050565b60006145c56023836150e6565b91506145d0826157c4565b604082019050919050565b60006145e86025836150e6565b91506145f382615813565b604082019050919050565b600061460b601c836150e6565b915061461682615862565b602082019050919050565b600061462e6022836150e6565b91506146398261588b565b604082019050919050565b6000614651601b836150e6565b915061465c826158da565b602082019050919050565b60006146746039836150e6565b915061467f82615903565b604082019050919050565b60006146976016836150e6565b91506146a282615952565b602082019050919050565b60006146ba602b836150e6565b91506146c58261597b565b604082019050919050565b60006146dd6022836150e6565b91506146e8826159ca565b604082019050919050565b60006147006026836150e6565b915061470b82615a19565b604082019050919050565b60006147236020836150e6565b915061472e82615a68565b602082019050919050565b6000614746601a836150e6565b915061475182615a91565b602082019050919050565b6000614769602f836150e6565b915061477482615aba565b604082019050919050565b600061478c601a836150e6565b915061479782615b09565b602082019050919050565b60006147af6032836150e6565b91506147ba82615b32565b604082019050919050565b60006147d26015836150e6565b91506147dd82615b81565b602082019050919050565b60006147f56020836150e6565b915061480082615baa565b602082019050919050565b60006148186022836150e6565b915061482382615bd3565b604082019050919050565b600061483b6033836150e6565b915061484682615c22565b604082019050919050565b600061485e601d836150e6565b915061486982615c71565b602082019050919050565b60006148816021836150e6565b915061488c82615c9a565b604082019050919050565b60006148a46005836150f7565b91506148af82615ce9565b600582019050919050565b60006148c7602e836150e6565b91506148d282615d12565b604082019050919050565b60006148ea602f836150e6565b91506148f582615d61565b604082019050919050565b600061490d602d836150e6565b915061491882615db0565b604082019050919050565b60006149306022836150e6565b915061493b82615dff565b604082019050919050565b61494f81615321565b82525050565b61495e81615321565b82525050565b61497561497082615321565b61547e565b82525050565b6149848161532b565b82525050565b600061499682866142d4565b6014820191506149a682856142d4565b6014820191506149b68284614964565b602082019150819050949350505050565b60006149d382856142d4565b6014820191506149e38284614964565b6020820191508190509392505050565b60006149ff8285614421565b9150614a0b82846143f0565b91508190509392505050565b6000614a238285614421565b9150614a2f8284614421565b9150614a3a82614897565b91508190509392505050565b6000614a518261452c565b9150614a5d8284614367565b60208201915081905092915050565b6000602082019050614a8160008301846142c5565b92915050565b6000608082019050614a9c60008301876142c5565b614aa960208301866142c5565b614ab66040830185614955565b8181036060830152614ac8818461437e565b905095945050505050565b60006020820190508181036000830152614aed81846142eb565b905092915050565b6000602082019050614b0a6000830184614349565b92915050565b6000608082019050614b256000830187614358565b614b32602083018661497b565b614b3f6040830185614358565b614b4c6060830184614358565b95945050505050565b60006020820190508181036000830152614b6f81846143b7565b905092915050565b60006020820190508181036000830152614b90816144a0565b9050919050565b60006020820190508181036000830152614bb0816144c3565b9050919050565b60006020820190508181036000830152614bd0816144e6565b9050919050565b60006020820190508181036000830152614bf081614509565b9050919050565b60006020820190508181036000830152614c108161454f565b9050919050565b60006020820190508181036000830152614c3081614572565b9050919050565b60006020820190508181036000830152614c5081614595565b9050919050565b60006020820190508181036000830152614c70816145b8565b9050919050565b60006020820190508181036000830152614c90816145db565b9050919050565b60006020820190508181036000830152614cb0816145fe565b9050919050565b60006020820190508181036000830152614cd081614621565b9050919050565b60006020820190508181036000830152614cf081614644565b9050919050565b60006020820190508181036000830152614d1081614667565b9050919050565b60006020820190508181036000830152614d308161468a565b9050919050565b60006020820190508181036000830152614d50816146ad565b9050919050565b60006020820190508181036000830152614d70816146d0565b9050919050565b60006020820190508181036000830152614d90816146f3565b9050919050565b60006020820190508181036000830152614db081614716565b9050919050565b60006020820190508181036000830152614dd081614739565b9050919050565b60006020820190508181036000830152614df08161475c565b9050919050565b60006020820190508181036000830152614e108161477f565b9050919050565b60006020820190508181036000830152614e30816147a2565b9050919050565b60006020820190508181036000830152614e50816147c5565b9050919050565b60006020820190508181036000830152614e70816147e8565b9050919050565b60006020820190508181036000830152614e908161480b565b9050919050565b60006020820190508181036000830152614eb08161482e565b9050919050565b60006020820190508181036000830152614ed081614851565b9050919050565b60006020820190508181036000830152614ef081614874565b9050919050565b60006020820190508181036000830152614f10816148ba565b9050919050565b60006020820190508181036000830152614f30816148dd565b9050919050565b60006020820190508181036000830152614f5081614900565b9050919050565b60006020820190508181036000830152614f7081614923565b9050919050565b6000602082019050614f8c6000830184614955565b92915050565b6000614f9c614fad565b9050614fa882826153d6565b919050565b6000604051905090565b600067ffffffffffffffff821115614fd257614fd16155a4565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614ffe57614ffd6155a4565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561502a576150296155a4565b5b615033826155ec565b9050602081019050919050565b600067ffffffffffffffff82111561505b5761505a6155a4565b5b615064826155ec565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061510d826152e5565b9150615118836152e5565b9250826fffffffffffffffffffffffffffffffff0382111561513d5761513c6154b9565b5b828201905092915050565b600061515382615321565b915061515e83615321565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115615193576151926154b9565b5b828201905092915050565b60006151a982615321565b91506151b483615321565b9250826151c4576151c36154e8565b5b828204905092915050565b60006151da82615321565b91506151e583615321565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561521e5761521d6154b9565b5b828202905092915050565b6000615234826152e5565b915061523f836152e5565b925082821015615252576152516154b9565b5b828203905092915050565b600061526882615321565b915061527383615321565b925082821015615286576152856154b9565b5b828203905092915050565b600061529c82615301565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561536557808201518184015260208101905061534a565b83811115615374576000848401525b50505050565b600061538582615321565b91506000821415615399576153986154b9565b5b600182039050919050565b600060028204905060018216806153bc57607f821691505b602082108114156153d0576153cf615546565b5b50919050565b6153df826155ec565b810181811067ffffffffffffffff821117156153fe576153fd6155a4565b5b80604052505050565b600061541282615321565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615445576154446154b9565b5b600182019050919050565b600061545b8261546c565b9050919050565b6000819050919050565b6000615477826155fd565b9050919050565b6000819050919050565b600061549382615321565b915061549e83615321565b9250826154ae576154ad6154e8565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f426c7572204170652059432052657665616c6564210000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f426c7572204170652059432057726f6e67205369676e61747572652100000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f426c757220417065205943204d696e74696e6720506175736520210000000000600082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f426c757220417065205943204e6f74204f776e65722100000000000000000000600082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f426c757220417065205943204c696d6974205065722054782021000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f426c75722041706520594320536f6c646f757420210000000000000000000000600082015250565b7f426c75722041706520594320496e73756666696369656e742046756e64732021600082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f2f6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b615e5781615291565b8114615e6257600080fd5b50565b615e6e816152a3565b8114615e7957600080fd5b50565b615e85816152b9565b8114615e9057600080fd5b50565b615e9c81615321565b8114615ea757600080fd5b5056fea2646970667358221220d54a157f25f6c4e2677cd6641f7528d3385fc97bdf52060b0eb7e8300896b61d64736f6c63430008070033

Deployed Bytecode

0x60806040526004361061027d5760003560e01c80637eb63c661161014f578063b88d4fde116100c1578063d7224ba01161007a578063d7224ba0146109d5578063e59de6c614610a00578063e63b211f14610a1c578063e985e9c514610a45578063f2fde38b14610a82578063f968adbe14610aab5761027d565b8063b88d4fde1461089f578063b8e404cb146108c8578063c2ca0ac5146108f3578063c87b56dd14610930578063ca2047281461096d578063d5abeb01146109aa5761027d565b80638e7d556e116101135780638e7d556e146107b057806395d89b41146107ed578063a035b1fe14610818578063a0712d6814610843578063a22cb4651461085f578063ac915c06146108885761027d565b80637eb63c66146106df57806380c90d30146107085780638171609b14610733578063864e92431461075c5780638da5cb5b146107855761027d565b80632f745c59116101f35780636473af91116101ac5780636473af91146105d357806367243482146106105780636790a9de146106395780636f8b44b01461066257806370a082311461068b578063715018a6146106c85761027d565b80632f745c59146104b15780633ccfd60b146104ee57806342842e0e146105055780634f6ccce71461052e578063620f53a81461056b5780636352211e146105965761027d565b8063123eaa9011610245578063123eaa901461038d57806315da2ec9146103ca57806318160ddd146103f55780631e7269c51461042057806323b872dd1461045d5780632cfac6ec146104865761027d565b806301ffc9a714610282578063040755cb146102bf57806306fdde03146102fc578063081812fc14610327578063095ea7b314610364575b600080fd5b34801561028e57600080fd5b506102a960048036038101906102a491906140f6565b610ad6565b6040516102b69190614af5565b60405180910390f35b3480156102cb57600080fd5b506102e660048036038101906102e19190614224565b610c20565b6040516102f39190614f77565b60405180910390f35b34801561030857600080fd5b50610311610c44565b60405161031e9190614b55565b60405180910390f35b34801561033357600080fd5b5061034e60048036038101906103499190614224565b610cd6565b60405161035b9190614a6c565b60405180910390f35b34801561037057600080fd5b5061038b60048036038101906103869190613ff5565b610d5b565b005b34801561039957600080fd5b506103b460048036038101906103af9190614150565b610e74565b6040516103c19190614af5565b60405180910390f35b3480156103d657600080fd5b506103df610f53565b6040516103ec9190614f77565b60405180910390f35b34801561040157600080fd5b5061040a61105c565b6040516104179190614f77565b60405180910390f35b34801561042c57600080fd5b5061044760048036038101906104429190613e72565b611078565b6040516104549190614f77565b60405180910390f35b34801561046957600080fd5b50610484600480360381019061047f9190613edf565b611090565b005b34801561049257600080fd5b5061049b6110a0565b6040516104a89190614f77565b60405180910390f35b3480156104bd57600080fd5b506104d860048036038101906104d39190613ff5565b6110a6565b6040516104e59190614f77565b60405180910390f35b3480156104fa57600080fd5b506105036112a7565b005b34801561051157600080fd5b5061052c60048036038101906105279190613edf565b61130f565b005b34801561053a57600080fd5b5061055560048036038101906105509190614224565b61132f565b6040516105629190614f77565b60405180910390f35b34801561057757600080fd5b50610580611382565b60405161058d9190614b55565b60405180910390f35b3480156105a257600080fd5b506105bd60048036038101906105b89190614224565b611410565b6040516105ca9190614a6c565b60405180910390f35b3480156105df57600080fd5b506105fa60048036038101906105f59190613e72565b611426565b6040516106079190614ad3565b60405180910390f35b34801561061c57600080fd5b5061063760048036038101906106329190614035565b6114da565b005b34801561064557600080fd5b50610660600480360381019061065b91906141ac565b611544565b005b34801561066e57600080fd5b5061068960048036038101906106849190614224565b61157e565b005b34801561069757600080fd5b506106b260048036038101906106ad9190613e72565b611590565b6040516106bf9190614f77565b60405180910390f35b3480156106d457600080fd5b506106dd611679565b005b3480156106eb57600080fd5b50610706600480360381019061070191906140ad565b61168d565b005b34801561071457600080fd5b5061071d6116af565b60405161072a9190614af5565b60405180910390f35b34801561073f57600080fd5b5061075a60048036038101906107559190614224565b6116c2565b005b34801561076857600080fd5b50610783600480360381019061077e9190613e72565b6116d7565b005b34801561079157600080fd5b5061079a611723565b6040516107a79190614a6c565b60405180910390f35b3480156107bc57600080fd5b506107d760048036038101906107d29190614224565b61174d565b6040516107e49190614f77565b60405180910390f35b3480156107f957600080fd5b50610802611771565b60405161080f9190614b55565b60405180910390f35b34801561082457600080fd5b5061082d611803565b60405161083a9190614f77565b60405180910390f35b61085d60048036038101906108589190614224565b611809565b005b34801561086b57600080fd5b5061088660048036038101906108819190613fb5565b61190d565b005b34801561089457600080fd5b5061089d611a8e565b005b3480156108ab57600080fd5b506108c660048036038101906108c19190613f32565b611ac2565b005b3480156108d457600080fd5b506108dd611b1e565b6040516108ea9190614b55565b60405180910390f35b3480156108ff57600080fd5b5061091a60048036038101906109159190614224565b611bac565b6040516109279190614af5565b60405180910390f35b34801561093c57600080fd5b5061095760048036038101906109529190614224565b611bcc565b6040516109649190614b55565b60405180910390f35b34801561097957600080fd5b50610994600480360381019061098f9190614224565b611d03565b6040516109a19190614b55565b60405180910390f35b3480156109b657600080fd5b506109bf611da3565b6040516109cc9190614f77565b60405180910390f35b3480156109e157600080fd5b506109ea611da9565b6040516109f79190614f77565b60405180910390f35b610a1a6004803603810190610a159190614251565b611daf565b005b348015610a2857600080fd5b50610a436004803603810190610a3e91906140ad565b611f8a565b005b348015610a5157600080fd5b50610a6c6004803603810190610a679190613e9f565b611fac565b604051610a799190614af5565b60405180910390f35b348015610a8e57600080fd5b50610aa96004803603810190610aa49190613e72565b612040565b005b348015610ab757600080fd5b50610ac06120c4565b604051610acd9190614f77565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ba157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610c0957507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610c195750610c18826120ca565b5b9050919050565b600b8181548110610c3057600080fd5b906000526020600020016000915090505481565b606060018054610c53906153a4565b80601f0160208091040260200160405190810160405280929190818152602001828054610c7f906153a4565b8015610ccc5780601f10610ca157610100808354040283529160200191610ccc565b820191906000526020600020905b815481529060010190602001808311610caf57829003601f168201915b5050505050905090565b6000610ce182612134565b610d20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1790614f37565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d6682611410565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610dd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dce90614e77565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610df6612141565b73ffffffffffffffffffffffffffffffffffffffff161480610e255750610e2481610e1f612141565b611fac565b5b610e64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5b90614cf7565b60405180910390fd5b610e6f838383612149565b505050565b60008030600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684604051602001610eae9392919061498a565b6040516020818303038152906040528051906020012090506000610ee385610ed5846121fb565b61222b90919063ffffffff16565b90508073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610f4657600192505050610f4d565b6000925050505b92915050565b6000600c600081548110610f6a57610f69615575565b5b9060005260206000200154610f7d61105c565b1015610faa57600b600081548110610f9857610f97615575565b5b90600052602060002001549050611059565b600c600181548110610fbf57610fbe615575565b5b9060005260206000200154610fd261105c565b1015610fff57600b600181548110610fed57610fec615575565b5b90600052602060002001549050611059565b600c60028154811061101457611013615575565b5b906000526020600020015461102761105c565b101561105457600b60028154811061104257611041615575565b5b90600052602060002001549050611059565b600090505b90565b6000611066612252565b600054611073919061525d565b905090565b60136020528060005260406000206000915090505481565b61109b83838361225b565b505050565b60125481565b60006110b183611590565b82106110f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e990614b97565b60405180910390fd5b60006110fc61105c565b90506000806000600190505b838111611265576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146111f957806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561125157868414156112425781955050505050506112a1565b838061124d90615407565b9450505b50808061125d90615407565b915050611108565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129890614ef7565b60405180910390fd5b92915050565b6112af612814565b3373ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f1935050505015801561130c573d6000803e3d6000fd5b50565b61132a83838360405180602001604052806000815250611ac2565b505050565b600061133961105c565b821061137a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137190614c57565b60405180910390fd5b819050919050565b600f805461138f906153a4565b80601f01602080910402602001604051908101604052809291908181526020018280546113bb906153a4565b80156114085780601f106113dd57610100808354040283529160200191611408565b820191906000526020600020905b8154815290600101906020018083116113eb57829003601f168201915b505050505081565b600061141b82612892565b600001519050919050565b6060600061143383611590565b905060008167ffffffffffffffff811115611451576114506155a4565b5b60405190808252806020026020018201604052801561147f5781602001602082028036833780820191505090505b50905060005b828110156114cf57600061149986836110a6565b9050808383815181106114af576114ae615575565b5b6020026020010181815250505080806114c790615407565b915050611485565b508092505050919050565b6114e2612814565b60005b825181101561153f5761152c83828151811061150457611503615575565b5b602002602001015183838151811061151f5761151e615575565b5b6020026020010151612a95565b808061153790615407565b9150506114e5565b505050565b61154c612814565b81600e9080519060200190611562929190613ac3565b5080600f9080519060200190611579929190613ac3565b505050565b611586612814565b8060118190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611601576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f890614d37565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b611681612814565b61168b6000612ab3565b565b611695612814565b80600c90805190602001906116ab929190613b49565b5050565b600a60149054906101000a900460ff1681565b6116ca612814565b6116d43382612a95565b50565b6116df612814565b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600c818154811061175d57600080fd5b906000526020600020016000915090505481565b606060028054611780906153a4565b80601f01602080910402602001604051908101604052809291908181526020018280546117ac906153a4565b80156117f95780601f106117ce576101008083540402835291602001916117f9565b820191906000526020600020905b8154815290600101906020018083116117dc57829003601f168201915b5050505050905090565b600d5481565b600a60149054906101000a900460ff16611858576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184f90614cd7565b60405180910390fd5b60105481111561189d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189490614db7565b60405180910390fd5b6012546011546118ad919061525d565b816118b661105c565b6118c09190615148565b1115611901576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f890614e37565b60405180910390fd5b61190a81612b79565b50565b611915612141565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611983576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197a90614df7565b60405180910390fd5b8060066000611990612141565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a3d612141565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a829190614af5565b60405180910390a35050565b611a96612814565b600a60149054906101000a900460ff1615600a60146101000a81548160ff021916908315150217905550565b611acd84848461225b565b611ad984848484612d4d565b611b18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0f90614e97565b60405180910390fd5b50505050565b600e8054611b2b906153a4565b80601f0160208091040260200160405190810160405280929190818152602001828054611b57906153a4565b8015611ba45780601f10611b7957610100808354040283529160200191611ba4565b820191906000526020600020905b815481529060010190602001808311611b8757829003601f168201915b505050505081565b60146020528060005260406000206000915054906101000a900460ff1681565b6060611bd782612134565b611c16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0d90614dd7565b60405180910390fd5b6014600083815260200190815260200160002060009054906101000a900460ff1615611ca4576000600e8054611c4b906153a4565b905011611c675760405180602001604052806000815250611c9d565b600e60156000848152602001908152602001600020604051602001611c8d929190614a17565b6040516020818303038152906040525b9050611cfe565b6000600f8054611cb3906153a4565b905011611ccf5760405180602001604052806000815250611cfb565b600f611cda83612ee4565b604051602001611ceb9291906149f3565b6040516020818303038152906040525b90505b919050565b60156020528060005260406000206000915090508054611d22906153a4565b80601f0160208091040260200160405190810160405280929190818152602001828054611d4e906153a4565b8015611d9b5780601f10611d7057610100808354040283529160200191611d9b565b820191906000526020600020905b815481529060010190602001808311611d7e57829003601f168201915b505050505081565b60115481565b60075481565b3373ffffffffffffffffffffffffffffffffffffffff16611dcf83611410565b73ffffffffffffffffffffffffffffffffffffffff1614611e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1c90614d17565b60405180910390fd5b600015156014600084815260200190815260200160002060009054906101000a900460ff16151514611e8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8390614bf7565b60405180910390fd5b611e968183610e74565b611ed5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ecc90614c97565b60405180910390fd5b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683604051602001611f0c9291906149c7565b60405160208183030381529060405280519060200120905060016014600085815260200190815260200160002060006101000a81548160ff021916908315150217905550611f5e8160001c6020613045565b601560008581526020019081526020016000209080519060200190611f84929190613ac3565b50505050565b611f92612814565b80600b9080519060200190611fa8929190613b49565b5050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612048612814565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156120b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120af90614c17565b60405180910390fd5b6120c181612ab3565b50565b60105481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60008160405160200161220e9190614a46565b604051602081830303815290604052805190602001209050919050565b600080600061223a8585613281565b91509150612247816132d3565b819250505092915050565b60006001905090565b600061226682612892565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661228d612141565b73ffffffffffffffffffffffffffffffffffffffff1614806122e957506122b2612141565b73ffffffffffffffffffffffffffffffffffffffff166122d184610cd6565b73ffffffffffffffffffffffffffffffffffffffff16145b80612305575061230482600001516122ff612141565b611fac565b5b905080612347576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233e90614e17565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146123b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b090614d77565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612429576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242090614c77565b60405180910390fd5b61243685858560016134a8565b6124466000848460000151612149565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166124b49190615229565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166125589190615102565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600060018461265e9190615148565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156127a4576126d481612134565b156127a3576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461280c86868660016134ae565b505050505050565b61281c612141565b73ffffffffffffffffffffffffffffffffffffffff1661283a611723565b73ffffffffffffffffffffffffffffffffffffffff1614612890576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288790614d97565b60405180910390fd5b565b61289a613b96565b6128a382612134565b6128e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d990614c37565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000006483106129465760017f000000000000000000000000000000000000000000000000000000000000006484612939919061525d565b6129439190615148565b90505b60008390505b818110612a54576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612a4057809350505050612a90565b508080612a4c9061537a565b91505061294c565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8790614f17565b60405180910390fd5b919050565b612aaf8282604051806020016040528060008152506134b4565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000612b83610f53565b905080601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015612c985780821015612bd8578091505b600d548183612be7919061525d565b612bf191906151cf565b341015612c33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2a90614e57565b60405180910390fd5b81601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c829190615148565b92505081905550612c933383612a95565b612d49565b600d5482612ca691906151cf565b341015612ce8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cdf90614e57565b60405180910390fd5b81601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d379190615148565b92505081905550612d483383612a95565b5b5050565b6000612d6e8473ffffffffffffffffffffffffffffffffffffffff16613993565b15612ed7578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d97612141565b8786866040518563ffffffff1660e01b8152600401612db99493929190614a87565b602060405180830381600087803b158015612dd357600080fd5b505af1925050508015612e0457506040513d601f19601f82011682018060405250810190612e019190614123565b60015b612e87573d8060008114612e34576040519150601f19603f3d011682016040523d82523d6000602084013e612e39565b606091505b50600081511415612e7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e7690614e97565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612edc565b600190505b949350505050565b60606000821415612f2c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613040565b600082905060005b60008214612f5e578080612f4790615407565b915050600a82612f57919061519e565b9150612f34565b60008167ffffffffffffffff811115612f7a57612f796155a4565b5b6040519080825280601f01601f191660200182016040528015612fac5781602001600182028036833780820191505090505b5090505b6000851461303957600182612fc5919061525d565b9150600a85612fd49190615488565b6030612fe09190615148565b60f81b818381518110612ff657612ff5615575565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85613032919061519e565b9450612fb0565b8093505050505b919050565b60606000600283600261305891906151cf565b6130629190615148565b67ffffffffffffffff81111561307b5761307a6155a4565b5b6040519080825280601f01601f1916602001820160405280156130ad5781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106130e5576130e4615575565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061314957613148615575565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000600184600261318991906151cf565b6131939190615148565b90505b6001811115613233577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106131d5576131d4615575565b5b1a60f81b8282815181106131ec576131eb615575565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061322c9061537a565b9050613196565b5060008414613277576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161326e90614bb7565b60405180910390fd5b8091505092915050565b6000806041835114156132c35760008060006020860151925060408601519150606086015160001a90506132b7878285856139b6565b945094505050506132cc565b60006002915091505b9250929050565b600060048111156132e7576132e6615517565b5b8160048111156132fa576132f9615517565b5b1415613305576134a5565b6001600481111561331957613318615517565b5b81600481111561332c5761332b615517565b5b141561336d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161336490614b77565b60405180910390fd5b6002600481111561338157613380615517565b5b81600481111561339457613393615517565b5b14156133d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133cc90614bd7565b60405180910390fd5b600360048111156133e9576133e8615517565b5b8160048111156133fc576133fb615517565b5b141561343d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161343490614cb7565b60405180910390fd5b6004808111156134505761344f615517565b5b81600481111561346357613462615517565b5b14156134a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161349b90614d57565b60405180910390fd5b5b50565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561352a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161352190614ed7565b60405180910390fd5b61353381612134565b15613573576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161356a90614eb7565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000648311156135d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135cd90614f57565b60405180910390fd5b6135e360008583866134a8565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905060405180604001604052808583600001516136e09190615102565b6fffffffffffffffffffffffffffffffff1681526020018583602001516137079190615102565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b8581101561397657818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46139166000888488612d4d565b613955576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161394c90614e97565b60405180910390fd5b818061396090615407565b925050808061396e90615407565b9150506138a5565b508060008190555061398b60008785886134ae565b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156139f1576000600391509150613aba565b601b8560ff1614158015613a095750601c8560ff1614155b15613a1b576000600491509150613aba565b600060018787878760405160008152602001604052604051613a409493929190614b10565b6020604051602081039080840390855afa158015613a62573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613ab157600060019250925050613aba565b80600092509250505b94509492505050565b828054613acf906153a4565b90600052602060002090601f016020900481019282613af15760008555613b38565b82601f10613b0a57805160ff1916838001178555613b38565b82800160010185558215613b38579182015b82811115613b37578251825591602001919060010190613b1c565b5b509050613b459190613bd0565b5090565b828054828255906000526020600020908101928215613b85579160200282015b82811115613b84578251825591602001919060010190613b69565b5b509050613b929190613bd0565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115613be9576000816000905550600101613bd1565b5090565b6000613c00613bfb84614fb7565b614f92565b90508083825260208201905082856020860282011115613c2357613c226155d8565b5b60005b85811015613c535781613c398882613d51565b845260208401935060208301925050600181019050613c26565b5050509392505050565b6000613c70613c6b84614fe3565b614f92565b90508083825260208201905082856020860282011115613c9357613c926155d8565b5b60005b85811015613cc35781613ca98882613e5d565b845260208401935060208301925050600181019050613c96565b5050509392505050565b6000613ce0613cdb8461500f565b614f92565b905082815260208101848484011115613cfc57613cfb6155dd565b5b613d07848285615338565b509392505050565b6000613d22613d1d84615040565b614f92565b905082815260208101848484011115613d3e57613d3d6155dd565b5b613d49848285615338565b509392505050565b600081359050613d6081615e4e565b92915050565b600082601f830112613d7b57613d7a6155d3565b5b8135613d8b848260208601613bed565b91505092915050565b600082601f830112613da957613da86155d3565b5b8135613db9848260208601613c5d565b91505092915050565b600081359050613dd181615e65565b92915050565b600081359050613de681615e7c565b92915050565b600081519050613dfb81615e7c565b92915050565b600082601f830112613e1657613e156155d3565b5b8135613e26848260208601613ccd565b91505092915050565b600082601f830112613e4457613e436155d3565b5b8135613e54848260208601613d0f565b91505092915050565b600081359050613e6c81615e93565b92915050565b600060208284031215613e8857613e876155e7565b5b6000613e9684828501613d51565b91505092915050565b60008060408385031215613eb657613eb56155e7565b5b6000613ec485828601613d51565b9250506020613ed585828601613d51565b9150509250929050565b600080600060608486031215613ef857613ef76155e7565b5b6000613f0686828701613d51565b9350506020613f1786828701613d51565b9250506040613f2886828701613e5d565b9150509250925092565b60008060008060808587031215613f4c57613f4b6155e7565b5b6000613f5a87828801613d51565b9450506020613f6b87828801613d51565b9350506040613f7c87828801613e5d565b925050606085013567ffffffffffffffff811115613f9d57613f9c6155e2565b5b613fa987828801613e01565b91505092959194509250565b60008060408385031215613fcc57613fcb6155e7565b5b6000613fda85828601613d51565b9250506020613feb85828601613dc2565b9150509250929050565b6000806040838503121561400c5761400b6155e7565b5b600061401a85828601613d51565b925050602061402b85828601613e5d565b9150509250929050565b6000806040838503121561404c5761404b6155e7565b5b600083013567ffffffffffffffff81111561406a576140696155e2565b5b61407685828601613d66565b925050602083013567ffffffffffffffff811115614097576140966155e2565b5b6140a385828601613d94565b9150509250929050565b6000602082840312156140c3576140c26155e7565b5b600082013567ffffffffffffffff8111156140e1576140e06155e2565b5b6140ed84828501613d94565b91505092915050565b60006020828403121561410c5761410b6155e7565b5b600061411a84828501613dd7565b91505092915050565b600060208284031215614139576141386155e7565b5b600061414784828501613dec565b91505092915050565b60008060408385031215614167576141666155e7565b5b600083013567ffffffffffffffff811115614185576141846155e2565b5b61419185828601613e01565b92505060206141a285828601613e5d565b9150509250929050565b600080604083850312156141c3576141c26155e7565b5b600083013567ffffffffffffffff8111156141e1576141e06155e2565b5b6141ed85828601613e2f565b925050602083013567ffffffffffffffff81111561420e5761420d6155e2565b5b61421a85828601613e2f565b9150509250929050565b60006020828403121561423a576142396155e7565b5b600061424884828501613e5d565b91505092915050565b60008060408385031215614268576142676155e7565b5b600061427685828601613e5d565b925050602083013567ffffffffffffffff811115614297576142966155e2565b5b6142a385828601613e01565b9150509250929050565b60006142b98383614946565b60208301905092915050565b6142ce81615291565b82525050565b6142e56142e082615291565b615450565b82525050565b60006142f682615096565b61430081856150c4565b935061430b83615071565b8060005b8381101561433c57815161432388826142ad565b975061432e836150b7565b92505060018101905061430f565b5085935050505092915050565b614352816152a3565b82525050565b614361816152af565b82525050565b614378614373826152af565b615462565b82525050565b6000614389826150a1565b61439381856150d5565b93506143a3818560208601615347565b6143ac816155ec565b840191505092915050565b60006143c2826150ac565b6143cc81856150e6565b93506143dc818560208601615347565b6143e5816155ec565b840191505092915050565b60006143fb826150ac565b61440581856150f7565b9350614415818560208601615347565b80840191505092915050565b6000815461442e816153a4565b61443881866150f7565b94506001821660008114614453576001811461446457614497565b60ff19831686528186019350614497565b61446d85615081565b60005b8381101561448f57815481890152600182019150602081019050614470565b838801955050505b50505092915050565b60006144ad6018836150e6565b91506144b88261560a565b602082019050919050565b60006144d06022836150e6565b91506144db82615633565b604082019050919050565b60006144f36020836150e6565b91506144fe82615682565b602082019050919050565b6000614516601f836150e6565b9150614521826156ab565b602082019050919050565b6000614539601c836150f7565b9150614544826156d4565b601c82019050919050565b600061455c6015836150e6565b9150614567826156fd565b602082019050919050565b600061457f6026836150e6565b915061458a82615726565b604082019050919050565b60006145a2602a836150e6565b91506145ad82615775565b604082019050919050565b60006145c56023836150e6565b91506145d0826157c4565b604082019050919050565b60006145e86025836150e6565b91506145f382615813565b604082019050919050565b600061460b601c836150e6565b915061461682615862565b602082019050919050565b600061462e6022836150e6565b91506146398261588b565b604082019050919050565b6000614651601b836150e6565b915061465c826158da565b602082019050919050565b60006146746039836150e6565b915061467f82615903565b604082019050919050565b60006146976016836150e6565b91506146a282615952565b602082019050919050565b60006146ba602b836150e6565b91506146c58261597b565b604082019050919050565b60006146dd6022836150e6565b91506146e8826159ca565b604082019050919050565b60006147006026836150e6565b915061470b82615a19565b604082019050919050565b60006147236020836150e6565b915061472e82615a68565b602082019050919050565b6000614746601a836150e6565b915061475182615a91565b602082019050919050565b6000614769602f836150e6565b915061477482615aba565b604082019050919050565b600061478c601a836150e6565b915061479782615b09565b602082019050919050565b60006147af6032836150e6565b91506147ba82615b32565b604082019050919050565b60006147d26015836150e6565b91506147dd82615b81565b602082019050919050565b60006147f56020836150e6565b915061480082615baa565b602082019050919050565b60006148186022836150e6565b915061482382615bd3565b604082019050919050565b600061483b6033836150e6565b915061484682615c22565b604082019050919050565b600061485e601d836150e6565b915061486982615c71565b602082019050919050565b60006148816021836150e6565b915061488c82615c9a565b604082019050919050565b60006148a46005836150f7565b91506148af82615ce9565b600582019050919050565b60006148c7602e836150e6565b91506148d282615d12565b604082019050919050565b60006148ea602f836150e6565b91506148f582615d61565b604082019050919050565b600061490d602d836150e6565b915061491882615db0565b604082019050919050565b60006149306022836150e6565b915061493b82615dff565b604082019050919050565b61494f81615321565b82525050565b61495e81615321565b82525050565b61497561497082615321565b61547e565b82525050565b6149848161532b565b82525050565b600061499682866142d4565b6014820191506149a682856142d4565b6014820191506149b68284614964565b602082019150819050949350505050565b60006149d382856142d4565b6014820191506149e38284614964565b6020820191508190509392505050565b60006149ff8285614421565b9150614a0b82846143f0565b91508190509392505050565b6000614a238285614421565b9150614a2f8284614421565b9150614a3a82614897565b91508190509392505050565b6000614a518261452c565b9150614a5d8284614367565b60208201915081905092915050565b6000602082019050614a8160008301846142c5565b92915050565b6000608082019050614a9c60008301876142c5565b614aa960208301866142c5565b614ab66040830185614955565b8181036060830152614ac8818461437e565b905095945050505050565b60006020820190508181036000830152614aed81846142eb565b905092915050565b6000602082019050614b0a6000830184614349565b92915050565b6000608082019050614b256000830187614358565b614b32602083018661497b565b614b3f6040830185614358565b614b4c6060830184614358565b95945050505050565b60006020820190508181036000830152614b6f81846143b7565b905092915050565b60006020820190508181036000830152614b90816144a0565b9050919050565b60006020820190508181036000830152614bb0816144c3565b9050919050565b60006020820190508181036000830152614bd0816144e6565b9050919050565b60006020820190508181036000830152614bf081614509565b9050919050565b60006020820190508181036000830152614c108161454f565b9050919050565b60006020820190508181036000830152614c3081614572565b9050919050565b60006020820190508181036000830152614c5081614595565b9050919050565b60006020820190508181036000830152614c70816145b8565b9050919050565b60006020820190508181036000830152614c90816145db565b9050919050565b60006020820190508181036000830152614cb0816145fe565b9050919050565b60006020820190508181036000830152614cd081614621565b9050919050565b60006020820190508181036000830152614cf081614644565b9050919050565b60006020820190508181036000830152614d1081614667565b9050919050565b60006020820190508181036000830152614d308161468a565b9050919050565b60006020820190508181036000830152614d50816146ad565b9050919050565b60006020820190508181036000830152614d70816146d0565b9050919050565b60006020820190508181036000830152614d90816146f3565b9050919050565b60006020820190508181036000830152614db081614716565b9050919050565b60006020820190508181036000830152614dd081614739565b9050919050565b60006020820190508181036000830152614df08161475c565b9050919050565b60006020820190508181036000830152614e108161477f565b9050919050565b60006020820190508181036000830152614e30816147a2565b9050919050565b60006020820190508181036000830152614e50816147c5565b9050919050565b60006020820190508181036000830152614e70816147e8565b9050919050565b60006020820190508181036000830152614e908161480b565b9050919050565b60006020820190508181036000830152614eb08161482e565b9050919050565b60006020820190508181036000830152614ed081614851565b9050919050565b60006020820190508181036000830152614ef081614874565b9050919050565b60006020820190508181036000830152614f10816148ba565b9050919050565b60006020820190508181036000830152614f30816148dd565b9050919050565b60006020820190508181036000830152614f5081614900565b9050919050565b60006020820190508181036000830152614f7081614923565b9050919050565b6000602082019050614f8c6000830184614955565b92915050565b6000614f9c614fad565b9050614fa882826153d6565b919050565b6000604051905090565b600067ffffffffffffffff821115614fd257614fd16155a4565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614ffe57614ffd6155a4565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561502a576150296155a4565b5b615033826155ec565b9050602081019050919050565b600067ffffffffffffffff82111561505b5761505a6155a4565b5b615064826155ec565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061510d826152e5565b9150615118836152e5565b9250826fffffffffffffffffffffffffffffffff0382111561513d5761513c6154b9565b5b828201905092915050565b600061515382615321565b915061515e83615321565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115615193576151926154b9565b5b828201905092915050565b60006151a982615321565b91506151b483615321565b9250826151c4576151c36154e8565b5b828204905092915050565b60006151da82615321565b91506151e583615321565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561521e5761521d6154b9565b5b828202905092915050565b6000615234826152e5565b915061523f836152e5565b925082821015615252576152516154b9565b5b828203905092915050565b600061526882615321565b915061527383615321565b925082821015615286576152856154b9565b5b828203905092915050565b600061529c82615301565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561536557808201518184015260208101905061534a565b83811115615374576000848401525b50505050565b600061538582615321565b91506000821415615399576153986154b9565b5b600182039050919050565b600060028204905060018216806153bc57607f821691505b602082108114156153d0576153cf615546565b5b50919050565b6153df826155ec565b810181811067ffffffffffffffff821117156153fe576153fd6155a4565b5b80604052505050565b600061541282615321565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615445576154446154b9565b5b600182019050919050565b600061545b8261546c565b9050919050565b6000819050919050565b6000615477826155fd565b9050919050565b6000819050919050565b600061549382615321565b915061549e83615321565b9250826154ae576154ad6154e8565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f426c7572204170652059432052657665616c6564210000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f426c7572204170652059432057726f6e67205369676e61747572652100000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f426c757220417065205943204d696e74696e6720506175736520210000000000600082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f426c757220417065205943204e6f74204f776e65722100000000000000000000600082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f426c757220417065205943204c696d6974205065722054782021000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f426c75722041706520594320536f6c646f757420210000000000000000000000600082015250565b7f426c75722041706520594320496e73756666696369656e742046756e64732021600082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f2f6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b615e5781615291565b8114615e6257600080fd5b50565b615e6e816152a3565b8114615e7957600080fd5b50565b615e85816152b9565b8114615e9057600080fd5b50565b615e9c81615321565b8114615ea757600080fd5b5056fea2646970667358221220d54a157f25f6c4e2677cd6641f7528d3385fc97bdf52060b0eb7e8300896b61d64736f6c63430008070033

Deployed Bytecode Sourcemap

278:5007:12:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4820:370:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;434:40:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6546:94:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8071:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7634:379;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2967:391:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2503:458;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2904:112:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;779:42:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8921:142:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;739:31:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4011:745:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5166:116:12;;;;;;;;;;;;;:::i;:::-;;9126:157:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3085:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;623:31:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6369:118:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3329:393;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3585:220:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3915:200;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4405:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5246:211:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1831:101:0;;;;;;;;;;;;;:::i;:::-;;4123:135:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;399:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4511:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3366:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1201:85:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;481:53:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6701:98:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;541:39:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1615:293;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8339:274:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3817:86:12;;;;;;;;;;;;;:::i;:::-;;9346:311:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;587:27:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;828:39;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4625:533;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;874:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;700:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13761:43:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1107:500:12;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4270:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8676:186:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2081:198:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;663:28:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4820:370:13;4947:4;4992:25;4977:40;;;:11;:40;;;;:99;;;;5043:33;5028:48;;;:11;:48;;;;4977:99;:160;;;;5102:35;5087:50;;;:11;:50;;;;4977:160;:207;;;;5148:36;5172:11;5148:23;:36::i;:::-;4977:207;4963:221;;4820:370;;;:::o;434:40:12:-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;6546:94:13:-;6600:13;6629:5;6622:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6546:94;:::o;8071:204::-;8139:7;8163:16;8171:7;8163;:16::i;:::-;8155:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;8245:15;:24;8261:7;8245:24;;;;;;;;;;;;;;;;;;;;;8238:31;;8071:204;;;:::o;7634:379::-;7703:13;7719:24;7735:7;7719:15;:24::i;:::-;7703:40;;7764:5;7758:11;;:2;:11;;;;7750:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;7849:5;7833:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;7858:37;7875:5;7882:12;:10;:12::i;:::-;7858:16;:37::i;:::-;7833:62;7817:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;7979:28;7988:2;7992:7;8001:5;7979:8;:28::i;:::-;7696:317;7634:379;;:::o;2967:391:12:-;3054:4;3076:19;3133:4;3139:3;;;;;;;;;;;3143:7;3108:43;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3098:54;;;;;;3076:76;;3163:14;3180:56;3225:10;3180:36;:11;:34;:36::i;:::-;:44;;:56;;;;:::i;:::-;3163:73;;3260:6;3253:13;;:3;;;;;;;;;;;:13;;;3249:102;;;3290:4;3283:11;;;;;;3249:102;3334:5;3327:12;;;;2967:391;;;;;:::o;2503:458::-;2549:7;2588:15;2604:1;2588:18;;;;;;;;:::i;:::-;;;;;;;;;;2572:13;:11;:13::i;:::-;:34;2569:385;;;2639:13;2653:1;2639:16;;;;;;;;:::i;:::-;;;;;;;;;;2632:23;;;;2569:385;2702:15;2718:1;2702:18;;;;;;;;:::i;:::-;;;;;;;;;;2686:13;:11;:13::i;:::-;:34;2682:272;;;2753:13;2767:1;2753:16;;;;;;;;:::i;:::-;;;;;;;;;;2746:23;;;;2682:272;2816:15;2832:1;2816:18;;;;;;;;:::i;:::-;;;;;;;;;;2800:13;:11;:13::i;:::-;:34;2796:158;;;2867:13;2881:1;2867:16;;;;;;;;:::i;:::-;;;;;;;;;;2860:23;;;;2796:158;2941:1;2934:8;;2503:458;;:::o;2904:112:13:-;2957:7;2995:15;:13;:15::i;:::-;2980:12;;:30;;;;:::i;:::-;2973:37;;2904:112;:::o;779:42:12:-;;;;;;;;;;;;;;;;;:::o;8921:142:13:-;9029:28;9039:4;9045:2;9049:7;9029:9;:28::i;:::-;8921:142;;;:::o;739:31:12:-;;;;:::o;4011:745:13:-;4120:7;4155:16;4165:5;4155:9;:16::i;:::-;4147:5;:24;4139:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;4217:22;4242:13;:11;:13::i;:::-;4217:38;;4262:19;4292:25;4342:9;4354:1;4342:13;;4337:351;4362:14;4357:1;:19;4337:351;;4392:31;4426:11;:14;4438:1;4426:14;;;;;;;;;;;4392:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4479:1;4453:28;;:9;:14;;;:28;;;4449:89;;4514:9;:14;;;4494:34;;4449:89;4571:5;4550:26;;:17;:26;;;4546:135;;;4608:5;4593:11;:20;4589:59;;;4635:1;4628:8;;;;;;;;;4589:59;4658:13;;;;;:::i;:::-;;;;4546:135;4383:305;4378:3;;;;;:::i;:::-;;;;4337:351;;;;4694:56;;;;;;;;;;:::i;:::-;;;;;;;;4011:745;;;;;:::o;5166:116:12:-;1094:13:0;:11;:13::i;:::-;5222:10:12::1;5214:28;;:60;5259:4;5243:30;;;5214:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;5166:116::o:0;9126:157:13:-;9238:39;9255:4;9261:2;9265:7;9238:39;;;;;;;;;;;;:16;:39::i;:::-;9126:157;;;:::o;3085:177::-;3152:7;3184:13;:11;:13::i;:::-;3176:5;:21;3168:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;3251:5;3244:12;;3085:177;;;:::o;623:31:12:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;6369:118:13:-;6433:7;6456:20;6468:7;6456:11;:20::i;:::-;:25;;;6449:32;;6369:118;;;:::o;3329:393::-;3412:22;3452:14;3470:16;3480:5;3470:9;:16::i;:::-;3452:34;;3498:22;3537:6;3523:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3498:46;;3559:6;3555:137;3573:6;3569:1;:10;3555:137;;;3601:15;3619:28;3639:5;3645:1;3619:19;:28::i;:::-;3601:46;;3673:7;3662:5;3668:1;3662:8;;;;;;;;:::i;:::-;;;;;;;:18;;;;;3586:106;3581:3;;;;;:::i;:::-;;;;3555:137;;;;3709:5;3702:12;;;;3329:393;;;:::o;3585:220:12:-;1094:13:0;:11;:13::i;:::-;3691:9:12::1;3686:112;3710:13;:20;3706:1;:24;3686:112;;;3751:35;3761:13;3775:1;3761:16;;;;;;;;:::i;:::-;;;;;;;;3779:3;3783:1;3779:6;;;;;;;;:::i;:::-;;;;;;;;3751:9;:35::i;:::-;3732:3;;;;;:::i;:::-;;;;3686:112;;;;3585:220:::0;;:::o;3915:200::-;1094:13:0;:11;:13::i;:::-;4044:14:12::1;4028:13;:30;;;;;;;;;;;;:::i;:::-;;4089:18;4069:17;:38;;;;;;;;;;;;:::i;:::-;;3915:200:::0;;:::o;4405:98::-;1094:13:0;:11;:13::i;:::-;4487:8:12::1;4475:9;:20;;;;4405:98:::0;:::o;5246:211:13:-;5310:7;5351:1;5334:19;;:5;:19;;;;5326:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;5423:12;:19;5436:5;5423:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;5415:36;;5408:43;;5246:211;;;:::o;1831:101:0:-;1094:13;:11;:13::i;:::-;1895:30:::1;1922:1;1895:18;:30::i;:::-;1831:101::o:0;4123:135:12:-;1094:13:0;:11;:13::i;:::-;4234:16:12::1;4216:15;:34;;;;;;;;;;;;:::i;:::-;;4123:135:::0;:::o;399:28::-;;;;;;;;;;;;;:::o;4511:106::-;1094:13:0;:11;:13::i;:::-;4583:26:12::1;4593:10;4605:3;4583:9;:26::i;:::-;4511:106:::0;:::o;3366:89::-;1094:13:0;:11;:13::i;:::-;3438:9:12::1;3432:3;;:15;;;;;;;;;;;;;;;;;;3366:89:::0;:::o;1201:85:0:-;1247:7;1273:6;;;;;;;;;;;1266:13;;1201:85;:::o;481:53:12:-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;6701:98:13:-;6757:13;6786:7;6779:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6701:98;:::o;541:39:12:-;;;;:::o;1615:293::-;1683:7;;;;;;;;;;;1675:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;1749:8;;1742:3;:15;;1734:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;1840:10;;1830:9;;:20;;;;:::i;:::-;1823:3;1807:13;:11;:13::i;:::-;:19;;;;:::i;:::-;:43;;1799:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;1886:14;1896:3;1886:9;:14::i;:::-;1615:293;:::o;8339:274:13:-;8442:12;:10;:12::i;:::-;8430:24;;:8;:24;;;;8422:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;8539:8;8494:18;:32;8513:12;:10;:12::i;:::-;8494:32;;;;;;;;;;;;;;;:42;8527:8;8494:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;8588:8;8559:48;;8574:12;:10;:12::i;:::-;8559:48;;;8598:8;8559:48;;;;;;:::i;:::-;;;;;;;;8339:274;;:::o;3817:86:12:-;1094:13:0;:11;:13::i;:::-;3887:7:12::1;;;;;;;;;;;3886:8;3875:7;;:19;;;;;;;;;;;;;;;;;;3817:86::o:0;9346:311:13:-;9483:28;9493:4;9499:2;9503:7;9483:9;:28::i;:::-;9534:48;9557:4;9563:2;9567:7;9576:5;9534:22;:48::i;:::-;9518:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;9346:311;;;;:::o;587:27:12:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;828:39::-;;;;;;;;;;;;;;;;;;;;;;:::o;4625:533::-;4698:13;4732:16;4740:7;4732;:16::i;:::-;4724:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;4814:6;:15;4821:7;4814:15;;;;;;;;;;;;;;;;;;;;;4811:340;;;4892:1;4868:13;4862:27;;;;;:::i;:::-;;;:31;:106;;;;;;;;;;;;;;;;;4920:13;4935:9;:18;4945:7;4935:18;;;;;;;;;;;4903:59;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4862:106;4855:113;;;;4811:340;5060:1;5032:17;5026:31;;;;;:::i;:::-;;;:35;:113;;;;;;;;;;;;;;;;;5088:17;5107:25;5124:7;5107:16;:25::i;:::-;5071:62;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5026:113;5019:120;;4625:533;;;;:::o;874:44::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;700:32::-;;;;:::o;13761:43:13:-;;;;:::o;1107:500:12:-;1229:10;1209:30;;:16;1217:7;1209;:16::i;:::-;:30;;;1201:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;1304:5;1285:24;;:6;:15;1292:7;1285:15;;;;;;;;;;;;;;;;;;;;;:24;;;1277:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;1354:33;1369:9;1379:7;1354:14;:33::i;:::-;1346:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;1430:19;1479:3;;;;;;;;;;;1483:7;1462:29;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1452:40;;;;;;1430:62;;1521:4;1503:6;:15;1510:7;1503:15;;;;;;;;;;;;:22;;;;;;;;;;;;;;;;;;1557:42;1582:11;1577:17;;1596:2;1557:19;:42::i;:::-;1536:9;:18;1546:7;1536:18;;;;;;;;;;;:63;;;;;;;;;;;;:::i;:::-;;1190:417;1107:500;;:::o;4270:127::-;1094:13:0;:11;:13::i;:::-;4375:14:12::1;4359:13;:30;;;;;;;;;;;;:::i;:::-;;4270:127:::0;:::o;8676:186:13:-;8798:4;8821:18;:25;8840:5;8821:25;;;;;;;;;;;;;;;:35;8847:8;8821:35;;;;;;;;;;;;;;;;;;;;;;;;;8814:42;;8676: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;663:28:12:-;;;;:::o;829:155:10:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;9896:105:13:-;9953:4;9983:12;;9973:7;:22;9966:29;;9896:105;;;:::o;640:96:7:-;693:7;719:10;712:17;;640:96;:::o;13583:172:13:-;13707:2;13680:15;:24;13696:7;13680:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;13741:7;13737:2;13721:28;;13730:5;13721:28;;;;;;;;;;;;13583:172;;;:::o;7463:265:9:-;7532:7;7715:4;7662:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;7652:69;;;;;;7645:76;;7463:265;;;:::o;3759:227::-;3837:7;3857:17;3876:18;3898:27;3909:4;3915:9;3898:10;:27::i;:::-;3856:69;;;;3935:18;3947:5;3935:11;:18::i;:::-;3970:9;3963:16;;;;3759:227;;;;:::o;998:101:12:-;1063:7;1090:1;1083:8;;998:101;:::o;11948:1529:13:-;12045:35;12083:20;12095:7;12083:11;:20::i;:::-;12045:58;;12112:22;12154:13;:18;;;12138:34;;:12;:10;:12::i;:::-;:34;;;:81;;;;12207:12;:10;:12::i;:::-;12183:36;;:20;12195:7;12183:11;:20::i;:::-;:36;;;12138:81;:142;;;;12230:50;12247:13;:18;;;12267:12;:10;:12::i;:::-;12230:16;:50::i;:::-;12138:142;12112:169;;12306:17;12290:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;12438:4;12416:26;;:13;:18;;;:26;;;12400:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;12527:1;12513:16;;:2;:16;;;;12505:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;12580:43;12602:4;12608:2;12612:7;12621:1;12580:21;:43::i;:::-;12680:49;12697:1;12701:7;12710:13;:18;;;12680:8;:49::i;:::-;12768:1;12738:12;:18;12751:4;12738:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;12804:1;12776:12;:16;12789:2;12776:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;12835:43;;;;;;;;12850:2;12835:43;;;;;;12861:15;12835:43;;;;;12812:11;:20;12824:7;12812:20;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13106:19;13138:1;13128:7;:11;;;;:::i;:::-;13106:33;;13191:1;13150:43;;:11;:24;13162:11;13150:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;13146:236;;;13208:20;13216:11;13208:7;:20::i;:::-;13204:171;;;13268:97;;;;;;;;13295:13;:18;;;13268:97;;;;;;13326:13;:28;;;13268:97;;;;;13241:11;:24;13253:11;13241:24;;;;;;;;;;;:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13204:171;13146:236;13414:7;13410:2;13395:27;;13404:4;13395:27;;;;;;;;;;;;13429:42;13450:4;13456:2;13460:7;13469:1;13429:20;:42::i;:::-;12038:1439;;;11948:1529;;;:::o;1359:130:0:-;1433:12;:10;:12::i;:::-;1422:23;;:7;:5;:7::i;:::-;:23;;;1414:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1359:130::o;5709:606:13:-;5785:21;;:::i;:::-;5826:16;5834:7;5826;:16::i;:::-;5818:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;5898:26;5946:12;5935:7;:23;5931:93;;6015:1;6000:12;5990:7;:22;;;;:::i;:::-;:26;;;;:::i;:::-;5969:47;;5931:93;6037:12;6052:7;6037:22;;6032:212;6069:18;6061:4;:26;6032:212;;6106:31;6140:11;:17;6152:4;6140:17;;;;;;;;;;;6106:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6196:1;6170:28;;:9;:14;;;:28;;;6166:71;;6218:9;6211:16;;;;;;;6166:71;6097:147;6089:6;;;;;:::i;:::-;;;;6032:212;;;;6252:57;;;;;;;;;;:::i;:::-;;;;;;;;5709:606;;;;:::o;10007:98::-;10072:27;10082:2;10086:8;10072:27;;;;;;;;;;;;:9;:27::i;:::-;10007:98;;:::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;1916:579:12:-;1969:13;1985:15;:13;:15::i;:::-;1969:31;;2035:8;2014:6;:18;2021:10;2014:18;;;;;;;;;;;;;;;;:29;2011:477;;;2079:8;2073:3;:14;2070:33;;;2095:8;2089:14;;2070:33;2157:5;;2145:8;2139:3;:14;;;;:::i;:::-;2138:24;;;;:::i;:::-;2125:9;:37;;2117:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;2235:3;2213:6;:18;2220:10;2213:18;;;;;;;;;;;;;;;;:25;;;;;;;:::i;:::-;;;;;;;;2252:26;2262:10;2274:3;2252:9;:26::i;:::-;2011:477;;;2355:5;;2349:3;:11;;;;:::i;:::-;2336:9;:24;;2328:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2433:3;2411:6;:18;2418:10;2411:18;;;;;;;;;;;;;;;;:25;;;;;;;:::i;:::-;;;;;;;;2450:26;2460:10;2472:3;2450:9;:26::i;:::-;2011:477;1958:537;1916:579;:::o;15298:690:13:-;15435:4;15452:15;:2;:13;;;:15::i;:::-;15448:535;;;15507:2;15491:36;;;15528:12;:10;:12::i;:::-;15542:4;15548:7;15557:5;15491:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;15478:464;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15739:1;15722:6;:13;:18;15718:215;;;15755:61;;;;;;;;;;:::i;:::-;;;;;;;;15718:215;15901:6;15895:13;15886:6;15882:2;15878:15;15871:38;15478:464;15623:45;;;15613:55;;;:6;:55;;;;15606:62;;;;;15448:535;15971:4;15964:11;;15298:690;;;;;;;:::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;1652:441::-;1727:13;1752:19;1797:1;1788:6;1784:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;1774:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1752:47;;1809:15;:6;1816:1;1809:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;1834;:6;1841:1;1834:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;1864:9;1889:1;1880:6;1876:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;1864:26;;1859:132;1896:1;1892;:5;1859:132;;;1930:12;1951:3;1943:5;:11;1930:25;;;;;;;:::i;:::-;;;;;1918:6;1925:1;1918:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;1979:1;1969:11;;;;;1899:3;;;;:::i;:::-;;;1859:132;;;;2017:1;2008:5;:10;2000:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;2079:6;2065:21;;;1652:441;;;;:::o;2243:730:9:-;2324:7;2333:12;2381:2;2361:9;:16;:22;2357:610;;;2399:9;2422;2445:7;2697:4;2686:9;2682:20;2676:27;2671:32;;2746:4;2735:9;2731:20;2725:27;2720:32;;2803:4;2792:9;2788:20;2782:27;2779:1;2774:36;2769:41;;2844:25;2855:4;2861:1;2864;2867;2844:10;:25::i;:::-;2837:32;;;;;;;;;2357:610;2916:1;2920:35;2900:56;;;;2243:730;;;;;;:::o;548:631::-;625:20;616:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;612:561;;;661:7;;612:561;721:29;712:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;708:465;;;766:34;;;;;;;;;;:::i;:::-;;;;;;;;708:465;830:35;821:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;817:356;;;881:41;;;;;;;;;;:::i;:::-;;;;;;;;817:356;952:30;943:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;939:234;;;998:44;;;;;;;;;;:::i;:::-;;;;;;;;939:234;1072:30;1063:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;1059:114;;;1118:44;;;;;;;;;;:::i;:::-;;;;;;;;1059:114;548:631;;:::o;16450:141:13:-;;;;;:::o;16977:140::-;;;;;:::o;10444:1272::-;10549:20;10572:12;;10549:35;;10613:1;10599:16;;:2;:16;;;;10591:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;10790:21;10798:12;10790:7;:21::i;:::-;10789:22;10781:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;10872:12;10860:8;:24;;10852:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;10932:61;10962:1;10966:2;10970:12;10984:8;10932:21;:61::i;:::-;11002:30;11035:12;:16;11048:2;11035:16;;;;;;;;;;;;;;;11002:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11077:119;;;;;;;;11127:8;11097:11;:19;;;:39;;;;:::i;:::-;11077:119;;;;;;11180:8;11145:11;:24;;;:44;;;;:::i;:::-;11077:119;;;;;11058:12;:16;11071:2;11058:16;;;;;;;;;;;;;;;:138;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11231:43;;;;;;;;11246:2;11231:43;;;;;;11257:15;11231:43;;;;;11203:11;:25;11215:12;11203:25;;;;;;;;;;;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11283:20;11306:12;11283:35;;11332:9;11327:281;11351:8;11347:1;:12;11327:281;;;11405:12;11401:2;11380:38;;11397:1;11380:38;;;;;;;;;;;;11445:59;11476:1;11480:2;11484:12;11498:5;11445:22;:59::i;:::-;11427:150;;;;;;;;;;;;:::i;:::-;;;;;;;;;11586:14;;;;;:::i;:::-;;;;11361:3;;;;;:::i;:::-;;;;11327:281;;;;11631:12;11616;:27;;;;11650:60;11679:1;11683:2;11687:12;11701:8;11650:20;:60::i;:::-;10542:1174;;;10444:1272;;;:::o;1175:320:6:-;1235:4;1487:1;1465:7;:19;;;:23;1458:30;;1175:320;;;:::o;5167:1603:9:-;5293:7;5302:12;6217:66;6212:1;6204:10;;:79;6200:161;;;6315:1;6319:30;6299:51;;;;;;6200:161;6379:2;6374:1;:7;;;;:18;;;;;6390:2;6385:1;:7;;;;6374:18;6370:100;;;6424:1;6428:30;6408:51;;;;;;6370:100;6564:14;6581:24;6591:4;6597:1;6600;6603;6581:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6564:41;;6637:1;6619:20;;:6;:20;;;6615:101;;;6671:1;6675:29;6655:50;;;;;;;6615:101;6734:6;6742:20;6726:37;;;;;5167:1603;;;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:14:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;769:::-;865:5;890:81;906:64;963:6;906:64;:::i;:::-;890:81;:::i;:::-;881:90;;991:5;1020:6;1013:5;1006:21;1054:4;1047:5;1043:16;1036:23;;1080:6;1130:3;1122:4;1114:6;1110:17;1105:3;1101:27;1098:36;1095:143;;;1149:79;;:::i;:::-;1095:143;1262:1;1247:238;1272:6;1269:1;1266:13;1247:238;;;1340:3;1369:37;1402:3;1390:10;1369:37;:::i;:::-;1364:3;1357:50;1436:4;1431:3;1427:14;1420:21;;1470:4;1465:3;1461:14;1454:21;;1307:178;1294:1;1291;1287:9;1282:14;;1247:238;;;1251:14;871:620;;769:722;;;;;:::o;1497:410::-;1574:5;1599:65;1615:48;1656:6;1615:48;:::i;:::-;1599:65;:::i;:::-;1590:74;;1687:6;1680:5;1673:21;1725:4;1718:5;1714:16;1763:3;1754:6;1749:3;1745:16;1742:25;1739:112;;;1770:79;;:::i;:::-;1739:112;1860:41;1894:6;1889:3;1884;1860:41;:::i;:::-;1580:327;1497:410;;;;;:::o;1913:412::-;1991:5;2016:66;2032:49;2074:6;2032:49;:::i;:::-;2016:66;:::i;:::-;2007:75;;2105:6;2098:5;2091:21;2143:4;2136:5;2132:16;2181:3;2172:6;2167:3;2163:16;2160:25;2157:112;;;2188:79;;:::i;:::-;2157:112;2278:41;2312:6;2307:3;2302;2278:41;:::i;:::-;1997:328;1913:412;;;;;:::o;2331:139::-;2377:5;2415:6;2402:20;2393:29;;2431:33;2458:5;2431:33;:::i;:::-;2331:139;;;;:::o;2493:370::-;2564:5;2613:3;2606:4;2598:6;2594:17;2590:27;2580:122;;2621:79;;:::i;:::-;2580:122;2738:6;2725:20;2763:94;2853:3;2845:6;2838:4;2830:6;2826:17;2763:94;:::i;:::-;2754:103;;2570:293;2493:370;;;;:::o;2886:::-;2957:5;3006:3;2999:4;2991:6;2987:17;2983:27;2973:122;;3014:79;;:::i;:::-;2973:122;3131:6;3118:20;3156:94;3246:3;3238:6;3231:4;3223:6;3219:17;3156:94;:::i;:::-;3147:103;;2963:293;2886:370;;;;:::o;3262:133::-;3305:5;3343:6;3330:20;3321:29;;3359:30;3383:5;3359:30;:::i;:::-;3262:133;;;;:::o;3401:137::-;3446:5;3484:6;3471:20;3462:29;;3500:32;3526:5;3500:32;:::i;:::-;3401:137;;;;:::o;3544:141::-;3600:5;3631:6;3625:13;3616:22;;3647:32;3673:5;3647:32;:::i;:::-;3544:141;;;;:::o;3704:338::-;3759:5;3808:3;3801:4;3793:6;3789:17;3785:27;3775:122;;3816:79;;:::i;:::-;3775:122;3933:6;3920:20;3958:78;4032:3;4024:6;4017:4;4009:6;4005:17;3958:78;:::i;:::-;3949:87;;3765:277;3704:338;;;;:::o;4062:340::-;4118:5;4167:3;4160:4;4152:6;4148:17;4144:27;4134:122;;4175:79;;:::i;:::-;4134:122;4292:6;4279:20;4317:79;4392:3;4384:6;4377:4;4369:6;4365:17;4317:79;:::i;:::-;4308:88;;4124:278;4062:340;;;;:::o;4408:139::-;4454:5;4492:6;4479:20;4470:29;;4508:33;4535:5;4508:33;:::i;:::-;4408:139;;;;:::o;4553:329::-;4612:6;4661:2;4649:9;4640:7;4636:23;4632:32;4629:119;;;4667:79;;:::i;:::-;4629:119;4787:1;4812:53;4857:7;4848:6;4837:9;4833:22;4812:53;:::i;:::-;4802:63;;4758:117;4553:329;;;;:::o;4888:474::-;4956:6;4964;5013:2;5001:9;4992:7;4988:23;4984:32;4981:119;;;5019:79;;:::i;:::-;4981:119;5139:1;5164:53;5209:7;5200:6;5189:9;5185:22;5164:53;:::i;:::-;5154:63;;5110:117;5266:2;5292:53;5337:7;5328:6;5317:9;5313:22;5292:53;:::i;:::-;5282:63;;5237:118;4888:474;;;;;:::o;5368:619::-;5445:6;5453;5461;5510:2;5498:9;5489:7;5485:23;5481:32;5478:119;;;5516:79;;:::i;:::-;5478:119;5636:1;5661:53;5706:7;5697:6;5686:9;5682:22;5661:53;:::i;:::-;5651:63;;5607:117;5763:2;5789:53;5834:7;5825:6;5814:9;5810:22;5789:53;:::i;:::-;5779:63;;5734:118;5891:2;5917:53;5962:7;5953:6;5942:9;5938:22;5917:53;:::i;:::-;5907:63;;5862:118;5368:619;;;;;:::o;5993:943::-;6088:6;6096;6104;6112;6161:3;6149:9;6140:7;6136:23;6132:33;6129:120;;;6168:79;;:::i;:::-;6129:120;6288:1;6313:53;6358:7;6349:6;6338:9;6334:22;6313:53;:::i;:::-;6303:63;;6259:117;6415:2;6441:53;6486:7;6477:6;6466:9;6462:22;6441:53;:::i;:::-;6431:63;;6386:118;6543:2;6569:53;6614:7;6605:6;6594:9;6590:22;6569:53;:::i;:::-;6559:63;;6514:118;6699:2;6688:9;6684:18;6671:32;6730:18;6722:6;6719:30;6716:117;;;6752:79;;:::i;:::-;6716:117;6857:62;6911:7;6902:6;6891:9;6887:22;6857:62;:::i;:::-;6847:72;;6642:287;5993:943;;;;;;;:::o;6942:468::-;7007:6;7015;7064:2;7052:9;7043:7;7039:23;7035:32;7032:119;;;7070:79;;:::i;:::-;7032:119;7190:1;7215:53;7260:7;7251:6;7240:9;7236:22;7215:53;:::i;:::-;7205:63;;7161:117;7317:2;7343:50;7385:7;7376:6;7365:9;7361:22;7343:50;:::i;:::-;7333:60;;7288:115;6942:468;;;;;:::o;7416:474::-;7484:6;7492;7541:2;7529:9;7520:7;7516:23;7512:32;7509:119;;;7547:79;;:::i;:::-;7509:119;7667:1;7692:53;7737:7;7728:6;7717:9;7713:22;7692:53;:::i;:::-;7682:63;;7638:117;7794:2;7820:53;7865:7;7856:6;7845:9;7841:22;7820:53;:::i;:::-;7810:63;;7765:118;7416:474;;;;;:::o;7896:894::-;8014:6;8022;8071:2;8059:9;8050:7;8046:23;8042:32;8039:119;;;8077:79;;:::i;:::-;8039:119;8225:1;8214:9;8210:17;8197:31;8255:18;8247:6;8244:30;8241:117;;;8277:79;;:::i;:::-;8241:117;8382:78;8452:7;8443:6;8432:9;8428:22;8382:78;:::i;:::-;8372:88;;8168:302;8537:2;8526:9;8522:18;8509:32;8568:18;8560:6;8557:30;8554:117;;;8590:79;;:::i;:::-;8554:117;8695:78;8765:7;8756:6;8745:9;8741:22;8695:78;:::i;:::-;8685:88;;8480:303;7896:894;;;;;:::o;8796:539::-;8880:6;8929:2;8917:9;8908:7;8904:23;8900:32;8897:119;;;8935:79;;:::i;:::-;8897:119;9083:1;9072:9;9068:17;9055:31;9113:18;9105:6;9102:30;9099:117;;;9135:79;;:::i;:::-;9099:117;9240:78;9310:7;9301:6;9290:9;9286:22;9240:78;:::i;:::-;9230:88;;9026:302;8796:539;;;;:::o;9341:327::-;9399:6;9448:2;9436:9;9427:7;9423:23;9419:32;9416:119;;;9454:79;;:::i;:::-;9416:119;9574:1;9599:52;9643:7;9634:6;9623:9;9619:22;9599:52;:::i;:::-;9589:62;;9545:116;9341:327;;;;:::o;9674:349::-;9743:6;9792:2;9780:9;9771:7;9767:23;9763:32;9760:119;;;9798:79;;:::i;:::-;9760:119;9918:1;9943:63;9998:7;9989:6;9978:9;9974:22;9943:63;:::i;:::-;9933:73;;9889:127;9674:349;;;;:::o;10029:652::-;10106:6;10114;10163:2;10151:9;10142:7;10138:23;10134:32;10131:119;;;10169:79;;:::i;:::-;10131:119;10317:1;10306:9;10302:17;10289:31;10347:18;10339:6;10336:30;10333:117;;;10369:79;;:::i;:::-;10333:117;10474:62;10528:7;10519:6;10508:9;10504:22;10474:62;:::i;:::-;10464:72;;10260:286;10585:2;10611:53;10656:7;10647:6;10636:9;10632:22;10611:53;:::i;:::-;10601:63;;10556:118;10029:652;;;;;:::o;10687:834::-;10775:6;10783;10832:2;10820:9;10811:7;10807:23;10803:32;10800:119;;;10838:79;;:::i;:::-;10800:119;10986:1;10975:9;10971:17;10958:31;11016:18;11008:6;11005:30;11002:117;;;11038:79;;:::i;:::-;11002:117;11143:63;11198:7;11189:6;11178:9;11174:22;11143:63;:::i;:::-;11133:73;;10929:287;11283:2;11272:9;11268:18;11255:32;11314:18;11306:6;11303:30;11300:117;;;11336:79;;:::i;:::-;11300:117;11441:63;11496:7;11487:6;11476:9;11472:22;11441:63;:::i;:::-;11431:73;;11226:288;10687:834;;;;;:::o;11527:329::-;11586:6;11635:2;11623:9;11614:7;11610:23;11606:32;11603:119;;;11641:79;;:::i;:::-;11603:119;11761:1;11786:53;11831:7;11822:6;11811:9;11807:22;11786:53;:::i;:::-;11776:63;;11732:117;11527:329;;;;:::o;11862:652::-;11939:6;11947;11996:2;11984:9;11975:7;11971:23;11967:32;11964:119;;;12002:79;;:::i;:::-;11964:119;12122:1;12147:53;12192:7;12183:6;12172:9;12168:22;12147:53;:::i;:::-;12137:63;;12093:117;12277:2;12266:9;12262:18;12249:32;12308:18;12300:6;12297:30;12294:117;;;12330:79;;:::i;:::-;12294:117;12435:62;12489:7;12480:6;12469:9;12465:22;12435:62;:::i;:::-;12425:72;;12220:287;11862:652;;;;;:::o;12520:179::-;12589:10;12610:46;12652:3;12644:6;12610:46;:::i;:::-;12688:4;12683:3;12679:14;12665:28;;12520:179;;;;:::o;12705:118::-;12792:24;12810:5;12792:24;:::i;:::-;12787:3;12780:37;12705:118;;:::o;12829:157::-;12934:45;12954:24;12972:5;12954:24;:::i;:::-;12934:45;:::i;:::-;12929:3;12922:58;12829:157;;:::o;13022:732::-;13141:3;13170:54;13218:5;13170:54;:::i;:::-;13240:86;13319:6;13314:3;13240:86;:::i;:::-;13233:93;;13350:56;13400:5;13350:56;:::i;:::-;13429:7;13460:1;13445:284;13470:6;13467:1;13464:13;13445:284;;;13546:6;13540:13;13573:63;13632:3;13617:13;13573:63;:::i;:::-;13566:70;;13659:60;13712:6;13659:60;:::i;:::-;13649:70;;13505:224;13492:1;13489;13485:9;13480:14;;13445:284;;;13449:14;13745:3;13738:10;;13146:608;;;13022:732;;;;:::o;13760:109::-;13841:21;13856:5;13841:21;:::i;:::-;13836:3;13829:34;13760:109;;:::o;13875:118::-;13962:24;13980:5;13962:24;:::i;:::-;13957:3;13950:37;13875:118;;:::o;13999:157::-;14104:45;14124:24;14142:5;14124:24;:::i;:::-;14104:45;:::i;:::-;14099:3;14092:58;13999:157;;:::o;14162:360::-;14248:3;14276:38;14308:5;14276:38;:::i;:::-;14330:70;14393:6;14388:3;14330:70;:::i;:::-;14323:77;;14409:52;14454:6;14449:3;14442:4;14435:5;14431:16;14409:52;:::i;:::-;14486:29;14508:6;14486:29;:::i;:::-;14481:3;14477:39;14470:46;;14252:270;14162:360;;;;:::o;14528:364::-;14616:3;14644:39;14677:5;14644:39;:::i;:::-;14699:71;14763:6;14758:3;14699:71;:::i;:::-;14692:78;;14779:52;14824:6;14819:3;14812:4;14805:5;14801:16;14779:52;:::i;:::-;14856:29;14878:6;14856:29;:::i;:::-;14851:3;14847:39;14840:46;;14620:272;14528:364;;;;:::o;14898:377::-;15004:3;15032:39;15065:5;15032:39;:::i;:::-;15087:89;15169:6;15164:3;15087:89;:::i;:::-;15080:96;;15185:52;15230:6;15225:3;15218:4;15211:5;15207:16;15185:52;:::i;:::-;15262:6;15257:3;15253:16;15246:23;;15008:267;14898:377;;;;:::o;15305:845::-;15408:3;15445:5;15439:12;15474:36;15500:9;15474:36;:::i;:::-;15526:89;15608:6;15603:3;15526:89;:::i;:::-;15519:96;;15646:1;15635:9;15631:17;15662:1;15657:137;;;;15808:1;15803:341;;;;15624:520;;15657:137;15741:4;15737:9;15726;15722:25;15717:3;15710:38;15777:6;15772:3;15768:16;15761:23;;15657:137;;15803:341;15870:38;15902:5;15870:38;:::i;:::-;15930:1;15944:154;15958:6;15955:1;15952:13;15944:154;;;16032:7;16026:14;16022:1;16017:3;16013:11;16006:35;16082:1;16073:7;16069:15;16058:26;;15980:4;15977:1;15973:12;15968:17;;15944:154;;;16127:6;16122:3;16118:16;16111:23;;15810:334;;15624:520;;15412:738;;15305:845;;;;:::o;16156:366::-;16298:3;16319:67;16383:2;16378:3;16319:67;:::i;:::-;16312:74;;16395:93;16484:3;16395:93;:::i;:::-;16513:2;16508:3;16504:12;16497:19;;16156:366;;;:::o;16528:::-;16670:3;16691:67;16755:2;16750:3;16691:67;:::i;:::-;16684:74;;16767:93;16856:3;16767:93;:::i;:::-;16885:2;16880:3;16876:12;16869:19;;16528:366;;;:::o;16900:::-;17042:3;17063:67;17127:2;17122:3;17063:67;:::i;:::-;17056:74;;17139:93;17228:3;17139:93;:::i;:::-;17257:2;17252:3;17248:12;17241:19;;16900:366;;;:::o;17272:::-;17414:3;17435:67;17499:2;17494:3;17435:67;:::i;:::-;17428:74;;17511:93;17600:3;17511:93;:::i;:::-;17629:2;17624:3;17620:12;17613:19;;17272:366;;;:::o;17644:402::-;17804:3;17825:85;17907:2;17902:3;17825:85;:::i;:::-;17818:92;;17919:93;18008:3;17919:93;:::i;:::-;18037:2;18032:3;18028:12;18021:19;;17644:402;;;:::o;18052:366::-;18194:3;18215:67;18279:2;18274:3;18215:67;:::i;:::-;18208:74;;18291:93;18380:3;18291:93;:::i;:::-;18409:2;18404:3;18400:12;18393:19;;18052:366;;;:::o;18424:::-;18566:3;18587:67;18651:2;18646:3;18587:67;:::i;:::-;18580:74;;18663:93;18752:3;18663:93;:::i;:::-;18781:2;18776:3;18772:12;18765:19;;18424:366;;;:::o;18796:::-;18938:3;18959:67;19023:2;19018:3;18959:67;:::i;:::-;18952:74;;19035:93;19124:3;19035:93;:::i;:::-;19153:2;19148:3;19144:12;19137:19;;18796:366;;;:::o;19168:::-;19310:3;19331:67;19395:2;19390:3;19331:67;:::i;:::-;19324:74;;19407:93;19496:3;19407:93;:::i;:::-;19525:2;19520:3;19516:12;19509:19;;19168:366;;;:::o;19540:::-;19682:3;19703:67;19767:2;19762:3;19703:67;:::i;:::-;19696:74;;19779:93;19868:3;19779:93;:::i;:::-;19897:2;19892:3;19888:12;19881:19;;19540:366;;;:::o;19912:::-;20054:3;20075:67;20139:2;20134:3;20075:67;:::i;:::-;20068:74;;20151:93;20240:3;20151:93;:::i;:::-;20269:2;20264:3;20260:12;20253:19;;19912:366;;;:::o;20284:::-;20426:3;20447:67;20511:2;20506:3;20447:67;:::i;:::-;20440:74;;20523:93;20612:3;20523:93;:::i;:::-;20641:2;20636:3;20632:12;20625:19;;20284:366;;;:::o;20656:::-;20798:3;20819:67;20883:2;20878:3;20819:67;:::i;:::-;20812:74;;20895:93;20984:3;20895:93;:::i;:::-;21013:2;21008:3;21004:12;20997:19;;20656:366;;;:::o;21028:::-;21170:3;21191:67;21255:2;21250:3;21191:67;:::i;:::-;21184:74;;21267:93;21356:3;21267:93;:::i;:::-;21385:2;21380:3;21376:12;21369:19;;21028:366;;;:::o;21400:::-;21542:3;21563:67;21627:2;21622:3;21563:67;:::i;:::-;21556:74;;21639:93;21728:3;21639:93;:::i;:::-;21757:2;21752:3;21748:12;21741:19;;21400:366;;;:::o;21772:::-;21914:3;21935:67;21999:2;21994:3;21935:67;:::i;:::-;21928:74;;22011:93;22100:3;22011:93;:::i;:::-;22129:2;22124:3;22120:12;22113:19;;21772:366;;;:::o;22144:::-;22286:3;22307:67;22371:2;22366:3;22307:67;:::i;:::-;22300:74;;22383:93;22472:3;22383:93;:::i;:::-;22501:2;22496:3;22492:12;22485:19;;22144:366;;;:::o;22516:::-;22658:3;22679:67;22743:2;22738:3;22679:67;:::i;:::-;22672:74;;22755:93;22844:3;22755:93;:::i;:::-;22873:2;22868:3;22864:12;22857:19;;22516:366;;;:::o;22888:::-;23030:3;23051:67;23115:2;23110:3;23051:67;:::i;:::-;23044:74;;23127:93;23216:3;23127:93;:::i;:::-;23245:2;23240:3;23236:12;23229:19;;22888:366;;;:::o;23260:::-;23402:3;23423:67;23487:2;23482:3;23423:67;:::i;:::-;23416:74;;23499:93;23588:3;23499:93;:::i;:::-;23617:2;23612:3;23608:12;23601:19;;23260:366;;;:::o;23632:::-;23774:3;23795:67;23859:2;23854:3;23795:67;:::i;:::-;23788:74;;23871:93;23960:3;23871:93;:::i;:::-;23989:2;23984:3;23980:12;23973:19;;23632:366;;;:::o;24004:::-;24146:3;24167:67;24231:2;24226:3;24167:67;:::i;:::-;24160:74;;24243:93;24332:3;24243:93;:::i;:::-;24361:2;24356:3;24352:12;24345:19;;24004:366;;;:::o;24376:::-;24518:3;24539:67;24603:2;24598:3;24539:67;:::i;:::-;24532:74;;24615:93;24704:3;24615:93;:::i;:::-;24733:2;24728:3;24724:12;24717:19;;24376:366;;;:::o;24748:::-;24890:3;24911:67;24975:2;24970:3;24911:67;:::i;:::-;24904:74;;24987:93;25076:3;24987:93;:::i;:::-;25105:2;25100:3;25096:12;25089:19;;24748:366;;;:::o;25120:::-;25262:3;25283:67;25347:2;25342:3;25283:67;:::i;:::-;25276:74;;25359:93;25448:3;25359:93;:::i;:::-;25477:2;25472:3;25468:12;25461:19;;25120:366;;;:::o;25492:::-;25634:3;25655:67;25719:2;25714:3;25655:67;:::i;:::-;25648:74;;25731:93;25820:3;25731:93;:::i;:::-;25849:2;25844:3;25840:12;25833:19;;25492:366;;;:::o;25864:::-;26006:3;26027:67;26091:2;26086:3;26027:67;:::i;:::-;26020:74;;26103:93;26192:3;26103:93;:::i;:::-;26221:2;26216:3;26212:12;26205:19;;25864:366;;;:::o;26236:::-;26378:3;26399:67;26463:2;26458:3;26399:67;:::i;:::-;26392:74;;26475:93;26564:3;26475:93;:::i;:::-;26593:2;26588:3;26584:12;26577:19;;26236:366;;;:::o;26608:::-;26750:3;26771:67;26835:2;26830:3;26771:67;:::i;:::-;26764:74;;26847:93;26936:3;26847:93;:::i;:::-;26965:2;26960:3;26956:12;26949:19;;26608:366;;;:::o;26980:400::-;27140:3;27161:84;27243:1;27238:3;27161:84;:::i;:::-;27154:91;;27254:93;27343:3;27254:93;:::i;:::-;27372:1;27367:3;27363:11;27356:18;;26980:400;;;:::o;27386:366::-;27528:3;27549:67;27613:2;27608:3;27549:67;:::i;:::-;27542:74;;27625:93;27714:3;27625:93;:::i;:::-;27743:2;27738:3;27734:12;27727:19;;27386:366;;;:::o;27758:::-;27900:3;27921:67;27985:2;27980:3;27921:67;:::i;:::-;27914:74;;27997:93;28086:3;27997:93;:::i;:::-;28115:2;28110:3;28106:12;28099:19;;27758:366;;;:::o;28130:::-;28272:3;28293:67;28357:2;28352:3;28293:67;:::i;:::-;28286:74;;28369:93;28458:3;28369:93;:::i;:::-;28487:2;28482:3;28478:12;28471:19;;28130:366;;;:::o;28502:::-;28644:3;28665:67;28729:2;28724:3;28665:67;:::i;:::-;28658:74;;28741:93;28830:3;28741:93;:::i;:::-;28859:2;28854:3;28850:12;28843:19;;28502:366;;;:::o;28874:108::-;28951:24;28969:5;28951:24;:::i;:::-;28946:3;28939:37;28874:108;;:::o;28988:118::-;29075:24;29093:5;29075:24;:::i;:::-;29070:3;29063:37;28988:118;;:::o;29112:157::-;29217:45;29237:24;29255:5;29237:24;:::i;:::-;29217:45;:::i;:::-;29212:3;29205:58;29112:157;;:::o;29275:112::-;29358:22;29374:5;29358:22;:::i;:::-;29353:3;29346:35;29275:112;;:::o;29393:538::-;29561:3;29576:75;29647:3;29638:6;29576:75;:::i;:::-;29676:2;29671:3;29667:12;29660:19;;29689:75;29760:3;29751:6;29689:75;:::i;:::-;29789:2;29784:3;29780:12;29773:19;;29802:75;29873:3;29864:6;29802:75;:::i;:::-;29902:2;29897:3;29893:12;29886:19;;29922:3;29915:10;;29393:538;;;;;;:::o;29937:397::-;30077:3;30092:75;30163:3;30154:6;30092:75;:::i;:::-;30192:2;30187:3;30183:12;30176:19;;30205:75;30276:3;30267:6;30205:75;:::i;:::-;30305:2;30300:3;30296:12;30289:19;;30325:3;30318:10;;29937:397;;;;;:::o;30340:429::-;30517:3;30539:92;30627:3;30618:6;30539:92;:::i;:::-;30532:99;;30648:95;30739:3;30730:6;30648:95;:::i;:::-;30641:102;;30760:3;30753:10;;30340:429;;;;;:::o;30775:689::-;31050:3;31072:92;31160:3;31151:6;31072:92;:::i;:::-;31065:99;;31181:92;31269:3;31260:6;31181:92;:::i;:::-;31174:99;;31290:148;31434:3;31290:148;:::i;:::-;31283:155;;31455:3;31448:10;;30775:689;;;;;:::o;31470:522::-;31683:3;31705:148;31849:3;31705:148;:::i;:::-;31698:155;;31863:75;31934:3;31925:6;31863:75;:::i;:::-;31963:2;31958:3;31954:12;31947:19;;31983:3;31976:10;;31470:522;;;;:::o;31998:222::-;32091:4;32129:2;32118:9;32114:18;32106:26;;32142:71;32210:1;32199:9;32195:17;32186:6;32142:71;:::i;:::-;31998:222;;;;:::o;32226:640::-;32421:4;32459:3;32448:9;32444:19;32436:27;;32473:71;32541:1;32530:9;32526:17;32517:6;32473:71;:::i;:::-;32554:72;32622:2;32611:9;32607:18;32598:6;32554:72;:::i;:::-;32636;32704:2;32693:9;32689:18;32680:6;32636:72;:::i;:::-;32755:9;32749:4;32745:20;32740:2;32729:9;32725:18;32718:48;32783:76;32854:4;32845:6;32783:76;:::i;:::-;32775:84;;32226:640;;;;;;;:::o;32872:373::-;33015:4;33053:2;33042:9;33038:18;33030:26;;33102:9;33096:4;33092:20;33088:1;33077:9;33073:17;33066:47;33130:108;33233:4;33224:6;33130:108;:::i;:::-;33122:116;;32872:373;;;;:::o;33251:210::-;33338:4;33376:2;33365:9;33361:18;33353:26;;33389:65;33451:1;33440:9;33436:17;33427:6;33389:65;:::i;:::-;33251:210;;;;:::o;33467:545::-;33640:4;33678:3;33667:9;33663:19;33655:27;;33692:71;33760:1;33749:9;33745:17;33736:6;33692:71;:::i;:::-;33773:68;33837:2;33826:9;33822:18;33813:6;33773:68;:::i;:::-;33851:72;33919:2;33908:9;33904:18;33895:6;33851:72;:::i;:::-;33933;34001:2;33990:9;33986:18;33977:6;33933:72;:::i;:::-;33467:545;;;;;;;:::o;34018:313::-;34131:4;34169:2;34158:9;34154:18;34146:26;;34218:9;34212:4;34208:20;34204:1;34193:9;34189:17;34182:47;34246:78;34319:4;34310:6;34246:78;:::i;:::-;34238:86;;34018:313;;;;:::o;34337:419::-;34503:4;34541:2;34530:9;34526:18;34518:26;;34590:9;34584:4;34580:20;34576:1;34565:9;34561:17;34554:47;34618:131;34744:4;34618:131;:::i;:::-;34610:139;;34337:419;;;:::o;34762:::-;34928:4;34966:2;34955:9;34951:18;34943:26;;35015:9;35009:4;35005:20;35001:1;34990:9;34986:17;34979:47;35043:131;35169:4;35043:131;:::i;:::-;35035:139;;34762:419;;;:::o;35187:::-;35353:4;35391:2;35380:9;35376:18;35368:26;;35440:9;35434:4;35430:20;35426:1;35415:9;35411:17;35404:47;35468:131;35594:4;35468:131;:::i;:::-;35460:139;;35187:419;;;:::o;35612:::-;35778:4;35816:2;35805:9;35801:18;35793:26;;35865:9;35859:4;35855:20;35851:1;35840:9;35836:17;35829:47;35893:131;36019:4;35893:131;:::i;:::-;35885:139;;35612:419;;;:::o;36037:::-;36203:4;36241:2;36230:9;36226:18;36218:26;;36290:9;36284:4;36280:20;36276:1;36265:9;36261:17;36254:47;36318:131;36444:4;36318:131;:::i;:::-;36310:139;;36037:419;;;:::o;36462:::-;36628:4;36666:2;36655:9;36651:18;36643:26;;36715:9;36709:4;36705:20;36701:1;36690:9;36686:17;36679:47;36743:131;36869:4;36743:131;:::i;:::-;36735:139;;36462:419;;;:::o;36887:::-;37053:4;37091:2;37080:9;37076:18;37068:26;;37140:9;37134:4;37130:20;37126:1;37115:9;37111:17;37104:47;37168:131;37294:4;37168:131;:::i;:::-;37160:139;;36887:419;;;:::o;37312:::-;37478:4;37516:2;37505:9;37501:18;37493:26;;37565:9;37559:4;37555:20;37551:1;37540:9;37536:17;37529:47;37593:131;37719:4;37593:131;:::i;:::-;37585:139;;37312:419;;;:::o;37737:::-;37903:4;37941:2;37930:9;37926:18;37918:26;;37990:9;37984:4;37980:20;37976:1;37965:9;37961:17;37954:47;38018:131;38144:4;38018:131;:::i;:::-;38010:139;;37737:419;;;:::o;38162:::-;38328:4;38366:2;38355:9;38351:18;38343:26;;38415:9;38409:4;38405:20;38401:1;38390:9;38386:17;38379:47;38443:131;38569:4;38443:131;:::i;:::-;38435:139;;38162:419;;;:::o;38587:::-;38753:4;38791:2;38780:9;38776:18;38768:26;;38840:9;38834:4;38830:20;38826:1;38815:9;38811:17;38804:47;38868:131;38994:4;38868:131;:::i;:::-;38860:139;;38587:419;;;:::o;39012:::-;39178:4;39216:2;39205:9;39201:18;39193:26;;39265:9;39259:4;39255:20;39251:1;39240:9;39236:17;39229:47;39293:131;39419:4;39293:131;:::i;:::-;39285:139;;39012:419;;;:::o;39437:::-;39603:4;39641:2;39630:9;39626:18;39618:26;;39690:9;39684:4;39680:20;39676:1;39665:9;39661:17;39654:47;39718:131;39844:4;39718:131;:::i;:::-;39710:139;;39437:419;;;:::o;39862:::-;40028:4;40066:2;40055:9;40051:18;40043:26;;40115:9;40109:4;40105:20;40101:1;40090:9;40086:17;40079:47;40143:131;40269:4;40143:131;:::i;:::-;40135:139;;39862:419;;;:::o;40287:::-;40453:4;40491:2;40480:9;40476:18;40468:26;;40540:9;40534:4;40530:20;40526:1;40515:9;40511:17;40504:47;40568:131;40694:4;40568:131;:::i;:::-;40560:139;;40287:419;;;:::o;40712:::-;40878:4;40916:2;40905:9;40901:18;40893:26;;40965:9;40959:4;40955:20;40951:1;40940:9;40936:17;40929:47;40993:131;41119:4;40993:131;:::i;:::-;40985:139;;40712:419;;;:::o;41137:::-;41303:4;41341:2;41330:9;41326:18;41318:26;;41390:9;41384:4;41380:20;41376:1;41365:9;41361:17;41354:47;41418:131;41544:4;41418:131;:::i;:::-;41410:139;;41137:419;;;:::o;41562:::-;41728:4;41766:2;41755:9;41751:18;41743:26;;41815:9;41809:4;41805:20;41801:1;41790:9;41786:17;41779:47;41843:131;41969:4;41843:131;:::i;:::-;41835:139;;41562:419;;;:::o;41987:::-;42153:4;42191:2;42180:9;42176:18;42168:26;;42240:9;42234:4;42230:20;42226:1;42215:9;42211:17;42204:47;42268:131;42394:4;42268:131;:::i;:::-;42260:139;;41987:419;;;:::o;42412:::-;42578:4;42616:2;42605:9;42601:18;42593:26;;42665:9;42659:4;42655:20;42651:1;42640:9;42636:17;42629:47;42693:131;42819:4;42693:131;:::i;:::-;42685:139;;42412:419;;;:::o;42837:::-;43003:4;43041:2;43030:9;43026:18;43018:26;;43090:9;43084:4;43080:20;43076:1;43065:9;43061:17;43054:47;43118:131;43244:4;43118:131;:::i;:::-;43110:139;;42837:419;;;:::o;43262:::-;43428:4;43466:2;43455:9;43451:18;43443:26;;43515:9;43509:4;43505:20;43501:1;43490:9;43486:17;43479:47;43543:131;43669:4;43543:131;:::i;:::-;43535:139;;43262:419;;;:::o;43687:::-;43853:4;43891:2;43880:9;43876:18;43868:26;;43940:9;43934:4;43930:20;43926:1;43915:9;43911:17;43904:47;43968:131;44094:4;43968:131;:::i;:::-;43960:139;;43687:419;;;:::o;44112:::-;44278:4;44316:2;44305:9;44301:18;44293:26;;44365:9;44359:4;44355:20;44351:1;44340:9;44336:17;44329:47;44393:131;44519:4;44393:131;:::i;:::-;44385:139;;44112:419;;;:::o;44537:::-;44703:4;44741:2;44730:9;44726:18;44718:26;;44790:9;44784:4;44780:20;44776:1;44765:9;44761:17;44754:47;44818:131;44944:4;44818:131;:::i;:::-;44810:139;;44537:419;;;:::o;44962:::-;45128:4;45166:2;45155:9;45151:18;45143:26;;45215:9;45209:4;45205:20;45201:1;45190:9;45186:17;45179:47;45243:131;45369:4;45243:131;:::i;:::-;45235:139;;44962:419;;;:::o;45387:::-;45553:4;45591:2;45580:9;45576:18;45568:26;;45640:9;45634:4;45630:20;45626:1;45615:9;45611:17;45604:47;45668:131;45794:4;45668:131;:::i;:::-;45660:139;;45387:419;;;:::o;45812:::-;45978:4;46016:2;46005:9;46001:18;45993:26;;46065:9;46059:4;46055:20;46051:1;46040:9;46036:17;46029:47;46093:131;46219:4;46093:131;:::i;:::-;46085:139;;45812:419;;;:::o;46237:::-;46403:4;46441:2;46430:9;46426:18;46418:26;;46490:9;46484:4;46480:20;46476:1;46465:9;46461:17;46454:47;46518:131;46644:4;46518:131;:::i;:::-;46510:139;;46237:419;;;:::o;46662:::-;46828:4;46866:2;46855:9;46851:18;46843:26;;46915:9;46909:4;46905:20;46901:1;46890:9;46886:17;46879:47;46943:131;47069:4;46943:131;:::i;:::-;46935:139;;46662:419;;;:::o;47087:::-;47253:4;47291:2;47280:9;47276:18;47268:26;;47340:9;47334:4;47330:20;47326:1;47315:9;47311:17;47304:47;47368:131;47494:4;47368:131;:::i;:::-;47360:139;;47087:419;;;:::o;47512:::-;47678:4;47716:2;47705:9;47701:18;47693:26;;47765:9;47759:4;47755:20;47751:1;47740:9;47736:17;47729:47;47793:131;47919:4;47793:131;:::i;:::-;47785:139;;47512:419;;;:::o;47937:222::-;48030:4;48068:2;48057:9;48053:18;48045:26;;48081:71;48149:1;48138:9;48134:17;48125:6;48081:71;:::i;:::-;47937:222;;;;:::o;48165:129::-;48199:6;48226:20;;:::i;:::-;48216:30;;48255:33;48283:4;48275:6;48255:33;:::i;:::-;48165:129;;;:::o;48300:75::-;48333:6;48366:2;48360:9;48350:19;;48300:75;:::o;48381:311::-;48458:4;48548:18;48540:6;48537:30;48534:56;;;48570:18;;:::i;:::-;48534:56;48620:4;48612:6;48608:17;48600:25;;48680:4;48674;48670:15;48662:23;;48381:311;;;:::o;48698:::-;48775:4;48865:18;48857:6;48854:30;48851:56;;;48887:18;;:::i;:::-;48851:56;48937:4;48929:6;48925:17;48917:25;;48997:4;48991;48987:15;48979:23;;48698:311;;;:::o;49015:307::-;49076:4;49166:18;49158:6;49155:30;49152:56;;;49188:18;;:::i;:::-;49152:56;49226:29;49248:6;49226:29;:::i;:::-;49218:37;;49310:4;49304;49300:15;49292:23;;49015:307;;;:::o;49328:308::-;49390:4;49480:18;49472:6;49469:30;49466:56;;;49502:18;;:::i;:::-;49466:56;49540:29;49562:6;49540:29;:::i;:::-;49532:37;;49624:4;49618;49614:15;49606:23;;49328:308;;;:::o;49642:132::-;49709:4;49732:3;49724:11;;49762:4;49757:3;49753:14;49745:22;;49642:132;;;:::o;49780:141::-;49829:4;49852:3;49844:11;;49875:3;49872:1;49865:14;49909:4;49906:1;49896:18;49888:26;;49780:141;;;:::o;49927:114::-;49994:6;50028:5;50022:12;50012:22;;49927:114;;;:::o;50047:98::-;50098:6;50132:5;50126:12;50116:22;;50047:98;;;:::o;50151:99::-;50203:6;50237:5;50231:12;50221:22;;50151:99;;;:::o;50256:113::-;50326:4;50358;50353:3;50349:14;50341:22;;50256:113;;;:::o;50375:184::-;50474:11;50508:6;50503:3;50496:19;50548:4;50543:3;50539:14;50524:29;;50375:184;;;;:::o;50565:168::-;50648:11;50682:6;50677:3;50670:19;50722:4;50717:3;50713:14;50698:29;;50565:168;;;;:::o;50739:169::-;50823:11;50857:6;50852:3;50845:19;50897:4;50892:3;50888:14;50873:29;;50739:169;;;;:::o;50914:148::-;51016:11;51053:3;51038:18;;50914:148;;;;:::o;51068:273::-;51108:3;51127:20;51145:1;51127:20;:::i;:::-;51122:25;;51161:20;51179:1;51161:20;:::i;:::-;51156:25;;51283:1;51247:34;51243:42;51240:1;51237:49;51234:75;;;51289:18;;:::i;:::-;51234:75;51333:1;51330;51326:9;51319:16;;51068:273;;;;:::o;51347:305::-;51387:3;51406:20;51424:1;51406:20;:::i;:::-;51401:25;;51440:20;51458:1;51440:20;:::i;:::-;51435:25;;51594:1;51526:66;51522:74;51519:1;51516:81;51513:107;;;51600:18;;:::i;:::-;51513:107;51644:1;51641;51637:9;51630:16;;51347:305;;;;:::o;51658:185::-;51698:1;51715:20;51733:1;51715:20;:::i;:::-;51710:25;;51749:20;51767:1;51749:20;:::i;:::-;51744:25;;51788:1;51778:35;;51793:18;;:::i;:::-;51778:35;51835:1;51832;51828:9;51823:14;;51658:185;;;;:::o;51849:348::-;51889:7;51912:20;51930:1;51912:20;:::i;:::-;51907:25;;51946:20;51964:1;51946:20;:::i;:::-;51941:25;;52134:1;52066:66;52062:74;52059:1;52056:81;52051:1;52044:9;52037:17;52033:105;52030:131;;;52141:18;;:::i;:::-;52030:131;52189:1;52186;52182:9;52171:20;;51849:348;;;;:::o;52203:191::-;52243:4;52263:20;52281:1;52263:20;:::i;:::-;52258:25;;52297:20;52315:1;52297:20;:::i;:::-;52292:25;;52336:1;52333;52330:8;52327:34;;;52341:18;;:::i;:::-;52327:34;52386:1;52383;52379:9;52371:17;;52203:191;;;;:::o;52400:::-;52440:4;52460:20;52478:1;52460:20;:::i;:::-;52455:25;;52494:20;52512:1;52494:20;:::i;:::-;52489:25;;52533:1;52530;52527:8;52524:34;;;52538:18;;:::i;:::-;52524:34;52583:1;52580;52576:9;52568:17;;52400:191;;;;:::o;52597:96::-;52634:7;52663:24;52681:5;52663:24;:::i;:::-;52652:35;;52597:96;;;:::o;52699:90::-;52733:7;52776:5;52769:13;52762:21;52751:32;;52699:90;;;:::o;52795:77::-;52832:7;52861:5;52850:16;;52795:77;;;:::o;52878:149::-;52914:7;52954:66;52947:5;52943:78;52932:89;;52878:149;;;:::o;53033:118::-;53070:7;53110:34;53103:5;53099:46;53088:57;;53033:118;;;:::o;53157:126::-;53194:7;53234:42;53227:5;53223:54;53212:65;;53157:126;;;:::o;53289:77::-;53326:7;53355:5;53344:16;;53289:77;;;:::o;53372:86::-;53407:7;53447:4;53440:5;53436:16;53425:27;;53372:86;;;:::o;53464:154::-;53548:6;53543:3;53538;53525:30;53610:1;53601:6;53596:3;53592:16;53585:27;53464:154;;;:::o;53624:307::-;53692:1;53702:113;53716:6;53713:1;53710:13;53702:113;;;53801:1;53796:3;53792:11;53786:18;53782:1;53777:3;53773:11;53766:39;53738:2;53735:1;53731:10;53726:15;;53702:113;;;53833:6;53830:1;53827:13;53824:101;;;53913:1;53904:6;53899:3;53895:16;53888:27;53824:101;53673:258;53624:307;;;:::o;53937:171::-;53976:3;53999:24;54017:5;53999:24;:::i;:::-;53990:33;;54045:4;54038:5;54035:15;54032:41;;;54053:18;;:::i;:::-;54032:41;54100:1;54093:5;54089:13;54082:20;;53937:171;;;:::o;54114:320::-;54158:6;54195:1;54189:4;54185:12;54175:22;;54242:1;54236:4;54232:12;54263:18;54253:81;;54319:4;54311:6;54307:17;54297:27;;54253:81;54381:2;54373:6;54370:14;54350:18;54347:38;54344:84;;;54400:18;;:::i;:::-;54344:84;54165:269;54114:320;;;:::o;54440:281::-;54523:27;54545:4;54523:27;:::i;:::-;54515:6;54511:40;54653:6;54641:10;54638:22;54617:18;54605:10;54602:34;54599:62;54596:88;;;54664:18;;:::i;:::-;54596:88;54704:10;54700:2;54693:22;54483:238;54440:281;;:::o;54727:233::-;54766:3;54789:24;54807:5;54789:24;:::i;:::-;54780:33;;54835:66;54828:5;54825:77;54822:103;;;54905:18;;:::i;:::-;54822:103;54952:1;54945:5;54941:13;54934:20;;54727:233;;;:::o;54966:100::-;55005:7;55034:26;55054:5;55034:26;:::i;:::-;55023:37;;54966:100;;;:::o;55072:79::-;55111:7;55140:5;55129:16;;55072:79;;;:::o;55157:94::-;55196:7;55225:20;55239:5;55225:20;:::i;:::-;55214:31;;55157:94;;;:::o;55257:79::-;55296:7;55325:5;55314:16;;55257:79;;;:::o;55342:176::-;55374:1;55391:20;55409:1;55391:20;:::i;:::-;55386:25;;55425:20;55443:1;55425:20;:::i;:::-;55420:25;;55464:1;55454:35;;55469:18;;:::i;:::-;55454:35;55510:1;55507;55503:9;55498:14;;55342:176;;;;:::o;55524:180::-;55572:77;55569:1;55562:88;55669:4;55666:1;55659:15;55693:4;55690:1;55683:15;55710:180;55758:77;55755:1;55748:88;55855:4;55852:1;55845:15;55879:4;55876:1;55869:15;55896:180;55944:77;55941:1;55934:88;56041:4;56038:1;56031:15;56065:4;56062:1;56055:15;56082:180;56130:77;56127:1;56120:88;56227:4;56224:1;56217:15;56251:4;56248:1;56241:15;56268:180;56316:77;56313:1;56306:88;56413:4;56410:1;56403:15;56437:4;56434:1;56427:15;56454:180;56502:77;56499:1;56492:88;56599:4;56596:1;56589:15;56623:4;56620:1;56613:15;56640:117;56749:1;56746;56739:12;56763:117;56872:1;56869;56862:12;56886:117;56995:1;56992;56985:12;57009:117;57118:1;57115;57108:12;57132:117;57241:1;57238;57231:12;57255:102;57296:6;57347:2;57343:7;57338:2;57331:5;57327:14;57323:28;57313:38;;57255:102;;;:::o;57363:94::-;57396:8;57444:5;57440:2;57436:14;57415:35;;57363:94;;;:::o;57463:174::-;57603:26;57599:1;57591:6;57587:14;57580:50;57463:174;:::o;57643:221::-;57783:34;57779:1;57771:6;57767:14;57760:58;57852:4;57847:2;57839:6;57835:15;57828:29;57643:221;:::o;57870:182::-;58010:34;58006:1;57998:6;57994:14;57987:58;57870:182;:::o;58058:181::-;58198:33;58194:1;58186:6;58182:14;58175:57;58058:181;:::o;58245:214::-;58385:66;58381:1;58373:6;58369:14;58362:90;58245:214;:::o;58465:171::-;58605:23;58601:1;58593:6;58589:14;58582:47;58465:171;:::o;58642:225::-;58782:34;58778:1;58770:6;58766:14;58759:58;58851:8;58846:2;58838:6;58834:15;58827:33;58642:225;:::o;58873:229::-;59013:34;59009:1;59001:6;58997:14;58990:58;59082:12;59077:2;59069:6;59065:15;59058:37;58873:229;:::o;59108:222::-;59248:34;59244:1;59236:6;59232:14;59225:58;59317:5;59312:2;59304:6;59300:15;59293:30;59108:222;:::o;59336:224::-;59476:34;59472:1;59464:6;59460:14;59453:58;59545:7;59540:2;59532:6;59528:15;59521:32;59336:224;:::o;59566:178::-;59706:30;59702:1;59694:6;59690:14;59683:54;59566:178;:::o;59750:221::-;59890:34;59886:1;59878:6;59874:14;59867:58;59959:4;59954:2;59946:6;59942:15;59935:29;59750:221;:::o;59977:177::-;60117:29;60113:1;60105:6;60101:14;60094:53;59977:177;:::o;60160:244::-;60300:34;60296:1;60288:6;60284:14;60277:58;60369:27;60364:2;60356:6;60352:15;60345:52;60160:244;:::o;60410:172::-;60550:24;60546:1;60538:6;60534:14;60527:48;60410:172;:::o;60588:230::-;60728:34;60724:1;60716:6;60712:14;60705:58;60797:13;60792:2;60784:6;60780:15;60773:38;60588:230;:::o;60824:221::-;60964:34;60960:1;60952:6;60948:14;60941:58;61033:4;61028:2;61020:6;61016:15;61009:29;60824:221;:::o;61051:225::-;61191:34;61187:1;61179:6;61175:14;61168:58;61260:8;61255:2;61247:6;61243:15;61236:33;61051:225;:::o;61282:182::-;61422:34;61418:1;61410:6;61406:14;61399:58;61282:182;:::o;61470:176::-;61610:28;61606:1;61598:6;61594:14;61587:52;61470:176;:::o;61652:234::-;61792:34;61788:1;61780:6;61776:14;61769:58;61861:17;61856:2;61848:6;61844:15;61837:42;61652:234;:::o;61892:176::-;62032:28;62028:1;62020:6;62016:14;62009:52;61892:176;:::o;62074:237::-;62214:34;62210:1;62202:6;62198:14;62191:58;62283:20;62278:2;62270:6;62266:15;62259:45;62074:237;:::o;62317:171::-;62457:23;62453:1;62445:6;62441:14;62434:47;62317:171;:::o;62494:182::-;62634:34;62630:1;62622:6;62618:14;62611:58;62494:182;:::o;62682:221::-;62822:34;62818:1;62810:6;62806:14;62799:58;62891:4;62886:2;62878:6;62874:15;62867:29;62682:221;:::o;62909:238::-;63049:34;63045:1;63037:6;63033:14;63026:58;63118:21;63113:2;63105:6;63101:15;63094:46;62909:238;:::o;63153:179::-;63293:31;63289:1;63281:6;63277:14;63270:55;63153:179;:::o;63338:220::-;63478:34;63474:1;63466:6;63462:14;63455:58;63547:3;63542:2;63534:6;63530:15;63523:28;63338:220;:::o;63564:155::-;63704:7;63700:1;63692:6;63688:14;63681:31;63564:155;:::o;63725:233::-;63865:34;63861:1;63853:6;63849:14;63842:58;63934:16;63929:2;63921:6;63917:15;63910:41;63725:233;:::o;63964:234::-;64104:34;64100:1;64092:6;64088:14;64081:58;64173:17;64168:2;64160:6;64156:15;64149:42;63964:234;:::o;64204:232::-;64344:34;64340:1;64332:6;64328:14;64321:58;64413:15;64408:2;64400:6;64396:15;64389:40;64204:232;:::o;64442:221::-;64582:34;64578:1;64570:6;64566:14;64559:58;64651:4;64646:2;64638:6;64634:15;64627:29;64442:221;:::o;64669:122::-;64742:24;64760:5;64742:24;:::i;:::-;64735:5;64732:35;64722:63;;64781:1;64778;64771:12;64722:63;64669:122;:::o;64797:116::-;64867:21;64882:5;64867:21;:::i;:::-;64860:5;64857:32;64847:60;;64903:1;64900;64893:12;64847:60;64797:116;:::o;64919:120::-;64991:23;65008:5;64991:23;:::i;:::-;64984:5;64981:34;64971:62;;65029:1;65026;65019:12;64971:62;64919:120;:::o;65045:122::-;65118:24;65136:5;65118:24;:::i;:::-;65111:5;65108:35;65098:63;;65157:1;65154;65147:12;65098:63;65045:122;:::o

Swarm Source

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