ETH Price: $3,462.89 (+2.03%)
Gas: 18 Gwei

Contract

0x20DB8237E76B160c3aa2030c07C8e6Ca0d3F07E5
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
0x60806040175184362023-06-20 4:08:35377 days ago1687234115IN
 Create: EmblemVault
0 ETH0.061663914.44661272

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
EmblemVault

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 1 runs

Other Settings:
default evmVersion
File 1 of 19 : EmblemVault.sol
// SPDX-License-Identifier: CLOSED - Pending Licensing Audit
pragma solidity ^0.8.4;
pragma experimental ABIEncoderV2;
import "./SafeMath.sol";
import "./ERC165.sol";
import "./HasRegistration.sol";
import "./IHandlerCallback.sol";
import "./IsBypassable.sol";
import "./Clonable.sol";
import "./Stream.sol";
import "./ERC2981Royalties.sol";
import "./EventableERC721.sol";
import "operator-filter-registry/src/upgradeable/OperatorFiltererUpgradeable.sol";

library AddressUtils {

  
  function isContract(
    address _addr
  )
    internal
    view
    returns (bool addressCheck)
  {
    
    bytes32 codehash;
    bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
    assembly { codehash := extcodehash(_addr) } // solhint-disable-line
    addressCheck = (codehash != 0x0 && codehash != accountHash);
  }

}

contract NFToken is ERC165, HasRegistration, EventableERC721, OperatorFiltererUpgradeable {
  using SafeMath for uint256;
  using AddressUtils for address;

  /**
   * List of revert message codes. Implementing dApp should handle showing the correct message.
   * Based on 0xcert framework error codes.
   */
  string constant ZERO_ADDRESS = "003001";
  string constant NOT_VALID_NFT = "003002";
  string constant NOT_OWNER_OR_OPERATOR = "003003";
  string constant NOT_OWNER_APPROVED_OR_OPERATOR = "003004";
  string constant NOT_ABLE_TO_RECEIVE_NFT = "003005";
  string constant NFT_ALREADY_EXISTS = "003006";
  string constant NOT_OWNER = "003007";
  string constant IS_OWNER = "003008";

  /**
   * @dev Magic value of a smart contract that can recieve NFT.
   * Equal to: bytes4(keccak256("onERC721Received(address,address,uint256,bytes)")).
   */
  bytes4 internal constant MAGIC_ON_ERC721_RECEIVED = 0x150b7a02;

  /**
   * @dev A mapping from NFT ID to the address that owns it.
   */
  mapping (uint256 => address) internal idToOwner;

  /**
   * @dev Mapping from NFT ID to approved address.
   */
  mapping (uint256 => address) internal idToApproval;

   /**
   * @dev Mapping from owner address to count of his tokens.
   */
  mapping (address => uint256) private ownerToNFTokenCount;

  /**
   * @dev Mapping from owner address to mapping of operator addresses.
   */
  mapping (address => mapping (address => bool)) internal ownerToOperators;

  /**
   * @dev Guarantees that the msg.sender is an owner or operator of the given NFT.
   * @param _tokenId ID of the NFT to validate.
   */
  modifier canOperate(
    uint256 _tokenId
  )
  {
    address tokenOwner = idToOwner[_tokenId];
    require(tokenOwner == _msgSender() || ownerToOperators[tokenOwner][_msgSender()], NOT_OWNER_OR_OPERATOR);
    _;
  }

  /**
   * @dev Guarantees that the msg.sender is allowed to transfer NFT.
   * @param _tokenId ID of the NFT to transfer.
   */
  modifier canTransfer(uint256 _tokenId) {
    bool _canBypass = canBypassForTokenId(_tokenId);
    bool hasOldBalance;
    
    address tokenOwner = idToOwner[_tokenId];
    require(
      tokenOwner == _msgSender()
      || idToApproval[_tokenId] == _msgSender()
      || ownerToOperators[tokenOwner][_msgSender()]
      || _canBypass,
      NOT_OWNER_APPROVED_OR_OPERATOR
    );
    _;
  }


  modifier validNFToken(    uint256 _tokenId  )  {
    require(idToOwner[_tokenId] != address(0), NOT_VALID_NFT);
    _;
  }

  function makeEvents(address[] calldata _from, address[] calldata _to, uint256[] calldata tokenIds) public onlyOwner override {
    EventableERC721.makeEvents(_from, _to, tokenIds);
  }

  function safeTransferFrom(
    address _from,
    address _to,
    uint256 _tokenId,
    bytes calldata _data
  )
    external
    override
  {
    _safeTransferFrom(_from, _to, _tokenId, _data);
  }
  function safeTransferFrom(
    address _from,
    address _to,
    uint256 _tokenId
  )
    external
    override
  {
    _safeTransferFrom(_from, _to, _tokenId, "");
  }

  function transferFrom(address _from, address _to, uint256 _tokenId) external override onlyAllowedOperatorApproval(_from) canTransfer(_tokenId) validNFToken(_tokenId) {
    address tokenOwner = idToOwner[_tokenId];
    require(tokenOwner == _from, NOT_OWNER);
    _transfer(_to, _tokenId);
  }

  function approve(
    address _approved,
    uint256 _tokenId
  )
    external
    override
    onlyAllowedOperatorApproval(_approved)
    canOperate(_tokenId)
    validNFToken(_tokenId)
  {
    address tokenOwner = idToOwner[_tokenId];
    require(_approved != tokenOwner, IS_OWNER);

    idToApproval[_tokenId] = _approved;
    emit Approval(tokenOwner, _approved, _tokenId);
  }

  function setApprovalForAll(
    address _operator,
    bool _approved
  ) onlyAllowedOperatorApproval(_operator)
    external
    override
  {
    ownerToOperators[_msgSender()][_operator] = _approved;
    emit ApprovalForAll(_msgSender(), _operator, _approved);
  }

  function balanceOf(
    address _owner
  )
    external
    override
    view
    returns (uint256)
  {
    require(_owner != address(0), ZERO_ADDRESS);
    return _getOwnerNFTCount(_owner);
  }


  function ownerOf(
    uint256 _tokenId
  )
    external
    override
    view
    returns (address _owner)
  {
    _owner = idToOwner[_tokenId];
    require(_owner != address(0), NOT_VALID_NFT);
  }

  function getApproved(
    uint256 _tokenId
  )
    external
    override
    view
    validNFToken(_tokenId)
    returns (address)
  {
    return idToApproval[_tokenId];
  }

  function isApprovedForAll(
    address _owner,
    address _operator
  )
    external
    override
    view
    returns (bool)
  {
    return ownerToOperators[_owner][_operator];
  }

  /**
   * @dev Actually preforms the transfer.
   * @notice Does NO checks.
   * @param _to Address of a new owner.
   * @param _tokenId The NFT that is being transferred.
   */
  function _transfer(
    address _to,
    uint256 _tokenId
  )
    internal
  {
    address from = idToOwner[_tokenId];
    _clearApproval(_tokenId);
    _removeNFToken(from, _tokenId);
    _addNFToken(_to, _tokenId);
    if (registeredOfType[3].length > 0 && registeredOfType[3][0] != address(0)) {
      IHandlerCallback(registeredOfType[3][0]).executeCallbacks(from, _to, _tokenId, IHandlerCallback.CallbackType.TRANSFER);
    }

    emit Transfer(from, _to, _tokenId);
  }

  function _mint(
    address _to,
    uint256 _tokenId
  )
    internal
    virtual
  {
    require(_to != address(0), ZERO_ADDRESS);
    require(idToOwner[_tokenId] == address(0), NFT_ALREADY_EXISTS);

    _addNFToken(_to, _tokenId);
    emit Transfer(address(0), _to, _tokenId);
  }

  function _burn(
    uint256 _tokenId
  )
    internal
    virtual
    validNFToken(_tokenId)
  {
    address tokenOwner = idToOwner[_tokenId];
    _clearApproval(_tokenId);
    _removeNFToken(tokenOwner, _tokenId);
    emit Transfer(tokenOwner, address(0), _tokenId);
  }


  function _removeNFToken(
    address _from,
    uint256 _tokenId
  )
    internal
    virtual
  {
    require(idToOwner[_tokenId] == _from, NOT_OWNER);
    ownerToNFTokenCount[_from] = ownerToNFTokenCount[_from] - 1;
    delete idToOwner[_tokenId];
  }

  function _addNFToken(address _to,uint256 _tokenId) internal virtual  {
    require(idToOwner[_tokenId] == address(0), NFT_ALREADY_EXISTS);

    idToOwner[_tokenId] = _to;
    ownerToNFTokenCount[_to] = ownerToNFTokenCount[_to].add(1);
  }

  /**
   * @dev Helper function that gets NFT count of owner. This is needed for overriding in enumerable
   * extension to remove double storage (gas optimization) of owner nft count.
   * @param _owner Address for whom to query the count.
   * @return Number of _owner NFTs.
   */
  function _getOwnerNFTCount(
    address _owner
  )
    internal
    virtual
    view
    returns (uint256)
  {
    return ownerToNFTokenCount[_owner];
  }

  function _safeTransferFrom(
    address _from,
    address _to,
    uint256 _tokenId,
    bytes memory _data
  )
    private
    onlyAllowedOperatorApproval(_from)
    canTransfer(_tokenId)
    validNFToken(_tokenId)
  {
    address tokenOwner = idToOwner[_tokenId];
    require(tokenOwner == _from, NOT_OWNER);
    require(_to != address(0), ZERO_ADDRESS);

    _transfer(_to, _tokenId);

    if (_to.isContract())
    {
      bytes4 retval = ERC721TokenReceiver(_to).onERC721Received(_msgSender(), _from, _tokenId, _data);
      require(retval == MAGIC_ON_ERC721_RECEIVED, NOT_ABLE_TO_RECEIVE_NFT);
    }
  }

  /**
   * @dev Clears the current approval of a given NFT ID.
   * @param _tokenId ID of the NFT to be transferred.
   */
  function _clearApproval(
    uint256 _tokenId
  )
    private
  {
    if (idToApproval[_tokenId] != address(0))
    {
      delete idToApproval[_tokenId];
    }
  }

}


abstract contract NFTokenEnumerableMetadata is NFToken, ERC721Metadata, ERC721Enumerable {

  string internal nftName;
  string internal nftSymbol;
  string internal nftContractMetadataUri;

  mapping (uint256 => string) internal idToUri;
  mapping (uint256 => string) internal idToPayload;
  bool initialized;

  function name() external override view returns (string memory _name) {
    _name = nftName;
  }

  /**
   * @dev Returns an abbreviated name for NFTokens.
   * @return _symbol Representing symbol.
   */
  function symbol()
    external
    override
    view
    returns (string memory _symbol)
  {
    _symbol = nftSymbol;
  }

  /**
   * @dev A distinct URI (RFC 3986) for a given NFT.
   * @param _tokenId Id for which we want uri.
   * @return URI of _tokenId.
   */
  function tokenURI(
    uint256 _tokenId
  )
    external
    override
    view
    validNFToken(_tokenId)
    returns (string memory)
  {
    return idToUri[_tokenId];
  }
  
    /**
   * @dev A distinct URI (RFC 3986) for a given NFT.
   * @param _tokenId Id for which we want uri.
   * @return URI of _tokenId.
   */
  function tokenPayload(
    uint256 _tokenId
  )
    external
    view
    validNFToken(_tokenId)
    returns (string memory)
  {
    return idToPayload[_tokenId];
  }

  /**
   * @dev Set a distinct URI (RFC 3986) for a given NFT ID.
   * @notice This is an internal function which should be called from user-implemented external
   * function. Its purpose is to show and properly initialize data structures when using this
   * implementation.
   * @param _tokenId Id for which we want URI.
   * @param _uri String representing RFC 3986 URI.
   */
  function _setTokenUri(
    uint256 _tokenId,
    string memory _uri
  )
    internal
    validNFToken(_tokenId)
  {
    idToUri[_tokenId] = _uri;
  }
  
function _setTokenPayload(
    uint256 _tokenId,
    string memory _payload
  )
    internal
    validNFToken(_tokenId)
  {
    idToPayload[_tokenId] = _payload;
  }
  
  /**
   * List of revert message codes. Implementing dApp should handle showing the correct message.
   * Based on 0xcert framework error codes.
   */
  string constant INVALID_INDEX = "005007";

  /**
   * @dev Array of all NFT IDs.
   */
  uint256[] internal tokens;

  /**
   * @dev Mapping from token ID to its index in global tokens array.
   */
  mapping(uint256 => uint256) internal idToIndex;

  /**
   * @dev Mapping from owner to list of owned NFT IDs.
   */
  mapping(address => uint256[]) internal ownerToIds;

  /**
   * @dev Mapping from NFT ID to its index in the owner tokens list.
   */
  mapping(uint256 => uint256) internal idToOwnerIndex;
  
  /**
   * @dev Returns the count of all existing NFTokens.
   * @return Total supply of NFTs.
   */
  function totalSupply()
    external
    override
    view
    returns (uint256)
  {
    return tokens.length;
  }

  /**
   * @dev Returns NFT ID by its index.
   * @param _index A counter less than `totalSupply()`.
   * @return Token id.
   */
  function tokenByIndex(
    uint256 _index
  )
    external
    override
    view
    returns (uint256)
  {
    require(_index < tokens.length, INVALID_INDEX);
    return tokens[_index];
  }

  /**
   * @dev returns the n-th NFT ID from a list of owner's tokens.
   * @param _owner Token owner's address.
   * @param _index Index number representing n-th token in owner's list of tokens.
   * @return Token id.
   */
  function tokenOfOwnerByIndex(
    address _owner,
    uint256 _index
  )
    external
    override
    view
    returns (uint256)
  {
    require(_index < ownerToIds[_owner].length, INVALID_INDEX);
    return ownerToIds[_owner][_index];
  }

  /**
   * @dev Mints a new NFT.
   * @notice This is an internal function which should be called from user-implemented external
   * mint function. Its purpose is to show and properly initialize data structures when using this
   * implementation.
   * @param _to The address that will own the minted NFT.
   * @param _tokenId of the NFT to be minted by the msg.sender.
   */
  function _mint(
    address _to,
    uint256 _tokenId
  )
    internal
    override
    virtual
  {
    super._mint(_to, _tokenId);
    tokens.push(_tokenId);
    idToIndex[_tokenId] = tokens.length - 1;
  }

  /**
   * @dev Burns a NFT.
   * @notice This is an internal function which should be called from user-implemented external
   * burn function. Its purpose is to show and properly initialize data structures when using this
   * implementation. Also, note that this burn implementation allows the minter to re-mint a burned
   * NFT.
   * @param _tokenId ID of the NFT to be burned.
   */
  function _burn(
    uint256 _tokenId
  )
    internal
    override
    virtual
  {
    super._burn(_tokenId);
    
    if (bytes(idToUri[_tokenId]).length != 0)
    {
      delete idToUri[_tokenId];
    }
    
    if (bytes(idToPayload[_tokenId]).length != 0)
    {
      delete idToPayload[_tokenId];
    }
    
    uint256 tokenIndex = idToIndex[_tokenId];
    uint256 lastTokenIndex = tokens.length - 1;
    uint256 lastToken = tokens[lastTokenIndex];

    tokens[tokenIndex] = lastToken;

    tokens.pop();
    // This wastes gas if you are burning the last token but saves a little gas if you are not.
    idToIndex[lastToken] = tokenIndex;
    idToIndex[_tokenId] = 0;
  }

  /**
   * @dev Removes a NFT from an address.
   * @notice Use and override this function with caution. Wrong usage can have serious consequences.
   * @param _from Address from wich we want to remove the NFT.
   * @param _tokenId Which NFT we want to remove.
   */
  function _removeNFToken(
    address _from,
    uint256 _tokenId
  )
    internal
    override
    virtual
  {
    require(idToOwner[_tokenId] == _from, NOT_OWNER);
    delete idToOwner[_tokenId];

    uint256 tokenToRemoveIndex = idToOwnerIndex[_tokenId];
    uint256 lastTokenIndex = ownerToIds[_from].length - 1;

    if (lastTokenIndex != tokenToRemoveIndex)
    {
      uint256 lastToken = ownerToIds[_from][lastTokenIndex];
      ownerToIds[_from][tokenToRemoveIndex] = lastToken;
      idToOwnerIndex[lastToken] = tokenToRemoveIndex;
    }

    ownerToIds[_from].pop();
  }

  /**
   * @dev Assignes a new NFT to an address.
   * @notice Use and override this function with caution. Wrong usage can have serious consequences.
   * @param _to Address to wich we want to add the NFT.
   * @param _tokenId Which NFT we want to add.
   */
  function _addNFToken(
    address _to,
    uint256 _tokenId
  )
    internal
    override
    virtual
  {
    require(idToOwner[_tokenId] == address(0), NFT_ALREADY_EXISTS);
    idToOwner[_tokenId] = _to;

    ownerToIds[_to].push(_tokenId);
    idToOwnerIndex[_tokenId] = ownerToIds[_to].length - 1;
  }

  /**
   * @dev Helper function that gets NFT count of owner. This is needed for overriding in enumerable
   * extension to remove double storage(gas optimization) of owner nft count.
   * @param _owner Address for whom to query the count.
   * @return Number of _owner NFTs.
   */
  function _getOwnerNFTCount(address _owner) internal override virtual view returns (uint256) {
    return ownerToIds[_owner].length; // UpgradableERC721.balanceOfHook(_owner, ownerToIds);
  }

}

