ETH Price: $3,643.34 (+9.65%)

Token

Gummy Invasions (GUMMY)
 

Overview

Max Total Supply

777 GUMMY

Holders

277

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
7 GUMMY
0xA2085E0eb73fA194743027C0f943c11044dCc308
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:
GummyInvasions

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 4 of 10: Gummy.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.16;

import "./ReentrancyGuard.sol";
import "./MerkleProof.sol";
import "./Strings.sol";
import "./Delegated.sol";
import "./ERC721A.sol";



contract GummyInvasions is Delegated, ReentrancyGuard, ERC721A {

  using Strings for uint256;
  uint256 public immutable maxSupply = 777;
  uint256 public personalCap = 3;
  uint256 public teamAllocation = 22;
  bool public teamClaimed = false;
  string public baseURI;
  string public uriSuffix = ".json";


  bool public isPresaleActive;
  bool public isPublicSaleActive;
  bytes32 public merkleRoot;

  uint256 public mintPrice = 444000000000000000;
  uint256 public whitelistSold;
  address public registry = 0x53Fc2d449Ca9A5eA311081C545D5Bb7BB0b802D8;
  

  mapping(address => uint256) public whitelistAccountAmounts;
  event BaseURI(string baseUri);


  constructor()
    Delegated()
    ERC721A("Gummy Invasions", "GUMMY") {
  }


  function setBaseURI(string calldata _baseUri) external onlyOwner onlyDelegates {
    baseURI = _baseUri;
    emit BaseURI(_baseUri);
  }


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

  function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) {
        require(_exists(_tokenId), "Token doesn't exist");
        return string(abi.encodePacked(baseURI, _tokenId.toString(), uriSuffix));
  }


  function setMerkleRoot(bytes32 root) external onlyOwner {
    merkleRoot = root;
  } 


  function setPersonalCap(uint256 _personalCap) public onlyOwner onlyDelegates {
    personalCap = _personalCap;
  }


  function setMintPrice(uint256 _mintPrice) external onlyOwner onlyDelegates {
    mintPrice = _mintPrice;
  }


  function setSaleConfig( bool presaleState, bool publicState ) external onlyOwner onlyDelegates{
    isPresaleActive = presaleState;
    isPublicSaleActive = publicState;
  }


  function isWhitelisted(
    address account,
    bytes32[] memory proof,
    uint256 alloc
  ) public view returns (bool) {
    return
      MerkleProof.verify(
        proof,
        merkleRoot,
        keccak256(abi.encodePacked(keccak256(abi.encodePacked(account, alloc))))
      );
  }



 function mint(bytes32[] memory proof, uint256 alloc, uint256 qty) external payable nonReentrant {
    require(_numberMinted(_msgSender()) + qty <= personalCap, "too many mints");
    require(totalSupply() + qty <= maxSupply, "max supply");
    require(msg.value == qty * mintPrice, "wrong amount");

    if (isPublicSaleActive) {
        require(isPublicSaleActive, "public auction not started yet");
    }
    else if (isPresaleActive) {
      require(isWhitelisted(_msgSender(), proof, alloc), "not whitelisted");
      require(whitelistAccountAmounts[_msgSender()] + qty <= alloc, "Auction is over, all tokens claimed");
      whitelistSold += qty;
      whitelistAccountAmounts[_msgSender()] += qty;
    }
    else{
      revert( "auction not active" );
    }
      _safeMint(_msgSender(), qty);
  }


  function crossmint(address _to, uint256 qty) public payable nonReentrant {
    require(isPublicSaleActive, "public auction not started yet");
    require(msg.value == qty * mintPrice, "wrong amount");
    require(_numberMinted(_msgSender()) + qty <= personalCap, "too many mints");
    require(totalSupply() + qty <= maxSupply, "max supply");
    require(msg.sender == 0xdAb1a1854214684acE522439684a145E62505233,
      "This function is for Crossmint only."
    );
    _safeMint(_to, qty);
  }


  function setFailSafeRegistry(address _registry) external onlyOwner onlyDelegates {
    registry = _registry;
  }


  function withdraw() external onlyOwner onlyDelegates {
    (bool success, ) = payable(registry).call{value: address(this).balance}("");
    require(success, "transfer failed");
  }


  function airdrop(uint256[] calldata qty, address[] calldata recipients) external payable onlyDelegates{
    require(qty.length == recipients.length, "arguments must have equal counts"); 
    uint256 total = 0;
    for( uint256 i = 0; i < qty.length; ++i ){
      total += qty[i];
    }
    require(totalSupply() + total <= maxSupply, "max supply");
    for( uint256 i = 0; i < qty.length; ++i ){
      _safeMint(recipients[i], qty[i]);

    }
  }


  function airdropTeam() external onlyOwner onlyDelegates{
    require( !teamClaimed, "already claimed" );
    teamClaimed = true;
    _safeMint(msg.sender, teamAllocation);
  }



  /// @notice In the event that our community's tokens are compromised,

  ///   owner has the ability to "rescue" lost tokens and return them

  ///   to the rightful owner

  ///   Before rescue, the user should revoke approval from the bad actor

  /// @param tokenId the token that needs to be rescued

  /// @param recipient where to deliver the rescued token

  function rescue( uint256 tokenId, address recipient ) external onlyOwner{
    _tokenApprovals[tokenId] = TokenApprovalRef(owner());
    address from = ownerOf( tokenId );
    transferFrom( from, recipient, tokenId );

  }

}



/**

▓█████▄  ██▀███      ██▓███   ▄▄▄       █     █░███▄    █ 
▒██▀ ██▌▓██ ▒ ██▒   ▓██░  ██▒▒████▄    ▓█░ █ ░█░██ ▀█   █ 
░██   █▌▓██ ░▄█ ▒   ▓██░ ██▓▒▒██  ▀█▄  ▒█░ █ ░█▓██  ▀█ ██▒
░▓█▄   ▌▒██▀▀█▄     ▒██▄█▓▒ ▒░██▄▄▄▄██ ░█░ █ ░█▓██▒  ▐▌██▒
░▒████▓ ░██▓ ▒██▒   ▒██▒ ░  ░ ▓█   ▓██▒░░██▒██▓▒██░   ▓██░
 ▒▒▓  ▒ ░ ▒▓ ░▒▓░   ▒▓▒░ ░  ░ ▒▒   ▓▒█░░ ▓░▒ ▒ ░ ▒░   ▒ ▒ 
 ░ ▒  ▒   ░▒ ░ ▒░   ░▒ ░       ▒   ▒▒ ░  ▒ ░ ░ ░ ░░   ░ ▒░
 ░ ░  ░   ░░   ░    ░░         ░   ▒     ░   ░    ░   ░ ░ 
   ░       ░                       ░  ░    ░            ░ 
 ░                                                        
**/

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

pragma solidity ^0.8.0;

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

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

File 2 of 10: Delegated.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.16;

import "./Ownable.sol";

contract Delegated is Ownable{
  mapping(address => bool) internal _delegates;

  modifier onlyDelegates {
    require(_delegates[msg.sender], "Invalid delegate" );
    _;
  }

  constructor()
    Ownable(){
    setDelegate( owner(), true );
  }

  //onlyOwner
  function isDelegate( address addr ) external view onlyOwner returns( bool ){
    return _delegates[addr];
  }

  function setDelegate( address addr, bool isDelegate_ ) public onlyOwner{
    _delegates[addr] = isDelegate_;
  }

  function transferOwnership(address newOwner) public virtual override onlyOwner {
    _delegates[newOwner] = true;
    super.transferOwnership( newOwner );
  }
}

File 3 of 10: ERC721A.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.1.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

import './IERC721A.sol';

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

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard,
 * including the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at `_startTokenId()`
 * (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // Reference type for token approval.
    struct TokenApprovalRef {
        address value;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

    // The tokenId of the next token to be minted.
    uint256 private _currentIndex;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        // The interface IDs are constants representing the first 4 bytes of the XOR of
        // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165
        // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & BITMASK_ADDRESS_DATA_ENTRY;
    }

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

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

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

    /**
     * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal virtual {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        // Cast `aux` with assembly to avoid redundant masking.
        assembly {
            auxCasted := aux
        }
        packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

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

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & BITMASK_BURNED == 0) {
                        // Invariant:
                        // There will always be an ownership that has an address and is not burned
                        // before an ownership that does not have an address and is not burned.
                        // Hence, curr will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed is zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

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

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

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

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

    /**
     * @dev Packs ownership data into a single uint256.
     */
    function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, BITMASK_ADDRESS)
            // `owner | (block.timestamp << BITPOS_START_TIMESTAMP) | flags`.
            result := or(owner, or(shl(BITPOS_START_TIMESTAMP, timestamp()), flags))
        }
    }

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

    /**
     * @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) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

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

    /**
     * @dev Returns the `nextInitialized` flag set if `quantity` equals 1.
     */
    function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) {
        // For branchless setting of the `nextInitialized` flag.
        assembly {
            // `(quantity == 1) << BITPOS_NEXT_INITIALIZED`.
            result := shl(BITPOS_NEXT_INITIALIZED, eq(quantity, 1))
        }
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ownerOf(tokenId);

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

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

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId].value;
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        if (operator == _msgSenderERC721A()) revert ApproveToCaller();

        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), 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-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

    /**
     * @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 virtual returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned.
    }

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

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement
     *   {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * See {_mint}.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal virtual {
        _mint(to, quantity);

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

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

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

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

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

            uint256 tokenId = startTokenId;
            uint256 end = startTokenId + quantity;
            do {
                emit Transfer(address(0), to, tokenId++);
            } while (tokenId < end);

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

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

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

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

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

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

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

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

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

    /**
     * @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 transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

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

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

        address from = address(uint160(prevOwnershipPacked));

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

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

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

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

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

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

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

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

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
            bytes4 retval
        ) {
            return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

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

    /**
     * @dev Returns the next extra data for the packed ownership data.
     * The returned result is shifted into position.
     */
    function _nextExtraData(
        address from,
        address to,
        uint256 prevOwnershipPacked
    ) private view returns (uint256) {
        uint24 extraData = uint24(prevOwnershipPacked >> BITPOS_EXTRA_DATA);
        return uint256(_extraData(from, to, extraData)) << BITPOS_EXTRA_DATA;
    }

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

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

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

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

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function _toString(uint256 value) internal pure virtual returns (string memory ptr) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit),
            // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged.
            // We will need 1 32-byte word to store the length,
            // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128.
            ptr := add(mload(0x40), 128)
            // Update the free memory pointer to allocate.
            mstore(0x40, ptr)

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

            // We write the string from the rightmost digit to the leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // Costs a bit more than early returning for the zero case,
            // but cheaper in terms of deployment and overall runtime costs.
            for {
                // Initialize and perform the first pass without check.
                let temp := value
                // Move the pointer 1 byte leftwards to point to an empty character slot.
                ptr := sub(ptr, 1)
                // Write the character to the pointer. 48 is the ASCII index of '0'.
                mstore8(ptr, add(48, mod(temp, 10)))
                temp := div(temp, 10)
            } temp {
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
            } {
                // Body of the for loop.
                ptr := sub(ptr, 1)
                mstore8(ptr, add(48, mod(temp, 10)))
            }

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

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

pragma solidity ^0.8.4;

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

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

    /**
     * The caller cannot approve to their own address.
     */
    error ApproveToCaller();

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     *
     * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens.
     */
    function totalSupply() external view returns (uint256);

    // ==============================
    //            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);

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

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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * 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 be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) 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);

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

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

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

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

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

    /**
     * @dev Emitted when tokens in `fromTokenId` to `toTokenId` (inclusive) is transferred from `from` to `to`,
     * as defined in the ERC2309 standard. See `_mintERC2309` for more details.
     */
    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}

File 6 of 10: Math.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/Math.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
     * with further edits by Uniswap Labs also under MIT license.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1);

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
            // in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator,
        Rounding rounding
    ) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10**64) {
                value /= 10**64;
                result += 64;
            }
            if (value >= 10**32) {
                value /= 10**32;
                result += 32;
            }
            if (value >= 10**16) {
                value /= 10**16;
                result += 16;
            }
            if (value >= 10**8) {
                value /= 10**8;
                result += 8;
            }
            if (value >= 10**4) {
                value /= 10**4;
                result += 4;
            }
            if (value >= 10**2) {
                value /= 10**2;
                result += 2;
            }
            if (value >= 10**1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);
        }
    }
}