/**
 * @dev This is an example contract implementation of NFToken with metadata extension.
 */
contract EmblemVault is NFTokenEnumerableMetadata, Clonable, ERC2981Royalties {
  address payable public streamAddress;
  function initialize() public override initializer {
    __Ownable_init();
    nftName = "Emblem Vault V2";
    nftSymbol = "Emblem.pro";
    _registerInterface(0x5b5e139f); // ERC721Metadata
    _registerInterface(0x780e9d63); // ERC721Enumerable
    _registerInterface(0x80ac58cd); // ERC721
    _registerInterface(0x2a55205a); // ERC2981
    initializeERC165();
    streamAddress = payable(address(new Stream()));
    Stream(streamAddress).initialize();
    OwnableUpgradeable(streamAddress).transferOwnership(_msgSender());
    isClaimable = true;
  }

  function updateStreamAddress(address _streamAddress) public onlyOwner {
    streamAddress = payable(_streamAddress);
  }
  
  function changeName(string calldata _name, string calldata _symbol) public onlyOwner {
      nftName = _name;
      nftSymbol = _symbol;
  }

  /**
   * @dev Mints a new NFT.
   * @param _to The address that will own the minted NFT.
   * @param _tokenId of the NFT to be minted by the msg.sender.
   * @param _uri String representing RFC 3986 URI.
   */
  function mint( address _to, uint256 _tokenId, string calldata _uri, string calldata _payload) public onlyOwner {
    super._mint(_to, _tokenId);
    super._setTokenUri(_tokenId, _uri);
    super._setTokenPayload(_tokenId, _payload);
    if (registeredOfType[3].length > 0 && registeredOfType[3][0] == _msgSender()) {
      IHandlerCallback(_msgSender()).executeCallbacks(address(0), _to, _tokenId, IHandlerCallback.CallbackType.MINT);  
    }
  }
  
  function burn(uint256 _tokenId) external canTransfer(_tokenId) {
    super._burn(_tokenId);
    if (registeredOfType[3].length > 0 && registeredOfType[3][0] != address(0)) {
      IHandlerCallback(registeredOfType[3][0]).executeCallbacks(_msgSender(), address(0), _tokenId, IHandlerCallback.CallbackType.BURN);
    }
  }
  
  function contractURI() public view returns (string memory) {
    return nftContractMetadataUri;
  }
  
  event UpdatedContractURI(string _from, string _to);
  function updateContractURI(string memory uri) public onlyOwner {
    emit UpdatedContractURI(nftContractMetadataUri, uri);
    nftContractMetadataUri = uri;
  }
  
  function getOwnerNFTCount(address _owner) public view returns (uint256) {
      return NFTokenEnumerableMetadata._getOwnerNFTCount(_owner);
  }
  
  function updateTokenUri(
    uint256 _tokenId,
    string memory _uri
  )
    public
    validNFToken(_tokenId)
    onlyOwner
  {
    idToUri[_tokenId] = _uri;
  }
  
  

}

File 2 of 19 : SafeMath.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;

        return c;
    }
}

File 3 of 19 : HasRegistration.sol
// SPDX-License-Identifier: CLOSED - Pending Licensing Audit
pragma solidity ^0.8.4;
import "./IsBypassable.sol";

contract HasRegistration is IsBypassable {

    mapping(address => uint256) public registeredContracts; // 0 EMPTY, 1 ERC1155, 2 ERC721, 3 HANDLER, 4 ERC20, 5 BALANCE, 6 CLAIM, 7 UNKNOWN, 8 FACTORY, 9 STAKING, 10 BYPASS
    mapping(uint256 => address[]) internal registeredOfType;

    modifier isRegisteredContract(address _contract) {
        require(registeredContracts[_contract] > 0, "Contract is not registered");
        _;
    }

    modifier isRegisteredContractOrOwner(address _contract) {
        require(registeredContracts[_contract] > 0 || owner() == _msgSender(), "Contract is not registered nor Owner");
        _;
    }

    function registerContract(address _contract, uint _type) public isRegisteredContractOrOwner(_msgSender()) {
        registeredContracts[_contract] = _type;
        registeredOfType[_type].push(_contract);
    }

    function unregisterContract(address _contract, uint256 index) public onlyOwner isRegisteredContract(_contract) {
        address[] storage arr = registeredOfType[registeredContracts[_contract]];
        arr[index] = arr[arr.length - 1];
        arr.pop();
        delete registeredContracts[_contract];
    }

    function isRegistered(address _contract, uint256 _type) public view returns (bool) {
        return registeredContracts[_contract] == _type;
    }

    function getAllRegisteredContractsOfType(uint256 _type) public view returns (address[] memory) {
        return registeredOfType[_type];
    }
}

File 4 of 19 : IsBypassable.sol
// SPDX-License-Identifier: CLOSED - Pending Licensing Audit
pragma solidity ^0.8.4;

import "./IsClaimable.sol";

abstract contract IsBypassable is IsClaimable {

    bool byPassable;
    mapping(address => mapping(bytes4 => bool)) byPassableFunction;
    mapping(address => mapping(uint256 => bool)) byPassableIds;

    modifier onlyOwner virtual override {
        bool _canBypass = byPassable && byPassableFunction[_msgSender()][msg.sig];
        require(owner() == _msgSender() || _canBypass, "Not owner or able to bypass");
            _;
    }

    modifier onlyOwnerOrBypassWithId(uint256 id) {
        require (owner() == _msgSender() || (id != 0 && byPassableIds[_msgSender()][id] ), "Invalid id");
            _;
    }

    function canBypass() internal view returns(bool) {
        return (byPassable && byPassableFunction[_msgSender()][msg.sig]);
    }

    function canBypassForTokenId(uint256 id) internal view returns(bool) {
        return (byPassable && canBypass() && byPassableIds[_msgSender()][id]);
    }

    function toggleBypassability() public onlyOwner {
      byPassable = !byPassable;
    }

    function addBypassRule(address who, bytes4 functionSig, uint256 id) public onlyOwner {
        byPassableFunction[who][functionSig] = true;
        if (id != 0) {
            byPassableIds[who][id] = true;
        }        
    }

    function removeBypassRule(address who, bytes4 functionSig, uint256 id) public onlyOwner {
        byPassableFunction[who][functionSig] = false;
        if (id !=0) {
            byPassableIds[who][id] = true;
        }
    }
}

File 5 of 19 : ERC165.sol
// SPDX-License-Identifier: CLOSED - Pending Licensing Audit
pragma solidity ^0.8.4;

contract ERC165 {

    mapping(bytes4 => bool) private supportedInterfaces;

    function initializeERC165() internal {
        require(supportedInterfaces[0x01ffc9a7] == false, "Already Registered");
        _registerInterface(0x01ffc9a7);
    }
    
    function supportsInterface(bytes4 interfaceId) public view returns (bool) {
        return supportedInterfaces[interfaceId];
    }
    
    function _registerInterface(bytes4 interfaceId) internal {
        require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
        supportedInterfaces[interfaceId] = true;
    }
}

// interface IERC1155Receiver {
//     function onERC1155Received(address operator, address from, uint256 id, uint256 value, bytes calldata data) external returns(bytes4);
//     function onERC1155BatchReceived(address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external returns(bytes4);
// }

// interface IERC1155MetadataURI  {
//     function uri(uint256 id) external view returns (string memory);
// }

File 6 of 19 : IHandlerCallback.sol
// SPDX-License-Identifier: CLOSED - Pending Licensing Audit
pragma solidity ^0.8.4;

interface IHandlerCallback {
    enum CallbackType {
        MINT, TRANSFER, CLAIM, BURN, FALLBACK
    }

    struct Callback {
        address vault;
        address registrant;
        address target;
        bytes4 targetFunction;
        bool canRevert;
    }
    function executeCallbacksInternal(address _from, address _to, uint256 tokenId, CallbackType _type) external;
    function executeCallbacks(address _from, address _to, uint256 tokenId, CallbackType _type) external;
    function executeStoredCallbacksInternal(address _nftAddress, address _from, address _to, uint256 tokenId, IHandlerCallback.CallbackType _type) external;
    
}

File 7 of 19 : Clonable.sol
// SPDX-License-Identifier: CLOSED - Pending Licensing Audit
pragma solidity ^0.8.4;

interface IClonable {
    function initialize() external;
    function version() external returns(uint256);  
}
abstract contract Clonable {

    function initialize() public virtual;

    function version() public pure virtual returns (uint256) {
        return 1;
    }

}

File 8 of 19 : EventableERC721.sol
// SPDX-License-Identifier: CLOSED - Pending Licensing Audit
pragma solidity ^0.8.4;

interface ERC721Enumerable {

  /**
   * @dev Returns a count of valid NFTs tracked by this contract, where each one of them has an
   * assigned and queryable owner not equal to the zero address.
   * @return Total supply of NFTs.
   */
  function totalSupply()
    external
    view
    returns (uint256);

  /**
   * @dev Returns the token identifier for the `_index`th NFT. Sort order is not specified.
   * @param _index A counter less than `totalSupply()`.
   * @return Token id.
   */
  function tokenByIndex(
    uint256 _index
  )
    external
    view
    returns (uint256);

  /**
   * @dev Returns the token identifier for the `_index`th NFT assigned to `_owner`. Sort order is
   * not specified. It throws if `_index` >= `balanceOf(_owner)` or if `_owner` is the zero address,
   * representing invalid NFTs.
   * @param _owner An address where we are interested in NFTs owned by them.
   * @param _index A counter less than `balanceOf(_owner)`.
   * @return Token id.
   */
  function tokenOfOwnerByIndex(
    address _owner,
    uint256 _index
  )
    external
    view
    returns (uint256);

}


/**
 * @dev Optional metadata extension for ERC-721 non-fungible token standard.
 * See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md.
 */
interface ERC721Metadata {

  /**
   * @dev Returns a descriptive name for a collection of NFTs in this contract.
   * @return _name Representing name.
   */
  function name()
    external
    view
    returns (string memory _name);

  /**
   * @dev Returns a abbreviated name for a collection of NFTs in this contract.
   * @return _symbol Representing symbol.
   */
  function symbol()
    external
    view
    returns (string memory _symbol);

  /**
   * @dev Returns a distinct Uniform Resource Identifier (URI) for a given asset. It Throws if
   * `_tokenId` is not a valid NFT. URIs are defined in RFC3986. The URI may point to a JSON file
   * that conforms to the "ERC721 Metadata JSON Schema".
   * @return URI of _tokenId.
   */
  function tokenURI(uint256 _tokenId)
    external
    view
    returns (string memory);

}

/**
 * @dev ERC-721 interface for accepting safe transfers.
 * See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md.
 */
interface ERC721TokenReceiver {
  
  function onERC721Received(
    address _operator,
    address _from,
    uint256 _tokenId,
    bytes calldata _data
  )
    external
    returns(bytes4);

}

interface IEventableERC721 {
    function makeEvents(address[] calldata _from, address[] calldata _to, uint256[] calldata tokenIds) external;
}

/**
 * @dev ERC-721 non-fungible token standard.
 * See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md.
 */
interface IERC721 {
 
  event Transfer(
    address indexed _from,
    address indexed _to,
    uint256 indexed _tokenId
  );

  event Approval(
    address indexed _owner,
    address indexed _approved,
    uint256 indexed _tokenId
  );

  event ApprovalForAll(
    address indexed _owner,
    address indexed _operator,
    bool _approved
  );

  function safeTransferFrom(
    address _from,
    address _to,
    uint256 _tokenId,
    bytes calldata _data
  )
    external;

  function safeTransferFrom(
    address _from,
    address _to,
    uint256 _tokenId
  )
    external;

  function transferFrom(
    address _from,
    address _to,
    uint256 _tokenId
  )
    external;

  function approve(
    address _approved,
    uint256 _tokenId
  )
    external;

  function setApprovalForAll(
    address _operator,
    bool _approved
  )
    external;

  function balanceOf(
    address _owner
  )
    external
    view
    returns (uint256);

  function ownerOf(
    uint256 _tokenId
  )
    external
    view
    returns (address);

  function getApproved(
    uint256 _tokenId
  )
    external
    view
    returns (address);

  function isApprovedForAll(
    address _owner,
    address _operator
  )
    external
    view
    returns (bool);
}

abstract contract EventableERC721 is IEventableERC721, IERC721 {
    function makeEvents(address[] calldata _from, address[] calldata _to, uint256[] calldata tokenIds) public virtual override {
        _handleEventFromLoops(_from, _to, tokenIds);
    }    
    function _handleEventFromLoops(address[] calldata _from, address[] calldata _to, uint256[] calldata amounts) internal {
        for (uint i=0; i < _from.length; i++) {
            if (amounts.length == _from.length && amounts.length == _to.length) {
                _handleEventEmits(_from[i], _to[i], makeSingleArray(amounts, i));
            } else if (amounts.length == _from.length && amounts.length != _to.length) {
                _handleEventToLoops(_from[i], _to, makeSingleArray(amounts, i));
            } else {
                _handleEventToLoops(_from[i], _to, amounts);
            }
        }
    }
    function _handleEventToLoops(address _from, address[] calldata _to, uint256[] memory amounts) internal {
        for (uint i=0; i < _to.length; i++) {
            if (amounts.length == _to.length) {
                _handleEventEmits(_from, _to[i], makeSingleArray(amounts, i));
            } else {
                _handleEventEmits(_from, _to[i], amounts);
            }
        }
    }
    function _handleEventEmits(address _from, address _to, uint256[] memory amounts) internal {
        for (uint i=0; i < amounts.length; i++) {
            emit Transfer(_from, _to, amounts[i]);
        }
    }
    function makeSingleArray(uint256[] memory amount, uint index) internal pure returns (uint256[] memory) {
        uint256[] memory arr = new uint256[](1);
        arr[0] = amount[index];
        return arr;
    }
}

File 9 of 19 : Stream.sol
/////////////////////////////////////////////////////////////////////////////////////
//
//  SPDX-License-Identifier: MIT
//
//  ███    ███  ██████  ███    ██ ███████ ██    ██ ██████  ██ ██████  ███████
//  ████  ████ ██    ██ ████   ██ ██       ██  ██  ██   ██ ██ ██   ██ ██     
//  ██ ████ ██ ██    ██ ██ ██  ██ █████     ████   ██████  ██ ██████  █████  
//  ██  ██  ██ ██    ██ ██  ██ ██ ██         ██    ██      ██ ██      ██     
//  ██      ██  ██████  ██   ████ ███████    ██    ██      ██ ██      ███████
// 
//  ███████ ████████ ██████  ███████  █████  ███    ███ 
//  ██         ██    ██   ██ ██      ██   ██ ████  ████ 
//  ███████    ██    ██████  █████   ███████ ██ ████ ██ 
//       ██    ██    ██   ██ ██      ██   ██ ██  ██  ██ 
//  ███████    ██    ██   ██ ███████ ██   ██ ██      ██ 
//
//  https://moneypipe.xyz
//
/////////////////////////////////////////////////////////////////////////////////////
pragma solidity ^0.8.4;
// import "@openzeppelin/contracts/proxy/utils/Initializable.sol";
import "./OwnableUpgradeable.sol";
contract Stream is OwnableUpgradeable {
  Member[] private _members;
  struct Member {
    address account;
    uint32 value;
    uint32 total;
  }
  function initialize() initializer public {
    __Ownable_init();
    // for(uint i=0; i<m.length; i++) {
    //   _members.push(m[i]);
    // }
  }

  function addMembers(Member[] calldata m) public onlyOwner {
    for(uint i=0; i<m.length; i++) {
      _members.push(m[i]);
    }
  }
   function addMember(Member calldata m) public onlyOwner {
      _members.push(m);
  } 
  function removeMember(uint256 index) public onlyOwner {
    _members[index] = _members[_members.length - 1];
    _members.pop();
  } 
  receive () external payable {
    require(_members.length > 0, "1");
    for(uint i=0; i<_members.length; i++) {
      Member memory member = _members[i];
      _transfer(member.account, msg.value * member.value / member.total);
    }
  }
  function members() external view returns (Member[] memory) {
    return _members;
  }
  // adopted from https://github.com/lexDAO/Kali/blob/main/contracts/libraries/SafeTransferLib.sol
  error TransferFailed();
  function _transfer(address to, uint256 amount) internal {
    bool callStatus;
    assembly {
      callStatus := call(gas(), to, amount, 0, 0, 0, 0)
    }
    if (!callStatus) revert TransferFailed();
  }
}

File 10 of 19 : ERC2981Royalties.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import './ERC2981Base.sol';
import './OwnableUpgradeable.sol';

/// @dev This is a contract used to add ERC2981 support to ERC721 and 1155
/// @dev This implementation has the same royalties for each and every tokens
abstract contract ERC2981Royalties is ERC2981Base {
    RoyaltyInfo private _contractRoyalties;
    mapping(uint256 => RoyaltyInfo) private _individualRoyalties;

    
    /// @dev Sets token royalties
    /// @param tokenId the token id fir which we register the royalties
    /// @param recipient recipient of the royalties
    /// @param value percentage (using 2 decimals - 10000 = 100, 0 = 0)
    function setTokenRoyalty(uint256 tokenId, address recipient, uint256 value) public override {
        require(msg.sender == OwnableUpgradeable(address(this)).owner(), "Not Owner");
        require(value <= 10000, 'ERC2981Royalties: Too high');
        if (tokenId == 0) {
            _contractRoyalties = RoyaltyInfo(recipient, uint24(value));
        } else {
            _individualRoyalties[tokenId] = RoyaltyInfo(recipient, uint24(value));
        }
    }

    function royaltyInfo(uint256 tokenId, uint256 value) public view override returns (address receiver, uint256 royaltyAmount) {
        RoyaltyInfo memory royalties = _individualRoyalties[tokenId].recipient != address(0)? _individualRoyalties[tokenId]: _contractRoyalties;
        
        receiver = royalties.recipient;
        royaltyAmount = (value * royalties.amount) / 10000;
    }
}

File 11 of 19 : OperatorFiltererUpgradeable.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

import {IOperatorFilterRegistry} from "../IOperatorFilterRegistry.sol";
// import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";

import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";

abstract contract OperatorFiltererUpgradeable is Initializable {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry constant operatorFilterRegistry =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    function __OperatorFilterer_init(address subscriptionOrRegistrantToCopy, bool subscribe)
        internal
        onlyInitializing
    {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(operatorFilterRegistry).code.length > 0) {
            if (!operatorFilterRegistry.isRegistered(address(this))) {
                if (subscribe) {
                    operatorFilterRegistry.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    if (subscriptionOrRegistrantToCopy != address(0)) {
                        operatorFilterRegistry.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                    } else {
                        operatorFilterRegistry.register(address(this));
                    }
                }
            }
        }
    }

    modifier onlyAllowedOperator(address from) virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(operatorFilterRegistry).code.length > 0) {
            // Allow spending tokens from addresses with balance
            // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
            // from an EOA.
            if (from == msg.sender) {
                _;
                return;
            }
            if (!operatorFilterRegistry.isOperatorAllowed(address(this), msg.sender)) {
                revert OperatorNotAllowed(msg.sender);
            }
        }
        _;
    }

    modifier onlyAllowedOperatorApproval(address operator) virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(operatorFilterRegistry).code.length > 0) {
            if (!operatorFilterRegistry.isOperatorAllowed(address(this), operator)) {
                revert OperatorNotAllowed(operator);
            }
        }
        _;
    }
}

File 12 of 19 : IsClaimable.sol
// SPDX-License-Identifier: CLOSED - Pending Licensing Audit
pragma solidity ^0.8.4;
import "./OwnableUpgradeable.sol";
abstract contract IsClaimable is OwnableUpgradeable {

    bool public isClaimable;

    function toggleClaimable() public onlyOwner {
        isClaimable = !isClaimable;
    }
   
}

File 13 of 19 : OwnableUpgradeable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.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 OwnableUpgradeable is Initializable, ContextUpgradeable {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    function __Ownable_init() internal onlyInitializing {
        __Ownable_init_unchained();
    }

    function __Ownable_init_unchained() internal onlyInitializing {
        _transferOwnership(_msgSender());
    }

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() 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);
    }

    /**
     * @dev This empty reserved space is put in place to allow future versions to add new
     * variables without shifting down storage in the inheritance chain.
     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
     */
    uint256[49] private __gap;
}

File 14 of 19 : ContextUpgradeable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;
import "../proxy/utils/Initializable.sol";

/**
 * @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 ContextUpgradeable is Initializable {
    function __Context_init() internal onlyInitializing {
    }

    function __Context_init_unchained() internal onlyInitializing {
    }
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

    /**
     * @dev This empty reserved space is put in place to allow future versions to add new
     * variables without shifting down storage in the inheritance chain.
     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
     */
    uint256[50] private __gap;
}

File 15 of 19 : Initializable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (proxy/utils/Initializable.sol)

pragma solidity ^0.8.2;

import "../../utils/AddressUpgradeable.sol";

/**
 * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
 * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an
 * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
 * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
 *
 * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be
 * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in
 * case an upgrade adds a module that needs to be initialized.
 *
 * For example:
 *
 * [.hljs-theme-light.nopadding]
 * ```
 * contract MyToken is ERC20Upgradeable {
 *     function initialize() initializer public {
 *         __ERC20_init("MyToken", "MTK");
 *     }
 * }
 * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {
 *     function initializeV2() reinitializer(2) public {
 *         __ERC20Permit_init("MyToken");
 *     }
 * }
 * ```
 *
 * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
 * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.
 *
 * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
 * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
 *
 * [CAUTION]
 * ====
 * Avoid leaving a contract uninitialized.
 *
 * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation
 * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke
 * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:
 *
 * [.hljs-theme-light.nopadding]
 * ```
 * /// @custom:oz-upgrades-unsafe-allow constructor
 * constructor() {
 *     _disableInitializers();
 * }
 * ```
 * ====
 */
abstract contract Initializable {
    /**
     * @dev Indicates that the contract has been initialized.
     * @custom:oz-retyped-from bool
     */
    uint8 private _initialized;

    /**
     * @dev Indicates that the contract is in the process of being initialized.
     */
    bool private _initializing;

    /**
     * @dev Triggered when the contract has been initialized or reinitialized.
     */
    event Initialized(uint8 version);

    /**
     * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,
     * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`.
     */
    modifier initializer() {
        bool isTopLevelCall = !_initializing;
        require(
            (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1),
            "Initializable: contract is already initialized"
        );
        _initialized = 1;
        if (isTopLevelCall) {
            _initializing = true;
        }
        _;
        if (isTopLevelCall) {
            _initializing = false;
            emit Initialized(1);
        }
    }

    /**
     * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the
     * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be
     * used to initialize parent contracts.
     *
     * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original
     * initialization step. This is essential to configure modules that are added through upgrades and that require
     * initialization.
     *
     * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in
     * a contract, executing them in the right order is up to the developer or operator.
     */
    modifier reinitializer(uint8 version) {
        require(!_initializing && _initialized < version, "Initializable: contract is already initialized");
        _initialized = version;
        _initializing = true;
        _;
        _initializing = false;
        emit Initialized(version);
    }

    /**
     * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the
     * {initializer} and {reinitializer} modifiers, directly or indirectly.
     */
    modifier onlyInitializing() {
        require(_initializing, "Initializable: contract is not initializing");
        _;
    }

    /**
     * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.
     * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized
     * to any version. It is recommended to use this to lock implementation contracts that are designed to be called
     * through proxies.
     */
    function _disableInitializers() internal virtual {
        require(!_initializing, "Initializable: contract is initializing");
        if (_initialized < type(uint8).max) {
            _initialized = type(uint8).max;
            emit Initialized(type(uint8).max);
        }
    }
}

File 16 of 19 : AddressUpgradeable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

File 17 of 19 : ERC2981Base.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import './IERC2981Royalties.sol';

/// @dev This is a contract used to add ERC2981 support to ERC721 and 1155
abstract contract ERC2981Base is IERC2981Royalties {
    struct RoyaltyInfo {
        address recipient;
        uint24 amount;
    }

}

File 18 of 19 : IERC2981Royalties.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface IERC2981Royalties {
   function setTokenRoyalty(uint256 tokenId, address recipient, uint256 value) external;
   function royaltyInfo(uint256 tokenId, uint256 value) external view returns (address receiver, uint256 royaltyAmount);
}