File 7 of 10: MerkleProof.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Tree proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

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

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

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

    /**
     * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`,
     * consuming from one or the other at each step according to the instructions given by
     * `proofFlags`.
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

import "./Context.sol";

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

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

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

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

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

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

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

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

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

File 9 of 10: 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() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // 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;
    }

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

File 10 of 10: Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

import "./Math.sol";

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _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) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.log256(value) + 1);
        }
    }

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"baseUri","type":"string"}],"name":"BaseURI","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256[]","name":"qty","type":"uint256[]"},{"internalType":"address[]","name":"recipients","type":"address[]"}],"name":"airdrop","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"airdropTeam","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"crossmint","outputs":[],"stateMutability":"payable","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":"address","name":"addr","type":"address"}],"name":"isDelegate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPresaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"uint256","name":"alloc","type":"uint256"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"uint256","name":"alloc","type":"uint256"},{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","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":"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":"personalCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"registry","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"rescue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseUri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"isDelegate_","type":"bool"}],"name":"setDelegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_registry","type":"address"}],"name":"setFailSafeRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_personalCap","type":"uint256"}],"name":"setPersonalCap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"presaleState","type":"bool"},{"internalType":"bool","name":"publicState","type":"bool"}],"name":"setSaleConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamAllocation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistAccountAmounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistSold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a06040526103096080908152506003600b556016600c556000600d60006101000a81548160ff0219169083151502179055506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600f908162000078919062000654565b5067062967a5c84600006012557353fc2d449ca9a5ea311081c545d5bb7bb0b802d8601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000e757600080fd5b506040518060400160405280600f81526020017f47756d6d7920496e766173696f6e7300000000000000000000000000000000008152506040518060400160405280600581526020017f47554d4d590000000000000000000000000000000000000000000000000000008152506200017462000168620001e060201b60201c565b620001e860201b60201c565b6200019662000188620002ac60201b60201c565b6001620002d560201b60201c565b60016002819055508160059081620001af919062000654565b508060069081620001c1919062000654565b50620001d26200034060201b60201c565b6003819055505050620007be565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b620002e56200034960201b60201c565b80600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60006001905090565b62000359620001e060201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200037f620002ac60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620003d8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003cf906200079c565b60405180910390fd5b565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200045c57607f821691505b60208210810362000472576200047162000414565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620004dc7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200049d565b620004e886836200049d565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620005356200052f620005298462000500565b6200050a565b62000500565b9050919050565b6000819050919050565b620005518362000514565b6200056962000560826200053c565b848454620004aa565b825550505050565b600090565b6200058062000571565b6200058d81848462000546565b505050565b5b81811015620005b557620005a960008262000576565b60018101905062000593565b5050565b601f8211156200060457620005ce8162000478565b620005d9846200048d565b81016020851015620005e9578190505b62000601620005f8856200048d565b83018262000592565b50505b505050565b600082821c905092915050565b6000620006296000198460080262000609565b1980831691505092915050565b600062000644838362000616565b9150826002028217905092915050565b6200065f82620003da565b67ffffffffffffffff8111156200067b576200067a620003e5565b5b62000687825462000443565b62000694828285620005b9565b600060209050601f831160018114620006cc5760008415620006b7578287015190505b620006c3858262000636565b86555062000733565b601f198416620006dc8662000478565b60005b828110156200070657848901518255600182019150602085019450602081019050620006df565b8683101562000726578489015162000722601f89168262000616565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000620007846020836200073b565b915062000791826200074c565b602082019050919050565b60006020820190508181036000830152620007b78162000775565b9050919050565b608051614b44620007ef60003960008181610dd10152818161189001528181611ade015261235c0152614b446000f3fe6080604052600436106102725760003560e01c80636c0360eb1161014f578063a923625c116100c1578063e78b9d0b1161007a578063e78b9d0b14610929578063e985e9c514610954578063f2fde38b14610991578063f4a0a528146109ba578063f760f228146109e3578063ff45f00f14610a0c57610272565b8063a923625c1461081b578063b88d4fde14610844578063bfb396971461086d578063c7c2aee314610896578063c87b56dd146108c1578063d5abeb01146108fe57610272565b806385a8c9371161011357806385a8c937146106f95780638da5cb5b1461073657806391d6fc281461076157806395d89b411461078a578063a22cb465146107b5578063a371a062146107de57610272565b80636c0360eb1461062657806370a0823114610651578063715018a61461068e5780637b103999146106a55780637cb64759146106d057610272565b80633ccfd60b116101e857806358891a37116101ac57806358891a371461053057806360d938dc1461054c5780636352211e146105775780636673c4c2146105b45780636816521a146105d05780636817c76c146105fb57610272565b80633ccfd60b1461047357806342842e0e1461048a5780634a994eef146104b35780635503a0e8146104dc57806355f804b31461050757610272565b806314bf9af61161023a57806314bf9af61461038257806318160ddd1461039e5780631e84c413146103c957806323b872dd146103f45780632eb4a7ab1461041d5780632f3346521461044857610272565b806301ffc9a71461027757806306fdde03146102b457806307779627146102df578063081812fc1461031c578063095ea7b314610359575b600080fd5b34801561028357600080fd5b5061029e60048036038101906102999190613281565b610a23565b6040516102ab91906132c9565b60405180910390f35b3480156102c057600080fd5b506102c9610ab5565b6040516102d69190613374565b60405180910390f35b3480156102eb57600080fd5b50610306600480360381019061030191906133f4565b610b47565b60405161031391906132c9565b60405180910390f35b34801561032857600080fd5b50610343600480360381019061033e9190613457565b610ba5565b6040516103509190613493565b60405180910390f35b34801561036557600080fd5b50610380600480360381019061037b91906134ae565b610c24565b005b61039c6004803603810190610397919061366c565b610d68565b005b3480156103aa57600080fd5b506103b36110cb565b6040516103c091906136ea565b60405180910390f35b3480156103d557600080fd5b506103de6110e2565b6040516103eb91906132c9565b60405180910390f35b34801561040057600080fd5b5061041b60048036038101906104169190613705565b6110f5565b005b34801561042957600080fd5b50610432611417565b60405161043f9190613767565b60405180910390f35b34801561045457600080fd5b5061045d61141d565b60405161046a91906132c9565b60405180910390f35b34801561047f57600080fd5b50610488611430565b005b34801561049657600080fd5b506104b160048036038101906104ac9190613705565b611595565b005b3480156104bf57600080fd5b506104da60048036038101906104d591906137ae565b6115b5565b005b3480156104e857600080fd5b506104f1611618565b6040516104fe9190613374565b60405180910390f35b34801561051357600080fd5b5061052e60048036038101906105299190613849565b6116a6565b005b61054a600480360381019061054591906134ae565b611789565b005b34801561055857600080fd5b5061056161199b565b60405161056e91906132c9565b60405180910390f35b34801561058357600080fd5b5061059e60048036038101906105999190613457565b6119ae565b6040516105ab9190613493565b60405180910390f35b6105ce60048036038101906105c99190613942565b6119c0565b005b3480156105dc57600080fd5b506105e5611bc2565b6040516105f291906136ea565b60405180910390f35b34801561060757600080fd5b50610610611bc8565b60405161061d91906136ea565b60405180910390f35b34801561063257600080fd5b5061063b611bce565b6040516106489190613374565b60405180910390f35b34801561065d57600080fd5b50610678600480360381019061067391906133f4565b611c5c565b60405161068591906136ea565b60405180910390f35b34801561069a57600080fd5b506106a3611d14565b005b3480156106b157600080fd5b506106ba611d28565b6040516106c79190613493565b60405180910390f35b3480156106dc57600080fd5b506106f760048036038101906106f291906139c3565b611d4e565b005b34801561070557600080fd5b50610720600480360381019061071b91906133f4565b611d60565b60405161072d91906136ea565b60405180910390f35b34801561074257600080fd5b5061074b611d78565b6040516107589190613493565b60405180910390f35b34801561076d57600080fd5b50610788600480360381019061078391906133f4565b611da1565b005b34801561079657600080fd5b5061079f611e79565b6040516107ac9190613374565b60405180910390f35b3480156107c157600080fd5b506107dc60048036038101906107d791906137ae565b611f0b565b005b3480156107ea57600080fd5b50610805600480360381019061080091906139f0565b612082565b60405161081291906132c9565b60405180910390f35b34801561082757600080fd5b50610842600480360381019061083d9190613a5f565b6120e8565b005b34801561085057600080fd5b5061086b60048036038101906108669190613b54565b612196565b005b34801561087957600080fd5b50610894600480360381019061088f9190613bd7565b612209565b005b3480156108a257600080fd5b506108ab6122d5565b6040516108b891906136ea565b60405180910390f35b3480156108cd57600080fd5b506108e860048036038101906108e39190613457565b6122db565b6040516108f59190613374565b60405180910390f35b34801561090a57600080fd5b5061091361235a565b60405161092091906136ea565b60405180910390f35b34801561093557600080fd5b5061093e61237e565b60405161094b91906136ea565b60405180910390f35b34801561096057600080fd5b5061097b60048036038101906109769190613c17565b612384565b60405161098891906132c9565b60405180910390f35b34801561099d57600080fd5b506109b860048036038101906109b391906133f4565b612418565b005b3480156109c657600080fd5b506109e160048036038101906109dc9190613457565b612483565b005b3480156109ef57600080fd5b50610a0a6004803603810190610a059190613457565b612521565b005b348015610a1857600080fd5b50610a216125bf565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a7e57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610aae5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060058054610ac490613c86565b80601f0160208091040260200160405190810160405280929190818152602001828054610af090613c86565b8015610b3d5780601f10610b1257610100808354040283529160200191610b3d565b820191906000526020600020905b815481529060010190602001808311610b2057829003601f168201915b5050505050905090565b6000610b516126cc565b600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000610bb08261274a565b610be6576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6009600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c2f826119ae565b90508073ffffffffffffffffffffffffffffffffffffffff16610c506127a9565b73ffffffffffffffffffffffffffffffffffffffff1614610cb357610c7c81610c776127a9565b612384565b610cb2576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826009600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b610d706127b1565b600b5481610d84610d7f6127fe565b612806565b610d8e9190613ce6565b1115610dcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc690613d66565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081610df96110cb565b610e039190613ce6565b1115610e44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3b90613dd2565b60405180910390fd5b60125481610e529190613df2565b3414610e93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8a90613e98565b60405180910390fd5b601060019054906101000a900460ff1615610efc57601060019054906101000a900460ff16610ef7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eee90613f04565b60405180910390fd5b6110ad565b601060009054906101000a900460ff161561107157610f23610f1c6127fe565b8484612082565b610f62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5990613f70565b60405180910390fd5b818160156000610f706127fe565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610fb59190613ce6565b1115610ff6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fed90614002565b60405180910390fd5b80601360008282546110089190613ce6565b92505081905550806015600061101c6127fe565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110659190613ce6565b925050819055506110ac565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a39061406e565b60405180910390fd5b5b6110be6110b86127fe565b8261285d565b6110c661287b565b505050565b60006110d5612885565b6004546003540303905090565b601060019054906101000a900460ff1681565b60006111008261288e565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611167576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806111738461295a565b9150915061118981876111846127a9565b612981565b6111d55761119e866111996127a9565b612384565b6111d4576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361123b576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61124886868660016129c5565b801561125357600082555b600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550611321856112fd8888876129cb565b7c0200000000000000000000000000000000000000000000000000000000176129f3565b600760008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036113a757600060018501905060006007600083815260200190815260200160002054036113a55760035481146113a4578360076000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461140f8686866001612a1e565b505050505050565b60115481565b600d60009054906101000a900460ff1681565b6114386126cc565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166114c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bb906140da565b60405180910390fd5b6000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff164760405161150c9061412b565b60006040518083038185875af1925050503d8060008114611549576040519150601f19603f3d011682016040523d82523d6000602084013e61154e565b606091505b5050905080611592576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115899061418c565b60405180910390fd5b50565b6115b083838360405180602001604052806000815250612196565b505050565b6115bd6126cc565b80600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600f805461162590613c86565b80601f016020809104026020016040519081016040528092919081815260200182805461165190613c86565b801561169e5780601f106116735761010080835404028352916020019161169e565b820191906000526020600020905b81548152906001019060200180831161168157829003601f168201915b505050505081565b6116ae6126cc565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661173a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611731906140da565b60405180910390fd5b8181600e918261174b929190614363565b507f01e56a02aca7f26a28165a040851ba78f30282b55ca81c63a804cdc1e2dcea72828260405161177d929190614460565b60405180910390a15050565b6117916127b1565b601060019054906101000a900460ff166117e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d790613f04565b60405180910390fd5b601254816117ee9190613df2565b341461182f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182690613e98565b60405180910390fd5b600b548161184361183e6127fe565b612806565b61184d9190613ce6565b111561188e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188590613d66565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000816118b86110cb565b6118c29190613ce6565b1115611903576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fa90613dd2565b60405180910390fd5b73dab1a1854214684ace522439684a145e6250523373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611985576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197c906144f6565b60405180910390fd5b61198f828261285d565b61199761287b565b5050565b601060009054906101000a900460ff1681565b60006119b98261288e565b9050919050565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611a4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a43906140da565b60405180910390fd5b818190508484905014611a94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8b90614562565b60405180910390fd5b6000805b85859050811015611adb57858582818110611ab657611ab5614582565b5b9050602002013582611ac89190613ce6565b915080611ad4906145b1565b9050611a98565b507f000000000000000000000000000000000000000000000000000000000000000081611b066110cb565b611b109190613ce6565b1115611b51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4890613dd2565b60405180910390fd5b60005b85859050811015611bba57611ba9848483818110611b7557611b74614582565b5b9050602002016020810190611b8a91906133f4565b878784818110611b9d57611b9c614582565b5b9050602002013561285d565b80611bb3906145b1565b9050611b54565b505050505050565b600c5481565b60125481565b600e8054611bdb90613c86565b80601f0160208091040260200160405190810160405280929190818152602001828054611c0790613c86565b8015611c545780601f10611c2957610100808354040283529160200191611c54565b820191906000526020600020905b815481529060010190602001808311611c3757829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611cc3576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611d1c6126cc565b611d266000612a24565b565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611d566126cc565b8060118190555050565b60156020528060005260406000206000915090505481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611da96126cc565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611e35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2c906140da565b60405180910390fd5b80601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b606060068054611e8890613c86565b80601f0160208091040260200160405190810160405280929190818152602001828054611eb490613c86565b8015611f015780601f10611ed657610100808354040283529160200191611f01565b820191906000526020600020905b815481529060010190602001808311611ee457829003601f168201915b5050505050905090565b611f136127a9565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f77576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600a6000611f846127a9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166120316127a9565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161207691906132c9565b60405180910390a35050565b60006120df83601154868560405160200161209e929190614662565b604051602081830303815290604052805190602001206040516020016120c491906146af565b60405160208183030381529060405280519060200120612ae8565b90509392505050565b6120f06126cc565b6040518060200160405280612103611d78565b73ffffffffffffffffffffffffffffffffffffffff168152506009600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050506000612184836119ae565b90506121918183856110f5565b505050565b6121a18484846110f5565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612203576121cc84848484612aff565b612202576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6122116126cc565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661229d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612294906140da565b60405180910390fd5b81601060006101000a81548160ff02191690831515021790555080601060016101000a81548160ff0219169083151502179055505050565b600b5481565b60606122e68261274a565b612325576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231c90614716565b60405180910390fd5b600e61233083612c4f565b600f604051602001612344939291906147f5565b6040516020818303038152906040529050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60135481565b6000600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6124206126cc565b60018060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061248081612d1d565b50565b61248b6126cc565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612517576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250e906140da565b60405180910390fd5b8060128190555050565b6125296126cc565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166125b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ac906140da565b60405180910390fd5b80600b8190555050565b6125c76126cc565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612653576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161264a906140da565b60405180910390fd5b600d60009054906101000a900460ff16156126a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269a90614872565b60405180910390fd5b6001600d60006101000a81548160ff0219169083151502179055506126ca33600c5461285d565b565b6126d46127fe565b73ffffffffffffffffffffffffffffffffffffffff166126f2611d78565b73ffffffffffffffffffffffffffffffffffffffff1614612748576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273f906148de565b60405180910390fd5b565b600081612755612885565b11158015612764575060035482105b80156127a2575060007c0100000000000000000000000000000000000000000000000000000000600760008581526020019081526020016000205416145b9050919050565b600033905090565b60028054036127f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ec9061494a565b60405180910390fd5b60028081905550565b600033905090565b600067ffffffffffffffff6040600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b612877828260405180602001604052806000815250612da0565b5050565b6001600281905550565b60006001905090565b6000808290508061289d612885565b11612923576003548110156129225760006007600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612920575b600081036129165760076000836001900393508381526020019081526020016000205490506128ec565b8092505050612955565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006009600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86129e2868684612e3e565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600082612af58584612e47565b1490509392505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b256127a9565b8786866040518563ffffffff1660e01b8152600401612b4794939291906149bf565b6020604051808303816000875af1925050508015612b8357506040513d601f19601f82011682018060405250810190612b809190614a20565b60015b612bfc573d8060008114612bb3576040519150601f19603f3d011682016040523d82523d6000602084013e612bb8565b606091505b506000815103612bf4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060006001612c5e84612e9d565b01905060008167ffffffffffffffff811115612c7d57612c7c6134f3565b5b6040519080825280601f01601f191660200182016040528015612caf5781602001600182028036833780820191505090505b509050600082602001820190505b600115612d12578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581612d0657612d05614a4d565b5b04945060008503612cbd575b819350505050919050565b612d256126cc565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612d94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d8b90614aee565b60405180910390fd5b612d9d81612a24565b50565b612daa8383612ff0565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612e395760006003549050600083820390505b612deb6000868380600101945086612aff565b612e21576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612dd8578160035414612e3657600080fd5b50505b505050565b60009392505050565b60008082905060005b8451811015612e9257612e7d82868381518110612e7057612e6f614582565b5b60200260200101516131c3565b91508080612e8a906145b1565b915050612e50565b508091505092915050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612efb577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612ef157612ef0614a4d565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612f38576d04ee2d6d415b85acef81000000008381612f2e57612f2d614a4d565b5b0492506020810190505b662386f26fc100008310612f6757662386f26fc100008381612f5d57612f5c614a4d565b5b0492506010810190505b6305f5e1008310612f90576305f5e1008381612f8657612f85614a4d565b5b0492506008810190505b6127108310612fb5576127108381612fab57612faa614a4d565b5b0492506004810190505b60648310612fd85760648381612fce57612fcd614a4d565b5b0492506002810190505b600a8310612fe7576001810190505b80915050919050565b60006003549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361305d576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008203613097576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6130a460008483856129c5565b600160406001901b178202600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061311b8361310c60008660006129cb565b613115856131ee565b176129f3565b60076000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821061313f578060038190555050506131be6000848385612a1e565b505050565b60008183106131db576131d682846131fe565b6131e6565b6131e583836131fe565b5b905092915050565b60006001821460e11b9050919050565b600082600052816020526040600020905092915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61325e81613229565b811461326957600080fd5b50565b60008135905061327b81613255565b92915050565b6000602082840312156132975761329661321f565b5b60006132a58482850161326c565b91505092915050565b60008115159050919050565b6132c3816132ae565b82525050565b60006020820190506132de60008301846132ba565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561331e578082015181840152602081019050613303565b60008484015250505050565b6000601f19601f8301169050919050565b6000613346826132e4565b61335081856132ef565b9350613360818560208601613300565b6133698161332a565b840191505092915050565b6000602082019050818103600083015261338e818461333b565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006133c182613396565b9050919050565b6133d1816133b6565b81146133dc57600080fd5b50565b6000813590506133ee816133c8565b92915050565b60006020828403121561340a5761340961321f565b5b6000613418848285016133df565b91505092915050565b6000819050919050565b61343481613421565b811461343f57600080fd5b50565b6000813590506134518161342b565b92915050565b60006020828403121561346d5761346c61321f565b5b600061347b84828501613442565b91505092915050565b61348d816133b6565b82525050565b60006020820190506134a86000830184613484565b92915050565b600080604083850312156134c5576134c461321f565b5b60006134d3858286016133df565b92505060206134e485828601613442565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61352b8261332a565b810181811067ffffffffffffffff8211171561354a576135496134f3565b5b80604052505050565b600061355d613215565b90506135698282613522565b919050565b600067ffffffffffffffff821115613589576135886134f3565b5b602082029050602081019050919050565b600080fd5b6000819050919050565b6135b28161359f565b81146135bd57600080fd5b50565b6000813590506135cf816135a9565b92915050565b60006135e86135e38461356e565b613553565b9050808382526020820190506020840283018581111561360b5761360a61359a565b5b835b81811015613634578061362088826135c0565b84526020840193505060208101905061360d565b5050509392505050565b600082601f830112613653576136526134ee565b5b81356136638482602086016135d5565b91505092915050565b6000806000606084860312156136855761368461321f565b5b600084013567ffffffffffffffff8111156136a3576136a2613224565b5b6136af8682870161363e565b93505060206136c086828701613442565b92505060406136d186828701613442565b9150509250925092565b6136e481613421565b82525050565b60006020820190506136ff60008301846136db565b92915050565b60008060006060848603121561371e5761371d61321f565b5b600061372c868287016133df565b935050602061373d868287016133df565b925050604061374e86828701613442565b9150509250925092565b6137618161359f565b82525050565b600060208201905061377c6000830184613758565b92915050565b61378b816132ae565b811461379657600080fd5b50565b6000813590506137a881613782565b92915050565b600080604083850312156137c5576137c461321f565b5b60006137d3858286016133df565b92505060206137e485828601613799565b9150509250929050565b600080fd5b60008083601f840112613809576138086134ee565b5b8235905067ffffffffffffffff811115613826576138256137ee565b5b6020830191508360018202830111156138425761384161359a565b5b9250929050565b600080602083850312156138605761385f61321f565b5b600083013567ffffffffffffffff81111561387e5761387d613224565b5b61388a858286016137f3565b92509250509250929050565b60008083601f8401126138ac576138ab6134ee565b5b8235905067ffffffffffffffff8111156138c9576138c86137ee565b5b6020830191508360208202830111156138e5576138e461359a565b5b9250929050565b60008083601f840112613902576139016134ee565b5b8235905067ffffffffffffffff81111561391f5761391e6137ee565b5b60208301915083602082028301111561393b5761393a61359a565b5b9250929050565b6000806000806040858703121561395c5761395b61321f565b5b600085013567ffffffffffffffff81111561397a57613979613224565b5b61398687828801613896565b9450945050602085013567ffffffffffffffff8111156139a9576139a8613224565b5b6139b5878288016138ec565b925092505092959194509250565b6000602082840312156139d9576139d861321f565b5b60006139e7848285016135c0565b91505092915050565b600080600060608486031215613a0957613a0861321f565b5b6000613a17868287016133df565b935050602084013567ffffffffffffffff811115613a3857613a37613224565b5b613a448682870161363e565b9250506040613a5586828701613442565b9150509250925092565b60008060408385031215613a7657613a7561321f565b5b6000613a8485828601613442565b9250506020613a95858286016133df565b9150509250929050565b600080fd5b600067ffffffffffffffff821115613abf57613abe6134f3565b5b613ac88261332a565b9050602081019050919050565b82818337600083830152505050565b6000613af7613af284613aa4565b613553565b905082815260208101848484011115613b1357613b12613a9f565b5b613b1e848285613ad5565b509392505050565b600082601f830112613b3b57613b3a6134ee565b5b8135613b4b848260208601613ae4565b91505092915050565b60008060008060808587031215613b6e57613b6d61321f565b5b6000613b7c878288016133df565b9450506020613b8d878288016133df565b9350506040613b9e87828801613442565b925050606085013567ffffffffffffffff811115613bbf57613bbe613224565b5b613bcb87828801613b26565b91505092959194509250565b60008060408385031215613bee57613bed61321f565b5b6000613bfc85828601613799565b9250506020613c0d85828601613799565b9150509250929050565b60008060408385031215613c2e57613c2d61321f565b5b6000613c3c858286016133df565b9250506020613c4d858286016133df565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613c9e57607f821691505b602082108103613cb157613cb0613c57565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613cf182613421565b9150613cfc83613421565b9250828201905080821115613d1457613d13613cb7565b5b92915050565b7f746f6f206d616e79206d696e7473000000000000000000000000000000000000600082015250565b6000613d50600e836132ef565b9150613d5b82613d1a565b602082019050919050565b60006020820190508181036000830152613d7f81613d43565b9050919050565b7f6d617820737570706c7900000000000000000000000000000000000000000000600082015250565b6000613dbc600a836132ef565b9150613dc782613d86565b602082019050919050565b60006020820190508181036000830152613deb81613daf565b9050919050565b6000613dfd82613421565b9150613e0883613421565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e4157613e40613cb7565b5b828202905092915050565b7f77726f6e6720616d6f756e740000000000000000000000000000000000000000600082015250565b6000613e82600c836132ef565b9150613e8d82613e4c565b602082019050919050565b60006020820190508181036000830152613eb181613e75565b9050919050565b7f7075626c69632061756374696f6e206e6f742073746172746564207965740000600082015250565b6000613eee601e836132ef565b9150613ef982613eb8565b602082019050919050565b60006020820190508181036000830152613f1d81613ee1565b9050919050565b7f6e6f742077686974656c69737465640000000000000000000000000000000000600082015250565b6000613f5a600f836132ef565b9150613f6582613f24565b602082019050919050565b60006020820190508181036000830152613f8981613f4d565b9050919050565b7f41756374696f6e206973206f7665722c20616c6c20746f6b656e7320636c616960008201527f6d65640000000000000000000000000000000000000000000000000000000000602082015250565b6000613fec6023836132ef565b9150613ff782613f90565b604082019050919050565b6000602082019050818103600083015261401b81613fdf565b9050919050565b7f61756374696f6e206e6f74206163746976650000000000000000000000000000600082015250565b60006140586012836132ef565b915061406382614022565b602082019050919050565b600060208201905081810360008301526140878161404b565b9050919050565b7f496e76616c69642064656c656761746500000000000000000000000000000000600082015250565b60006140c46010836132ef565b91506140cf8261408e565b602082019050919050565b600060208201905081810360008301526140f3816140b7565b9050919050565b600081905092915050565b50565b60006141156000836140fa565b915061412082614105565b600082019050919050565b600061413682614108565b9150819050919050565b7f7472616e73666572206661696c65640000000000000000000000000000000000600082015250565b6000614176600f836132ef565b915061418182614140565b602082019050919050565b600060208201905081810360008301526141a581614169565b9050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026142197fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826141dc565b61422386836141dc565b95508019841693508086168417925050509392505050565b6000819050919050565b600061426061425b61425684613421565b61423b565b613421565b9050919050565b6000819050919050565b61427a83614245565b61428e61428682614267565b8484546141e9565b825550505050565b600090565b6142a3614296565b6142ae818484614271565b505050565b5b818110156142d2576142c760008261429b565b6001810190506142b4565b5050565b601f821115614317576142e8816141b7565b6142f1846141cc565b81016020851015614300578190505b61431461430c856141cc565b8301826142b3565b50505b505050565b600082821c905092915050565b600061433a6000198460080261431c565b1980831691505092915050565b60006143538383614329565b9150826002028217905092915050565b61436d83836141ac565b67ffffffffffffffff811115614386576143856134f3565b5b6143908254613c86565b61439b8282856142d6565b6000601f8311600181146143ca57600084156143b8578287013590505b6143c28582614347565b86555061442a565b601f1984166143d8866141b7565b60005b82811015614400578489013582556001820191506020850194506020810190506143db565b8683101561441d5784890135614419601f891682614329565b8355505b6001600288020188555050505b50505050505050565b600061443f83856132ef565b935061444c838584613ad5565b6144558361332a565b840190509392505050565b6000602082019050818103600083015261447b818486614433565b90509392505050565b7f546869732066756e6374696f6e20697320666f722043726f73736d696e74206f60008201527f6e6c792e00000000000000000000000000000000000000000000000000000000602082015250565b60006144e06024836132ef565b91506144eb82614484565b604082019050919050565b6000602082019050818103600083015261450f816144d3565b9050919050565b7f617267756d656e7473206d757374206861766520657175616c20636f756e7473600082015250565b600061454c6020836132ef565b915061455782614516565b602082019050919050565b6000602082019050818103600083015261457b8161453f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006145bc82613421565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036145ee576145ed613cb7565b5b600182019050919050565b60008160601b9050919050565b6000614611826145f9565b9050919050565b600061462382614606565b9050919050565b61463b614636826133b6565b614618565b82525050565b6000819050919050565b61465c61465782613421565b614641565b82525050565b600061466e828561462a565b60148201915061467e828461464b565b6020820191508190509392505050565b6000819050919050565b6146a96146a48261359f565b61468e565b82525050565b60006146bb8284614698565b60208201915081905092915050565b7f546f6b656e20646f65736e277420657869737400000000000000000000000000600082015250565b60006147006013836132ef565b915061470b826146ca565b602082019050919050565b6000602082019050818103600083015261472f816146f3565b9050919050565b600081905092915050565b6000815461474e81613c86565b6147588186614736565b945060018216600081146147735760018114614788576147bb565b60ff19831686528115158202860193506147bb565b614791856141b7565b60005b838110156147b357815481890152600182019150602081019050614794565b838801955050505b50505092915050565b60006147cf826132e4565b6147d98185614736565b93506147e9818560208601613300565b80840191505092915050565b60006148018286614741565b915061480d82856147c4565b91506148198284614741565b9150819050949350505050565b7f616c726561647920636c61696d65640000000000000000000000000000000000600082015250565b600061485c600f836132ef565b915061486782614826565b602082019050919050565b6000602082019050818103600083015261488b8161484f565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006148c86020836132ef565b91506148d382614892565b602082019050919050565b600060208201905081810360008301526148f7816148bb565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614934601f836132ef565b915061493f826148fe565b602082019050919050565b6000602082019050818103600083015261496381614927565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006149918261496a565b61499b8185614975565b93506149ab818560208601613300565b6149b48161332a565b840191505092915050565b60006080820190506149d46000830187613484565b6149e16020830186613484565b6149ee60408301856136db565b8181036060830152614a008184614986565b905095945050505050565b600081519050614a1a81613255565b92915050565b600060208284031215614a3657614a3561321f565b5b6000614a4484828501614a0b565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614ad86026836132ef565b9150614ae382614a7c565b604082019050919050565b60006020820190508181036000830152614b0781614acb565b905091905056fea2646970667358221220f7c3ed133b2428d9713bad50e192bd0404c59e25878013b9a99d64931f46a59b64736f6c63430008100033

Deployed Bytecode

0x6080604052600436106102725760003560e01c80636c0360eb1161014f578063a923625c116100c1578063e78b9d0b1161007a578063e78b9d0b14610929578063e985e9c514610954578063f2fde38b14610991578063f4a0a528146109ba578063f760f228146109e3578063ff45f00f14610a0c57610272565b8063a923625c1461081b578063b88d4fde14610844578063bfb396971461086d578063c7c2aee314610896578063c87b56dd146108c1578063d5abeb01146108fe57610272565b806385a8c9371161011357806385a8c937146106f95780638da5cb5b1461073657806391d6fc281461076157806395d89b411461078a578063a22cb465146107b5578063a371a062146107de57610272565b80636c0360eb1461062657806370a0823114610651578063715018a61461068e5780637b103999146106a55780637cb64759146106d057610272565b80633ccfd60b116101e857806358891a37116101ac57806358891a371461053057806360d938dc1461054c5780636352211e146105775780636673c4c2146105b45780636816521a146105d05780636817c76c146105fb57610272565b80633ccfd60b1461047357806342842e0e1461048a5780634a994eef146104b35780635503a0e8146104dc57806355f804b31461050757610272565b806314bf9af61161023a57806314bf9af61461038257806318160ddd1461039e5780631e84c413146103c957806323b872dd146103f45780632eb4a7ab1461041d5780632f3346521461044857610272565b806301ffc9a71461027757806306fdde03146102b457806307779627146102df578063081812fc1461031c578063095ea7b314610359575b600080fd5b34801561028357600080fd5b5061029e60048036038101906102999190613281565b610a23565b6040516102ab91906132c9565b60405180910390f35b3480156102c057600080fd5b506102c9610ab5565b6040516102d69190613374565b60405180910390f35b3480156102eb57600080fd5b50610306600480360381019061030191906133f4565b610b47565b60405161031391906132c9565b60405180910390f35b34801561032857600080fd5b50610343600480360381019061033e9190613457565b610ba5565b6040516103509190613493565b60405180910390f35b34801561036557600080fd5b50610380600480360381019061037b91906134ae565b610c24565b005b61039c6004803603810190610397919061366c565b610d68565b005b3480156103aa57600080fd5b506103b36110cb565b6040516103c091906136ea565b60405180910390f35b3480156103d557600080fd5b506103de6110e2565b6040516103eb91906132c9565b60405180910390f35b34801561040057600080fd5b5061041b60048036038101906104169190613705565b6110f5565b005b34801561042957600080fd5b50610432611417565b60405161043f9190613767565b60405180910390f35b34801561045457600080fd5b5061045d61141d565b60405161046a91906132c9565b60405180910390f35b34801561047f57600080fd5b50610488611430565b005b34801561049657600080fd5b506104b160048036038101906104ac9190613705565b611595565b005b3480156104bf57600080fd5b506104da60048036038101906104d591906137ae565b6115b5565b005b3480156104e857600080fd5b506104f1611618565b6040516104fe9190613374565b60405180910390f35b34801561051357600080fd5b5061052e60048036038101906105299190613849565b6116a6565b005b61054a600480360381019061054591906134ae565b611789565b005b34801561055857600080fd5b5061056161199b565b60405161056e91906132c9565b60405180910390f35b34801561058357600080fd5b5061059e60048036038101906105999190613457565b6119ae565b6040516105ab9190613493565b60405180910390f35b6105ce60048036038101906105c99190613942565b6119c0565b005b3480156105dc57600080fd5b506105e5611bc2565b6040516105f291906136ea565b60405180910390f35b34801561060757600080fd5b50610610611bc8565b60405161061d91906136ea565b60405180910390f35b34801561063257600080fd5b5061063b611bce565b6040516106489190613374565b60405180910390f35b34801561065d57600080fd5b50610678600480360381019061067391906133f4565b611c5c565b60405161068591906136ea565b60405180910390f35b34801561069a57600080fd5b506106a3611d14565b005b3480156106b157600080fd5b506106ba611d28565b6040516106c79190613493565b60405180910390f35b3480156106dc57600080fd5b506106f760048036038101906106f291906139c3565b611d4e565b005b34801561070557600080fd5b50610720600480360381019061071b91906133f4565b611d60565b60405161072d91906136ea565b60405180910390f35b34801561074257600080fd5b5061074b611d78565b6040516107589190613493565b60405180910390f35b34801561076d57600080fd5b50610788600480360381019061078391906133f4565b611da1565b005b34801561079657600080fd5b5061079f611e79565b6040516107ac9190613374565b60405180910390f35b3480156107c157600080fd5b506107dc60048036038101906107d791906137ae565b611f0b565b005b3480156107ea57600080fd5b50610805600480360381019061080091906139f0565b612082565b60405161081291906132c9565b60405180910390f35b34801561082757600080fd5b50610842600480360381019061083d9190613a5f565b6120e8565b005b34801561085057600080fd5b5061086b60048036038101906108669190613b54565b612196565b005b34801561087957600080fd5b50610894600480360381019061088f9190613bd7565b612209565b005b3480156108a257600080fd5b506108ab6122d5565b6040516108b891906136ea565b60405180910390f35b3480156108cd57600080fd5b506108e860048036038101906108e39190613457565b6122db565b6040516108f59190613374565b60405180910390f35b34801561090a57600080fd5b5061091361235a565b60405161092091906136ea565b60405180910390f35b34801561093557600080fd5b5061093e61237e565b60405161094b91906136ea565b60405180910390f35b34801561096057600080fd5b5061097b60048036038101906109769190613c17565b612384565b60405161098891906132c9565b60405180910390f35b34801561099d57600080fd5b506109b860048036038101906109b391906133f4565b612418565b005b3480156109c657600080fd5b506109e160048036038101906109dc9190613457565b612483565b005b3480156109ef57600080fd5b50610a0a6004803603810190610a059190613457565b612521565b005b348015610a1857600080fd5b50610a216125bf565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a7e57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610aae5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060058054610ac490613c86565b80601f0160208091040260200160405190810160405280929190818152602001828054610af090613c86565b8015610b3d5780601f10610b1257610100808354040283529160200191610b3d565b820191906000526020600020905b815481529060010190602001808311610b2057829003601f168201915b5050505050905090565b6000610b516126cc565b600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000610bb08261274a565b610be6576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6009600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c2f826119ae565b90508073ffffffffffffffffffffffffffffffffffffffff16610c506127a9565b73ffffffffffffffffffffffffffffffffffffffff1614610cb357610c7c81610c776127a9565b612384565b610cb2576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826009600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b610d706127b1565b600b5481610d84610d7f6127fe565b612806565b610d8e9190613ce6565b1115610dcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc690613d66565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000030981610df96110cb565b610e039190613ce6565b1115610e44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3b90613dd2565b60405180910390fd5b60125481610e529190613df2565b3414610e93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8a90613e98565b60405180910390fd5b601060019054906101000a900460ff1615610efc57601060019054906101000a900460ff16610ef7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eee90613f04565b60405180910390fd5b6110ad565b601060009054906101000a900460ff161561107157610f23610f1c6127fe565b8484612082565b610f62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5990613f70565b60405180910390fd5b818160156000610f706127fe565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610fb59190613ce6565b1115610ff6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fed90614002565b60405180910390fd5b80601360008282546110089190613ce6565b92505081905550806015600061101c6127fe565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110659190613ce6565b925050819055506110ac565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a39061406e565b60405180910390fd5b5b6110be6110b86127fe565b8261285d565b6110c661287b565b505050565b60006110d5612885565b6004546003540303905090565b601060019054906101000a900460ff1681565b60006111008261288e565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611167576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806111738461295a565b9150915061118981876111846127a9565b612981565b6111d55761119e866111996127a9565b612384565b6111d4576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361123b576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61124886868660016129c5565b801561125357600082555b600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550611321856112fd8888876129cb565b7c0200000000000000000000000000000000000000000000000000000000176129f3565b600760008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036113a757600060018501905060006007600083815260200190815260200160002054036113a55760035481146113a4578360076000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461140f8686866001612a1e565b505050505050565b60115481565b600d60009054906101000a900460ff1681565b6114386126cc565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166114c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bb906140da565b60405180910390fd5b6000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff164760405161150c9061412b565b60006040518083038185875af1925050503d8060008114611549576040519150601f19603f3d011682016040523d82523d6000602084013e61154e565b606091505b5050905080611592576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115899061418c565b60405180910390fd5b50565b6115b083838360405180602001604052806000815250612196565b505050565b6115bd6126cc565b80600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600f805461162590613c86565b80601f016020809104026020016040519081016040528092919081815260200182805461165190613c86565b801561169e5780601f106116735761010080835404028352916020019161169e565b820191906000526020600020905b81548152906001019060200180831161168157829003601f168201915b505050505081565b6116ae6126cc565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661173a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611731906140da565b60405180910390fd5b8181600e918261174b929190614363565b507f01e56a02aca7f26a28165a040851ba78f30282b55ca81c63a804cdc1e2dcea72828260405161177d929190614460565b60405180910390a15050565b6117916127b1565b601060019054906101000a900460ff166117e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d790613f04565b60405180910390fd5b601254816117ee9190613df2565b341461182f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182690613e98565b60405180910390fd5b600b548161184361183e6127fe565b612806565b61184d9190613ce6565b111561188e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188590613d66565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000309816118b86110cb565b6118c29190613ce6565b1115611903576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fa90613dd2565b60405180910390fd5b73dab1a1854214684ace522439684a145e6250523373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611985576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197c906144f6565b60405180910390fd5b61198f828261285d565b61199761287b565b5050565b601060009054906101000a900460ff1681565b60006119b98261288e565b9050919050565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611a4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a43906140da565b60405180910390fd5b818190508484905014611a94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8b90614562565b60405180910390fd5b6000805b85859050811015611adb57858582818110611ab657611ab5614582565b5b9050602002013582611ac89190613ce6565b915080611ad4906145b1565b9050611a98565b507f000000000000000000000000000000000000000000000000000000000000030981611b066110cb565b611b109190613ce6565b1115611b51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4890613dd2565b60405180910390fd5b60005b85859050811015611bba57611ba9848483818110611b7557611b74614582565b5b9050602002016020810190611b8a91906133f4565b878784818110611b9d57611b9c614582565b5b9050602002013561285d565b80611bb3906145b1565b9050611b54565b505050505050565b600c5481565b60125481565b600e8054611bdb90613c86565b80601f0160208091040260200160405190810160405280929190818152602001828054611c0790613c86565b8015611c545780601f10611c2957610100808354040283529160200191611c54565b820191906000526020600020905b815481529060010190602001808311611c3757829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611cc3576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611d1c6126cc565b611d266000612a24565b565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611d566126cc565b8060118190555050565b60156020528060005260406000206000915090505481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611da96126cc565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611e35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2c906140da565b60405180910390fd5b80601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b606060068054611e8890613c86565b80601f0160208091040260200160405190810160405280929190818152602001828054611eb490613c86565b8015611f015780601f10611ed657610100808354040283529160200191611f01565b820191906000526020600020905b815481529060010190602001808311611ee457829003601f168201915b5050505050905090565b611f136127a9565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f77576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600a6000611f846127a9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166120316127a9565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161207691906132c9565b60405180910390a35050565b60006120df83601154868560405160200161209e929190614662565b604051602081830303815290604052805190602001206040516020016120c491906146af565b60405160208183030381529060405280519060200120612ae8565b90509392505050565b6120f06126cc565b6040518060200160405280612103611d78565b73ffffffffffffffffffffffffffffffffffffffff168152506009600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050506000612184836119ae565b90506121918183856110f5565b505050565b6121a18484846110f5565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612203576121cc84848484612aff565b612202576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6122116126cc565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661229d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612294906140da565b60405180910390fd5b81601060006101000a81548160ff02191690831515021790555080601060016101000a81548160ff0219169083151502179055505050565b600b5481565b60606122e68261274a565b612325576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231c90614716565b60405180910390fd5b600e61233083612c4f565b600f604051602001612344939291906147f5565b6040516020818303038152906040529050919050565b7f000000000000000000000000000000000000000000000000000000000000030981565b60135481565b6000600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6124206126cc565b60018060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061248081612d1d565b50565b61248b6126cc565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612517576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250e906140da565b60405180910390fd5b8060128190555050565b6125296126cc565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166125b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ac906140da565b60405180910390fd5b80600b8190555050565b6125c76126cc565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612653576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161264a906140da565b60405180910390fd5b600d60009054906101000a900460ff16156126a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269a90614872565b60405180910390fd5b6001600d60006101000a81548160ff0219169083151502179055506126ca33600c5461285d565b565b6126d46127fe565b73ffffffffffffffffffffffffffffffffffffffff166126f2611d78565b73ffffffffffffffffffffffffffffffffffffffff1614612748576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273f906148de565b60405180910390fd5b565b600081612755612885565b11158015612764575060035482105b80156127a2575060007c0100000000000000000000000000000000000000000000000000000000600760008581526020019081526020016000205416145b9050919050565b600033905090565b60028054036127f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ec9061494a565b60405180910390fd5b60028081905550565b600033905090565b600067ffffffffffffffff6040600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b612877828260405180602001604052806000815250612da0565b5050565b6001600281905550565b60006001905090565b6000808290508061289d612885565b11612923576003548110156129225760006007600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612920575b600081036129165760076000836001900393508381526020019081526020016000205490506128ec565b8092505050612955565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006009600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86129e2868684612e3e565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600082612af58584612e47565b1490509392505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b256127a9565b8786866040518563ffffffff1660e01b8152600401612b4794939291906149bf565b6020604051808303816000875af1925050508015612b8357506040513d601f19601f82011682018060405250810190612b809190614a20565b60015b612bfc573d8060008114612bb3576040519150601f19603f3d011682016040523d82523d6000602084013e612bb8565b606091505b506000815103612bf4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060006001612c5e84612e9d565b01905060008167ffffffffffffffff811115612c7d57612c7c6134f3565b5b6040519080825280601f01601f191660200182016040528015612caf5781602001600182028036833780820191505090505b509050600082602001820190505b600115612d12578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581612d0657612d05614a4d565b5b04945060008503612cbd575b819350505050919050565b612d256126cc565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612d94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d8b90614aee565b60405180910390fd5b612d9d81612a24565b50565b612daa8383612ff0565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612e395760006003549050600083820390505b612deb6000868380600101945086612aff565b612e21576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612dd8578160035414612e3657600080fd5b50505b505050565b60009392505050565b60008082905060005b8451811015612e9257612e7d82868381518110612e7057612e6f614582565b5b60200260200101516131c3565b91508080612e8a906145b1565b915050612e50565b508091505092915050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612efb577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612ef157612ef0614a4d565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612f38576d04ee2d6d415b85acef81000000008381612f2e57612f2d614a4d565b5b0492506020810190505b662386f26fc100008310612f6757662386f26fc100008381612f5d57612f5c614a4d565b5b0492506010810190505b6305f5e1008310612f90576305f5e1008381612f8657612f85614a4d565b5b0492506008810190505b6127108310612fb5576127108381612fab57612faa614a4d565b5b0492506004810190505b60648310612fd85760648381612fce57612fcd614a4d565b5b0492506002810190505b600a8310612fe7576001810190505b80915050919050565b60006003549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361305d576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008203613097576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6130a460008483856129c5565b600160406001901b178202600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061311b8361310c60008660006129cb565b613115856131ee565b176129f3565b60076000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821061313f578060038190555050506131be6000848385612a1e565b505050565b60008183106131db576131d682846131fe565b6131e6565b6131e583836131fe565b5b905092915050565b60006001821460e11b9050919050565b600082600052816020526040600020905092915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61325e81613229565b811461326957600080fd5b50565b60008135905061327b81613255565b92915050565b6000602082840312156132975761329661321f565b5b60006132a58482850161326c565b91505092915050565b60008115159050919050565b6132c3816132ae565b82525050565b60006020820190506132de60008301846132ba565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561331e578082015181840152602081019050613303565b60008484015250505050565b6000601f19601f8301169050919050565b6000613346826132e4565b61335081856132ef565b9350613360818560208601613300565b6133698161332a565b840191505092915050565b6000602082019050818103600083015261338e818461333b565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006133c182613396565b9050919050565b6133d1816133b6565b81146133dc57600080fd5b50565b6000813590506133ee816133c8565b92915050565b60006020828403121561340a5761340961321f565b5b6000613418848285016133df565b91505092915050565b6000819050919050565b61343481613421565b811461343f57600080fd5b50565b6000813590506134518161342b565b92915050565b60006020828403121561346d5761346c61321f565b5b600061347b84828501613442565b91505092915050565b61348d816133b6565b82525050565b60006020820190506134a86000830184613484565b92915050565b600080604083850312156134c5576134c461321f565b5b60006134d3858286016133df565b92505060206134e485828601613442565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61352b8261332a565b810181811067ffffffffffffffff8211171561354a576135496134f3565b5b80604052505050565b600061355d613215565b90506135698282613522565b919050565b600067ffffffffffffffff821115613589576135886134f3565b5b602082029050602081019050919050565b600080fd5b6000819050919050565b6135b28161359f565b81146135bd57600080fd5b50565b6000813590506135cf816135a9565b92915050565b60006135e86135e38461356e565b613553565b9050808382526020820190506020840283018581111561360b5761360a61359a565b5b835b81811015613634578061362088826135c0565b84526020840193505060208101905061360d565b5050509392505050565b600082601f830112613653576136526134ee565b5b81356136638482602086016135d5565b91505092915050565b6000806000606084860312156136855761368461321f565b5b600084013567ffffffffffffffff8111156136a3576136a2613224565b5b6136af8682870161363e565b93505060206136c086828701613442565b92505060406136d186828701613442565b9150509250925092565b6136e481613421565b82525050565b60006020820190506136ff60008301846136db565b92915050565b60008060006060848603121561371e5761371d61321f565b5b600061372c868287016133df565b935050602061373d868287016133df565b925050604061374e86828701613442565b9150509250925092565b6137618161359f565b82525050565b600060208201905061377c6000830184613758565b92915050565b61378b816132ae565b811461379657600080fd5b50565b6000813590506137a881613782565b92915050565b600080604083850312156137c5576137c461321f565b5b60006137d3858286016133df565b92505060206137e485828601613799565b9150509250929050565b600080fd5b60008083601f840112613809576138086134ee565b5b8235905067ffffffffffffffff811115613826576138256137ee565b5b6020830191508360018202830111156138425761384161359a565b5b9250929050565b600080602083850312156138605761385f61321f565b5b600083013567ffffffffffffffff81111561387e5761387d613224565b5b61388a858286016137f3565b92509250509250929050565b60008083601f8401126138ac576138ab6134ee565b5b8235905067ffffffffffffffff8111156138c9576138c86137ee565b5b6020830191508360208202830111156138e5576138e461359a565b5b9250929050565b60008083601f840112613902576139016134ee565b5b8235905067ffffffffffffffff81111561391f5761391e6137ee565b5b60208301915083602082028301111561393b5761393a61359a565b5b9250929050565b6000806000806040858703121561395c5761395b61321f565b5b600085013567ffffffffffffffff81111561397a57613979613224565b5b61398687828801613896565b9450945050602085013567ffffffffffffffff8111156139a9576139a8613224565b5b6139b5878288016138ec565b925092505092959194509250565b6000602082840312156139d9576139d861321f565b5b60006139e7848285016135c0565b91505092915050565b600080600060608486031215613a0957613a0861321f565b5b6000613a17868287016133df565b935050602084013567ffffffffffffffff811115613a3857613a37613224565b5b613a448682870161363e565b9250506040613a5586828701613442565b9150509250925092565b60008060408385031215613a7657613a7561321f565b5b6000613a8485828601613442565b9250506020613a95858286016133df565b9150509250929050565b600080fd5b600067ffffffffffffffff821115613abf57613abe6134f3565b5b613ac88261332a565b9050602081019050919050565b82818337600083830152505050565b6000613af7613af284613aa4565b613553565b905082815260208101848484011115613b1357613b12613a9f565b5b613b1e848285613ad5565b509392505050565b600082601f830112613b3b57613b3a6134ee565b5b8135613b4b848260208601613ae4565b91505092915050565b60008060008060808587031215613b6e57613b6d61321f565b5b6000613b7c878288016133df565b9450506020613b8d878288016133df565b9350506040613b9e87828801613442565b925050606085013567ffffffffffffffff811115613bbf57613bbe613224565b5b613bcb87828801613b26565b91505092959194509250565b60008060408385031215613bee57613bed61321f565b5b6000613bfc85828601613799565b9250506020613c0d85828601613799565b9150509250929050565b60008060408385031215613c2e57613c2d61321f565b5b6000613c3c858286016133df565b9250506020613c4d858286016133df565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613c9e57607f821691505b602082108103613cb157613cb0613c57565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613cf182613421565b9150613cfc83613421565b9250828201905080821115613d1457613d13613cb7565b5b92915050565b7f746f6f206d616e79206d696e7473000000000000000000000000000000000000600082015250565b6000613d50600e836132ef565b9150613d5b82613d1a565b602082019050919050565b60006020820190508181036000830152613d7f81613d43565b9050919050565b7f6d617820737570706c7900000000000000000000000000000000000000000000600082015250565b6000613dbc600a836132ef565b9150613dc782613d86565b602082019050919050565b60006020820190508181036000830152613deb81613daf565b9050919050565b6000613dfd82613421565b9150613e0883613421565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e4157613e40613cb7565b5b828202905092915050565b7f77726f6e6720616d6f756e740000000000000000000000000000000000000000600082015250565b6000613e82600c836132ef565b9150613e8d82613e4c565b602082019050919050565b60006020820190508181036000830152613eb181613e75565b9050919050565b7f7075626c69632061756374696f6e206e6f742073746172746564207965740000600082015250565b6000613eee601e836132ef565b9150613ef982613eb8565b602082019050919050565b60006020820190508181036000830152613f1d81613ee1565b9050919050565b7f6e6f742077686974656c69737465640000000000000000000000000000000000600082015250565b6000613f5a600f836132ef565b9150613f6582613f24565b602082019050919050565b60006020820190508181036000830152613f8981613f4d565b9050919050565b7f41756374696f6e206973206f7665722c20616c6c20746f6b656e7320636c616960008201527f6d65640000000000000000000000000000000000000000000000000000000000602082015250565b6000613fec6023836132ef565b9150613ff782613f90565b604082019050919050565b6000602082019050818103600083015261401b81613fdf565b9050919050565b7f61756374696f6e206e6f74206163746976650000000000000000000000000000600082015250565b60006140586012836132ef565b915061406382614022565b602082019050919050565b600060208201905081810360008301526140878161404b565b9050919050565b7f496e76616c69642064656c656761746500000000000000000000000000000000600082015250565b60006140c46010836132ef565b91506140cf8261408e565b602082019050919050565b600060208201905081810360008301526140f3816140b7565b9050919050565b600081905092915050565b50565b60006141156000836140fa565b915061412082614105565b600082019050919050565b600061413682614108565b9150819050919050565b7f7472616e73666572206661696c65640000000000000000000000000000000000600082015250565b6000614176600f836132ef565b915061418182614140565b602082019050919050565b600060208201905081810360008301526141a581614169565b9050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026142197fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826141dc565b61422386836141dc565b95508019841693508086168417925050509392505050565b6000819050919050565b600061426061425b61425684613421565b61423b565b613421565b9050919050565b6000819050919050565b61427a83614245565b61428e61428682614267565b8484546141e9565b825550505050565b600090565b6142a3614296565b6142ae818484614271565b505050565b5b818110156142d2576142c760008261429b565b6001810190506142b4565b5050565b601f821115614317576142e8816141b7565b6142f1846141cc565b81016020851015614300578190505b61431461430c856141cc565b8301826142b3565b50505b505050565b600082821c905092915050565b600061433a6000198460080261431c565b1980831691505092915050565b60006143538383614329565b9150826002028217905092915050565b61436d83836141ac565b67ffffffffffffffff811115614386576143856134f3565b5b6143908254613c86565b61439b8282856142d6565b6000601f8311600181146143ca57600084156143b8578287013590505b6143c28582614347565b86555061442a565b601f1984166143d8866141b7565b60005b82811015614400578489013582556001820191506020850194506020810190506143db565b8683101561441d5784890135614419601f891682614329565b8355505b6001600288020188555050505b50505050505050565b600061443f83856132ef565b935061444c838584613ad5565b6144558361332a565b840190509392505050565b6000602082019050818103600083015261447b818486614433565b90509392505050565b7f546869732066756e6374696f6e20697320666f722043726f73736d696e74206f60008201527f6e6c792e00000000000000000000000000000000000000000000000000000000602082015250565b60006144e06024836132ef565b91506144eb82614484565b604082019050919050565b6000602082019050818103600083015261450f816144d3565b9050919050565b7f617267756d656e7473206d757374206861766520657175616c20636f756e7473600082015250565b600061454c6020836132ef565b915061455782614516565b602082019050919050565b6000602082019050818103600083015261457b8161453f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006145bc82613421565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036145ee576145ed613cb7565b5b600182019050919050565b60008160601b9050919050565b6000614611826145f9565b9050919050565b600061462382614606565b9050919050565b61463b614636826133b6565b614618565b82525050565b6000819050919050565b61465c61465782613421565b614641565b82525050565b600061466e828561462a565b60148201915061467e828461464b565b6020820191508190509392505050565b6000819050919050565b6146a96146a48261359f565b61468e565b82525050565b60006146bb8284614698565b60208201915081905092915050565b7f546f6b656e20646f65736e277420657869737400000000000000000000000000600082015250565b60006147006013836132ef565b915061470b826146ca565b602082019050919050565b6000602082019050818103600083015261472f816146f3565b9050919050565b600081905092915050565b6000815461474e81613c86565b6147588186614736565b945060018216600081146147735760018114614788576147bb565b60ff19831686528115158202860193506147bb565b614791856141b7565b60005b838110156147b357815481890152600182019150602081019050614794565b838801955050505b50505092915050565b60006147cf826132e4565b6147d98185614736565b93506147e9818560208601613300565b80840191505092915050565b60006148018286614741565b915061480d82856147c4565b91506148198284614741565b9150819050949350505050565b7f616c726561647920636c61696d65640000000000000000000000000000000000600082015250565b600061485c600f836132ef565b915061486782614826565b602082019050919050565b6000602082019050818103600083015261488b8161484f565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006148c86020836132ef565b91506148d382614892565b602082019050919050565b600060208201905081810360008301526148f7816148bb565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614934601f836132ef565b915061493f826148fe565b602082019050919050565b6000602082019050818103600083015261496381614927565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006149918261496a565b61499b8185614975565b93506149ab818560208601613300565b6149b48161332a565b840191505092915050565b60006080820190506149d46000830187613484565b6149e16020830186613484565b6149ee60408301856136db565b8181036060830152614a008184614986565b905095945050505050565b600081519050614a1a81613255565b92915050565b600060208284031215614a3657614a3561321f565b5b6000614a4484828501614a0b565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614ad86026836132ef565b9150614ae382614a7c565b604082019050919050565b60006020820190508181036000830152614b0781614acb565b905091905056fea2646970667358221220f7c3ed133b2428d9713bad50e192bd0404c59e25878013b9a99d64931f46a59b64736f6c63430008100033

Deployed Bytecode Sourcemap

207:5013:3:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5970:615:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11689:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;346:109:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13649:218:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13183:400;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2305:821:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5000:323:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;562:30:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22788:2800:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;597:25:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;426:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3766:183;;;;;;;;;;;;;:::i;:::-;;14553:185:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;459:112:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;488:33:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;978:139;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3134:502;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;530:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11470:152:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3957:457:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;387:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;629:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;462:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6649:232:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1884:103:7;;;;;;;;;;;;;:::i;:::-;;712:68:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1475:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;791:58;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1236:87:7;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3644:114:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11858:104:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13939:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1996:300:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4989:226;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14809:399:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1812:176:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;352:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1229:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;307:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;679:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14318:164:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;575:158:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1694:110:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1570:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4422:179;;;;;;;;;;;;;:::i;:::-;;5970:615:2;6055:4;6370:10;6355:25;;:11;:25;;;;:102;;;;6447:10;6432:25;;:11;:25;;;;6355:102;:179;;;;6524:10;6509:25;;:11;:25;;;;6355:179;6335:199;;5970:615;;;:::o;11689:100::-;11743:13;11776:5;11769:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11689:100;:::o;346:109:1:-;415:4;1122:13:7;:11;:13::i;:::-;434:10:1::1;:16;445:4;434:16;;;;;;;;;;;;;;;;;;;;;;;;;427:23;;346:109:::0;;;:::o;13649:218:2:-;13725:7;13750:16;13758:7;13750;:16::i;:::-;13745:64;;13775:34;;;;;;;;;;;;;;13745:64;13829:15;:24;13845:7;13829:24;;;;;;;;;;;:30;;;;;;;;;;;;13822:37;;13649:218;;;:::o;13183:400::-;13264:13;13280:16;13288:7;13280;:16::i;:::-;13264:32;;13336:5;13313:28;;:19;:17;:19::i;:::-;:28;;;13309:175;;13361:44;13378:5;13385:19;:17;:19::i;:::-;13361:16;:44::i;:::-;13356:128;;13433:35;;;;;;;;;;;;;;13356:128;13309:175;13529:2;13496:15;:24;13512:7;13496:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;13567:7;13563:2;13547:28;;13556:5;13547:28;;;;;;;;;;;;13253:330;13183:400;;:::o;2305:821:3:-;2296:21:8;:19;:21::i;:::-;2453:11:3::1;;2446:3;2416:27;2430:12;:10;:12::i;:::-;2416:13;:27::i;:::-;:33;;;;:::i;:::-;:48;;2408:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;2521:9;2514:3;2498:13;:11;:13::i;:::-;:19;;;;:::i;:::-;:32;;2490:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;2579:9;;2573:3;:15;;;;:::i;:::-;2560:9;:28;2552:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;2618:18;;;;;;;;;;;2614:470;;;2657:18;;;;;;;;;;;2649:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;2614:470;;;2733:15;;;;;;;;;;;2729:355;;;2767:41;2781:12;:10;:12::i;:::-;2795:5;2802;2767:13;:41::i;:::-;2759:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;2892:5;2885:3;2845:23;:37;2869:12;:10;:12::i;:::-;2845:37;;;;;;;;;;;;;;;;:43;;;;:::i;:::-;:52;;2837:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;2963:3;2946:13;;:20;;;;;;;:::i;:::-;;;;;;;;3016:3;2975:23;:37;2999:12;:10;:12::i;:::-;2975:37;;;;;;;;;;;;;;;;:44;;;;;;;:::i;:::-;;;;;;;;2729:355;;;3046:30;;;;;;;;;;:::i;:::-;;;;;;;;2729:355;2614:470;3092:28;3102:12;:10;:12::i;:::-;3116:3;3092:9;:28::i;:::-;2340:20:8::0;:18;:20::i;:::-;2305:821:3;;;:::o;5000:323:2:-;5061:7;5289:15;:13;:15::i;:::-;5274:12;;5258:13;;:28;:46;5251:53;;5000:323;:::o;562:30:3:-;;;;;;;;;;;;;:::o;22788:2800:2:-;22922:27;22952;22971:7;22952:18;:27::i;:::-;22922:57;;23037:4;22996:45;;23012:19;22996:45;;;22992:86;;23050:28;;;;;;;;;;;;;;22992:86;23092:27;23121:23;23148:28;23168:7;23148:19;:28::i;:::-;23091:85;;;;23276:62;23295:15;23312:4;23318:19;:17;:19::i;:::-;23276:18;:62::i;:::-;23271:174;;23358:43;23375:4;23381:19;:17;:19::i;:::-;23358:16;:43::i;:::-;23353:92;;23410:35;;;;;;;;;;;;;;23353:92;23271:174;23476:1;23462:16;;:2;:16;;;23458:52;;23487:23;;;;;;;;;;;;;;23458:52;23523:43;23545:4;23551:2;23555:7;23564:1;23523:21;:43::i;:::-;23659:15;23656:160;;;23799:1;23778:19;23771:30;23656:160;24194:18;:24;24213:4;24194:24;;;;;;;;;;;;;;;;24192:26;;;;;;;;;;;;24263:18;:22;24282:2;24263:22;;;;;;;;;;;;;;;;24261:24;;;;;;;;;;;24585:145;24622:2;24670:45;24685:4;24691:2;24695:19;24670:14;:45::i;:::-;2210:8;24643:72;24585:18;:145::i;:::-;24556:17;:26;24574:7;24556:26;;;;;;;;;;;:174;;;;24900:1;2210:8;24850:19;:46;:51;24846:626;;24922:19;24954:1;24944:7;:11;24922:33;;25111:1;25077:17;:30;25095:11;25077:30;;;;;;;;;;;;:35;25073:384;;25215:13;;25200:11;:28;25196:242;;25395:19;25362:17;:30;25380:11;25362:30;;;;;;;;;;;:52;;;;25196:242;25073:384;24903:569;24846:626;25519:7;25515:2;25500:27;;25509:4;25500:27;;;;;;;;;;;;25538:42;25559:4;25565:2;25569:7;25578:1;25538:20;:42::i;:::-;22911:2677;;;22788:2800;;;:::o;597:25:3:-;;;;:::o;426:31::-;;;;;;;;;;;;;:::o;3766:183::-;1122:13:7;:11;:13::i;:::-;202:10:1::1;:22;213:10;202:22;;;;;;;;;;;;;;;;;;;;;;;;;194:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;3827:12:3::2;3853:8;;;;;;;;;;;3845:22;;3875:21;3845:56;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3826:75;;;3916:7;3908:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;3819:130;3766:183::o:0;14553:185:2:-;14691:39;14708:4;14714:2;14718:7;14691:39;;;;;;;;;;;;:16;:39::i;:::-;14553:185;;;:::o;459:112:1:-;1122:13:7;:11;:13::i;:::-;555:11:1::1;536:10;:16;547:4;536:16;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;459:112:::0;;:::o;488:33:3:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;978:139::-;1122:13:7;:11;:13::i;:::-;202:10:1::1;:22;213:10;202:22;;;;;;;;;;;;;;;;;;;;;;;;;194:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;1074:8:3::2;;1064:7;:18;;;;;;;:::i;:::-;;1094:17;1102:8;;1094:17;;;;;;;:::i;:::-;;;;;;;;978:139:::0;;:::o;3134:502::-;2296:21:8;:19;:21::i;:::-;3222:18:3::1;;;;;;;;;;;3214:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;3309:9;;3303:3;:15;;;;:::i;:::-;3290:9;:28;3282:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;3387:11;;3380:3;3350:27;3364:12;:10;:12::i;:::-;3350:13;:27::i;:::-;:33;;;;:::i;:::-;:48;;3342:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;3455:9;3448:3;3432:13;:11;:13::i;:::-;:19;;;;:::i;:::-;:32;;3424:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;3508:42;3494:56;;:10;:56;;;3486:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;3611:19;3621:3;3626;3611:9;:19::i;:::-;2340:20:8::0;:18;:20::i;:::-;3134:502:3;;:::o;530:27::-;;;;;;;;;;;;;:::o;11470:152:2:-;11542:7;11585:27;11604:7;11585:18;:27::i;:::-;11562:52;;11470:152;;;:::o;3957:457:3:-;202:10:1;:22;213:10;202:22;;;;;;;;;;;;;;;;;;;;;;;;;194:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;4088:10:3::1;;:17;;4074:3;;:10;;:31;4066:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;4150:13;4179:9:::0;4174:73:::1;4198:3;;:10;;4194:1;:14;4174:73;;;4233:3;;4237:1;4233:6;;;;;;;:::i;:::-;;;;;;;;4224:15;;;;;:::i;:::-;;;4210:3;;;;:::i;:::-;;;4174:73;;;;4286:9;4277:5;4261:13;:11;:13::i;:::-;:21;;;;:::i;:::-;:34;;4253:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;4322:9;4317:92;4341:3;;:10;;4337:1;:14;4317:92;;;4367:32;4377:10;;4388:1;4377:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;4392:3;;4396:1;4392:6;;;;;;;:::i;:::-;;;;;;;;4367:9;:32::i;:::-;4353:3;;;;:::i;:::-;;;4317:92;;;;4059:355;3957:457:::0;;;;:::o;387:34::-;;;;:::o;629:45::-;;;;:::o;462:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;6649:232:2:-;6721:7;6762:1;6745:19;;:5;:19;;;6741:60;;6773:28;;;;;;;;;;;;;;6741:60;1162:13;6819:18;:25;6838:5;6819:25;;;;;;;;;;;;;;;;:54;6812:61;;6649:232;;;:::o;1884:103:7:-;1122:13;:11;:13::i;:::-;1949:30:::1;1976:1;1949:18;:30::i;:::-;1884:103::o:0;712:68:3:-;;;;;;;;;;;;;:::o;1475:86::-;1122:13:7;:11;:13::i;:::-;1551:4:3::1;1538:10;:17;;;;1475:86:::0;:::o;791:58::-;;;;;;;;;;;;;;;;;:::o;1236:87:7:-;1282:7;1309:6;;;;;;;;;;;1302:13;;1236:87;:::o;3644:114:3:-;1122:13:7;:11;:13::i;:::-;202:10:1::1;:22;213:10;202:22;;;;;;;;;;;;;;;;;;;;;;;;;194:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;3743:9:3::2;3732:8;;:20;;;;;;;;;;;;;;;;;;3644:114:::0;:::o;11858:104:2:-;11914:13;11947:7;11940:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11858:104;:::o;13939:308::-;14050:19;:17;:19::i;:::-;14038:31;;:8;:31;;;14034:61;;14078:17;;;;;;;;;;;;;;14034:61;14160:8;14108:18;:39;14127:19;:17;:19::i;:::-;14108:39;;;;;;;;;;;;;;;:49;14148:8;14108:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;14220:8;14184:55;;14199:19;:17;:19::i;:::-;14184:55;;;14230:8;14184:55;;;;;;:::i;:::-;;;;;;;;13939:308;;:::o;1996:300:3:-;2116:4;2143:147;2172:5;2188:10;;2263:7;2272:5;2246:32;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2236:43;;;;;;2219:61;;;;;;;;:::i;:::-;;;;;;;;;;;;;2209:72;;;;;;2143:18;:147::i;:::-;2129:161;;1996:300;;;;;:::o;4989:226::-;1122:13:7;:11;:13::i;:::-;5095:25:3::1;;;;;;;;5112:7;:5;:7::i;:::-;5095:25;;;;::::0;5068:15:::1;:24;5084:7;5068:24;;;;;;;;;;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5127:12;5142:18;5151:7;5142;:18::i;:::-;5127:33;;5167:40;5181:4;5187:9;5198:7;5167:12;:40::i;:::-;5061:154;4989:226:::0;;:::o;14809:399:2:-;14976:31;14989:4;14995:2;14999:7;14976:12;:31::i;:::-;15040:1;15022:2;:14;;;:19;15018:183;;15061:56;15092:4;15098:2;15102:7;15111:5;15061:30;:56::i;:::-;15056:145;;15145:40;;;;;;;;;;;;;;15056:145;15018:183;14809:399;;;;:::o;1812:176:3:-;1122:13:7;:11;:13::i;:::-;202:10:1::1;:22;213:10;202:22;;;;;;;;;;;;;;;;;;;;;;;;;194:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;1931:12:3::2;1913:15;;:30;;;;;;;;;;;;;;;;;;1971:11;1950:18;;:32;;;;;;;;;;;;;;;;;;1812:176:::0;;:::o;352:30::-;;;;:::o;1229:238::-;1303:13;1337:17;1345:8;1337:7;:17::i;:::-;1329:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;1420:7;1429:19;:8;:17;:19::i;:::-;1450:9;1403:57;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1389:72;;1229:238;;;:::o;307:40::-;;;:::o;679:28::-;;;;:::o;14318:164:2:-;14415:4;14439:18;:25;14458:5;14439:25;;;;;;;;;;;;;;;:35;14465:8;14439:35;;;;;;;;;;;;;;;;;;;;;;;;;14432:42;;14318:164;;;;:::o;575:158:1:-;1122:13:7;:11;:13::i;:::-;683:4:1::1;660:10:::0;:20:::1;671:8;660:20;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;693:35;718:8;693:23;:35::i;:::-;575:158:::0;:::o;1694:110:3:-;1122:13:7;:11;:13::i;:::-;202:10:1::1;:22;213:10;202:22;;;;;;;;;;;;;;;;;;;;;;;;;194:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;1788:10:3::2;1776:9;:22;;;;1694:110:::0;:::o;1570:116::-;1122:13:7;:11;:13::i;:::-;202:10:1::1;:22;213:10;202:22;;;;;;;;;;;;;;;;;;;;;;;;;194:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;1668:12:3::2;1654:11;:26;;;;1570:116:::0;:::o;4422:179::-;1122:13:7;:11;:13::i;:::-;202:10:1::1;:22;213:10;202:22;;;;;;;;;;;;;;;;;;;;;;;;;194:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;4494:11:3::2;;;;;;;;;;;4493:12;4484:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;4547:4;4533:11;;:18;;;;;;;;;;;;;;;;;;4558:37;4568:10;4580:14;;4558:9;:37::i;:::-;4422:179::o:0;1401:132:7:-;1476:12;:10;:12::i;:::-;1465:23;;:7;:5;:7::i;:::-;:23;;;1457:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1401:132::o;15463:281:2:-;15528:4;15584:7;15565:15;:13;:15::i;:::-;:26;;:66;;;;;15618:13;;15608:7;:23;15565:66;:152;;;;;15716:1;1932:8;15669:17;:26;15687:7;15669:26;;;;;;;;;;;;:43;:48;15565:152;15545:172;;15463:281;;;:::o;33892:105::-;33952:7;33979:10;33972:17;;33892:105;:::o;2376:289:8:-;1778:1;2506:7;;:19;2498:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1778:1;2639:7;:18;;;;2376:289::o;656:98:0:-;709:7;736:10;729:17;;656:98;:::o;6963:184:2:-;7032:7;1162:13;1299:2;7060:18;:25;7079:5;7060:25;;;;;;;;;;;;;;;;:49;;7059:80;7052:87;;6963:184;;;:::o;15828:112::-;15905:27;15915:2;15919:8;15905:27;;;;;;;;;;;;:9;:27::i;:::-;15828:112;;:::o;2673:213:8:-;1734:1;2856:7;:22;;;;2673:213::o;4516:92:2:-;4572:7;4599:1;4592:8;;4516:92;:::o;8363:1129::-;8430:7;8450:12;8465:7;8450:22;;8533:4;8514:15;:13;:15::i;:::-;:23;8510:915;;8567:13;;8560:4;:20;8556:869;;;8605:14;8622:17;:23;8640:4;8622:23;;;;;;;;;;;;8605:40;;8738:1;1932:8;8711:6;:23;:28;8707:699;;9230:113;9247:1;9237:6;:11;9230:113;;9290:17;:25;9308:6;;;;;;;9290:25;;;;;;;;;;;;9281:34;;9230:113;;;9376:6;9369:13;;;;;;8707:699;8582:843;8556:869;8510:915;9453:31;;;;;;;;;;;;;;8363:1129;;;;:::o;21304:472::-;21399:27;21428:23;21469:38;21510:15;:24;21526:7;21510:24;;;;;;;;;;;21469:65;;21681:18;21658:41;;21738:19;21732:26;21713:45;;21643:126;21304:472;;;:::o;21889:645::-;22031:11;22193:15;22187:4;22183:26;22175:34;;22352:15;22341:9;22337:31;22324:44;;22499:15;22488:9;22485:30;22478:4;22467:9;22464:19;22461:55;22451:65;;21889:645;;;;;:::o;32725:159::-;;;;;:::o;31037:309::-;31172:7;31192:16;2333:3;31218:19;:40;;31192:67;;2333:3;31285:31;31296:4;31302:2;31306:9;31285:10;:31::i;:::-;31277:40;;:61;;31270:68;;;31037:309;;;;;:::o;10961:447::-;11041:14;11209:15;11202:5;11198:27;11189:36;;11383:5;11369:11;11345:22;11341:40;11338:51;11331:5;11328:62;11318:72;;10961:447;;;;:::o;33543:158::-;;;;;:::o;2503:191:7:-;2577:16;2596:6;;;;;;;;;;;2577:25;;2622:8;2613:6;;:17;;;;;;;;;;;;;;;;;;2677:8;2646:40;;2667:8;2646:40;;;;;;;;;;;;2566:128;2503:191;:::o;1179:190:6:-;1304:4;1357;1328:25;1341:5;1348:4;1328:12;:25::i;:::-;:33;1321:40;;1179:190;;;;;:::o;29539:716:2:-;29702:4;29748:2;29723:45;;;29769:19;:17;:19::i;:::-;29790:4;29796:7;29805:5;29723:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;29719:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30023:1;30006:6;:13;:18;30002:235;;30052:40;;;;;;;;;;;;;;30002:235;30195:6;30189:13;30180:6;30176:2;30172:15;30165:38;29719:529;29892:54;;;29882:64;;;:6;:64;;;;29875:71;;;29539:716;;;;;;:::o;427::9:-;483:13;534:14;571:1;551:17;562:5;551:10;:17::i;:::-;:21;534:38;;587:20;621:6;610:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;587:41;;643:11;772:6;768:2;764:15;756:6;752:28;745:35;;809:288;816:4;809:288;;;841:5;;;;;;;;983:8;978:2;971:5;967:14;962:30;957:3;949:44;1039:2;1030:11;;;;;;:::i;:::-;;;;;1073:1;1064:5;:10;809:288;1060:21;809:288;1118:6;1111:13;;;;;427:716;;;:::o;2142:201:7:-;1122:13;:11;:13::i;:::-;2251:1:::1;2231:22;;:8;:22;;::::0;2223:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2307:28;2326:8;2307:18;:28::i;:::-;2142:201:::0;:::o;16356:689:2:-;16487:19;16493:2;16497:8;16487:5;:19::i;:::-;16566:1;16548:2;:14;;;:19;16544:483;;16588:11;16602:13;;16588:27;;16634:13;16656:8;16650:3;:14;16634:30;;16683:233;16714:62;16753:1;16757:2;16761:7;;;;;;16770:5;16714:30;:62::i;:::-;16709:167;;16812:40;;;;;;;;;;;;;;16709:167;16911:3;16903:5;:11;16683:233;;16998:3;16981:13;;:20;16977:34;;17003:8;;;16977:34;16569:458;;16544:483;16356:689;;;:::o;31922:147::-;32059:6;31922:147;;;;;:::o;2046:296:6:-;2129:7;2149:20;2172:4;2149:27;;2192:9;2187:118;2211:5;:12;2207:1;:16;2187:118;;;2260:33;2270:12;2284:5;2290:1;2284:8;;;;;;;;:::i;:::-;;;;;;;;2260:9;:33::i;:::-;2245:48;;2225:3;;;;;:::i;:::-;;;;2187:118;;;;2322:12;2315:19;;;2046:296;;;;:::o;10146:922:5:-;10199:7;10219:14;10236:1;10219:18;;10286:6;10277:5;:15;10273:102;;10322:6;10313:15;;;;;;:::i;:::-;;;;;10357:2;10347:12;;;;10273:102;10402:6;10393:5;:15;10389:102;;10438:6;10429:15;;;;;;:::i;:::-;;;;;10473:2;10463:12;;;;10389:102;10518:6;10509:5;:15;10505:102;;10554:6;10545:15;;;;;;:::i;:::-;;;;;10589:2;10579:12;;;;10505:102;10634:5;10625;:14;10621:99;;10669:5;10660:14;;;;;;:::i;:::-;;;;;10703:1;10693:11;;;;10621:99;10747:5;10738;:14;10734:99;;10782:5;10773:14;;;;;;:::i;:::-;;;;;10816:1;10806:11;;;;10734:99;10860:5;10851;:14;10847:99;;10895:5;10886:14;;;;;;:::i;:::-;;;;;10929:1;10919:11;;;;10847:99;10973:5;10964;:14;10960:66;;11009:1;10999:11;;;;10960:66;11054:6;11047:13;;;10146:922;;;:::o;17318:1537:2:-;17391:20;17414:13;;17391:36;;17456:1;17442:16;;:2;:16;;;17438:48;;17467:19;;;;;;;;;;;;;;17438:48;17513:1;17501:8;:13;17497:44;;17523:18;;;;;;;;;;;;;;17497:44;17554:61;17584:1;17588:2;17592:12;17606:8;17554:21;:61::i;:::-;18097:1;1299:2;18068:1;:25;;18067:31;18055:8;:44;18029:18;:22;18048:2;18029:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;18376:139;18413:2;18467:33;18490:1;18494:2;18498:1;18467:14;:33::i;:::-;18434:30;18455:8;18434:20;:30::i;:::-;:66;18376:18;:139::i;:::-;18342:17;:31;18360:12;18342:31;;;;;;;;;;;:173;;;;18532:15;18550:12;18532:30;;18577:11;18606:8;18591:12;:23;18577:37;;18629:101;18681:9;;;;;;18677:2;18656:35;;18673:1;18656:35;;;;;;;;;;;;18725:3;18715:7;:13;18629:101;;18762:3;18746:13;:19;;;;17803:974;;18787:60;18816:1;18820:2;18824:12;18838:8;18787:20;:60::i;:::-;17380:1475;17318:1537;;:::o;8253:149:6:-;8316:7;8347:1;8343;:5;:51;;8374:20;8389:1;8392;8374:14;:20::i;:::-;8343:51;;;8351:20;8366:1;8369;8351:14;:20::i;:::-;8343:51;8336:58;;8253:149;;;;:::o;12799:322:2:-;12869:14;13100:1;13090:8;13087:15;13062:23;13058:45;13048:55;;12799:322;;;:::o;8410:268:6:-;8478:13;8585:1;8579:4;8572:15;8614:1;8608:4;8601:15;8655:4;8649;8639:21;8630:30;;8410:268;;;;:::o;7:75:10:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:126::-;2897:7;2937:42;2930:5;2926:54;2915:65;;2860:126;;;:::o;2992:96::-;3029:7;3058:24;3076:5;3058:24;:::i;:::-;3047:35;;2992:96;;;:::o;3094:122::-;3167:24;3185:5;3167:24;:::i;:::-;3160:5;3157:35;3147:63;;3206:1;3203;3196:12;3147:63;3094:122;:::o;3222:139::-;3268:5;3306:6;3293:20;3284:29;;3322:33;3349:5;3322:33;:::i;:::-;3222:139;;;;:::o;3367:329::-;3426:6;3475:2;3463:9;3454:7;3450:23;3446:32;3443:119;;;3481:79;;:::i;:::-;3443:119;3601:1;3626:53;3671:7;3662:6;3651:9;3647:22;3626:53;:::i;:::-;3616:63;;3572:117;3367:329;;;;:::o;3702:77::-;3739:7;3768:5;3757:16;;3702:77;;;:::o;3785:122::-;3858:24;3876:5;3858:24;:::i;:::-;3851:5;3848:35;3838:63;;3897:1;3894;3887:12;3838:63;3785:122;:::o;3913:139::-;3959:5;3997:6;3984:20;3975:29;;4013:33;4040:5;4013:33;:::i;:::-;3913:139;;;;:::o;4058:329::-;4117:6;4166:2;4154:9;4145:7;4141:23;4137:32;4134:119;;;4172:79;;:::i;:::-;4134:119;4292:1;4317:53;4362:7;4353:6;4342:9;4338:22;4317:53;:::i;:::-;4307:63;;4263:117;4058:329;;;;:::o;4393:118::-;4480:24;4498:5;4480:24;:::i;:::-;4475:3;4468:37;4393:118;;:::o;4517:222::-;4610:4;4648:2;4637:9;4633:18;4625:26;;4661:71;4729:1;4718:9;4714:17;4705:6;4661:71;:::i;:::-;4517:222;;;;:::o;4745:474::-;4813:6;4821;4870:2;4858:9;4849:7;4845:23;4841:32;4838:119;;;4876:79;;:::i;:::-;4838:119;4996:1;5021:53;5066:7;5057:6;5046:9;5042:22;5021:53;:::i;:::-;5011:63;;4967:117;5123:2;5149:53;5194:7;5185:6;5174:9;5170:22;5149:53;:::i;:::-;5139:63;;5094:118;4745:474;;;;;:::o;5225:117::-;5334:1;5331;5324:12;5348:180;5396:77;5393:1;5386:88;5493:4;5490:1;5483:15;5517:4;5514:1;5507:15;5534:281;5617:27;5639:4;5617:27;:::i;:::-;5609:6;5605:40;5747:6;5735:10;5732:22;5711:18;5699:10;5696:34;5693:62;5690:88;;;5758:18;;:::i;:::-;5690:88;5798:10;5794:2;5787:22;5577:238;5534:281;;:::o;5821:129::-;5855:6;5882:20;;:::i;:::-;5872:30;;5911:33;5939:4;5931:6;5911:33;:::i;:::-;5821:129;;;:::o;5956:311::-;6033:4;6123:18;6115:6;6112:30;6109:56;;;6145:18;;:::i;:::-;6109:56;6195:4;6187:6;6183:17;6175:25;;6255:4;6249;6245:15;6237:23;;5956:311;;;:::o;6273:117::-;6382:1;6379;6372:12;6396:77;6433:7;6462:5;6451:16;;6396:77;;;:::o;6479:122::-;6552:24;6570:5;6552:24;:::i;:::-;6545:5;6542:35;6532:63;;6591:1;6588;6581:12;6532:63;6479:122;:::o;6607:139::-;6653:5;6691:6;6678:20;6669:29;;6707:33;6734:5;6707:33;:::i;:::-;6607:139;;;;:::o;6769:710::-;6865:5;6890:81;6906:64;6963:6;6906:64;:::i;:::-;6890:81;:::i;:::-;6881:90;;6991:5;7020:6;7013:5;7006:21;7054:4;7047:5;7043:16;7036:23;;7107:4;7099:6;7095:17;7087:6;7083:30;7136:3;7128:6;7125:15;7122:122;;;7155:79;;:::i;:::-;7122:122;7270:6;7253:220;7287:6;7282:3;7279:15;7253:220;;;7362:3;7391:37;7424:3;7412:10;7391:37;:::i;:::-;7386:3;7379:50;7458:4;7453:3;7449:14;7442:21;;7329:144;7313:4;7308:3;7304:14;7297:21;;7253:220;;;7257:21;6871:608;;6769:710;;;;;:::o;7502:370::-;7573:5;7622:3;7615:4;7607:6;7603:17;7599:27;7589:122;;7630:79;;:::i;:::-;7589:122;7747:6;7734:20;7772:94;7862:3;7854:6;7847:4;7839:6;7835:17;7772:94;:::i;:::-;7763:103;;7579:293;7502:370;;;;:::o;7878:829::-;7980:6;7988;7996;8045:2;8033:9;8024:7;8020:23;8016:32;8013:119;;;8051:79;;:::i;:::-;8013:119;8199:1;8188:9;8184:17;8171:31;8229:18;8221:6;8218:30;8215:117;;;8251:79;;:::i;:::-;8215:117;8356:78;8426:7;8417:6;8406:9;8402:22;8356:78;:::i;:::-;8346:88;;8142:302;8483:2;8509:53;8554:7;8545:6;8534:9;8530:22;8509:53;:::i;:::-;8499:63;;8454:118;8611:2;8637:53;8682:7;8673:6;8662:9;8658:22;8637:53;:::i;:::-;8627:63;;8582:118;7878:829;;;;;:::o;8713:118::-;8800:24;8818:5;8800:24;:::i;:::-;8795:3;8788:37;8713:118;;:::o;8837:222::-;8930:4;8968:2;8957:9;8953:18;8945:26;;8981:71;9049:1;9038:9;9034:17;9025:6;8981:71;:::i;:::-;8837:222;;;;:::o;9065:619::-;9142:6;9150;9158;9207:2;9195:9;9186:7;9182:23;9178:32;9175:119;;;9213:79;;:::i;:::-;9175:119;9333:1;9358:53;9403:7;9394:6;9383:9;9379:22;9358:53;:::i;:::-;9348:63;;9304:117;9460:2;9486:53;9531:7;9522:6;9511:9;9507:22;9486:53;:::i;:::-;9476:63;;9431:118;9588:2;9614:53;9659:7;9650:6;9639:9;9635:22;9614:53;:::i;:::-;9604:63;;9559:118;9065:619;;;;;:::o;9690:118::-;9777:24;9795:5;9777:24;:::i;:::-;9772:3;9765:37;9690:118;;:::o;9814:222::-;9907:4;9945:2;9934:9;9930:18;9922:26;;9958:71;10026:1;10015:9;10011:17;10002:6;9958:71;:::i;:::-;9814:222;;;;:::o;10042:116::-;10112:21;10127:5;10112:21;:::i;:::-;10105:5;10102:32;10092:60;;10148:1;10145;10138:12;10092:60;10042:116;:::o;10164:133::-;10207:5;10245:6;10232:20;10223:29;;10261:30;10285:5;10261:30;:::i;:::-;10164:133;;;;:::o;10303:468::-;10368:6;10376;10425:2;10413:9;10404:7;10400:23;10396:32;10393:119;;;10431:79;;:::i;:::-;10393:119;10551:1;10576:53;10621:7;10612:6;10601:9;10597:22;10576:53;:::i;:::-;10566:63;;10522:117;10678:2;10704:50;10746:7;10737:6;10726:9;10722:22;10704:50;:::i;:::-;10694:60;;10649:115;10303:468;;;;;:::o;10777:117::-;10886:1;10883;10876:12;10914:553;10972:8;10982:6;11032:3;11025:4;11017:6;11013:17;11009:27;10999:122;;11040:79;;:::i;:::-;10999:122;11153:6;11140:20;11130:30;;11183:18;11175:6;11172:30;11169:117;;;11205:79;;:::i;:::-;11169:117;11319:4;11311:6;11307:17;11295:29;;11373:3;11365:4;11357:6;11353:17;11343:8;11339:32;11336:41;11333:128;;;11380:79;;:::i;:::-;11333:128;10914:553;;;;;:::o;11473:529::-;11544:6;11552;11601:2;11589:9;11580:7;11576:23;11572:32;11569:119;;;11607:79;;:::i;:::-;11569:119;11755:1;11744:9;11740:17;11727:31;11785:18;11777:6;11774:30;11771:117;;;11807:79;;:::i;:::-;11771:117;11920:65;11977:7;11968:6;11957:9;11953:22;11920:65;:::i;:::-;11902:83;;;;11698:297;11473:529;;;;;:::o;12025:568::-;12098:8;12108:6;12158:3;12151:4;12143:6;12139:17;12135:27;12125:122;;12166:79;;:::i;:::-;12125:122;12279:6;12266:20;12256:30;;12309:18;12301:6;12298:30;12295:117;;;12331:79;;:::i;:::-;12295:117;12445:4;12437:6;12433:17;12421:29;;12499:3;12491:4;12483:6;12479:17;12469:8;12465:32;12462:41;12459:128;;;12506:79;;:::i;:::-;12459:128;12025:568;;;;;:::o;12616:::-;12689:8;12699:6;12749:3;12742:4;12734:6;12730:17;12726:27;12716:122;;12757:79;;:::i;:::-;12716:122;12870:6;12857:20;12847:30;;12900:18;12892:6;12889:30;12886:117;;;12922:79;;:::i;:::-;12886:117;13036:4;13028:6;13024:17;13012:29;;13090:3;13082:4;13074:6;13070:17;13060:8;13056:32;13053:41;13050:128;;;13097:79;;:::i;:::-;13050:128;12616:568;;;;;:::o;13190:934::-;13312:6;13320;13328;13336;13385:2;13373:9;13364:7;13360:23;13356:32;13353:119;;;13391:79;;:::i;:::-;13353:119;13539:1;13528:9;13524:17;13511:31;13569:18;13561:6;13558:30;13555:117;;;13591:79;;:::i;:::-;13555:117;13704:80;13776:7;13767:6;13756:9;13752:22;13704:80;:::i;:::-;13686:98;;;;13482:312;13861:2;13850:9;13846:18;13833:32;13892:18;13884:6;13881:30;13878:117;;;13914:79;;:::i;:::-;13878:117;14027:80;14099:7;14090:6;14079:9;14075:22;14027:80;:::i;:::-;14009:98;;;;13804:313;13190:934;;;;;;;:::o;14130:329::-;14189:6;14238:2;14226:9;14217:7;14213:23;14209:32;14206:119;;;14244:79;;:::i;:::-;14206:119;14364:1;14389:53;14434:7;14425:6;14414:9;14410:22;14389:53;:::i;:::-;14379:63;;14335:117;14130:329;;;;:::o;14465:829::-;14567:6;14575;14583;14632:2;14620:9;14611:7;14607:23;14603:32;14600:119;;;14638:79;;:::i;:::-;14600:119;14758:1;14783:53;14828:7;14819:6;14808:9;14804:22;14783:53;:::i;:::-;14773:63;;14729:117;14913:2;14902:9;14898:18;14885:32;14944:18;14936:6;14933:30;14930:117;;;14966:79;;:::i;:::-;14930:117;15071:78;15141:7;15132:6;15121:9;15117:22;15071:78;:::i;:::-;15061:88;;14856:303;15198:2;15224:53;15269:7;15260:6;15249:9;15245:22;15224:53;:::i;:::-;15214:63;;15169:118;14465:829;;;;;:::o;15300:474::-;15368:6;15376;15425:2;15413:9;15404:7;15400:23;15396:32;15393:119;;;15431:79;;:::i;:::-;15393:119;15551:1;15576:53;15621:7;15612:6;15601:9;15597:22;15576:53;:::i;:::-;15566:63;;15522:117;15678:2;15704:53;15749:7;15740:6;15729:9;15725:22;15704:53;:::i;:::-;15694:63;;15649:118;15300:474;;;;;:::o;15780:117::-;15889:1;15886;15879:12;15903:307;15964:4;16054:18;16046:6;16043:30;16040:56;;;16076:18;;:::i;:::-;16040:56;16114:29;16136:6;16114:29;:::i;:::-;16106:37;;16198:4;16192;16188:15;16180:23;;15903:307;;;:::o;16216:146::-;16313:6;16308:3;16303;16290:30;16354:1;16345:6;16340:3;16336:16;16329:27;16216:146;;;:::o;16368:423::-;16445:5;16470:65;16486:48;16527:6;16486:48;:::i;:::-;16470:65;:::i;:::-;16461:74;;16558:6;16551:5;16544:21;16596:4;16589:5;16585:16;16634:3;16625:6;16620:3;16616:16;16613:25;16610:112;;;16641:79;;:::i;:::-;16610:112;16731:54;16778:6;16773:3;16768;16731:54;:::i;:::-;16451:340;16368:423;;;;;:::o;16810:338::-;16865:5;16914:3;16907:4;16899:6;16895:17;16891:27;16881:122;;16922:79;;:::i;:::-;16881:122;17039:6;17026:20;17064:78;17138:3;17130:6;17123:4;17115:6;17111:17;17064:78;:::i;:::-;17055:87;;16871:277;16810:338;;;;:::o;17154:943::-;17249:6;17257;17265;17273;17322:3;17310:9;17301:7;17297:23;17293:33;17290:120;;;17329:79;;:::i;:::-;17290:120;17449:1;17474:53;17519:7;17510:6;17499:9;17495:22;17474:53;:::i;:::-;17464:63;;17420:117;17576:2;17602:53;17647:7;17638:6;17627:9;17623:22;17602:53;:::i;:::-;17592:63;;17547:118;17704:2;17730:53;17775:7;17766:6;17755:9;17751:22;17730:53;:::i;:::-;17720:63;;17675:118;17860:2;17849:9;17845:18;17832:32;17891:18;17883:6;17880:30;17877:117;;;17913:79;;:::i;:::-;17877:117;18018:62;18072:7;18063:6;18052:9;18048:22;18018:62;:::i;:::-;18008:72;;17803:287;17154:943;;;;;;;:::o;18103:462::-;18165:6;18173;18222:2;18210:9;18201:7;18197:23;18193:32;18190:119;;;18228:79;;:::i;:::-;18190:119;18348:1;18373:50;18415:7;18406:6;18395:9;18391:22;18373:50;:::i;:::-;18363:60;;18319:114;18472:2;18498:50;18540:7;18531:6;18520:9;18516:22;18498:50;:::i;:::-;18488:60;;18443:115;18103:462;;;;;:::o;18571:474::-;18639:6;18647;18696:2;18684:9;18675:7;18671:23;18667:32;18664:119;;;18702:79;;:::i;:::-;18664:119;18822:1;18847:53;18892:7;18883:6;18872:9;18868:22;18847:53;:::i;:::-;18837:63;;18793:117;18949:2;18975:53;19020:7;19011:6;19000:9;18996:22;18975:53;:::i;:::-;18965:63;;18920:118;18571:474;;;;;:::o;19051:180::-;19099:77;19096:1;19089:88;19196:4;19193:1;19186:15;19220:4;19217:1;19210:15;19237:320;19281:6;19318:1;19312:4;19308:12;19298:22;;19365:1;19359:4;19355:12;19386:18;19376:81;;19442:4;19434:6;19430:17;19420:27;;19376:81;19504:2;19496:6;19493:14;19473:18;19470:38;19467:84;;19523:18;;:::i;:::-;19467:84;19288:269;19237:320;;;:::o;19563:180::-;19611:77;19608:1;19601:88;19708:4;19705:1;19698:15;19732:4;19729:1;19722:15;19749:191;19789:3;19808:20;19826:1;19808:20;:::i;:::-;19803:25;;19842:20;19860:1;19842:20;:::i;:::-;19837:25;;19885:1;19882;19878:9;19871:16;;19906:3;19903:1;19900:10;19897:36;;;19913:18;;:::i;:::-;19897:36;19749:191;;;;:::o;19946:164::-;20086:16;20082:1;20074:6;20070:14;20063:40;19946:164;:::o;20116:366::-;20258:3;20279:67;20343:2;20338:3;20279:67;:::i;:::-;20272:74;;20355:93;20444:3;20355:93;:::i;:::-;20473:2;20468:3;20464:12;20457:19;;20116:366;;;:::o;20488:419::-;20654:4;20692:2;20681:9;20677:18;20669:26;;20741:9;20735:4;20731:20;20727:1;20716:9;20712:17;20705:47;20769:131;20895:4;20769:131;:::i;:::-;20761:139;;20488:419;;;:::o;20913:160::-;21053:12;21049:1;21041:6;21037:14;21030:36;20913:160;:::o;21079:366::-;21221:3;21242:67;21306:2;21301:3;21242:67;:::i;:::-;21235:74;;21318:93;21407:3;21318:93;:::i;:::-;21436:2;21431:3;21427:12;21420:19;;21079:366;;;:::o;21451:419::-;21617:4;21655:2;21644:9;21640:18;21632:26;;21704:9;21698:4;21694:20;21690:1;21679:9;21675:17;21668:47;21732:131;21858:4;21732:131;:::i;:::-;21724:139;;21451:419;;;:::o;21876:348::-;21916:7;21939:20;21957:1;21939:20;:::i;:::-;21934:25;;21973:20;21991:1;21973:20;:::i;:::-;21968:25;;22161:1;22093:66;22089:74;22086:1;22083:81;22078:1;22071:9;22064:17;22060:105;22057:131;;;22168:18;;:::i;:::-;22057:131;22216:1;22213;22209:9;22198:20;;21876:348;;;;:::o;22230:162::-;22370:14;22366:1;22358:6;22354:14;22347:38;22230:162;:::o;22398:366::-;22540:3;22561:67;22625:2;22620:3;22561:67;:::i;:::-;22554:74;;22637:93;22726:3;22637:93;:::i;:::-;22755:2;22750:3;22746:12;22739:19;;22398:366;;;:::o;22770:419::-;22936:4;22974:2;22963:9;22959:18;22951:26;;23023:9;23017:4;23013:20;23009:1;22998:9;22994:17;22987:47;23051:131;23177:4;23051:131;:::i;:::-;23043:139;;22770:419;;;:::o;23195:180::-;23335:32;23331:1;23323:6;23319:14;23312:56;23195:180;:::o;23381:366::-;23523:3;23544:67;23608:2;23603:3;23544:67;:::i;:::-;23537:74;;23620:93;23709:3;23620:93;:::i;:::-;23738:2;23733:3;23729:12;23722:19;;23381:366;;;:::o;23753:419::-;23919:4;23957:2;23946:9;23942:18;23934:26;;24006:9;24000:4;23996:20;23992:1;23981:9;23977:17;23970:47;24034:131;24160:4;24034:131;:::i;:::-;24026:139;;23753:419;;;:::o;24178:165::-;24318:17;24314:1;24306:6;24302:14;24295:41;24178:165;:::o;24349:366::-;24491:3;24512:67;24576:2;24571:3;24512:67;:::i;:::-;24505:74;;24588:93;24677:3;24588:93;:::i;:::-;24706:2;24701:3;24697:12;24690:19;;24349:366;;;:::o;24721:419::-;24887:4;24925:2;24914:9;24910:18;24902:26;;24974:9;24968:4;24964:20;24960:1;24949:9;24945:17;24938:47;25002:131;25128:4;25002:131;:::i;:::-;24994:139;;24721:419;;;:::o;25146:222::-;25286:34;25282:1;25274:6;25270:14;25263:58;25355:5;25350:2;25342:6;25338:15;25331:30;25146:222;:::o;25374:366::-;25516:3;25537:67;25601:2;25596:3;25537:67;:::i;:::-;25530:74;;25613:93;25702:3;25613:93;:::i;:::-;25731:2;25726:3;25722:12;25715:19;;25374:366;;;:::o;25746:419::-;25912:4;25950:2;25939:9;25935:18;25927:26;;25999:9;25993:4;25989:20;25985:1;25974:9;25970:17;25963:47;26027:131;26153:4;26027:131;:::i;:::-;26019:139;;25746:419;;;:::o;26171:168::-;26311:20;26307:1;26299:6;26295:14;26288:44;26171:168;:::o;26345:366::-;26487:3;26508:67;26572:2;26567:3;26508:67;:::i;:::-;26501:74;;26584:93;26673:3;26584:93;:::i;:::-;26702:2;26697:3;26693:12;26686:19;;26345:366;;;:::o;26717:419::-;26883:4;26921:2;26910:9;26906:18;26898:26;;26970:9;26964:4;26960:20;26956:1;26945:9;26941:17;26934:47;26998:131;27124:4;26998:131;:::i;:::-;26990:139;;26717:419;;;:::o;27142:166::-;27282:18;27278:1;27270:6;27266:14;27259:42;27142:166;:::o;27314:366::-;27456:3;27477:67;27541:2;27536:3;27477:67;:::i;:::-;27470:74;;27553:93;27642:3;27553:93;:::i;:::-;27671:2;27666:3;27662:12;27655:19;;27314:366;;;:::o;27686:419::-;27852:4;27890:2;27879:9;27875:18;27867:26;;27939:9;27933:4;27929:20;27925:1;27914:9;27910:17;27903:47;27967:131;28093:4;27967:131;:::i;:::-;27959:139;;27686:419;;;:::o;28111:147::-;28212:11;28249:3;28234:18;;28111:147;;;;:::o;28264:114::-;;:::o;28384:398::-;28543:3;28564:83;28645:1;28640:3;28564:83;:::i;:::-;28557:90;;28656:93;28745:3;28656:93;:::i;:::-;28774:1;28769:3;28765:11;28758:18;;28384:398;;;:::o;28788:379::-;28972:3;28994:147;29137:3;28994:147;:::i;:::-;28987:154;;29158:3;29151:10;;28788:379;;;:::o;29173:165::-;29313:17;29309:1;29301:6;29297:14;29290:41;29173:165;:::o;29344:366::-;29486:3;29507:67;29571:2;29566:3;29507:67;:::i;:::-;29500:74;;29583:93;29672:3;29583:93;:::i;:::-;29701:2;29696:3;29692:12;29685:19;;29344:366;;;:::o;29716:419::-;29882:4;29920:2;29909:9;29905:18;29897:26;;29969:9;29963:4;29959:20;29955:1;29944:9;29940:17;29933:47;29997:131;30123:4;29997:131;:::i;:::-;29989:139;;29716:419;;;:::o;30141:97::-;30200:6;30228:3;30218:13;;30141:97;;;;:::o;30244:141::-;30293:4;30316:3;30308:11;;30339:3;30336:1;30329:14;30373:4;30370:1;30360:18;30352:26;;30244:141;;;:::o;30391:93::-;30428:6;30475:2;30470;30463:5;30459:14;30455:23;30445:33;;30391:93;;;:::o;30490:107::-;30534:8;30584:5;30578:4;30574:16;30553:37;;30490:107;;;;:::o;30603:393::-;30672:6;30722:1;30710:10;30706:18;30745:97;30775:66;30764:9;30745:97;:::i;:::-;30863:39;30893:8;30882:9;30863:39;:::i;:::-;30851:51;;30935:4;30931:9;30924:5;30920:21;30911:30;;30984:4;30974:8;30970:19;30963:5;30960:30;30950:40;;30679:317;;30603:393;;;;;:::o;31002:60::-;31030:3;31051:5;31044:12;;31002:60;;;:::o;31068:142::-;31118:9;31151:53;31169:34;31178:24;31196:5;31178:24;:::i;:::-;31169:34;:::i;:::-;31151:53;:::i;:::-;31138:66;;31068:142;;;:::o;31216:75::-;31259:3;31280:5;31273:12;;31216:75;;;:::o;31297:269::-;31407:39;31438:7;31407:39;:::i;:::-;31468:91;31517:41;31541:16;31517:41;:::i;:::-;31509:6;31502:4;31496:11;31468:91;:::i;:::-;31462:4;31455:105;31373:193;31297:269;;;:::o;31572:73::-;31617:3;31572:73;:::o;31651:189::-;31728:32;;:::i;:::-;31769:65;31827:6;31819;31813:4;31769:65;:::i;:::-;31704:136;31651:189;;:::o;31846:186::-;31906:120;31923:3;31916:5;31913:14;31906:120;;;31977:39;32014:1;32007:5;31977:39;:::i;:::-;31950:1;31943:5;31939:13;31930:22;;31906:120;;;31846:186;;:::o;32038:543::-;32139:2;32134:3;32131:11;32128:446;;;32173:38;32205:5;32173:38;:::i;:::-;32257:29;32275:10;32257:29;:::i;:::-;32247:8;32243:44;32440:2;32428:10;32425:18;32422:49;;;32461:8;32446:23;;32422:49;32484:80;32540:22;32558:3;32540:22;:::i;:::-;32530:8;32526:37;32513:11;32484:80;:::i;:::-;32143:431;;32128:446;32038:543;;;:::o;32587:117::-;32641:8;32691:5;32685:4;32681:16;32660:37;;32587:117;;;;:::o;32710:169::-;32754:6;32787:51;32835:1;32831:6;32823:5;32820:1;32816:13;32787:51;:::i;:::-;32783:56;32868:4;32862;32858:15;32848:25;;32761:118;32710:169;;;;:::o;32884:295::-;32960:4;33106:29;33131:3;33125:4;33106:29;:::i;:::-;33098:37;;33168:3;33165:1;33161:11;33155:4;33152:21;33144:29;;32884:295;;;;:::o;33184:1403::-;33308:44;33348:3;33343;33308:44;:::i;:::-;33417:18;33409:6;33406:30;33403:56;;;33439:18;;:::i;:::-;33403:56;33483:38;33515:4;33509:11;33483:38;:::i;:::-;33568:67;33628:6;33620;33614:4;33568:67;:::i;:::-;33662:1;33691:2;33683:6;33680:14;33708:1;33703:632;;;;34379:1;34396:6;34393:84;;;34452:9;34447:3;34443:19;34430:33;34421:42;;34393:84;34503:67;34563:6;34556:5;34503:67;:::i;:::-;34497:4;34490:81;34352:229;33673:908;;33703:632;33755:4;33751:9;33743:6;33739:22;33789:37;33821:4;33789:37;:::i;:::-;33848:1;33862:215;33876:7;33873:1;33870:14;33862:215;;;33962:9;33957:3;33953:19;33940:33;33932:6;33925:49;34013:1;34005:6;34001:14;33991:24;;34060:2;34049:9;34045:18;34032:31;;33899:4;33896:1;33892:12;33887:17;;33862:215;;;34105:6;34096:7;34093:19;34090:186;;;34170:9;34165:3;34161:19;34148:33;34213:48;34255:4;34247:6;34243:17;34232:9;34213:48;:::i;:::-;34205:6;34198:64;34113:163;34090:186;34322:1;34318;34310:6;34306:14;34302:22;34296:4;34289:36;33710:625;;;33673:908;;33283:1304;;;33184:1403;;;:::o;34617:317::-;34715:3;34736:71;34800:6;34795:3;34736:71;:::i;:::-;34729:78;;34817:56;34866:6;34861:3;34854:5;34817:56;:::i;:::-;34898:29;34920:6;34898:29;:::i;:::-;34893:3;34889:39;34882:46;;34617:317;;;;;:::o;34940:333::-;35063:4;35101:2;35090:9;35086:18;35078:26;;35150:9;35144:4;35140:20;35136:1;35125:9;35121:17;35114:47;35178:88;35261:4;35252:6;35244;35178:88;:::i;:::-;35170:96;;34940:333;;;;;:::o;35279:223::-;35419:34;35415:1;35407:6;35403:14;35396:58;35488:6;35483:2;35475:6;35471:15;35464:31;35279:223;:::o;35508:366::-;35650:3;35671:67;35735:2;35730:3;35671:67;:::i;:::-;35664:74;;35747:93;35836:3;35747:93;:::i;:::-;35865:2;35860:3;35856:12;35849:19;;35508:366;;;:::o;35880:419::-;36046:4;36084:2;36073:9;36069:18;36061:26;;36133:9;36127:4;36123:20;36119:1;36108:9;36104:17;36097:47;36161:131;36287:4;36161:131;:::i;:::-;36153:139;;35880:419;;;:::o;36305:182::-;36445:34;36441:1;36433:6;36429:14;36422:58;36305:182;:::o;36493:366::-;36635:3;36656:67;36720:2;36715:3;36656:67;:::i;:::-;36649:74;;36732:93;36821:3;36732:93;:::i;:::-;36850:2;36845:3;36841:12;36834:19;;36493:366;;;:::o;36865:419::-;37031:4;37069:2;37058:9;37054:18;37046:26;;37118:9;37112:4;37108:20;37104:1;37093:9;37089:17;37082:47;37146:131;37272:4;37146:131;:::i;:::-;37138:139;;36865:419;;;:::o;37290:180::-;37338:77;37335:1;37328:88;37435:4;37432:1;37425:15;37459:4;37456:1;37449:15;37476:233;37515:3;37538:24;37556:5;37538:24;:::i;:::-;37529:33;;37584:66;37577:5;37574:77;37571:103;;37654:18;;:::i;:::-;37571:103;37701:1;37694:5;37690:13;37683:20;;37476:233;;;:::o;37715:94::-;37748:8;37796:5;37792:2;37788:14;37767:35;;37715:94;;;:::o;37815:::-;37854:7;37883:20;37897:5;37883:20;:::i;:::-;37872:31;;37815:94;;;:::o;37915:100::-;37954:7;37983:26;38003:5;37983:26;:::i;:::-;37972:37;;37915:100;;;:::o;38021:157::-;38126:45;38146:24;38164:5;38146:24;:::i;:::-;38126:45;:::i;:::-;38121:3;38114:58;38021:157;;:::o;38184:79::-;38223:7;38252:5;38241:16;;38184:79;;;:::o;38269:157::-;38374:45;38394:24;38412:5;38394:24;:::i;:::-;38374:45;:::i;:::-;38369:3;38362:58;38269:157;;:::o;38432:397::-;38572:3;38587:75;38658:3;38649:6;38587:75;:::i;:::-;38687:2;38682:3;38678:12;38671:19;;38700:75;38771:3;38762:6;38700:75;:::i;:::-;38800:2;38795:3;38791:12;38784:19;;38820:3;38813:10;;38432:397;;;;;:::o;38835:79::-;38874:7;38903:5;38892:16;;38835:79;;;:::o;38920:157::-;39025:45;39045:24;39063:5;39045:24;:::i;:::-;39025:45;:::i;:::-;39020:3;39013:58;38920:157;;:::o;39083:256::-;39195:3;39210:75;39281:3;39272:6;39210:75;:::i;:::-;39310:2;39305:3;39301:12;39294:19;;39330:3;39323:10;;39083:256;;;;:::o;39345:169::-;39485:21;39481:1;39473:6;39469:14;39462:45;39345:169;:::o;39520:366::-;39662:3;39683:67;39747:2;39742:3;39683:67;:::i;:::-;39676:74;;39759:93;39848:3;39759:93;:::i;:::-;39877:2;39872:3;39868:12;39861:19;;39520:366;;;:::o;39892:419::-;40058:4;40096:2;40085:9;40081:18;40073:26;;40145:9;40139:4;40135:20;40131:1;40120:9;40116:17;40109:47;40173:131;40299:4;40173:131;:::i;:::-;40165:139;;39892:419;;;:::o;40317:148::-;40419:11;40456:3;40441:18;;40317:148;;;;:::o;40495:874::-;40598:3;40635:5;40629:12;40664:36;40690:9;40664:36;:::i;:::-;40716:89;40798:6;40793:3;40716:89;:::i;:::-;40709:96;;40836:1;40825:9;40821:17;40852:1;40847:166;;;;41027:1;41022:341;;;;40814:549;;40847:166;40931:4;40927:9;40916;40912:25;40907:3;40900:38;40993:6;40986:14;40979:22;40971:6;40967:35;40962:3;40958:45;40951:52;;40847:166;;41022:341;41089:38;41121:5;41089:38;:::i;:::-;41149:1;41163:154;41177:6;41174:1;41171:13;41163:154;;;41251:7;41245:14;41241:1;41236:3;41232:11;41225:35;41301:1;41292:7;41288:15;41277:26;;41199:4;41196:1;41192:12;41187:17;;41163:154;;;41346:6;41341:3;41337:16;41330:23;;41029:334;;40814:549;;40602:767;;40495:874;;;;:::o;41375:390::-;41481:3;41509:39;41542:5;41509:39;:::i;:::-;41564:89;41646:6;41641:3;41564:89;:::i;:::-;41557:96;;41662:65;41720:6;41715:3;41708:4;41701:5;41697:16;41662:65;:::i;:::-;41752:6;41747:3;41743:16;41736:23;;41485:280;41375:390;;;;:::o;41771:583::-;41993:3;42015:92;42103:3;42094:6;42015:92;:::i;:::-;42008:99;;42124:95;42215:3;42206:6;42124:95;:::i;:::-;42117:102;;42236:92;42324:3;42315:6;42236:92;:::i;:::-;42229:99;;42345:3;42338:10;;41771:583;;;;;;:::o;42360:165::-;42500:17;42496:1;42488:6;42484:14;42477:41;42360:165;:::o;42531:366::-;42673:3;42694:67;42758:2;42753:3;42694:67;:::i;:::-;42687:74;;42770:93;42859:3;42770:93;:::i;:::-;42888:2;42883:3;42879:12;42872:19;;42531:366;;;:::o;42903:419::-;43069:4;43107:2;43096:9;43092:18;43084:26;;43156:9;43150:4;43146:20;43142:1;43131:9;43127:17;43120:47;43184:131;43310:4;43184:131;:::i;:::-;43176:139;;42903:419;;;:::o;43328:182::-;43468:34;43464:1;43456:6;43452:14;43445:58;43328:182;:::o;43516:366::-;43658:3;43679:67;43743:2;43738:3;43679:67;:::i;:::-;43672:74;;43755:93;43844:3;43755:93;:::i;:::-;43873:2;43868:3;43864:12;43857:19;;43516:366;;;:::o;43888:419::-;44054:4;44092:2;44081:9;44077:18;44069:26;;44141:9;44135:4;44131:20;44127:1;44116:9;44112:17;44105:47;44169:131;44295:4;44169:131;:::i;:::-;44161:139;;43888:419;;;:::o;44313:181::-;44453:33;44449:1;44441:6;44437:14;44430:57;44313:181;:::o;44500:366::-;44642:3;44663:67;44727:2;44722:3;44663:67;:::i;:::-;44656:74;;44739:93;44828:3;44739:93;:::i;:::-;44857:2;44852:3;44848:12;44841:19;;44500:366;;;:::o;44872:419::-;45038:4;45076:2;45065:9;45061:18;45053:26;;45125:9;45119:4;45115:20;45111:1;45100:9;45096:17;45089:47;45153:131;45279:4;45153:131;:::i;:::-;45145:139;;44872:419;;;:::o;45297:98::-;45348:6;45382:5;45376:12;45366:22;;45297:98;;;:::o;45401:168::-;45484:11;45518:6;45513:3;45506:19;45558:4;45553:3;45549:14;45534:29;;45401:168;;;;:::o;45575:373::-;45661:3;45689:38;45721:5;45689:38;:::i;:::-;45743:70;45806:6;45801:3;45743:70;:::i;:::-;45736:77;;45822:65;45880:6;45875:3;45868:4;45861:5;45857:16;45822:65;:::i;:::-;45912:29;45934:6;45912:29;:::i;:::-;45907:3;45903:39;45896:46;;45665:283;45575:373;;;;:::o;45954:640::-;46149:4;46187:3;46176:9;46172:19;46164:27;;46201:71;46269:1;46258:9;46254:17;46245:6;46201:71;:::i;:::-;46282:72;46350:2;46339:9;46335:18;46326:6;46282:72;:::i;:::-;46364;46432:2;46421:9;46417:18;46408:6;46364:72;:::i;:::-;46483:9;46477:4;46473:20;46468:2;46457:9;46453:18;46446:48;46511:76;46582:4;46573:6;46511:76;:::i;:::-;46503:84;;45954:640;;;;;;;:::o;46600:141::-;46656:5;46687:6;46681:13;46672:22;;46703:32;46729:5;46703:32;:::i;:::-;46600:141;;;;:::o;46747:349::-;46816:6;46865:2;46853:9;46844:7;46840:23;46836:32;46833:119;;;46871:79;;:::i;:::-;46833:119;46991:1;47016:63;47071:7;47062:6;47051:9;47047:22;47016:63;:::i;:::-;47006:73;;46962:127;46747:349;;;;:::o;47102:180::-;47150:77;47147:1;47140:88;47247:4;47244:1;47237:15;47271:4;47268:1;47261:15;47288:225;47428:34;47424:1;47416:6;47412:14;47405:58;47497:8;47492:2;47484:6;47480:15;47473:33;47288:225;:::o;47519:366::-;47661:3;47682:67;47746:2;47741:3;47682:67;:::i;:::-;47675:74;;47758:93;47847:3;47758:93;:::i;:::-;47876:2;47871:3;47867:12;47860:19;;47519:366;;;:::o;47891:419::-;48057:4;48095:2;48084:9;48080:18;48072:26;;48144:9;48138:4;48134:20;48130:1;48119:9;48115:17;48108:47;48172:131;48298:4;48172:131;:::i;:::-;48164:139;;47891:419;;;:::o

Swarm Source

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