File 19 of 19 : IOperatorFilterRegistry.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator) external view returns (bool);
    function register(address registrant) external;
    function registerAndSubscribe(address registrant, address subscription) external;
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;
    function unregister(address addr) external;
    function updateOperator(address registrant, address operator, bool filtered) external;
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
    function subscribe(address registrant, address registrantToSubscribe) external;
    function unsubscribe(address registrant, bool copyExistingEntries) external;
    function subscriptionOf(address addr) external returns (address registrant);
    function subscribers(address registrant) external returns (address[] memory);
    function subscriberAt(address registrant, uint256 index) external returns (address);
    function copyEntriesOf(address registrant, address registrantToCopy) external;
    function isOperatorFiltered(address registrant, address operator) external returns (bool);
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
    function filteredOperators(address addr) external returns (address[] memory);
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
    function isRegistered(address addr) external returns (bool);
    function codeHashOf(address addr) external returns (bytes32);
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 1
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","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":"uint8","name":"version","type":"uint8"}],"name":"Initialized","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_from","type":"string"},{"indexed":false,"internalType":"string","name":"_to","type":"string"}],"name":"UpdatedContractURI","type":"event"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bytes4","name":"functionSig","type":"bytes4"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"addBypassRule","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_approved","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":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"name":"changeName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_type","type":"uint256"}],"name":"getAllRegisteredContractsOfType","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"getOwnerNFTCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isClaimable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"},{"internalType":"uint256","name":"_type","type":"uint256"}],"name":"isRegistered","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_from","type":"address[]"},{"internalType":"address[]","name":"_to","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"makeEvents","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_uri","type":"string"},{"internalType":"string","name":"_payload","type":"string"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"_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":"_owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"},{"internalType":"uint256","name":"_type","type":"uint256"}],"name":"registerContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"registeredContracts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bytes4","name":"functionSig","type":"bytes4"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"removeBypassRule","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"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":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setTokenRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"streamAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"_symbol","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleBypassability","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleClaimable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenPayload","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"unregisterContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"updateContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_streamAddress","type":"address"}],"name":"updateStreamAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_uri","type":"string"}],"name":"updateTokenUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"}]

608060405234801561001057600080fd5b50614c3a806100206000396000f3fe608060405234801561001057600080fd5b50600436106102045760003560e01c806301ffc9a71461020957806306fdde031461024b578063081812fc14610260578063095ea7b314610280578063152f0eb51461029557806318160ddd146102a85780631986166f146102ba5780631beab0f6146102cd57806323b872dd146102e05780632a55205a146102f35780632adbc37d146103255780632cf1dacb1461032d5780632f745c59146103405780632fb102cf1461035357806330477d361461036657806340897bbe1461037957806342842e0e1461038157806342966c68146103945780634f6ccce7146103a757806354fd4d50146103ba5780636352211e146103c157806370a08231146103d4578063715018a6146103e7578063736cd42d146103ef57806374478bb3146104025780637b74297d1461040f5780637e5b1e241461042f5780638129fc1c1461044257806386575e401461044a5780638da5cb5b1461045d57806395d89b41146104655780639713c8071461046d5780639ad9523214610480578063a06617cd14610493578063a22cb465146104b3578063a8f1602c146104c6578063b88d4fde146104f3578063bd7f4c8d14610506578063c87b56dd14610519578063d31af4841461052c578063e565fef31461053f578063e8a3d48514610552578063e985e9c51461055a578063f2fde38b14610596575b600080fd5b610236610217366004613b74565b6001600160e01b03191660009081526020819052604090205460ff1690565b60405190151581526020015b60405180910390f35b6102536105a9565b6040516102429190613e2e565b61027361026e366004613c46565b61063b565b6040516102429190613d2a565b61029361028e366004613a22565b6106bd565b005b6102936102a3366004613a22565b610918565b6075545b604051908152602001610242565b6102936102c83660046139f3565b6109ea565b6102936102db366004613a22565b610ad5565b6102936102ee366004613916565b610cd5565b610306610301366004613cbe565b610f1c565b604080516001600160a01b039093168352602083019190915201610242565b610293610fa7565b61029361033b3660046139f3565b61103d565b6102ac61034e366004613a22565b611124565b610293610361366004613a4d565b6111c9565b607b54610273906001600160a01b031681565b6102936113aa565b61029361038f366004613916565b611437565b6102936103a2366004613c46565b611457565b6102ac6103b5366004613c46565b61164a565b60016102ac565b6102736103cf366004613c46565b6116c0565b6102ac6103e236600461389f565b611718565b61029361176f565b6102936103fd36600461389f565b6117f4565b6066546102369060ff1681565b61042261041d366004613c46565b61188f565b6040516102429190613de1565b61029361043d366004613c14565b6118fb565b6102936119c0565b610293610458366004613bac565b611c81565b610273611d1a565b610253611d29565b61029361047b366004613c5e565b611d38565b61025361048e366004613c46565b611eeb565b6102ac6104a136600461389f565b60696020526000908152604090205481565b6102936104c13660046139c6565b611fe6565b6102366104d4366004613a22565b6001600160a01b03919091166000908152606960205260409020541490565b610293610501366004613956565b61210b565b6102ac61051436600461389f565b61214d565b610253610527366004613c46565b612158565b61029361053a366004613c84565b6121cd565b61029361054d366004613ad5565b6122be565b610253612344565b6102366105683660046138de565b6001600160a01b039182166000908152606e6020908152604080832093909416825291909152205460ff1690565b6102936105a436600461389f565b612353565b6060606f80546105b890613fd2565b80601f01602080910402602001604051908101604052809291908181526020018280546105e490613fd2565b80156106315780601f1061060657610100808354040283529160200191610631565b820191906000526020600020905b81548152906001019060200180831161061457829003601f168201915b5050505050905090565b6000818152606b60209081526040808320548151808301909252600682526518181998181960d11b9282019290925283916001600160a01b031661069b5760405162461bcd60e51b81526004016106929190613e2e565b60405180910390fd5b506000838152606c60205260409020546001600160a01b031691505b50919050565b816daaeb6d7670e522a718067333cd4e3b1561077557604051633185c44d60e21b81526daaeb6d7670e522a718067333cd4e9063c6171134906107069030908590600401613d3e565b60206040518083038186803b15801561071e57600080fd5b505afa158015610732573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107569190613b58565b6107755780604051633b79c77360e21b81526004016106929190613d2a565b6000828152606b602052604090205482906001600160a01b0316338114806107c057506001600160a01b0381166000908152606e6020908152604080832033845290915290205460ff165b6040518060400160405280600681526020016530303330303360d01b815250906107fd5760405162461bcd60e51b81526004016106929190613e2e565b506000848152606b6020908152604091829020548251808401909352600683526518181998181960d11b918301919091528591906001600160a01b03166108575760405162461bcd60e51b81526004016106929190613e2e565b506000858152606b6020908152604091829020548251808401909352600683526506060666060760d31b918301919091526001600160a01b03908116919088168214156108b75760405162461bcd60e51b81526004016106929190613e2e565b506000868152606c602052604080822080546001600160a01b0319166001600160a01b038b811691821790925591518993918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a450505050505050565b33600081815260696020526040902054151580610944575033610939611d1a565b6001600160a01b0316145b61099c5760405162461bcd60e51b8152602060048201526024808201527f436f6e7472616374206973206e6f742072656769737465726564206e6f72204f6044820152633bb732b960e11b6064820152608401610692565b506001600160a01b039091166000818152606960209081526040808320859055938252606a8152928120805460018101825590825292902090910180546001600160a01b0319169091179055565b606654600090610100900460ff168015610a29575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b905033610a34611d1a565b6001600160a01b03161480610a465750805b610a625760405162461bcd60e51b815260040161069290613efc565b6001600160a01b03841660009081526067602090815260408083206001600160e01b0319871684529091529020805460ff191660011790558115610acf576001600160a01b03841660009081526068602090815260408083208584529091529020805460ff191660011790555b50505050565b606654600090610100900460ff168015610b14575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b905033610b1f611d1a565b6001600160a01b03161480610b315750805b610b4d5760405162461bcd60e51b815260040161069290613efc565b6001600160a01b0383166000908152606960205260409020548390610bb15760405162461bcd60e51b815260206004820152601a60248201527910dbdb9d1c9858dd081a5cc81b9bdd081c9959da5cdd195c995960321b6044820152606401610692565b6001600160a01b0384166000908152606960209081526040808320548352606a909152902080548190610be690600190613fbb565b81548110610c0457634e487b7160e01b600052603260045260246000fd5b9060005260206000200160009054906101000a90046001600160a01b0316818581548110610c4257634e487b7160e01b600052603260045260246000fd5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555080805480610c8e57634e487b7160e01b600052603160045260246000fd5b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b039690961681526069909552505060408320929092555050565b826daaeb6d7670e522a718067333cd4e3b15610d8d57604051633185c44d60e21b81526daaeb6d7670e522a718067333cd4e9063c617113490610d1e9030908590600401613d3e565b60206040518083038186803b158015610d3657600080fd5b505afa158015610d4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6e9190613b58565b610d8d5780604051633b79c77360e21b81526004016106929190613d2a565b816000610d998261243d565b6000838152606b6020526040812054919250906001600160a01b031633811480610dd957506000848152606c60205260409020546001600160a01b031633145b80610e0757506001600160a01b0381166000908152606e6020908152604080832033845290915290205460ff165b80610e0f5750825b604051806040016040528060068152602001650c0c0ccc0c0d60d21b81525090610e4c5760405162461bcd60e51b81526004016106929190613e2e565b506000868152606b6020908152604091829020548251808401909352600683526518181998181960d11b918301919091528791906001600160a01b0316610ea65760405162461bcd60e51b81526004016106929190613e2e565b506000878152606b6020908152604091829020548251808401909352600683526530303330303760d01b918301919091526001600160a01b0390811691908b168214610f055760405162461bcd60e51b81526004016106929190613e2e565b50610f108989612482565b50505050505050505050565b6000828152607a6020526040812054819081906001600160a01b0316610f43576079610f52565b6000858152607a602052604090205b6040805180820190915290546001600160a01b038116808352600160a01b90910462ffffff166020830181905290945090915061271090610f939086613f9c565b610f9d9190613f7c565b9150509250929050565b606654600090610100900460ff168015610fe6575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b905033610ff1611d1a565b6001600160a01b031614806110035750805b61101f5760405162461bcd60e51b815260040161069290613efc565b506066805461ff001981166101009182900460ff1615909102179055565b606654600090610100900460ff16801561107c575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b905033611087611d1a565b6001600160a01b031614806110995750805b6110b55760405162461bcd60e51b815260040161069290613efc565b6001600160a01b03841660009081526067602090815260408083206001600160e01b0319871684529091529020805460ff191690558115610acf576001600160a01b03841660009081526068602090815260408083208584529091529020805460ff1916600117905550505050565b6001600160a01b0382166000908152607760209081526040808320548151808301909252600682526530303530303760d01b9282019290925290831061117d5760405162461bcd60e51b81526004016106929190613e2e565b506001600160a01b03831660009081526077602052604090208054839081106111b657634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b606654600090610100900460ff168015611208575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b905033611213611d1a565b6001600160a01b031614806112255750805b6112415760405162461bcd60e51b815260040161069290613efc565b61124b8787612611565b61128b8686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061267192505050565b6112cb8684848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506126ea92505050565b6003600052606a602052600080516020614bc5833981519152541580159061133f575060036000908152606a602052600080516020614bc5833981519152805433929061132857634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0316145b156113a15760405163b68c437960e01b8152339063b68c43799061136e906000908b908b908390600401613d95565b600060405180830381600087803b15801561138857600080fd5b505af115801561139c573d6000803e3d6000fd5b505050505b50505050505050565b606654600090610100900460ff1680156113e9575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b9050336113f4611d1a565b6001600160a01b031614806114065750805b6114225760405162461bcd60e51b815260040161069290613efc565b506066805460ff19811660ff90911615179055565b61145283838360405180602001604052806000815250612763565b505050565b8060006114638261243d565b6000838152606b6020526040812054919250906001600160a01b0316338114806114a357506000848152606c60205260409020546001600160a01b031633145b806114d157506001600160a01b0381166000908152606e6020908152604080832033845290915290205460ff165b806114d95750825b604051806040016040528060068152602001650c0c0ccc0c0d60d21b815250906115165760405162461bcd60e51b81526004016106929190613e2e565b5061152085612ae0565b6003600052606a602052600080516020614bc58339815191525415801590611594575060036000908152606a602052600080516020614bc58339815191528054829061157c57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031614155b156116435760036000908152606a602052600080516020614bc583398151915280549091906115d357634e487b7160e01b600052603260045260246000fd5b600091825260208220015460405163b68c437960e01b81526001600160a01b039091169163b68c4379916116109133918a90600390600401613d95565b600060405180830381600087803b15801561162a57600080fd5b505af115801561163e573d6000803e3d6000fd5b505050505b5050505050565b60755460408051808201909152600681526530303530303760d01b6020820152600091831061168c5760405162461bcd60e51b81526004016106929190613e2e565b50607582815481106116ae57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b6000818152606b6020908152604091829020548251808401909352600683526518181998181960d11b918301919091526001600160a01b031690816106b75760405162461bcd60e51b81526004016106929190613e2e565b60408051808201909152600681526530303330303160d01b60208201526000906001600160a01b03831661175f5760405162461bcd60e51b81526004016106929190613e2e565b5061176982612c2c565b92915050565b606654600090610100900460ff1680156117ae575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b9050336117b9611d1a565b6001600160a01b031614806117cb5750805b6117e75760405162461bcd60e51b815260040161069290613efc565b6117f16000612c47565b50565b606654600090610100900460ff168015611833575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b90503361183e611d1a565b6001600160a01b031614806118505750805b61186c5760405162461bcd60e51b815260040161069290613efc565b50607b80546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152606a60209081526040918290208054835181840281018401909452808452606093928301828280156118ef57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116118d1575b50505050509050919050565b606654600090610100900460ff16801561193a575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b905033611945611d1a565b6001600160a01b031614806119575750805b6119735760405162461bcd60e51b815260040161069290613efc565b7fc4761b87ec5248fbb0deaff2d6b1651b8dd04322c6597549eefe44d799d480ce6071836040516119a5929190613e41565b60405180910390a18151611452906071906020850190613641565b600154610100900460ff16158080156119dd57506001805460ff16105b806119f65750303b1580156119f657506001805460ff16145b611a595760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610692565b6001805460ff1916811790558015611a7b576001805461ff0019166101001790555b611a83612c99565b60408051808201909152600f8082526e22b6b13632b6902b30bab63a102b1960891b6020909201918252611ab991606f91613641565b5060408051808201909152600a80825269456d626c656d2e70726f60b01b6020909201918252611aeb91607091613641565b50611afc635b5e139f60e01b612cca565b611b0c63780e9d6360e01b612cca565b611b1c6380ac58cd60e01b612cca565b611b2c63152a902d60e11b612cca565b611b34612d48565b604051611b40906136c5565b604051809103906000f080158015611b5c573d6000803e3d6000fd5b50607b80546001600160a01b0319166001600160a01b039290921691821790556040805163204a7f0760e21b81529051638129fc1c9160048082019260009290919082900301818387803b158015611bb357600080fd5b505af1158015611bc7573d6000803e3d6000fd5b5050607b5460405163f2fde38b60e01b81526001600160a01b03909116925063f2fde38b9150611bfb903390600401613d2a565b600060405180830381600087803b158015611c1557600080fd5b505af1158015611c29573d6000803e3d6000fd5b50506066805460ff19166001179055505080156117f1576001805461ff00191681556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b606654600090610100900460ff168015611cc0575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b905033611ccb611d1a565b6001600160a01b03161480611cdd5750805b611cf95760405162461bcd60e51b815260040161069290613efc565b611d05606f86866136d2565b50611d12607084846136d2565b505050505050565b6034546001600160a01b031690565b6060607080546105b890613fd2565b306001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611d7157600080fd5b505afa158015611d85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611da991906138c2565b6001600160a01b0316336001600160a01b031614611df55760405162461bcd60e51b81526020600482015260096024820152682737ba1027bbb732b960b91b6044820152606401610692565b612710811115611e445760405162461bcd60e51b815260206004820152601a60248201527908aa48664727062a4def2c2d8e8d2cae67440a8dede40d0d2ced60331b6044820152606401610692565b82611e9457604080518082019091526001600160a01b03831680825262ffffff8316602090920182905260798054600160a01b9093026001600160b81b0319909316909117919091179055505050565b6040805180820182526001600160a01b03938416815262ffffff92831660208083019182526000968752607a905291909420935184549151909216600160a01b026001600160b81b03199091169190921617179055565b6000818152606b6020908152604091829020548251808401909352600683526518181998181960d11b9183019190915260609183916001600160a01b0316611f465760405162461bcd60e51b81526004016106929190613e2e565b5060008381526073602052604090208054611f6090613fd2565b80601f0160208091040260200160405190810160405280929190818152602001828054611f8c90613fd2565b8015611fd95780601f10611fae57610100808354040283529160200191611fd9565b820191906000526020600020905b815481529060010190602001808311611fbc57829003601f168201915b5050505050915050919050565b816daaeb6d7670e522a718067333cd4e3b1561209e57604051633185c44d60e21b81526daaeb6d7670e522a718067333cd4e9063c61711349061202f9030908590600401613d3e565b60206040518083038186803b15801561204757600080fd5b505afa15801561205b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061207f9190613b58565b61209e5780604051633b79c77360e21b81526004016106929190613d2a565b336000818152606e602090815260408083206001600160a01b03881680855290835292819020805460ff191687151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61164385858585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061276392505050565b600061176982612c2c565b6000818152606b6020908152604091829020548251808401909352600683526518181998181960d11b9183019190915260609183916001600160a01b03166121b35760405162461bcd60e51b81526004016106929190613e2e565b5060008381526072602052604090208054611f6090613fd2565b6000828152606b6020908152604091829020548251808401909352600683526518181998181960d11b918301919091528391906001600160a01b03166122265760405162461bcd60e51b81526004016106929190613e2e565b50606654600090610100900460ff168015612266575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b905033612271611d1a565b6001600160a01b031614806122835750805b61229f5760405162461bcd60e51b815260040161069290613efc565b6000848152607260209081526040909120845161164392860190613641565b606654600090610100900460ff1680156122fd575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b905033612308611d1a565b6001600160a01b0316148061231a5750805b6123365760405162461bcd60e51b815260040161069290613efc565b6113a1878787878787612dcf565b6060607180546105b890613fd2565b606654600090610100900460ff168015612392575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b90503361239d611d1a565b6001600160a01b031614806123af5750805b6123cb5760405162461bcd60e51b815260040161069290613efc565b6001600160a01b0382166124305760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610692565b61243982612c47565b5050565b606654600090610100900460ff16801561245a575061245a612ddd565b8015611769575050336000908152606860209081526040808320938352929052205460ff1690565b6000818152606b60205260409020546001600160a01b03166124a382612e21565b6124ad8183612e5c565b6124b78383613006565b6003600052606a602052600080516020614bc5833981519152541580159061252b575060036000908152606a602052600080516020614bc58339815191528054829061251357634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031614155b156125dd5760036000908152606a602052600080516020614bc5833981519152805490919061256a57634e487b7160e01b600052603260045260246000fd5b60009182526020909120015460405163b68c437960e01b81526001600160a01b039091169063b68c4379906125aa90849087908790600190600401613d95565b600060405180830381600087803b1580156125c457600080fd5b505af11580156125d8573d6000803e3d6000fd5b505050505b81836001600160a01b0316826001600160a01b0316600080516020614be583398151915260405160405180910390a4505050565b61261b82826130c9565b607580546001818101835560008390527f9a8d93986a7b9e6294572ea6736696119c195c1a9f5eae642d3c5fcd44e49dea909101839055905461265e9190613fbb565b6000918252607660205260409091205550565b6000828152606b6020908152604091829020548251808401909352600683526518181998181960d11b918301919091528391906001600160a01b03166126ca5760405162461bcd60e51b81526004016106929190613e2e565b5060008381526072602090815260409091208351610acf92850190613641565b6000828152606b6020908152604091829020548251808401909352600683526518181998181960d11b918301919091528391906001600160a01b03166127435760405162461bcd60e51b81526004016106929190613e2e565b5060008381526073602090815260409091208351610acf92850190613641565b836daaeb6d7670e522a718067333cd4e3b1561281b57604051633185c44d60e21b81526daaeb6d7670e522a718067333cd4e9063c6171134906127ac9030908590600401613d3e565b60206040518083038186803b1580156127c457600080fd5b505afa1580156127d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127fc9190613b58565b61281b5780604051633b79c77360e21b81526004016106929190613d2a565b8260006128278261243d565b6000838152606b6020526040812054919250906001600160a01b03163381148061286757506000848152606c60205260409020546001600160a01b031633145b8061289557506001600160a01b0381166000908152606e6020908152604080832033845290915290205460ff165b8061289d5750825b604051806040016040528060068152602001650c0c0ccc0c0d60d21b815250906128da5760405162461bcd60e51b81526004016106929190613e2e565b506000878152606b6020908152604091829020548251808401909352600683526518181998181960d11b918301919091528891906001600160a01b03166129345760405162461bcd60e51b81526004016106929190613e2e565b506000888152606b6020908152604091829020548251808401909352600683526530303330303760d01b918301919091526001600160a01b0390811691908c1682146129935760405162461bcd60e51b81526004016106929190613e2e565b5060408051808201909152600681526530303330303160d01b60208201526001600160a01b038b166129d85760405162461bcd60e51b81526004016106929190613e2e565b506129e38a8a612482565b6129f58a6001600160a01b031661319a565b1561139c5760006001600160a01b038b1663150b7a02338e8d8d6040518563ffffffff1660e01b8152600401612a2e9493929190613d58565b602060405180830381600087803b158015612a4857600080fd5b505af1158015612a5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a809190613b90565b60408051808201909152600681526530303330303560d01b60208201529091506001600160e01b03198216630a85bd0160e11b14612ad15760405162461bcd60e51b81526004016106929190613e2e565b50505050505050505050505050565b612ae9816131d6565b60008181526072602052604090208054612b0290613fd2565b159050612b20576000818152607260205260408120612b2091613746565b60008181526073602052604090208054612b3990613fd2565b159050612b57576000818152607360205260408120612b5791613746565b600081815260766020526040812054607554909190612b7890600190613fbb565b9050600060758281548110612b9d57634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508060758481548110612bcc57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001556075805480612bf757634e487b7160e01b600052603160045260246000fd5b600082815260208082208301600019908101839055909201909255918152607690915260408082209390935592835250812055565b6001600160a01b031660009081526077602052604090205490565b603480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600154610100900460ff16612cc05760405162461bcd60e51b815260040161069290613f31565b612cc8613286565b565b6001600160e01b03198082161415612d235760405162461bcd60e51b815260206004820152601c60248201527b115490cc4d8d4e881a5b9d985b1a59081a5b9d195c999858d9481a5960221b6044820152606401610692565b6001600160e01b0319166000908152602081905260409020805460ff19166001179055565b6301ffc9a760e01b60009081526020527f67be87c3ff9960ca1e9cfac5cab2ff4747269cf9ed20c9b7306235ac35a491c55460ff1615612dbf5760405162461bcd60e51b8152602060048201526012602482015271105b1c9958591e48149959da5cdd195c995960721b6044820152606401610692565b612cc86301ffc9a760e01b612cca565b611d128686868686866132b6565b606654600090610100900460ff168015612e1c575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b905090565b6000818152606c60205260409020546001600160a01b0316156117f1576000908152606c6020526040902080546001600160a01b0319169055565b6000818152606b6020908152604091829020548251808401909352600683526530303330303760d01b918301919091526001600160a01b03848116911614612eb75760405162461bcd60e51b81526004016106929190613e2e565b506000818152606b6020908152604080832080546001600160a01b031916905560788252808320546001600160a01b03861684526077909252822054909190612f0290600190613fbb565b9050818114612fb5576001600160a01b0384166000908152607760205260408120805483908110612f4357634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508060776000876001600160a01b03166001600160a01b031681526020019081526020016000208481548110612f9557634e487b7160e01b600052603260045260246000fd5b600091825260208083209091019290925591825260789052604090208290555b6001600160a01b0384166000908152607760205260409020805480612fea57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000818152606b6020908152604091829020548251808401909352600683526518181998181b60d11b918301919091526001600160a01b03161561305d5760405162461bcd60e51b81526004016106929190613e2e565b506000818152606b6020908152604080832080546001600160a01b0319166001600160a01b0387169081179091558084526077835290832080546001818101835582865293852001859055925290546130b69190613fbb565b6000918252607860205260409091205550565b60408051808201909152600681526530303330303160d01b60208201526001600160a01b03831661310d5760405162461bcd60e51b81526004016106929190613e2e565b506000818152606b6020908152604091829020548251808401909352600683526518181998181b60d11b918301919091526001600160a01b0316156131655760405162461bcd60e51b81526004016106929190613e2e565b506131708282613006565b60405181906001600160a01b03841690600090600080516020614be5833981519152908290a45050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081158015906131ce5750808214155b949350505050565b6000818152606b6020908152604091829020548251808401909352600683526518181998181960d11b918301919091528291906001600160a01b031661322f5760405162461bcd60e51b81526004016106929190613e2e565b506000828152606b60205260409020546001600160a01b031661325183612e21565b61325b8184612e5c565b60405183906000906001600160a01b03841690600080516020614be5833981519152908390a4505050565b600154610100900460ff166132ad5760405162461bcd60e51b815260040161069290613f31565b612cc833612c47565b60005b858110156113a15781861480156132cf57508184145b15613389576133848787838181106132f757634e487b7160e01b600052603260045260246000fd5b905060200201602081019061330c919061389f565b86868481811061332c57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190613341919061389f565b61337f86868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525088925061349f915050565b613520565b61348d565b81861480156133985750818414155b1561341a576133848787838181106133c057634e487b7160e01b600052603260045260246000fd5b90506020020160208101906133d5919061389f565b868661341587878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061349f915050565b613594565b61348d87878381811061343d57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190613452919061389f565b868686868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061359492505050565b8061349781614007565b9150506132b9565b60408051600180825281830190925260609160009190602080830190803683370190505090508383815181106134e557634e487b7160e01b600052603260045260246000fd5b60200260200101518160008151811061350e57634e487b7160e01b600052603260045260246000fd5b60209081029190910101529392505050565b60005b8151811015610acf5781818151811061354c57634e487b7160e01b600052603260045260246000fd5b6020026020010151836001600160a01b0316856001600160a01b0316600080516020614be583398151915260405160405180910390a48061358c81614007565b915050613523565b60005b828110156116435781518314156135f0576135eb858585848181106135cc57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906135e1919061389f565b61337f858561349f565b61362f565b61362f8585858481811061361457634e487b7160e01b600052603260045260246000fd5b9050602002016020810190613629919061389f565b84613520565b8061363981614007565b915050613597565b82805461364d90613fd2565b90600052602060002090601f01602090048101928261366f57600085556136b5565b82601f1061368857805160ff19168380011785556136b5565b828001600101855582156136b5579182015b828111156136b557825182559160200191906001019061369a565b506136c192915061377c565b5090565b610b3d8061408883390190565b8280546136de90613fd2565b90600052602060002090601f01602090048101928261370057600085556136b5565b82601f106137195782800160ff198235161785556136b5565b828001600101855582156136b5579182015b828111156136b557823582559160200191906001019061372b565b50805461375290613fd2565b6000825580601f10613762575050565b601f0160209004906000526020600020908101906117f191905b5b808211156136c1576000815560010161377d565b60008083601f8401126137a2578081fd5b5081356001600160401b038111156137b8578182fd5b6020830191508360208260051b85010111156137d357600080fd5b9250929050565b60008083601f8401126137eb578182fd5b5081356001600160401b03811115613801578182fd5b6020830191508360208285010111156137d357600080fd5b600082601f830112613829578081fd5b81356001600160401b038082111561384357613843614038565b604051601f8301601f19908116603f0116810190828211818310171561386b5761386b614038565b81604052838152866020858801011115613883578485fd5b8360208701602083013792830160200193909352509392505050565b6000602082840312156138b0578081fd5b81356138bb8161404e565b9392505050565b6000602082840312156138d3578081fd5b81516138bb8161404e565b600080604083850312156138f0578081fd5b82356138fb8161404e565b9150602083013561390b8161404e565b809150509250929050565b60008060006060848603121561392a578081fd5b83356139358161404e565b925060208401356139458161404e565b929592945050506040919091013590565b60008060008060006080868803121561396d578081fd5b85356139788161404e565b945060208601356139888161404e565b93506040860135925060608601356001600160401b038111156139a9578182fd5b6139b5888289016137da565b969995985093965092949392505050565b600080604083850312156139d8578182fd5b82356139e38161404e565b9150602083013561390b81614063565b600080600060608486031215613a07578283fd5b8335613a128161404e565b9250602084013561394581614071565b60008060408385031215613a34578182fd5b8235613a3f8161404e565b946020939093013593505050565b60008060008060008060808789031215613a65578081fd5b8635613a708161404e565b95506020870135945060408701356001600160401b0380821115613a92578283fd5b613a9e8a838b016137da565b90965094506060890135915080821115613ab6578283fd5b50613ac389828a016137da565b979a9699509497509295939492505050565b60008060008060008060608789031215613aed578384fd5b86356001600160401b0380821115613b03578586fd5b613b0f8a838b01613791565b90985096506020890135915080821115613b27578586fd5b613b338a838b01613791565b90965094506040890135915080821115613b4b578384fd5b50613ac389828a01613791565b600060208284031215613b69578081fd5b81516138bb81614063565b600060208284031215613b85578081fd5b81356138bb81614071565b600060208284031215613ba1578081fd5b81516138bb81614071565b60008060008060408587031215613bc1578182fd5b84356001600160401b0380821115613bd7578384fd5b613be3888389016137da565b90965094506020870135915080821115613bfb578384fd5b50613c08878288016137da565b95989497509550505050565b600060208284031215613c25578081fd5b81356001600160401b03811115613c3a578182fd5b6131ce84828501613819565b600060208284031215613c57578081fd5b5035919050565b600080600060608486031215613c72578081fd5b8335925060208401356139458161404e565b60008060408385031215613c96578182fd5b8235915060208301356001600160401b03811115613cb2578182fd5b610f9d85828601613819565b60008060408385031215613cd0578182fd5b50508035926020909101359150565b60008151808452815b81811015613d0457602081850181015186830182015201613ce8565b81811115613d155782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613d8b90830184613cdf565b9695505050505050565b6001600160a01b03858116825284166020820152604081018390526080810160058310613dd257634e487b7160e01b600052602160045260246000fd5b82606083015295945050505050565b6020808252825182820181905260009190848201906040850190845b81811015613e225783516001600160a01b031683529284019291840191600101613dfd565b50909695505050505050565b6020815260006138bb6020830184613cdf565b60408152600080845482600182811c915080831680613e6157607f831692505b6020808410821415613e8157634e487b7160e01b87526022600452602487fd5b6040880184905260608801828015613ea05760018114613eb157613edb565b60ff19871682528282019750613edb565b60008c815260209020895b87811015613ed557815484820152908601908401613ebc565b83019850505b5050878603818901525050505050613ef38185613cdf565b95945050505050565b6020808252601b908201527a4e6f74206f776e6572206f722061626c6520746f2062797061737360281b604082015260600190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b600082613f9757634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615613fb657613fb6614022565b500290565b600082821015613fcd57613fcd614022565b500390565b600181811c90821680613fe657607f821691505b602082108114156106b757634e487b7160e01b600052602260045260246000fd5b600060001982141561401b5761401b614022565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146117f157600080fd5b80151581146117f157600080fd5b6001600160e01b0319811681146117f157600080fdfe608060405234801561001057600080fd5b50610b1d806100206000396000f3fe60806040526004361061006f5760003560e01c8063715018a6146101635780638129fc1c1461017a5780638da5cb5b1461018f578063932fe1d5146101c1578063a1a74aae146101e1578063bdd4d18d14610201578063d71ab4b714610223578063f2fde38b1461024357600080fd5b3661015e576065546100ac5760405162461bcd60e51b81526020600482015260016024820152603160f81b60448201526064015b60405180910390fd5b60005b60655481101561015b576000606582815481106100dc57634e487b7160e01b600052603260045260246000fd5b60009182526020918290206040805160608101825292909101546001600160a01b03811680845263ffffffff600160a01b83048116958501869052600160c01b9092049091169183018290529193506101489261013990346109cf565b61014391906109af565b610263565b508061015381610a05565b9150506100af565b50005b600080fd5b34801561016f57600080fd5b50610178610294565b005b34801561018657600080fd5b506101786102cf565b34801561019b57600080fd5b506101a46103e0565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101cd57600080fd5b506101786101dc366004610825565b6103ef565b3480156101ed57600080fd5b506101786101fc3660046108ab565b61048c565b34801561020d57600080fd5b506102166105c9565b6040516101b891906108c3565b34801561022f57600080fd5b5061017861023e366004610894565b610650565b34801561024f57600080fd5b5061017861025e366004610802565b6106bd565b600080600080600085875af190508061028f576040516312171d8360e31b815260040160405180910390fd5b505050565b3361029d6103e0565b6001600160a01b0316146102c35760405162461bcd60e51b81526004016100a39061092f565b6102cd6000610756565b565b600054610100900460ff16158080156102ef5750600054600160ff909116105b806103095750303b158015610309575060005460ff166001145b61036c5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016100a3565b6000805460ff19166001179055801561038f576000805461ff0019166101001790555b6103976107a8565b80156103dd576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50565b6033546001600160a01b031690565b336103f86103e0565b6001600160a01b03161461041e5760405162461bcd60e51b81526004016100a39061092f565b60005b8181101561028f57606583838381811061044b57634e487b7160e01b600052603260045260246000fd5b835460018101855560009485526020909420606090910292909201929190910190506104778282610a51565b5050808061048490610a05565b915050610421565b336104956103e0565b6001600160a01b0316146104bb5760405162461bcd60e51b81526004016100a39061092f565b606580546104cb906001906109ee565b815481106104e957634e487b7160e01b600052603260045260246000fd5b906000526020600020016065828154811061051457634e487b7160e01b600052603260045260246000fd5b600091825260209091208254910180546001600160a01b039092166001600160a01b031983168117825583546001600160c01b031990931617600160a01b9283900463ffffffff90811690930217808255925463ffffffff60c01b19909316600160c01b9384900490921690920217905560658054806105a457634e487b7160e01b600052603160045260246000fd5b600082815260209020810160001990810180546001600160e01b031916905501905550565b60606065805480602002602001604051908101604052809291908181526020016000905b8282101561064757600084815260209081902060408051606081018252918501546001600160a01b038116835263ffffffff600160a01b8204811684860152600160c01b90910416908201528252600190920191016105ed565b50505050905090565b336106596103e0565b6001600160a01b03161461067f5760405162461bcd60e51b81526004016100a39061092f565b6065805460018101825560009190915281907f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c70161028f8282610a51565b336106c66103e0565b6001600160a01b0316146106ec5760405162461bcd60e51b81526004016100a39061092f565b6001600160a01b0381166107515760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016100a3565b6103dd815b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff166107cf5760405162461bcd60e51b81526004016100a390610964565b6102cd600054610100900460ff166107f95760405162461bcd60e51b81526004016100a390610964565b6102cd33610756565b600060208284031215610813578081fd5b813561081e81610ad2565b9392505050565b60008060208385031215610837578081fd5b82356001600160401b038082111561084d578283fd5b818501915085601f830112610860578283fd5b81358181111561086e578384fd5b866020606083028501011115610882578384fd5b60209290920196919550909350505050565b6000606082840312156108a5578081fd5b50919050565b6000602082840312156108bc578081fd5b5035919050565b602080825282518282018190526000919060409081850190868401855b8281101561092257815180516001600160a01b031685528681015163ffffffff90811688870152908601511685850152606090930192908501906001016108e0565b5091979650505050505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b6000826109ca57634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156109e9576109e9610a20565b500290565b600082821015610a0057610a00610a20565b500390565b6000600019821415610a1957610a19610a20565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6000813563ffffffff81168114610a4b578182fd5b92915050565b8135610a5c81610ad2565b81546001600160a01b031981166001600160a01b0392909216918217835563ffffffff60a01b610a8e60208601610a36565b60a01b16808360018060c01b031984161717845563ffffffff60c01b610ab660408701610a36565b60c01b168363ffffffff60e01b84161782171784555050505050565b6001600160a01b03811681146103dd57600080fdfea264697066735822122014bc76b7d4091d371911118088e2bf2707a403b33e15cd967edd5236c982bb1b64736f6c63430008040033165f0fc496c6f74e1376579ffc36bcfc90ef4779c44b9232cf0d606db3cc69d1ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212203aeb7f1163a18c2fee92fe14647920860da58553ed7ac5ae50406754617d9def64736f6c63430008040033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102045760003560e01c806301ffc9a71461020957806306fdde031461024b578063081812fc14610260578063095ea7b314610280578063152f0eb51461029557806318160ddd146102a85780631986166f146102ba5780631beab0f6146102cd57806323b872dd146102e05780632a55205a146102f35780632adbc37d146103255780632cf1dacb1461032d5780632f745c59146103405780632fb102cf1461035357806330477d361461036657806340897bbe1461037957806342842e0e1461038157806342966c68146103945780634f6ccce7146103a757806354fd4d50146103ba5780636352211e146103c157806370a08231146103d4578063715018a6146103e7578063736cd42d146103ef57806374478bb3146104025780637b74297d1461040f5780637e5b1e241461042f5780638129fc1c1461044257806386575e401461044a5780638da5cb5b1461045d57806395d89b41146104655780639713c8071461046d5780639ad9523214610480578063a06617cd14610493578063a22cb465146104b3578063a8f1602c146104c6578063b88d4fde146104f3578063bd7f4c8d14610506578063c87b56dd14610519578063d31af4841461052c578063e565fef31461053f578063e8a3d48514610552578063e985e9c51461055a578063f2fde38b14610596575b600080fd5b610236610217366004613b74565b6001600160e01b03191660009081526020819052604090205460ff1690565b60405190151581526020015b60405180910390f35b6102536105a9565b6040516102429190613e2e565b61027361026e366004613c46565b61063b565b6040516102429190613d2a565b61029361028e366004613a22565b6106bd565b005b6102936102a3366004613a22565b610918565b6075545b604051908152602001610242565b6102936102c83660046139f3565b6109ea565b6102936102db366004613a22565b610ad5565b6102936102ee366004613916565b610cd5565b610306610301366004613cbe565b610f1c565b604080516001600160a01b039093168352602083019190915201610242565b610293610fa7565b61029361033b3660046139f3565b61103d565b6102ac61034e366004613a22565b611124565b610293610361366004613a4d565b6111c9565b607b54610273906001600160a01b031681565b6102936113aa565b61029361038f366004613916565b611437565b6102936103a2366004613c46565b611457565b6102ac6103b5366004613c46565b61164a565b60016102ac565b6102736103cf366004613c46565b6116c0565b6102ac6103e236600461389f565b611718565b61029361176f565b6102936103fd36600461389f565b6117f4565b6066546102369060ff1681565b61042261041d366004613c46565b61188f565b6040516102429190613de1565b61029361043d366004613c14565b6118fb565b6102936119c0565b610293610458366004613bac565b611c81565b610273611d1a565b610253611d29565b61029361047b366004613c5e565b611d38565b61025361048e366004613c46565b611eeb565b6102ac6104a136600461389f565b60696020526000908152604090205481565b6102936104c13660046139c6565b611fe6565b6102366104d4366004613a22565b6001600160a01b03919091166000908152606960205260409020541490565b610293610501366004613956565b61210b565b6102ac61051436600461389f565b61214d565b610253610527366004613c46565b612158565b61029361053a366004613c84565b6121cd565b61029361054d366004613ad5565b6122be565b610253612344565b6102366105683660046138de565b6001600160a01b039182166000908152606e6020908152604080832093909416825291909152205460ff1690565b6102936105a436600461389f565b612353565b6060606f80546105b890613fd2565b80601f01602080910402602001604051908101604052809291908181526020018280546105e490613fd2565b80156106315780601f1061060657610100808354040283529160200191610631565b820191906000526020600020905b81548152906001019060200180831161061457829003601f168201915b5050505050905090565b6000818152606b60209081526040808320548151808301909252600682526518181998181960d11b9282019290925283916001600160a01b031661069b5760405162461bcd60e51b81526004016106929190613e2e565b60405180910390fd5b506000838152606c60205260409020546001600160a01b031691505b50919050565b816daaeb6d7670e522a718067333cd4e3b1561077557604051633185c44d60e21b81526daaeb6d7670e522a718067333cd4e9063c6171134906107069030908590600401613d3e565b60206040518083038186803b15801561071e57600080fd5b505afa158015610732573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107569190613b58565b6107755780604051633b79c77360e21b81526004016106929190613d2a565b6000828152606b602052604090205482906001600160a01b0316338114806107c057506001600160a01b0381166000908152606e6020908152604080832033845290915290205460ff165b6040518060400160405280600681526020016530303330303360d01b815250906107fd5760405162461bcd60e51b81526004016106929190613e2e565b506000848152606b6020908152604091829020548251808401909352600683526518181998181960d11b918301919091528591906001600160a01b03166108575760405162461bcd60e51b81526004016106929190613e2e565b506000858152606b6020908152604091829020548251808401909352600683526506060666060760d31b918301919091526001600160a01b03908116919088168214156108b75760405162461bcd60e51b81526004016106929190613e2e565b506000868152606c602052604080822080546001600160a01b0319166001600160a01b038b811691821790925591518993918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a450505050505050565b33600081815260696020526040902054151580610944575033610939611d1a565b6001600160a01b0316145b61099c5760405162461bcd60e51b8152602060048201526024808201527f436f6e7472616374206973206e6f742072656769737465726564206e6f72204f6044820152633bb732b960e11b6064820152608401610692565b506001600160a01b039091166000818152606960209081526040808320859055938252606a8152928120805460018101825590825292902090910180546001600160a01b0319169091179055565b606654600090610100900460ff168015610a29575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b905033610a34611d1a565b6001600160a01b03161480610a465750805b610a625760405162461bcd60e51b815260040161069290613efc565b6001600160a01b03841660009081526067602090815260408083206001600160e01b0319871684529091529020805460ff191660011790558115610acf576001600160a01b03841660009081526068602090815260408083208584529091529020805460ff191660011790555b50505050565b606654600090610100900460ff168015610b14575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b905033610b1f611d1a565b6001600160a01b03161480610b315750805b610b4d5760405162461bcd60e51b815260040161069290613efc565b6001600160a01b0383166000908152606960205260409020548390610bb15760405162461bcd60e51b815260206004820152601a60248201527910dbdb9d1c9858dd081a5cc81b9bdd081c9959da5cdd195c995960321b6044820152606401610692565b6001600160a01b0384166000908152606960209081526040808320548352606a909152902080548190610be690600190613fbb565b81548110610c0457634e487b7160e01b600052603260045260246000fd5b9060005260206000200160009054906101000a90046001600160a01b0316818581548110610c4257634e487b7160e01b600052603260045260246000fd5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555080805480610c8e57634e487b7160e01b600052603160045260246000fd5b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b039690961681526069909552505060408320929092555050565b826daaeb6d7670e522a718067333cd4e3b15610d8d57604051633185c44d60e21b81526daaeb6d7670e522a718067333cd4e9063c617113490610d1e9030908590600401613d3e565b60206040518083038186803b158015610d3657600080fd5b505afa158015610d4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6e9190613b58565b610d8d5780604051633b79c77360e21b81526004016106929190613d2a565b816000610d998261243d565b6000838152606b6020526040812054919250906001600160a01b031633811480610dd957506000848152606c60205260409020546001600160a01b031633145b80610e0757506001600160a01b0381166000908152606e6020908152604080832033845290915290205460ff165b80610e0f5750825b604051806040016040528060068152602001650c0c0ccc0c0d60d21b81525090610e4c5760405162461bcd60e51b81526004016106929190613e2e565b506000868152606b6020908152604091829020548251808401909352600683526518181998181960d11b918301919091528791906001600160a01b0316610ea65760405162461bcd60e51b81526004016106929190613e2e565b506000878152606b6020908152604091829020548251808401909352600683526530303330303760d01b918301919091526001600160a01b0390811691908b168214610f055760405162461bcd60e51b81526004016106929190613e2e565b50610f108989612482565b50505050505050505050565b6000828152607a6020526040812054819081906001600160a01b0316610f43576079610f52565b6000858152607a602052604090205b6040805180820190915290546001600160a01b038116808352600160a01b90910462ffffff166020830181905290945090915061271090610f939086613f9c565b610f9d9190613f7c565b9150509250929050565b606654600090610100900460ff168015610fe6575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b905033610ff1611d1a565b6001600160a01b031614806110035750805b61101f5760405162461bcd60e51b815260040161069290613efc565b506066805461ff001981166101009182900460ff1615909102179055565b606654600090610100900460ff16801561107c575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b905033611087611d1a565b6001600160a01b031614806110995750805b6110b55760405162461bcd60e51b815260040161069290613efc565b6001600160a01b03841660009081526067602090815260408083206001600160e01b0319871684529091529020805460ff191690558115610acf576001600160a01b03841660009081526068602090815260408083208584529091529020805460ff1916600117905550505050565b6001600160a01b0382166000908152607760209081526040808320548151808301909252600682526530303530303760d01b9282019290925290831061117d5760405162461bcd60e51b81526004016106929190613e2e565b506001600160a01b03831660009081526077602052604090208054839081106111b657634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b606654600090610100900460ff168015611208575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b905033611213611d1a565b6001600160a01b031614806112255750805b6112415760405162461bcd60e51b815260040161069290613efc565b61124b8787612611565b61128b8686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061267192505050565b6112cb8684848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506126ea92505050565b6003600052606a602052600080516020614bc5833981519152541580159061133f575060036000908152606a602052600080516020614bc5833981519152805433929061132857634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0316145b156113a15760405163b68c437960e01b8152339063b68c43799061136e906000908b908b908390600401613d95565b600060405180830381600087803b15801561138857600080fd5b505af115801561139c573d6000803e3d6000fd5b505050505b50505050505050565b606654600090610100900460ff1680156113e9575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b9050336113f4611d1a565b6001600160a01b031614806114065750805b6114225760405162461bcd60e51b815260040161069290613efc565b506066805460ff19811660ff90911615179055565b61145283838360405180602001604052806000815250612763565b505050565b8060006114638261243d565b6000838152606b6020526040812054919250906001600160a01b0316338114806114a357506000848152606c60205260409020546001600160a01b031633145b806114d157506001600160a01b0381166000908152606e6020908152604080832033845290915290205460ff165b806114d95750825b604051806040016040528060068152602001650c0c0ccc0c0d60d21b815250906115165760405162461bcd60e51b81526004016106929190613e2e565b5061152085612ae0565b6003600052606a602052600080516020614bc58339815191525415801590611594575060036000908152606a602052600080516020614bc58339815191528054829061157c57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031614155b156116435760036000908152606a602052600080516020614bc583398151915280549091906115d357634e487b7160e01b600052603260045260246000fd5b600091825260208220015460405163b68c437960e01b81526001600160a01b039091169163b68c4379916116109133918a90600390600401613d95565b600060405180830381600087803b15801561162a57600080fd5b505af115801561163e573d6000803e3d6000fd5b505050505b5050505050565b60755460408051808201909152600681526530303530303760d01b6020820152600091831061168c5760405162461bcd60e51b81526004016106929190613e2e565b50607582815481106116ae57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b6000818152606b6020908152604091829020548251808401909352600683526518181998181960d11b918301919091526001600160a01b031690816106b75760405162461bcd60e51b81526004016106929190613e2e565b60408051808201909152600681526530303330303160d01b60208201526000906001600160a01b03831661175f5760405162461bcd60e51b81526004016106929190613e2e565b5061176982612c2c565b92915050565b606654600090610100900460ff1680156117ae575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b9050336117b9611d1a565b6001600160a01b031614806117cb5750805b6117e75760405162461bcd60e51b815260040161069290613efc565b6117f16000612c47565b50565b606654600090610100900460ff168015611833575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b90503361183e611d1a565b6001600160a01b031614806118505750805b61186c5760405162461bcd60e51b815260040161069290613efc565b50607b80546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152606a60209081526040918290208054835181840281018401909452808452606093928301828280156118ef57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116118d1575b50505050509050919050565b606654600090610100900460ff16801561193a575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b905033611945611d1a565b6001600160a01b031614806119575750805b6119735760405162461bcd60e51b815260040161069290613efc565b7fc4761b87ec5248fbb0deaff2d6b1651b8dd04322c6597549eefe44d799d480ce6071836040516119a5929190613e41565b60405180910390a18151611452906071906020850190613641565b600154610100900460ff16158080156119dd57506001805460ff16105b806119f65750303b1580156119f657506001805460ff16145b611a595760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610692565b6001805460ff1916811790558015611a7b576001805461ff0019166101001790555b611a83612c99565b60408051808201909152600f8082526e22b6b13632b6902b30bab63a102b1960891b6020909201918252611ab991606f91613641565b5060408051808201909152600a80825269456d626c656d2e70726f60b01b6020909201918252611aeb91607091613641565b50611afc635b5e139f60e01b612cca565b611b0c63780e9d6360e01b612cca565b611b1c6380ac58cd60e01b612cca565b611b2c63152a902d60e11b612cca565b611b34612d48565b604051611b40906136c5565b604051809103906000f080158015611b5c573d6000803e3d6000fd5b50607b80546001600160a01b0319166001600160a01b039290921691821790556040805163204a7f0760e21b81529051638129fc1c9160048082019260009290919082900301818387803b158015611bb357600080fd5b505af1158015611bc7573d6000803e3d6000fd5b5050607b5460405163f2fde38b60e01b81526001600160a01b03909116925063f2fde38b9150611bfb903390600401613d2a565b600060405180830381600087803b158015611c1557600080fd5b505af1158015611c29573d6000803e3d6000fd5b50506066805460ff19166001179055505080156117f1576001805461ff00191681556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b606654600090610100900460ff168015611cc0575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b905033611ccb611d1a565b6001600160a01b03161480611cdd5750805b611cf95760405162461bcd60e51b815260040161069290613efc565b611d05606f86866136d2565b50611d12607084846136d2565b505050505050565b6034546001600160a01b031690565b6060607080546105b890613fd2565b306001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611d7157600080fd5b505afa158015611d85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611da991906138c2565b6001600160a01b0316336001600160a01b031614611df55760405162461bcd60e51b81526020600482015260096024820152682737ba1027bbb732b960b91b6044820152606401610692565b612710811115611e445760405162461bcd60e51b815260206004820152601a60248201527908aa48664727062a4def2c2d8e8d2cae67440a8dede40d0d2ced60331b6044820152606401610692565b82611e9457604080518082019091526001600160a01b03831680825262ffffff8316602090920182905260798054600160a01b9093026001600160b81b0319909316909117919091179055505050565b6040805180820182526001600160a01b03938416815262ffffff92831660208083019182526000968752607a905291909420935184549151909216600160a01b026001600160b81b03199091169190921617179055565b6000818152606b6020908152604091829020548251808401909352600683526518181998181960d11b9183019190915260609183916001600160a01b0316611f465760405162461bcd60e51b81526004016106929190613e2e565b5060008381526073602052604090208054611f6090613fd2565b80601f0160208091040260200160405190810160405280929190818152602001828054611f8c90613fd2565b8015611fd95780601f10611fae57610100808354040283529160200191611fd9565b820191906000526020600020905b815481529060010190602001808311611fbc57829003601f168201915b5050505050915050919050565b816daaeb6d7670e522a718067333cd4e3b1561209e57604051633185c44d60e21b81526daaeb6d7670e522a718067333cd4e9063c61711349061202f9030908590600401613d3e565b60206040518083038186803b15801561204757600080fd5b505afa15801561205b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061207f9190613b58565b61209e5780604051633b79c77360e21b81526004016106929190613d2a565b336000818152606e602090815260408083206001600160a01b03881680855290835292819020805460ff191687151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61164385858585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061276392505050565b600061176982612c2c565b6000818152606b6020908152604091829020548251808401909352600683526518181998181960d11b9183019190915260609183916001600160a01b03166121b35760405162461bcd60e51b81526004016106929190613e2e565b5060008381526072602052604090208054611f6090613fd2565b6000828152606b6020908152604091829020548251808401909352600683526518181998181960d11b918301919091528391906001600160a01b03166122265760405162461bcd60e51b81526004016106929190613e2e565b50606654600090610100900460ff168015612266575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b905033612271611d1a565b6001600160a01b031614806122835750805b61229f5760405162461bcd60e51b815260040161069290613efc565b6000848152607260209081526040909120845161164392860190613641565b606654600090610100900460ff1680156122fd575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b905033612308611d1a565b6001600160a01b0316148061231a5750805b6123365760405162461bcd60e51b815260040161069290613efc565b6113a1878787878787612dcf565b6060607180546105b890613fd2565b606654600090610100900460ff168015612392575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b90503361239d611d1a565b6001600160a01b031614806123af5750805b6123cb5760405162461bcd60e51b815260040161069290613efc565b6001600160a01b0382166124305760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610692565b61243982612c47565b5050565b606654600090610100900460ff16801561245a575061245a612ddd565b8015611769575050336000908152606860209081526040808320938352929052205460ff1690565b6000818152606b60205260409020546001600160a01b03166124a382612e21565b6124ad8183612e5c565b6124b78383613006565b6003600052606a602052600080516020614bc5833981519152541580159061252b575060036000908152606a602052600080516020614bc58339815191528054829061251357634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031614155b156125dd5760036000908152606a602052600080516020614bc5833981519152805490919061256a57634e487b7160e01b600052603260045260246000fd5b60009182526020909120015460405163b68c437960e01b81526001600160a01b039091169063b68c4379906125aa90849087908790600190600401613d95565b600060405180830381600087803b1580156125c457600080fd5b505af11580156125d8573d6000803e3d6000fd5b505050505b81836001600160a01b0316826001600160a01b0316600080516020614be583398151915260405160405180910390a4505050565b61261b82826130c9565b607580546001818101835560008390527f9a8d93986a7b9e6294572ea6736696119c195c1a9f5eae642d3c5fcd44e49dea909101839055905461265e9190613fbb565b6000918252607660205260409091205550565b6000828152606b6020908152604091829020548251808401909352600683526518181998181960d11b918301919091528391906001600160a01b03166126ca5760405162461bcd60e51b81526004016106929190613e2e565b5060008381526072602090815260409091208351610acf92850190613641565b6000828152606b6020908152604091829020548251808401909352600683526518181998181960d11b918301919091528391906001600160a01b03166127435760405162461bcd60e51b81526004016106929190613e2e565b5060008381526073602090815260409091208351610acf92850190613641565b836daaeb6d7670e522a718067333cd4e3b1561281b57604051633185c44d60e21b81526daaeb6d7670e522a718067333cd4e9063c6171134906127ac9030908590600401613d3e565b60206040518083038186803b1580156127c457600080fd5b505afa1580156127d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127fc9190613b58565b61281b5780604051633b79c77360e21b81526004016106929190613d2a565b8260006128278261243d565b6000838152606b6020526040812054919250906001600160a01b03163381148061286757506000848152606c60205260409020546001600160a01b031633145b8061289557506001600160a01b0381166000908152606e6020908152604080832033845290915290205460ff165b8061289d5750825b604051806040016040528060068152602001650c0c0ccc0c0d60d21b815250906128da5760405162461bcd60e51b81526004016106929190613e2e565b506000878152606b6020908152604091829020548251808401909352600683526518181998181960d11b918301919091528891906001600160a01b03166129345760405162461bcd60e51b81526004016106929190613e2e565b506000888152606b6020908152604091829020548251808401909352600683526530303330303760d01b918301919091526001600160a01b0390811691908c1682146129935760405162461bcd60e51b81526004016106929190613e2e565b5060408051808201909152600681526530303330303160d01b60208201526001600160a01b038b166129d85760405162461bcd60e51b81526004016106929190613e2e565b506129e38a8a612482565b6129f58a6001600160a01b031661319a565b1561139c5760006001600160a01b038b1663150b7a02338e8d8d6040518563ffffffff1660e01b8152600401612a2e9493929190613d58565b602060405180830381600087803b158015612a4857600080fd5b505af1158015612a5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a809190613b90565b60408051808201909152600681526530303330303560d01b60208201529091506001600160e01b03198216630a85bd0160e11b14612ad15760405162461bcd60e51b81526004016106929190613e2e565b50505050505050505050505050565b612ae9816131d6565b60008181526072602052604090208054612b0290613fd2565b159050612b20576000818152607260205260408120612b2091613746565b60008181526073602052604090208054612b3990613fd2565b159050612b57576000818152607360205260408120612b5791613746565b600081815260766020526040812054607554909190612b7890600190613fbb565b9050600060758281548110612b9d57634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508060758481548110612bcc57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001556075805480612bf757634e487b7160e01b600052603160045260246000fd5b600082815260208082208301600019908101839055909201909255918152607690915260408082209390935592835250812055565b6001600160a01b031660009081526077602052604090205490565b603480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600154610100900460ff16612cc05760405162461bcd60e51b815260040161069290613f31565b612cc8613286565b565b6001600160e01b03198082161415612d235760405162461bcd60e51b815260206004820152601c60248201527b115490cc4d8d4e881a5b9d985b1a59081a5b9d195c999858d9481a5960221b6044820152606401610692565b6001600160e01b0319166000908152602081905260409020805460ff19166001179055565b6301ffc9a760e01b60009081526020527f67be87c3ff9960ca1e9cfac5cab2ff4747269cf9ed20c9b7306235ac35a491c55460ff1615612dbf5760405162461bcd60e51b8152602060048201526012602482015271105b1c9958591e48149959da5cdd195c995960721b6044820152606401610692565b612cc86301ffc9a760e01b612cca565b611d128686868686866132b6565b606654600090610100900460ff168015612e1c575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b905090565b6000818152606c60205260409020546001600160a01b0316156117f1576000908152606c6020526040902080546001600160a01b0319169055565b6000818152606b6020908152604091829020548251808401909352600683526530303330303760d01b918301919091526001600160a01b03848116911614612eb75760405162461bcd60e51b81526004016106929190613e2e565b506000818152606b6020908152604080832080546001600160a01b031916905560788252808320546001600160a01b03861684526077909252822054909190612f0290600190613fbb565b9050818114612fb5576001600160a01b0384166000908152607760205260408120805483908110612f4357634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508060776000876001600160a01b03166001600160a01b031681526020019081526020016000208481548110612f9557634e487b7160e01b600052603260045260246000fd5b600091825260208083209091019290925591825260789052604090208290555b6001600160a01b0384166000908152607760205260409020805480612fea57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000818152606b6020908152604091829020548251808401909352600683526518181998181b60d11b918301919091526001600160a01b03161561305d5760405162461bcd60e51b81526004016106929190613e2e565b506000818152606b6020908152604080832080546001600160a01b0319166001600160a01b0387169081179091558084526077835290832080546001818101835582865293852001859055925290546130b69190613fbb565b6000918252607860205260409091205550565b60408051808201909152600681526530303330303160d01b60208201526001600160a01b03831661310d5760405162461bcd60e51b81526004016106929190613e2e565b506000818152606b6020908152604091829020548251808401909352600683526518181998181b60d11b918301919091526001600160a01b0316156131655760405162461bcd60e51b81526004016106929190613e2e565b506131708282613006565b60405181906001600160a01b03841690600090600080516020614be5833981519152908290a45050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081158015906131ce5750808214155b949350505050565b6000818152606b6020908152604091829020548251808401909352600683526518181998181960d11b918301919091528291906001600160a01b031661322f5760405162461bcd60e51b81526004016106929190613e2e565b506000828152606b60205260409020546001600160a01b031661325183612e21565b61325b8184612e5c565b60405183906000906001600160a01b03841690600080516020614be5833981519152908390a4505050565b600154610100900460ff166132ad5760405162461bcd60e51b815260040161069290613f31565b612cc833612c47565b60005b858110156113a15781861480156132cf57508184145b15613389576133848787838181106132f757634e487b7160e01b600052603260045260246000fd5b905060200201602081019061330c919061389f565b86868481811061332c57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190613341919061389f565b61337f86868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525088925061349f915050565b613520565b61348d565b81861480156133985750818414155b1561341a576133848787838181106133c057634e487b7160e01b600052603260045260246000fd5b90506020020160208101906133d5919061389f565b868661341587878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061349f915050565b613594565b61348d87878381811061343d57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190613452919061389f565b868686868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061359492505050565b8061349781614007565b9150506132b9565b60408051600180825281830190925260609160009190602080830190803683370190505090508383815181106134e557634e487b7160e01b600052603260045260246000fd5b60200260200101518160008151811061350e57634e487b7160e01b600052603260045260246000fd5b60209081029190910101529392505050565b60005b8151811015610acf5781818151811061354c57634e487b7160e01b600052603260045260246000fd5b6020026020010151836001600160a01b0316856001600160a01b0316600080516020614be583398151915260405160405180910390a48061358c81614007565b915050613523565b60005b828110156116435781518314156135f0576135eb858585848181106135cc57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906135e1919061389f565b61337f858561349f565b61362f565b61362f8585858481811061361457634e487b7160e01b600052603260045260246000fd5b9050602002016020810190613629919061389f565b84613520565b8061363981614007565b915050613597565b82805461364d90613fd2565b90600052602060002090601f01602090048101928261366f57600085556136b5565b82601f1061368857805160ff19168380011785556136b5565b828001600101855582156136b5579182015b828111156136b557825182559160200191906001019061369a565b506136c192915061377c565b5090565b610b3d8061408883390190565b8280546136de90613fd2565b90600052602060002090601f01602090048101928261370057600085556136b5565b82601f106137195782800160ff198235161785556136b5565b828001600101855582156136b5579182015b828111156136b557823582559160200191906001019061372b565b50805461375290613fd2565b6000825580601f10613762575050565b601f0160209004906000526020600020908101906117f191905b5b808211156136c1576000815560010161377d565b60008083601f8401126137a2578081fd5b5081356001600160401b038111156137b8578182fd5b6020830191508360208260051b85010111156137d357600080fd5b9250929050565b60008083601f8401126137eb578182fd5b5081356001600160401b03811115613801578182fd5b6020830191508360208285010111156137d357600080fd5b600082601f830112613829578081fd5b81356001600160401b038082111561384357613843614038565b604051601f8301601f19908116603f0116810190828211818310171561386b5761386b614038565b81604052838152866020858801011115613883578485fd5b8360208701602083013792830160200193909352509392505050565b6000602082840312156138b0578081fd5b81356138bb8161404e565b9392505050565b6000602082840312156138d3578081fd5b81516138bb8161404e565b600080604083850312156138f0578081fd5b82356138fb8161404e565b9150602083013561390b8161404e565b809150509250929050565b60008060006060848603121561392a578081fd5b83356139358161404e565b925060208401356139458161404e565b929592945050506040919091013590565b60008060008060006080868803121561396d578081fd5b85356139788161404e565b945060208601356139888161404e565b93506040860135925060608601356001600160401b038111156139a9578182fd5b6139b5888289016137da565b969995985093965092949392505050565b600080604083850312156139d8578182fd5b82356139e38161404e565b9150602083013561390b81614063565b600080600060608486031215613a07578283fd5b8335613a128161404e565b9250602084013561394581614071565b60008060408385031215613a34578182fd5b8235613a3f8161404e565b946020939093013593505050565b60008060008060008060808789031215613a65578081fd5b8635613a708161404e565b95506020870135945060408701356001600160401b0380821115613a92578283fd5b613a9e8a838b016137da565b90965094506060890135915080821115613ab6578283fd5b50613ac389828a016137da565b979a9699509497509295939492505050565b60008060008060008060608789031215613aed578384fd5b86356001600160401b0380821115613b03578586fd5b613b0f8a838b01613791565b90985096506020890135915080821115613b27578586fd5b613b338a838b01613791565b90965094506040890135915080821115613b4b578384fd5b50613ac389828a01613791565b600060208284031215613b69578081fd5b81516138bb81614063565b600060208284031215613b85578081fd5b81356138bb81614071565b600060208284031215613ba1578081fd5b81516138bb81614071565b60008060008060408587031215613bc1578182fd5b84356001600160401b0380821115613bd7578384fd5b613be3888389016137da565b90965094506020870135915080821115613bfb578384fd5b50613c08878288016137da565b95989497509550505050565b600060208284031215613c25578081fd5b81356001600160401b03811115613c3a578182fd5b6131ce84828501613819565b600060208284031215613c57578081fd5b5035919050565b600080600060608486031215613c72578081fd5b8335925060208401356139458161404e565b60008060408385031215613c96578182fd5b8235915060208301356001600160401b03811115613cb2578182fd5b610f9d85828601613819565b60008060408385031215613cd0578182fd5b50508035926020909101359150565b60008151808452815b81811015613d0457602081850181015186830182015201613ce8565b81811115613d155782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613d8b90830184613cdf565b9695505050505050565b6001600160a01b03858116825284166020820152604081018390526080810160058310613dd257634e487b7160e01b600052602160045260246000fd5b82606083015295945050505050565b6020808252825182820181905260009190848201906040850190845b81811015613e225783516001600160a01b031683529284019291840191600101613dfd565b50909695505050505050565b6020815260006138bb6020830184613cdf565b60408152600080845482600182811c915080831680613e6157607f831692505b6020808410821415613e8157634e487b7160e01b87526022600452602487fd5b6040880184905260608801828015613ea05760018114613eb157613edb565b60ff19871682528282019750613edb565b60008c815260209020895b87811015613ed557815484820152908601908401613ebc565b83019850505b5050878603818901525050505050613ef38185613cdf565b95945050505050565b6020808252601b908201527a4e6f74206f776e6572206f722061626c6520746f2062797061737360281b604082015260600190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b600082613f9757634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615613fb657613fb6614022565b500290565b600082821015613fcd57613fcd614022565b500390565b600181811c90821680613fe657607f821691505b602082108114156106b757634e487b7160e01b600052602260045260246000fd5b600060001982141561401b5761401b614022565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146117f157600080fd5b80151581146117f157600080fd5b6001600160e01b0319811681146117f157600080fdfe608060405234801561001057600080fd5b50610b1d806100206000396000f3fe60806040526004361061006f5760003560e01c8063715018a6146101635780638129fc1c1461017a5780638da5cb5b1461018f578063932fe1d5146101c1578063a1a74aae146101e1578063bdd4d18d14610201578063d71ab4b714610223578063f2fde38b1461024357600080fd5b3661015e576065546100ac5760405162461bcd60e51b81526020600482015260016024820152603160f81b60448201526064015b60405180910390fd5b60005b60655481101561015b576000606582815481106100dc57634e487b7160e01b600052603260045260246000fd5b60009182526020918290206040805160608101825292909101546001600160a01b03811680845263ffffffff600160a01b83048116958501869052600160c01b9092049091169183018290529193506101489261013990346109cf565b61014391906109af565b610263565b508061015381610a05565b9150506100af565b50005b600080fd5b34801561016f57600080fd5b50610178610294565b005b34801561018657600080fd5b506101786102cf565b34801561019b57600080fd5b506101a46103e0565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101cd57600080fd5b506101786101dc366004610825565b6103ef565b3480156101ed57600080fd5b506101786101fc3660046108ab565b61048c565b34801561020d57600080fd5b506102166105c9565b6040516101b891906108c3565b34801561022f57600080fd5b5061017861023e366004610894565b610650565b34801561024f57600080fd5b5061017861025e366004610802565b6106bd565b600080600080600085875af190508061028f576040516312171d8360e31b815260040160405180910390fd5b505050565b3361029d6103e0565b6001600160a01b0316146102c35760405162461bcd60e51b81526004016100a39061092f565b6102cd6000610756565b565b600054610100900460ff16158080156102ef5750600054600160ff909116105b806103095750303b158015610309575060005460ff166001145b61036c5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016100a3565b6000805460ff19166001179055801561038f576000805461ff0019166101001790555b6103976107a8565b80156103dd576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50565b6033546001600160a01b031690565b336103f86103e0565b6001600160a01b03161461041e5760405162461bcd60e51b81526004016100a39061092f565b60005b8181101561028f57606583838381811061044b57634e487b7160e01b600052603260045260246000fd5b835460018101855560009485526020909420606090910292909201929190910190506104778282610a51565b5050808061048490610a05565b915050610421565b336104956103e0565b6001600160a01b0316146104bb5760405162461bcd60e51b81526004016100a39061092f565b606580546104cb906001906109ee565b815481106104e957634e487b7160e01b600052603260045260246000fd5b906000526020600020016065828154811061051457634e487b7160e01b600052603260045260246000fd5b600091825260209091208254910180546001600160a01b039092166001600160a01b031983168117825583546001600160c01b031990931617600160a01b9283900463ffffffff90811690930217808255925463ffffffff60c01b19909316600160c01b9384900490921690920217905560658054806105a457634e487b7160e01b600052603160045260246000fd5b600082815260209020810160001990810180546001600160e01b031916905501905550565b60606065805480602002602001604051908101604052809291908181526020016000905b8282101561064757600084815260209081902060408051606081018252918501546001600160a01b038116835263ffffffff600160a01b8204811684860152600160c01b90910416908201528252600190920191016105ed565b50505050905090565b336106596103e0565b6001600160a01b03161461067f5760405162461bcd60e51b81526004016100a39061092f565b6065805460018101825560009190915281907f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c70161028f8282610a51565b336106c66103e0565b6001600160a01b0316146106ec5760405162461bcd60e51b81526004016100a39061092f565b6001600160a01b0381166107515760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016100a3565b6103dd815b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff166107cf5760405162461bcd60e51b81526004016100a390610964565b6102cd600054610100900460ff166107f95760405162461bcd60e51b81526004016100a390610964565b6102cd33610756565b600060208284031215610813578081fd5b813561081e81610ad2565b9392505050565b60008060208385031215610837578081fd5b82356001600160401b038082111561084d578283fd5b818501915085601f830112610860578283fd5b81358181111561086e578384fd5b866020606083028501011115610882578384fd5b60209290920196919550909350505050565b6000606082840312156108a5578081fd5b50919050565b6000602082840312156108bc578081fd5b5035919050565b602080825282518282018190526000919060409081850190868401855b8281101561092257815180516001600160a01b031685528681015163ffffffff90811688870152908601511685850152606090930192908501906001016108e0565b5091979650505050505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b6000826109ca57634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156109e9576109e9610a20565b500290565b600082821015610a0057610a00610a20565b500390565b6000600019821415610a1957610a19610a20565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6000813563ffffffff81168114610a4b578182fd5b92915050565b8135610a5c81610ad2565b81546001600160a01b031981166001600160a01b0392909216918217835563ffffffff60a01b610a8e60208601610a36565b60a01b16808360018060c01b031984161717845563ffffffff60c01b610ab660408701610a36565b60c01b168363ffffffff60e01b84161782171784555050505050565b6001600160a01b03811681146103dd57600080fdfea264697066735822122014bc76b7d4091d371911118088e2bf2707a403b33e15cd967edd5236c982bb1b64736f6c63430008040033165f0fc496c6f74e1376579ffc36bcfc90ef4779c44b9232cf0d606db3cc69d1ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212203aeb7f1163a18c2fee92fe14647920860da58553ed7ac5ae50406754617d9def64736f6c63430008040033

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.