ETH Price: $3,079.98 (-0.26%)

Token

who*anon* (WHOANON)
 

Overview

Max Total Supply

329 WHOANON

Holders

223

Total Transfers

-

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
WhoAnonByMetadrop

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 14 : WhoAnonByMetadrop.sol
// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.17;

//                      %@@@@@                @@@@@
//                      %@@@@@                @@@@@
//              @       %@@@@@       @        @@@@@       ,
//             @@@@@@   %@@@@@   @@@@@@@@@    @@@@@   .@@@@@&
//             /@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//                #@@@@@@@@@@@@@@@@@    @@@@@@@@@@@@@@@@@
//                   @@@@@@@@@@@@          @@@@@@@@@@@
//              @@@@@@@@@@@@@@@@@@@@  @@@@@@@@@@@@@@@@@@@
//            @@@@@@@@@@%@@@@@@@@@@@@@@@@@@@@ @@@@@ @@@@@@@@@#
//             @@@@@    %@@@@@    @@@@@@@     @@@@@    .@@@@
//                      %@@@@@                @@@@@
//                      %@@@@@                @@@@@
//
//
//                               who*anon*
//
//
//
//                 @@@@@@&&&&&&&&&&&&&&&&&&&&&&&&&&&&@@@@@@
//          p   m  @@@@@@&&&&&&/      %%&&&%*     (&&&@@@@@
//          o   e  @@@@@@&&&&&&&%.     /%%*       #&&&@@@@@
//          w b t  @@@@@@&&&&&&&%#              ,%&&&@@@@@@
//          e y a  @@@@@@&&&&&&&&&%%,       .    (%&&@@@@@@
//          r   d  @@@@@@&&&&&&&&&&&%%    (/     #&&&@@@@@@
//          e   r  @@@@@@&&&#  &&&&&&&&%%%%*    /%&&&@@@@@@
//          d   o  @@@@@@&&&*   (&&&&&&&&&%.    (&&&@@@@@@@
//              p  @@@@@@&&&&&&&&&&&&&&&&&&&&&&&&&&&&@@@@@@
//
import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/Pausable.sol";
import "@openzeppelin/contracts/token/ERC1155/extensions/ERC1155Burnable.sol";
import "@openzeppelin/contracts/token/ERC1155/extensions/ERC1155Supply.sol";
import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol";

/**
 * @dev who*anon* ERC-1155 contract
 */
contract WhoAnonByMetadrop is
  ERC1155,
  Ownable,
  Pausable,
  ERC1155Burnable,
  ERC1155Supply
{
  // ERC-2981: NFT Royalty Standard
  bytes4 private constant _INTERFACE_ID_ERC2981 = 0x2a55205a;

  /**
   * @dev Add name and symbol for consistency with ERC-721 NFTs. Note that ERC-721 stores
   * these variables on-chain, but as they can only be set on the constructor we may as well
   * save the storage and have them as constants in the bytecode. You're welcome Ethereum!
   */
  string private constant NAME = "who*anon*";
  string private constant SYMBOL = "WHOANON";

  /**
   * @dev Developer address:
   */
  address public developer;
  address public beneficiary;

  /**
   * @dev Price buffer above and below the passed amount of ETH that will be accepted. This function
   * will be used to set the price for items in the UI, but there is always the possibility of price
   * fluctuations beween the display and the mint. These parameters determine as an amount per thousand
   * how high above or below the price the passed amount of ETH can be and still make a valid sale. The
   * stored values are in the following format:
   *   - priceBufferUp: amount as a proportion of 1,000. For example, if you set this to 1005 you allow the
   *       price to be up to 1005 / 1000 of the actual price, i.e. not exceeding 0.5% greater.
   *   - priceBufferDown: amount as a proportion of 1,000. For example, if you set this to 995 you allow the
   *       price to be up to 995 / 1000 of the actual price i.e. not exceeding 0.5% less.
   */
  uint16 public priceBufferUp;
  uint16 public priceBufferDown;

  bool public pausableShutoffProtectionDisabled = false;
  bool public pausableDisabled = false;

  bool public publicationShutoffProtectionDisabled = false;
  bool public publicationDisabled = false;

  // while we initialize to 0, we will mint the first token at 1
  uint256 public latestEdition;

  /**
   * @dev ERC-2981 configuration
   */
  address public royaltyReceipientAddress;
  uint256 public royaltyPercentageBasisPoints;

  AggregatorV3Interface internal priceFeed;

  /**
   * @dev titles struct:
   */
  struct PublishedTitle {
    // Slot 1 and 2 (at least)
    string titleURI;
    // Slot 3, 64 + 128 + 64 = 256
    uint64 maxSupply;
    uint128 priceInUSD;
    uint64 startTime;
    // Slot 4, 64 + 64 + 8 + 8 = 144
    uint64 endTime;
    uint64 developerAllocation;
    bool developerAllocationLocked;
    bool exists;
  }

  /**
   * @dev map token classes to parameters:
   */
  mapping(uint256 => PublishedTitle) public publishedTitles;

  mapping(uint256 => uint256) public developerAllocationMinted;

  /**
   * @dev Contract events:
   */
  event PriceBufferUpSet(uint256 priceBuffer);
  event PriceBufferDownSet(uint256 priceBuffer);
  event YouAreAnon(
    address account,
    uint256 tokenId,
    uint256 quantity,
    uint256 cost
  );
  event YouAreRedeemedAnon(
    address account,
    uint256 tokenId,
    uint256 quantity,
    bytes32 hashData,
    bytes data
  );
  event TitlePublished(
    uint256 tokenId,
    string titleURI,
    string redeemableURI_,
    uint64 maxSupply,
    uint128 priceInUSD,
    uint64 mintStartDate,
    uint64 mintEndDate,
    uint64 redeemStartDate,
    uint64 redeemEndDate,
    uint64 developerAllocation,
    bool developerAllocationLocked
  );

  error SupplyExceeded();
  error CannotMintRedeemTokens();
  error CannotRedeemRedeemTokens();
  error InvalidParameters();
  error DeveloperAllocationExceeded();
  error DeveloperAllocationLocked();
  error PublicationIsDisabled();
  error PausableIsDisabled();
  error PublicationShutoffProtectionIsOn();
  error PausableShutoffProtectionIsOn();

  /**
   * @dev Constructor must be passed an array of shareholders for the payment splitter, the first
   * array holding addresses and the second the corresponding shares. For example, you could have the following:
   *   - payees_ [beneficiaryAddress, developerAddress]
   *   - shares_ [90,10]
   * In this example the beneficiary address passed in can claim 90% of total ETH, the developer 10%
   */
  constructor(
    uint16[] memory priceBuffers_,
    address beneficiary_,
    address developer_,
    address priceFeedAddress_,
    PublishedTitle[] memory firstEditions_
  ) ERC1155("") {
    setPriceBufferUp(priceBuffers_[0]);
    setPriceBufferDown(priceBuffers_[1]);
    beneficiary = beneficiary_;
    developer = developer_;
    // @dev Contract address for pricefeed data.
    // MAINNET: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419
    // GOERLI: 0xD4a33860578De61DBAbDc8BFdb98FD742fA7028e
    priceFeed = AggregatorV3Interface(priceFeedAddress_);
    _publishFirstEditions(firstEditions_);
  }

  modifier whenMintingOpen(uint256 tokenId_) {
    require(mintingIsOpen(tokenId_), "Minting is not open");
    _;
  }

  modifier whenMintingClosed(uint256 tokenId_) {
    require(!mintingIsOpen(tokenId_), "Minting is open");
    _;
  }

  modifier onlyOwnerOrDeveloper() {
    require(
      msg.sender == owner() || msg.sender == developer,
      "Only owner or developer"
    );
    _;
  }

  /**
   * @dev whenDeveloperAllocationAvailable
   */
  modifier whenDeveloperAllocationAvailable(
    uint256 tokenId_,
    uint256 quantity_
  ) {
    if (
      (developerAllocationMinted[tokenId_] + quantity_) >
      publishedTitles[tokenId_].developerAllocation
    ) {
      revert DeveloperAllocationExceeded();
    }
    _;
  }

  /**
   *  =======================================
   *  ADMIN FUNCTIONS
   *  =======================================
   */

  /**
   * @dev owner can publish new titles:
   */
  function publish(
    string memory mintableURI_,
    string memory redeemableURI_,
    uint64 maxSupply_,
    uint128 priceInUSD_,
    uint64 mintableStartTime_,
    uint64 mintableDurationInHours_,
    uint64 redeemableStartTime_,
    uint64 redeemableDurationInHours_,
    uint64 developerAllocation_,
    bool developerAllocationLocked_
  ) external onlyOwner {
    if (publicationDisabled) {
      revert PublicationIsDisabled();
    }

    uint256 mintableEditionTokenId = latestEdition + 1;
    uint256 redeemableEditionTokenId = mintableEditionTokenId + 1;

    // Publish the mintable edition:
    publishedTitles[mintableEditionTokenId].titleURI = mintableURI_;
    publishedTitles[mintableEditionTokenId].maxSupply = maxSupply_;
    publishedTitles[mintableEditionTokenId].priceInUSD = priceInUSD_;
    publishedTitles[mintableEditionTokenId].startTime = mintableStartTime_;
    publishedTitles[mintableEditionTokenId].endTime =
      mintableStartTime_ +
      (mintableDurationInHours_ * 1 hours);
    publishedTitles[mintableEditionTokenId]
      .developerAllocation = developerAllocation_;
    publishedTitles[mintableEditionTokenId]
      .developerAllocationLocked = developerAllocationLocked_;
    publishedTitles[mintableEditionTokenId].exists = true;

    // Publish the redeemable edition:
    publishedTitles[redeemableEditionTokenId].titleURI = redeemableURI_;
    publishedTitles[redeemableEditionTokenId].maxSupply = 0;
    publishedTitles[redeemableEditionTokenId].priceInUSD = 0;
    publishedTitles[redeemableEditionTokenId].startTime = redeemableStartTime_;
    publishedTitles[redeemableEditionTokenId].endTime =
      redeemableStartTime_ +
      (redeemableDurationInHours_ * 1 hours);
    publishedTitles[redeemableEditionTokenId].developerAllocation = 0;
    publishedTitles[redeemableEditionTokenId].developerAllocationLocked = true;
    publishedTitles[redeemableEditionTokenId].exists = true;

    latestEdition = redeemableEditionTokenId;

    emit TitlePublished(
      mintableEditionTokenId,
      mintableURI_,
      redeemableURI_,
      maxSupply_,
      priceInUSD_,
      mintableStartTime_,
      mintableStartTime_ + (mintableDurationInHours_ * 1 hours),
      redeemableStartTime_,
      redeemableStartTime_ + (redeemableDurationInHours_ * 1 hours),
      developerAllocation_,
      developerAllocationLocked_
    );
  }

  /**
   * @dev updatePriceFeedAddress
   */
  function updatePriceFeedAddress(address priceFeedAddress_)
    external
    onlyOwner
  {
    priceFeed = AggregatorV3Interface(priceFeedAddress_);
  }

  /**
   * @dev updateLatestEdition
   */
  function updateLatestEdition(uint32 latestEdition_) external onlyOwner {
    latestEdition = latestEdition_;
  }

  /**
   * @dev disablePausableShutoffProtection
   */
  function disablePausableShutoffProtection() external onlyOwner {
    pausableShutoffProtectionDisabled = true;
  }

  /**
   * @dev disablePausable
   */
  function disablePausable() external onlyOwner {
    if (pausableShutoffProtectionDisabled) {
      pausableDisabled = true;
    } else {
      revert PausableShutoffProtectionIsOn();
    }
  }

  /**
   * @dev enablePausableShutoffProtection
   */
  function enablePausableShutoffProtection() external onlyOwner {
    pausableShutoffProtectionDisabled = false;
  }

  /**
   * @dev disablePausableShutoffProtection
   */
  function disablePublicationShutoffProtection() external onlyOwner {
    publicationShutoffProtectionDisabled = true;
  }

  /**
   * @dev disablePublication
   */
  function disablePublication() external onlyOwner {
    if (publicationShutoffProtectionDisabled) {
      publicationDisabled = true;
    } else {
      revert PublicationShutoffProtectionIsOn();
    }
  }

  /**
   * @dev enablePublicationShutoffProtection
   */
  function enablePublicationShutoffProtection() external onlyOwner {
    publicationShutoffProtectionDisabled = false;
  }

  /**
   * @dev owner can reduce supply:
   */
  function reduceSupply(uint256 tokenId_, uint64 maxSupply_)
    external
    onlyOwner
  {
    require(publishedTitles[tokenId_].exists, "Token ID does not exist");

    // A supply of 0 is unlimited, so under no circumstances can this be a valid update:
    require(
      maxSupply_ != 0,
      "Cannot set to unlimited after initial publication"
    );

    // A supply of 0 is unlimited, so always allow a reduction from unlimited:
    if (publishedTitles[tokenId_].maxSupply > 0) {
      require(
        publishedTitles[tokenId_].maxSupply > maxSupply_,
        "Supply can only be decreased"
      );
    }
    publishedTitles[tokenId_].maxSupply = maxSupply_;
  }

  /**
   * @dev updateTokenURI
   */
  function updateTokenURI(uint256 tokenId_, string memory uri_)
    external
    onlyOwner
  {
    require(publishedTitles[tokenId_].exists, "Token ID does not exist");

    publishedTitles[tokenId_].titleURI = uri_;
  }

  /**
   * @dev updateTokenPriceInUSD
   */
  function updateTokenPriceInUSD(uint256 tokenId_, uint128 tokenPrice_)
    external
    onlyOwner
  {
    require(publishedTitles[tokenId_].exists, "Token ID does not exist");

    // A supply of 0 is unlimited, so under no circumstances can this be a valid update:
    publishedTitles[tokenId_].priceInUSD = tokenPrice_;
  }

  /**
   * @dev updateStartTime
   */
  function updateStartTime(uint256 tokenId_, uint64 startTime_)
    external
    onlyOwner
  {
    require(publishedTitles[tokenId_].exists, "Token ID does not exist");

    publishedTitles[tokenId_].startTime = startTime_;
  }

  /**
   * @dev updateEndTime
   */
  function updateEndTime(uint256 tokenId_, uint64 endTime_) external onlyOwner {
    require(publishedTitles[tokenId_].exists, "Token ID does not exist");

    publishedTitles[tokenId_].endTime = endTime_;
  }

  /**
   * @dev updateDeveloperAllocation
   */
  function updateDeveloperAllocation(
    uint256 tokenId_,
    uint64 developerAlloaction_
  ) external onlyOwner {
    require(publishedTitles[tokenId_].exists, "Token ID does not exist");

    if (publishedTitles[tokenId_].developerAllocationLocked) {
      revert DeveloperAllocationLocked();
    }

    publishedTitles[tokenId_].developerAllocation = developerAlloaction_;
  }

  /**
   * @dev lockDeveloperAllocationForTokenId
   */
  function lockDeveloperAllocationForTokenId(uint256 tokenId_)
    external
    onlyOwner
  {
    publishedTitles[tokenId_].developerAllocationLocked = true;
  }

  /**
   * @dev updateDeveloper
   */
  function updateDeveloper(address developer_) external onlyOwner {
    developer = developer_;
  }

  /**
   * @dev updateBeneficiary
   */
  function updateBeneficiary(address beneficiary_) external onlyOwner {
    beneficiary = beneficiary_;
  }

  /**
   * @dev setPriceBufferUp
   */
  function setPriceBufferUp(uint16 priceBufferUpToSet_) public onlyOwner {
    priceBufferUp = priceBufferUpToSet_;
    emit PriceBufferUpSet(priceBufferUp);
  }

  /**
   * @dev setPriceBufferDown
   */
  function setPriceBufferDown(uint16 priceBufferDownToSet_) public onlyOwner {
    priceBufferDown = priceBufferDownToSet_;
    emit PriceBufferDownSet(priceBufferDown);
  }

  /**
   * @dev pause
   */
  function pause() public onlyOwner {
    if (pausableDisabled) {
      revert PausableIsDisabled();
    }
    _pause();
  }

  /**
   * @dev unpause
   */
  function unpause() public onlyOwner {
    _unpause();
  }

  /**
   *  =======================================
   *  GETTERS
   *  =======================================
   */

  /**
   * @dev get Title details
   */
  function getTitleDetails(uint256 _tokenId)
    external
    view
    returns (PublishedTitle memory)
  {
    return (publishedTitles[_tokenId]);
  }

  function getPriceFeedAddress() external view returns (address) {
    return (address(priceFeed));
  }

  function mintingIsOpen(uint256 tokenId_) public view returns (bool) {
    return (block.timestamp >= publishedTitles[tokenId_].startTime &&
      block.timestamp <= publishedTitles[tokenId_].endTime);
  }

  function getCurrentRate() external view returns (uint256) {
    return (uint256(getLatestPrice()));
  }

  function getDollarValueInWei(uint256 _dollarValue)
    external
    view
    returns (uint256)
  {
    uint256 latestPrice = uint256(getLatestPrice());
    return (_performConversion(latestPrice, _dollarValue));
  }

  function getETHPriceForTokenId(uint256 tokenId_)
    public
    view
    returns (uint256 price_)
  {
    uint256 latestPrice = uint256(getLatestPrice());

    return (
      _performConversion(latestPrice, publishedTitles[tokenId_].priceInUSD)
    );
  }

  function getBuffers()
    external
    view
    onlyOwner
    returns (uint256 bufferUp_, uint256 bufferDown_)
  {
    return (priceBufferUp, priceBufferDown);
  }

  /**
   * @dev Add name, symbol and total supply for consistency with ERC-721 NFTs.
   */
  function name() public pure returns (string memory) {
    return NAME;
  }

  function symbol() public pure returns (string memory) {
    return SYMBOL;
  }

  function totalSupply()
    public
    view
    returns (uint256 totalSupplyForAllCollections_)
  {
    for (uint256 i = 1; i <= latestEdition; ) {
      totalSupplyForAllCollections_ += totalSupply(i);
      unchecked {
        i++;
      }
    }
    return totalSupplyForAllCollections_;
  }

  /**
   * Returns the latest USD price to 8DP of 1 ETH
   */
  function getLatestPrice() public view returns (int256) {
    (, int256 price, , , ) = priceFeed.latestRoundData();
    return price;
  }

  /**
   * @dev _publishFirstEditions
   */
  function _publishFirstEditions(PublishedTitle[] memory firstEditions_)
    internal
  {
    for (uint256 i = 0; i < firstEditions_.length; ) {
      publishedTitles[i + 1] = firstEditions_[i];

      unchecked {
        i++;
      }
    }
    for (uint256 i = 0; i < firstEditions_.length; ) {
      emit TitlePublished(
        i + 1, // unredeemed edition
        firstEditions_[i].titleURI,
        firstEditions_[i + 1].titleURI,
        firstEditions_[i].maxSupply,
        firstEditions_[i].priceInUSD,
        firstEditions_[i].startTime,
        firstEditions_[i].endTime,
        firstEditions_[i + 1].startTime,
        firstEditions_[i + 1].endTime,
        firstEditions_[i].developerAllocation,
        firstEditions_[i].developerAllocationLocked
      );
      unchecked {
        i += 2;
      }
    }
    // Update the latest Edition number:
    latestEdition = firstEditions_.length;
  }

  /**
   * @dev perform price conversion USD to Wei at the prescribed number of significant figures (i.e. DP in ETH)
   */
  function _performConversion(uint256 _price, uint256 _value)
    internal
    pure
    returns (uint256 convertedValue)
  {
    require(_price > 0 && _price < 9999999999999, "Pricing Error");
    // The USD figure from the price feed is one eth in USD to 8 DP. We need the value of one dollar in wei/
    // The price feed has 8DP so lets add that exponent to our wei figure to give us the value of $1 in wei
    uint256 oneUSDInWei = ((10**26) / _price);
    // 2) Mutiply our dollar value by that to get our value in wei:
    uint256 valueInWei = oneUSDInWei * _value;

    // 3) And then roundup that number to 4DP of eth by removing 10**14 digits, adding 1, then multiplying by 10**14:
    valueInWei = ((valueInWei / (10**14)) + 1) * (10**14);
    return (valueInWei);
  }

  /**
   * @dev This function is called from the UI to mint NFTs for the user.
   */
  function iAmAnon(uint256 tokenId_, uint256 quantity_)
    external
    payable
    whenMintingOpen(tokenId_)
    whenNotPaused
  {
    require(quantity_ != 0, "Order must be for an item");

    // Can only mint mintables, i.e. ODD numbered token IDs. The even equivalent (minted 1 = redeemed 2 etc)
    // must be obtained on redemption of the minted
    if (!_isMintableToken(tokenId_)) {
      revert CannotMintRedeemTokens();
    }

    // Check that we aren't requesting more than is available:
    if (_orderExceedsSupply(tokenId_, quantity_)) {
      revert SupplyExceeded();
    }

    // Calculate the required price for this order:
    uint256 orderPrice = _priceOrder(tokenId_, quantity_);

    // Check the payment is correct:
    _checkPaymentToPrice(msg.value, orderPrice);

    // To reach here the price and quantity check must have passed. Mint the items:
    _mint(msg.sender, tokenId_, quantity_, "");

    emit YouAreAnon(msg.sender, tokenId_, quantity_, msg.value);
  }

  /**
   * @dev This function is called on redemption
   */
  function redeemAnon(
    uint256 tokenId_,
    uint256 quantity_,
    bytes32 dataHash_,
    bytes memory data_
  ) external whenMintingOpen(tokenId_ + 1) whenNotPaused {
    if (_isRedemptionToken(tokenId_)) {
      revert CannotRedeemRedeemTokens();
    }

    require(quantity_ != 0, "Redemption must be for an item");

    burn(msg.sender, tokenId_, quantity_);

    // All good so far? OK, mint their redeption equivalents
    _mint(msg.sender, (tokenId_ + 1), quantity_, "");

    emit YouAreRedeemedAnon(msg.sender, tokenId_, quantity_, dataHash_, data_);
  }

  /**
   * @dev _orderExceedsSupply
   */
  function _orderExceedsSupply(uint256 tokenId_, uint256 quantity_)
    internal
    view
    returns (bool)
  {
    // Note a supply set to 0 is unlimited:
    uint256 maxSupply = publishedTitles[tokenId_].maxSupply;

    if ((maxSupply != 0) && ((quantity_ + totalSupply(tokenId_)) > maxSupply)) {
      return true;
    } else {
      return false;
    }
  }

  /**
   * @dev _isMintableToken
   */
  function _isMintableToken(uint256 tokenId_) internal pure returns (bool) {
    return (tokenId_ % 2 != 0);
  }

  /**
   * @dev _isRedepmtionToken
   */
  function _isRedemptionToken(uint256 tokenId_) internal pure returns (bool) {
    return (tokenId_ % 2 == 0);
  }

  /**
   * @dev Get the current price of this order in the same way that it will have been assembled in the UI,
   * i.e. get the current price of each token type in ETH (including the rounding to 4DP of ETH) and then
   * multiply that by the total quantity ordered.
   */
  function _priceOrder(uint256 tokenId_, uint256 quantity_)
    internal
    view
    returns (uint256 price)
  {
    uint256 orderCostInETH = 0;

    uint256 unitPrice = getETHPriceForTokenId(tokenId_);

    orderCostInETH = (unitPrice * quantity_);

    return (orderCostInETH);
  }

  /**
   * @dev mintDeveloperAllocation
   */
  function mintDeveloperAllocation(uint256 tokenId_, uint256 quantity_)
    external
    payable
    onlyOwnerOrDeveloper
    whenDeveloperAllocationAvailable(tokenId_, quantity_)
  {
    _mint(developer, tokenId_, quantity_, "");

    developerAllocationMinted[tokenId_] += quantity_;
  }

  /**
   * @dev Determine if the passed cost is within bounds of current price:
   */
  function _checkPaymentToPrice(uint256 _passedETH, uint256 _orderPrice)
    internal
    view
  {
    // Establish upper and lower bands of price buffer and check
    uint256 orderPriceLower = (_orderPrice * priceBufferDown) / 1000;

    require(_passedETH >= orderPriceLower, "Insufficient ETH passed for order");

    uint256 orderPriceUpper = (_orderPrice * priceBufferUp) / 1000;

    require(_passedETH <= orderPriceUpper, "Too much ETH passed for order");
  }

  /**
   * @dev
   */
  function setRoyaltyPercentageBasisPoints(
    uint256 royaltyPercentageBasisPoints_
  ) external onlyOwner {
    royaltyPercentageBasisPoints = royaltyPercentageBasisPoints_;
  }

  /**
   * @dev
   */
  function setRoyaltyReceipientAddress(
    address payable royaltyReceipientAddress_
  ) external onlyOwner {
    royaltyReceipientAddress = royaltyReceipientAddress_;
  }

  /**
   * @dev
   */
  function royaltyInfo(uint256, uint256 salePrice_)
    external
    view
    returns (address receiver, uint256 royaltyAmount)
  {
    uint256 royalty = (salePrice_ * royaltyPercentageBasisPoints) / 10000;
    return (royaltyReceipientAddress, royalty);
  }

  /**
   * @dev
   */
  function supportsInterface(bytes4 interfaceId)
    public
    view
    override(ERC1155)
    returns (bool)
  {
    return
      interfaceId == _INTERFACE_ID_ERC2981 ||
      super.supportsInterface(interfaceId);
  }

  /**
   *  =======================================
   *  STANDARD FUNCTIONS
   *  =======================================
   */
  function uri(uint256 _tokenId)
    public
    view
    virtual
    override
    returns (string memory)
  {
    return publishedTitles[_tokenId].titleURI;
  }

  /**
   *
   * @dev withdrawContractBalance: onlyOwner withdrawal to the beneficiary address
   *
   */
  function withdrawContractBalance() external onlyOwner {
    (bool success, ) = beneficiary.call{value: address(this).balance}("");
    require(success, "Transfer failed");
  }

  /**
   *
   * @dev withdrawETH: onlyOwner withdrawal to the beneficiary address, sending
   * the amount to withdraw as an argument
   *
   */
  function withdrawETH(uint256 amount_) external onlyOwner {
    (bool success, ) = beneficiary.call{value: amount_}("");
    require(success, "Transfer failed");
  }

  /**
   * @dev The fallback function is executed on a call to the contract if
   * none of the other functions match the given function signature.
   */
  fallback() external payable {
    revert();
  }

  /**
   * @dev revert any random ETH:
   */
  receive() external payable {
    revert();
  }

  function _beforeTokenTransfer(
    address operator,
    address from,
    address to,
    uint256[] memory ids,
    uint256[] memory amounts,
    bytes memory data
  ) internal override(ERC1155, ERC1155Supply) whenNotPaused {
    super._beforeTokenTransfer(operator, from, to, ids, amounts, data);
  }
}

File 2 of 14 : AggregatorV3Interface.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface AggregatorV3Interface {
  function decimals() external view returns (uint8);

  function description() external view returns (string memory);

  function version() external view returns (uint256);

  function getRoundData(uint80 _roundId)
    external
    view
    returns (
      uint80 roundId,
      int256 answer,
      uint256 startedAt,
      uint256 updatedAt,
      uint80 answeredInRound
    );

  function latestRoundData()
    external
    view
    returns (
      uint80 roundId,
      int256 answer,
      uint256 startedAt,
      uint256 updatedAt,
      uint80 answeredInRound
    );
}

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

pragma solidity ^0.8.0;

import "../utils/Context.sol";

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

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

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

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

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

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

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

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

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

File 4 of 14 : Pausable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        _requireNotPaused();
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        _requirePaused();
        _;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Throws if the contract is paused.
     */
    function _requireNotPaused() internal view virtual {
        require(!paused(), "Pausable: paused");
    }

    /**
     * @dev Throws if the contract is not paused.
     */
    function _requirePaused() internal view virtual {
        require(paused(), "Pausable: not paused");
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

File 5 of 14 : ERC1155.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC1155/ERC1155.sol)

pragma solidity ^0.8.0;

import "./IERC1155.sol";
import "./IERC1155Receiver.sol";
import "./extensions/IERC1155MetadataURI.sol";
import "../../utils/Address.sol";
import "../../utils/Context.sol";
import "../../utils/introspection/ERC165.sol";

/**
 * @dev Implementation of the basic standard multi-token.
 * See https://eips.ethereum.org/EIPS/eip-1155
 * Originally based on code by Enjin: https://github.com/enjin/erc-1155
 *
 * _Available since v3.1._
 */
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
    using Address for address;

    // Mapping from token ID to account balances
    mapping(uint256 => mapping(address => uint256)) private _balances;

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

    // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
    string private _uri;

    /**
     * @dev See {_setURI}.
     */
    constructor(string memory uri_) {
        _setURI(uri_);
    }

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

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the same URI for *all* token types. It relies
     * on the token type ID substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * Clients calling this function must replace the `\{id\}` substring with the
     * actual token type ID.
     */
    function uri(uint256) public view virtual override returns (string memory) {
        return _uri;
    }

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
        require(account != address(0), "ERC1155: address zero is not a valid owner");
        return _balances[id][account];
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
        public
        view
        virtual
        override
        returns (uint256[] memory)
    {
        require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf(accounts[i], ids[i]);
        }

        return batchBalances;
    }

    /**
     * @dev See {IERC1155-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not token owner or approved"
        );
        _safeTransferFrom(from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not token owner or approved"
        );
        _safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }
        _balances[id][to] += amount;

        emit TransferSingle(operator, from, to, id, amount);

        _afterTokenTransfer(operator, from, to, ids, amounts, data);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
            _balances[id][to] += amount;
        }

        emit TransferBatch(operator, from, to, ids, amounts);

        _afterTokenTransfer(operator, from, to, ids, amounts, data);

        _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
    }

    /**
     * @dev Sets a new URI for all token types, by relying on the token type ID
     * substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * By this mechanism, any occurrence of the `\{id\}` substring in either the
     * URI or any of the amounts in the JSON file at said URI will be replaced by
     * clients with the token type ID.
     *
     * For example, the `https://token-cdn-domain/\{id\}.json` URI would be
     * interpreted by clients as
     * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
     * for token type ID 0x4cce0.
     *
     * See {uri}.
     *
     * Because these URIs cannot be meaningfully represented by the {URI} event,
     * this function emits no events.
     */
    function _setURI(string memory newuri) internal virtual {
        _uri = newuri;
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        _balances[id][to] += amount;
        emit TransferSingle(operator, address(0), to, id, amount);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

        _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; i++) {
            _balances[ids[i]][to] += amounts[i];
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

        _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
    }

    /**
     * @dev Destroys `amount` tokens of token type `id` from `from`
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `from` must have at least `amount` tokens of token type `id`.
     */
    function _burn(
        address from,
        uint256 id,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }

        emit TransferSingle(operator, from, address(0), id, amount);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function _burnBatch(
        address from,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        for (uint256 i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
        }

        emit TransferBatch(operator, from, address(0), ids, amounts);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits an {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC1155: setting approval status for self");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `ids` and `amounts` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    /**
     * @dev Hook that is called after any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
                if (response != IERC1155Receiver.onERC1155Received.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non-ERC1155Receiver implementer");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (
                bytes4 response
            ) {
                if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non-ERC1155Receiver implementer");
            }
        }
    }

    function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }
}

File 6 of 14 : ERC1155Burnable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC1155/extensions/ERC1155Burnable.sol)

pragma solidity ^0.8.0;

import "../ERC1155.sol";

/**
 * @dev Extension of {ERC1155} that allows token holders to destroy both their
 * own tokens and those that they have been approved to use.
 *
 * _Available since v3.1._
 */
abstract contract ERC1155Burnable is ERC1155 {
    function burn(
        address account,
        uint256 id,
        uint256 value
    ) public virtual {
        require(
            account == _msgSender() || isApprovedForAll(account, _msgSender()),
            "ERC1155: caller is not token owner or approved"
        );

        _burn(account, id, value);
    }

    function burnBatch(
        address account,
        uint256[] memory ids,
        uint256[] memory values
    ) public virtual {
        require(
            account == _msgSender() || isApprovedForAll(account, _msgSender()),
            "ERC1155: caller is not token owner or approved"
        );

        _burnBatch(account, ids, values);
    }
}

File 7 of 14 : ERC1155Supply.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC1155/extensions/ERC1155Supply.sol)

pragma solidity ^0.8.0;

import "../ERC1155.sol";

/**
 * @dev Extension of ERC1155 that adds tracking of total supply per id.
 *
 * Useful for scenarios where Fungible and Non-fungible tokens have to be
 * clearly identified. Note: While a totalSupply of 1 might mean the
 * corresponding is an NFT, there is no guarantees that no other token with the
 * same id are not going to be minted.
 */
abstract contract ERC1155Supply is ERC1155 {
    mapping(uint256 => uint256) private _totalSupply;

    /**
     * @dev Total amount of tokens in with a given id.
     */
    function totalSupply(uint256 id) public view virtual returns (uint256) {
        return _totalSupply[id];
    }

    /**
     * @dev Indicates whether any token exist with a given id, or not.
     */
    function exists(uint256 id) public view virtual returns (bool) {
        return ERC1155Supply.totalSupply(id) > 0;
    }

    /**
     * @dev See {ERC1155-_beforeTokenTransfer}.
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual override {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);

        if (from == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                _totalSupply[ids[i]] += amounts[i];
            }
        }

        if (to == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                uint256 id = ids[i];
                uint256 amount = amounts[i];
                uint256 supply = _totalSupply[id];
                require(supply >= amount, "ERC1155: burn amount exceeds totalSupply");
                unchecked {
                    _totalSupply[id] = supply - amount;
                }
            }
        }
    }
}

File 8 of 14 : IERC1155MetadataURI.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)

pragma solidity ^0.8.0;

import "../IERC1155.sol";

/**
 * @dev Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}

File 9 of 14 : IERC1155.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;

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

/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

File 10 of 14 : IERC1155Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.0;

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

/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
     * @dev Handles the receipt of a single ERC1155 token type. This function is
     * called at the end of a `safeTransferFrom` after the balance has been updated.
     *
     * NOTE: To accept the transfer, this must return
     * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
     * (i.e. 0xf23a6e61, or its own function selector).
     *
     * @param operator The address which initiated the transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param id The ID of the token being transferred
     * @param value The amount of tokens being transferred
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
     */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
     * @dev Handles the receipt of a multiple ERC1155 token types. This function
     * is called at the end of a `safeBatchTransferFrom` after the balances have
     * been updated.
     *
     * NOTE: To accept the transfer(s), this must return
     * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
     * (i.e. 0xbc197c81, or its own function selector).
     *
     * @param operator The address which initiated the batch transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param ids An array containing ids of each token being transferred (order and length must match values array)
     * @param values An array containing amounts of each token being transferred (order and length must match ids array)
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
     */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

File 11 of 14 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or 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 {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // 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 12 of 14 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

File 13 of 14 : ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

File 14 of 14 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint16[]","name":"priceBuffers_","type":"uint16[]"},{"internalType":"address","name":"beneficiary_","type":"address"},{"internalType":"address","name":"developer_","type":"address"},{"internalType":"address","name":"priceFeedAddress_","type":"address"},{"components":[{"internalType":"string","name":"titleURI","type":"string"},{"internalType":"uint64","name":"maxSupply","type":"uint64"},{"internalType":"uint128","name":"priceInUSD","type":"uint128"},{"internalType":"uint64","name":"startTime","type":"uint64"},{"internalType":"uint64","name":"endTime","type":"uint64"},{"internalType":"uint64","name":"developerAllocation","type":"uint64"},{"internalType":"bool","name":"developerAllocationLocked","type":"bool"},{"internalType":"bool","name":"exists","type":"bool"}],"internalType":"struct WhoAnonByMetadrop.PublishedTitle[]","name":"firstEditions_","type":"tuple[]"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"CannotMintRedeemTokens","type":"error"},{"inputs":[],"name":"CannotRedeemRedeemTokens","type":"error"},{"inputs":[],"name":"DeveloperAllocationExceeded","type":"error"},{"inputs":[],"name":"DeveloperAllocationLocked","type":"error"},{"inputs":[],"name":"InvalidParameters","type":"error"},{"inputs":[],"name":"PausableIsDisabled","type":"error"},{"inputs":[],"name":"PausableShutoffProtectionIsOn","type":"error"},{"inputs":[],"name":"PublicationIsDisabled","type":"error"},{"inputs":[],"name":"PublicationShutoffProtectionIsOn","type":"error"},{"inputs":[],"name":"SupplyExceeded","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"priceBuffer","type":"uint256"}],"name":"PriceBufferDownSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"priceBuffer","type":"uint256"}],"name":"PriceBufferUpSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"titleURI","type":"string"},{"indexed":false,"internalType":"string","name":"redeemableURI_","type":"string"},{"indexed":false,"internalType":"uint64","name":"maxSupply","type":"uint64"},{"indexed":false,"internalType":"uint128","name":"priceInUSD","type":"uint128"},{"indexed":false,"internalType":"uint64","name":"mintStartDate","type":"uint64"},{"indexed":false,"internalType":"uint64","name":"mintEndDate","type":"uint64"},{"indexed":false,"internalType":"uint64","name":"redeemStartDate","type":"uint64"},{"indexed":false,"internalType":"uint64","name":"redeemEndDate","type":"uint64"},{"indexed":false,"internalType":"uint64","name":"developerAllocation","type":"uint64"},{"indexed":false,"internalType":"bool","name":"developerAllocationLocked","type":"bool"}],"name":"TitlePublished","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"quantity","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"cost","type":"uint256"}],"name":"YouAreAnon","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"quantity","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"hashData","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"YouAreRedeemedAnon","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"beneficiary","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"developer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"developerAllocationMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disablePausable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disablePausableShutoffProtection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disablePublication","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disablePublicationShutoffProtection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enablePausableShutoffProtection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enablePublicationShutoffProtection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBuffers","outputs":[{"internalType":"uint256","name":"bufferUp_","type":"uint256"},{"internalType":"uint256","name":"bufferDown_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_dollarValue","type":"uint256"}],"name":"getDollarValueInWei","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"getETHPriceForTokenId","outputs":[{"internalType":"uint256","name":"price_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLatestPrice","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPriceFeedAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getTitleDetails","outputs":[{"components":[{"internalType":"string","name":"titleURI","type":"string"},{"internalType":"uint64","name":"maxSupply","type":"uint64"},{"internalType":"uint128","name":"priceInUSD","type":"uint128"},{"internalType":"uint64","name":"startTime","type":"uint64"},{"internalType":"uint64","name":"endTime","type":"uint64"},{"internalType":"uint64","name":"developerAllocation","type":"uint64"},{"internalType":"bool","name":"developerAllocationLocked","type":"bool"},{"internalType":"bool","name":"exists","type":"bool"}],"internalType":"struct WhoAnonByMetadrop.PublishedTitle","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"},{"internalType":"uint256","name":"quantity_","type":"uint256"}],"name":"iAmAnon","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestEdition","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"lockDeveloperAllocationForTokenId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"},{"internalType":"uint256","name":"quantity_","type":"uint256"}],"name":"mintDeveloperAllocation","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"mintingIsOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pausableDisabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pausableShutoffProtectionDisabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceBufferDown","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceBufferUp","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicationDisabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicationShutoffProtectionDisabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"mintableURI_","type":"string"},{"internalType":"string","name":"redeemableURI_","type":"string"},{"internalType":"uint64","name":"maxSupply_","type":"uint64"},{"internalType":"uint128","name":"priceInUSD_","type":"uint128"},{"internalType":"uint64","name":"mintableStartTime_","type":"uint64"},{"internalType":"uint64","name":"mintableDurationInHours_","type":"uint64"},{"internalType":"uint64","name":"redeemableStartTime_","type":"uint64"},{"internalType":"uint64","name":"redeemableDurationInHours_","type":"uint64"},{"internalType":"uint64","name":"developerAllocation_","type":"uint64"},{"internalType":"bool","name":"developerAllocationLocked_","type":"bool"}],"name":"publish","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"publishedTitles","outputs":[{"internalType":"string","name":"titleURI","type":"string"},{"internalType":"uint64","name":"maxSupply","type":"uint64"},{"internalType":"uint128","name":"priceInUSD","type":"uint128"},{"internalType":"uint64","name":"startTime","type":"uint64"},{"internalType":"uint64","name":"endTime","type":"uint64"},{"internalType":"uint64","name":"developerAllocation","type":"uint64"},{"internalType":"bool","name":"developerAllocationLocked","type":"bool"},{"internalType":"bool","name":"exists","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"},{"internalType":"uint256","name":"quantity_","type":"uint256"},{"internalType":"bytes32","name":"dataHash_","type":"bytes32"},{"internalType":"bytes","name":"data_","type":"bytes"}],"name":"redeemAnon","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"},{"internalType":"uint64","name":"maxSupply_","type":"uint64"}],"name":"reduceSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"salePrice_","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyPercentageBasisPoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyReceipientAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","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":"uint16","name":"priceBufferDownToSet_","type":"uint16"}],"name":"setPriceBufferDown","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"priceBufferUpToSet_","type":"uint16"}],"name":"setPriceBufferUp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"royaltyPercentageBasisPoints_","type":"uint256"}],"name":"setRoyaltyPercentageBasisPoints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"royaltyReceipientAddress_","type":"address"}],"name":"setRoyaltyReceipientAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"totalSupplyForAllCollections_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"beneficiary_","type":"address"}],"name":"updateBeneficiary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"developer_","type":"address"}],"name":"updateDeveloper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"},{"internalType":"uint64","name":"developerAlloaction_","type":"uint64"}],"name":"updateDeveloperAllocation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"},{"internalType":"uint64","name":"endTime_","type":"uint64"}],"name":"updateEndTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"latestEdition_","type":"uint32"}],"name":"updateLatestEdition","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"priceFeedAddress_","type":"address"}],"name":"updatePriceFeedAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"},{"internalType":"uint64","name":"startTime_","type":"uint64"}],"name":"updateStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"},{"internalType":"uint128","name":"tokenPrice_","type":"uint128"}],"name":"updateTokenPriceInUSD","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":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawContractBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526006805463ffffffff60c01b191690553480156200002157600080fd5b50604051620050cd380380620050cd8339810160408190526200004491620008b7565b6040805160208101909152600081526200005e8162000127565b506200006a3362000139565b6003805460ff60a01b191690558451620000a6908690600090620000925762000092620009c8565b60200260200101516200018b60201b60201c565b620000d485600181518110620000c057620000c0620009c8565b6020026020010151620001ef60201b60201c565b600680546001600160a01b038087166001600160a01b03199283161790925560058054868416908316179055600a8054928516929091169190911790556200011c816200024d565b505050505062000c21565b600262000135828262000a6d565b5050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6200019562000561565b6006805461ffff60a01b1916600160a01b61ffff8481168202929092179283905560405192041681527fd00b5e6e353fecced12d5c6cd88072ca056d6439d28237d88394fce16b008251906020015b60405180910390a150565b620001f962000561565b6006805461ffff60b01b1916600160b01b61ffff8481168202929092179283905560405192041681527f06fe0fd3278e87f46db9f52a32849cbfd5dcefb0d23ea15cd8f7047680ebe11a90602001620001e4565b60005b815181101562000380578181815181106200026f576200026f620009c8565b6020026020010151600b60008360016200028a919062000b39565b8152602081019190915260400160002081518190620002aa908262000a6d565b50602082015160018281018054604086015160608701516001600160401b039586166001600160c01b031990931692909217680100000000000000006001600160801b039092168202176001600160c01b0316600160c01b928616929092029190911790915560808501516002909401805460a087015160c088015160e0909801519686166001600160801b03199092169190911794169091029290921761ffff60801b1916600160801b9415159490940260ff60881b191693909317600160881b921515929092029190911790550162000250565b5060005b81518110156200055a577f7433e1c6079568166a1dfc41b61772346ff8162f0de188455e48e37fb0dfab06620003bc82600162000b39565b838381518110620003d157620003d1620009c8565b60200260200101516000015184846001620003ed919062000b39565b81518110620004005762000400620009c8565b602002602001015160000151858581518110620004215762000421620009c8565b602002602001015160200151868681518110620004425762000442620009c8565b602002602001015160400151878781518110620004635762000463620009c8565b602002602001015160600151888881518110620004845762000484620009c8565b60200260200101516080015189896001620004a0919062000b39565b81518110620004b357620004b3620009c8565b6020026020010151606001518a8a6001620004cf919062000b39565b81518110620004e257620004e2620009c8565b6020026020010151608001518b8b81518110620005035762000503620009c8565b602002602001015160a001518c8c81518110620005245762000524620009c8565b602002602001015160c00151604051620005499b9a9998979695949392919062000b8f565b60405180910390a160020162000384565b5051600755565b6003546001600160a01b03163314620005c05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b565b634e487b7160e01b600052604160045260246000fd5b60405161010081016001600160401b0381118282101715620005fe57620005fe620005c2565b60405290565b604051601f8201601f191681016001600160401b03811182821017156200062f576200062f620005c2565b604052919050565b60006001600160401b03821115620006535762000653620005c2565b5060051b60200190565b80516001600160a01b03811681146200067557600080fd5b919050565b60005b83811015620006975781810151838201526020016200067d565b50506000910152565b600082601f830112620006b257600080fd5b81516001600160401b03811115620006ce57620006ce620005c2565b620006e3601f8201601f191660200162000604565b818152846020838601011115620006f957600080fd5b6200070c8260208301602087016200067a565b949350505050565b80516001600160401b03811681146200067557600080fd5b80516001600160801b03811681146200067557600080fd5b805180151581146200067557600080fd5b600082601f8301126200076757600080fd5b81516020620007806200077a8362000637565b62000604565b82815260059290921b84018101918181019086841115620007a057600080fd5b8286015b84811015620008ac5780516001600160401b0380821115620007c65760008081fd5b90880190610100828b03601f1901811315620007e25760008081fd5b620007ec620005d8565b8784015183811115620007ff5760008081fd5b6200080f8d8a83880101620006a0565b825250604092506200082383850162000714565b888201526060620008368186016200072c565b84830152608093506200084b84860162000714565b9082015260a06200085e85820162000714565b8483015260c093506200087384860162000714565b9082015260e06200088685820162000744565b848301526200089783860162000744565b908201528652505050918301918301620007a4565b509695505050505050565b600080600080600060a08688031215620008d057600080fd5b85516001600160401b0380821115620008e857600080fd5b818801915088601f830112620008fd57600080fd5b81516020620009106200077a8362000637565b82815260059290921b8401810191818101908c8411156200093057600080fd5b948201945b838610156200096257855161ffff81168114620009525760008081fd5b8252948201949082019062000935565b99506200097390508a82016200065d565b9750505062000985604089016200065d565b945062000995606089016200065d565b93506080880151915080821115620009ac57600080fd5b50620009bb8882890162000755565b9150509295509295909350565b634e487b7160e01b600052603260045260246000fd5b600181811c90821680620009f357607f821691505b60208210810362000a1457634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000a6857600081815260208120601f850160051c8101602086101562000a435750805b601f850160051c820191505b8181101562000a645782815560010162000a4f565b5050505b505050565b81516001600160401b0381111562000a895762000a89620005c2565b62000aa18162000a9a8454620009de565b8462000a1a565b602080601f83116001811462000ad9576000841562000ac05750858301515b600019600386901b1c1916600185901b17855562000a64565b600085815260208120601f198616915b8281101562000b0a5788860151825594840194600190910190840162000ae9565b508582101562000b295787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b8082018082111562000b5b57634e487b7160e01b600052601160045260246000fd5b92915050565b6000815180845262000b7b8160208601602086016200067a565b601f01601f19169290920160200192915050565b60006101608d835280602084015262000bab8184018e62000b61565b9050828103604084015262000bc1818d62000b61565b6001600160401b039b8c1660608501526001600160801b039a909a166080840152505095881660a087015293871660c086015291861660e08501528516610100840152909316610120820152911515610140909201919091529392505050565b61449c8062000c316000396000f3fe6080604052600436106104075760003560e01c80638da5cb5b11610213578063e6aefa1b11610123578063f242432a116100ab578063f7551ef11161007a578063f7551ef114610cb1578063f7fb07b014610cd1578063fb0f94a414610ce6578063fc2b2da414610cfb578063feb8012314610d1c57600080fd5b8063f242432a14610c3c578063f2fde38b14610c5c578063f40a19cf14610c7c578063f5298aca14610c9157600080fd5b8063ea075e9c116100f2578063ea075e9c14610b83578063ea6be86c14610ba5578063ec6cd1e214610bd2578063f088302e14610bf2578063f14210a614610c1c57600080fd5b8063e6aefa1b14610ac5578063e8648b0b14610ae5578063e985e9c514610b1a578063e9be474414610b6357600080fd5b8063b52ddfbc116101a6578063c9732bc811610175578063c9732bc814610a30578063ca4b208b14610a50578063d56a7cd614610a70578063e042e98c14610a90578063e19292e514610ab057600080fd5b8063b52ddfbc1461099a578063bd85b039146109ba578063bfab3db9146109e7578063c441443b146109fc57600080fd5b80639b3a069b116101e25780639b3a069b146109315780639dd3417c14610951578063a22cb46514610967578063ac2ba0891461098757600080fd5b80638da5cb5b146108a15780638e15f473146108bf578063939e136e146108d457806395d89b411461090157600080fd5b80632a58fe0e11610319578063543c6056116102a15780636b20c454116102705780636b20c454146108175780636f2b6828146108375780636fa19fee14610857578063715018a6146108775780638456cb591461088c57600080fd5b8063543c6056146107b85780635c975abb146107cd578063641e7e6e146107ec5780636586b2071461080257600080fd5b80633f4ba83a116102e85780633f4ba83a14610707578063453709811461071c5780634e1273f41461073c5780634f558e79146107695780634fd514981461079857600080fd5b80632a58fe0e146106915780632eb2c2d6146106a657806335941b9c146106c657806338af3eed146106e757600080fd5b80630f0f30b21161039c5780631a9c67861161036b5780631a9c6786146105de5780631b75e482146105ff578063282048cc1461061f57806329e11186146106325780632a55205a1461065257600080fd5b80630f0f30b21461055757806316f9f5b31461058957806318160ddd146105a957806318e97fd1146105be57600080fd5b806306358427116103d857806306358427146104bc57806306fdde03146104dc5780630aaffd2a146105175780630e89341c1461053757600080fd5b80629ee39c14610416578062fdd58e1461043857806301ffc9a71461046b57806302a1ec971461049b57600080fd5b3661041157600080fd5b600080fd5b34801561042257600080fd5b5061043661043136600461343c565b610d3c565b005b34801561044457600080fd5b50610458610453366004613459565b610d66565b6040519081526020015b60405180910390f35b34801561047757600080fd5b5061048b61048636600461349b565b610dff565b6040519015158152602001610462565b3480156104a757600080fd5b5060065461048b90600160d81b900460ff1681565b3480156104c857600080fd5b506104366104d73660046134b8565b610e24565b3480156104e857600080fd5b506040805180820190915260098152683bb4379530b737b71560b91b60208201525b6040516104629190613522565b34801561052357600080fd5b5061043661053236600461343c565b610e86565b34801561054357600080fd5b5061050a610552366004613535565b610eb0565b34801561056357600080fd5b50600a546001600160a01b03165b6040516001600160a01b039091168152602001610462565b34801561059557600080fd5b506104366105a4366004613603565b610f52565b3480156105b557600080fd5b5061045861109d565b3480156105ca57600080fd5b506104366105d936600461365c565b6110d2565b3480156105ea57600080fd5b5060065461048b90600160c01b900460ff1681565b34801561060b57600080fd5b5061043661061a3660046136be565b61112f565b61043661062d3660046136ea565b6111b9565b34801561063e57600080fd5b5061043661064d366004613723565b61132b565b34801561065e57600080fd5b5061067261066d3660046136ea565b6113a3565b604080516001600160a01b039093168352602083019190915201610462565b34801561069d57600080fd5b506104366113da565b3480156106b257600080fd5b506104366106c13660046137da565b6113f7565b3480156106d257600080fd5b5060065461048b90600160c81b900460ff1681565b3480156106f357600080fd5b50600654610571906001600160a01b031681565b34801561071357600080fd5b50610436611443565b34801561072857600080fd5b50600854610571906001600160a01b031681565b34801561074857600080fd5b5061075c610757366004613887565b611455565b6040516104629190613984565b34801561077557600080fd5b5061048b610784366004613535565b600090815260046020526040902054151590565b3480156107a457600080fd5b506104586107b3366004613535565b61157e565b3480156107c457600080fd5b506104366115c0565b3480156107d957600080fd5b50600354600160a01b900460ff1661048b565b3480156107f857600080fd5b5061045860075481565b34801561080e57600080fd5b506104366115d7565b34801561082357600080fd5b50610436610832366004613997565b6115ee565b34801561084357600080fd5b50610436610852366004613a0c565b611631565b34801561086357600080fd5b5061043661087236600461343c565b611644565b34801561088357600080fd5b5061043661166e565b34801561089857600080fd5b50610436611680565b3480156108ad57600080fd5b506003546001600160a01b0316610571565b3480156108cb57600080fd5b506104586116bb565b3480156108e057600080fd5b506104586108ef366004613535565b600c6020526000908152604090205481565b34801561090d57600080fd5b506040805180820190915260078152662ba427a0a727a760c91b602082015261050a565b34801561093d57600080fd5b5061043661094c366004613723565b611740565b34801561095d57600080fd5b5061045860095481565b34801561097357600080fd5b50610436610982366004613a42565b6117b2565b6104366109953660046136ea565b6117c1565b3480156109a657600080fd5b506104366109b536600461343c565b6118e0565b3480156109c657600080fd5b506104586109d5366004613535565b60009081526004602052604090205490565b3480156109f357600080fd5b5061043661190a565b348015610a0857600080fd5b50610a1c610a17366004613535565b6119aa565b604051610462989796959493929190613a6e565b348015610a3c57600080fd5b50610436610a4b366004613ad5565b611a9a565b348015610a5c57600080fd5b50600554610571906001600160a01b031681565b348015610a7c57600080fd5b50610458610a8b366004613535565b611d06565b348015610a9c57600080fd5b50610436610aab366004613535565b611d1d565b348015610abc57600080fd5b50610436611d2a565b348015610ad157600080fd5b5061048b610ae0366004613535565b611d72565b348015610af157600080fd5b50600654610b0790600160b01b900461ffff1681565b60405161ffff9091168152602001610462565b348015610b2657600080fd5b5061048b610b35366004613bbf565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b348015610b6f57600080fd5b50610436610b7e366004613723565b611dc0565b348015610b8f57600080fd5b50600654610b0790600160a01b900461ffff1681565b348015610bb157600080fd5b50610bc5610bc0366004613535565b611e7c565b6040516104629190613bf8565b348015610bde57600080fd5b50610436610bed3660046134b8565b611fe6565b348015610bfe57600080fd5b50610c07612041565b60408051928352602083019190915201610462565b348015610c2857600080fd5b50610436610c37366004613535565b61206a565b348015610c4857600080fd5b50610436610c57366004613ca8565b612107565b348015610c6857600080fd5b50610436610c7736600461343c565b61214c565b348015610c8857600080fd5b506104366121c2565b348015610c9d57600080fd5b50610436610cac366004613d10565b61220a565b348015610cbd57600080fd5b50610436610ccc366004613723565b61224d565b348015610cdd57600080fd5b506104586123be565b348015610cf257600080fd5b506104366123cd565b348015610d0757600080fd5b5060065461048b90600160d01b900460ff1681565b348015610d2857600080fd5b50610436610d37366004613535565b6123ea565b610d44612416565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160a01b038316610dd65760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b506000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b60006001600160e01b0319821663152a902d60e11b1480610df95750610df982612470565b610e2c612416565b6006805461ffff60b01b1916600160b01b61ffff8481168202929092179283905560405192041681527f06fe0fd3278e87f46db9f52a32849cbfd5dcefb0d23ea15cd8f7047680ebe11a906020015b60405180910390a150565b610e8e612416565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152600b60205260409020805460609190610ecd90613d45565b80601f0160208091040260200160405190810160405280929190818152602001828054610ef990613d45565b8015610f465780601f10610f1b57610100808354040283529160200191610f46565b820191906000526020600020905b815481529060010190602001808311610f2957829003601f168201915b50505050509050919050565b610f5d846001613d95565b610f6681611d72565b610fa85760405162461bcd60e51b815260206004820152601360248201527226b4b73a34b7339034b9903737ba1037b832b760691b6044820152606401610dcd565b610fb06124c0565b610fb98561250d565b15610fd75760405163cc3ea67160e01b815260040160405180910390fd5b836000036110275760405162461bcd60e51b815260206004820152601e60248201527f526564656d7074696f6e206d75737420626520666f7220616e206974656d00006044820152606401610dcd565b61103233868661220a565b61105733611041876001613d95565b8660405180602001604052806000815250612521565b7fb939ee10986cac83ee56f03462ee8ebd7d5d664696db574c5f42eb730b31c90f338686868660405161108e959493929190613da8565b60405180910390a15050505050565b600060015b60075481116110ce576000818152600460205260409020546110c49083613d95565b91506001016110a2565b5090565b6110da612416565b6000828152600b6020526040902060020154600160881b900460ff166111125760405162461bcd60e51b8152600401610dcd90613de6565b6000828152600b6020526040902061112a8282613e63565b505050565b611137612416565b6000828152600b6020526040902060020154600160881b900460ff1661116f5760405162461bcd60e51b8152600401610dcd90613de6565b6000918252600b602052604090912060010180546001600160801b03909216600160401b0277ffffffffffffffffffffffffffffffff000000000000000019909216919091179055565b816111c381611d72565b6112055760405162461bcd60e51b815260206004820152601360248201527226b4b73a34b7339034b9903737ba1037b832b760691b6044820152606401610dcd565b61120d6124c0565b8160000361125d5760405162461bcd60e51b815260206004820152601960248201527f4f72646572206d75737420626520666f7220616e206974656d000000000000006044820152606401610dcd565b61126683612644565b61128357604051631afe061f60e21b815260040160405180910390fd5b61128d8383612659565b156112ab57604051637d3d824960e01b815260040160405180910390fd5b60006112b784846126bb565b90506112c334826126dd565b6112de33858560405180602001604052806000815250612521565b60408051338152602081018690529081018490523460608201527f14108c40853eafebc8d570ba3c24ab69eca575937c341a1bf4e6ab5c4f4e45b19060800160405180910390a150505050565b611333612416565b6000828152600b6020526040902060020154600160881b900460ff1661136b5760405162461bcd60e51b8152600401610dcd90613de6565b6000918252600b602052604090912060010180546001600160401b03909216600160c01b026001600160c01b03909216919091179055565b6000806000612710600954856113b99190613f22565b6113c39190613f4f565b6008546001600160a01b0316969095509350505050565b6113e2612416565b6006805460ff60c01b1916600160c01b179055565b6001600160a01b03851633148061141357506114138533610b35565b61142f5760405162461bcd60e51b8152600401610dcd90613f63565b61143c85858585856127e3565b5050505050565b61144b612416565b61145361298d565b565b606081518351146114ba5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610dcd565b600083516001600160401b038111156114d5576114d561354e565b6040519080825280602002602001820160405280156114fe578160200160208202803683370190505b50905060005b84518110156115765761154985828151811061152257611522613fb1565b602002602001015185838151811061153c5761153c613fb1565b6020026020010151610d66565b82828151811061155b5761155b613fb1565b602090810291909101015261156f81613fc7565b9050611504565b509392505050565b6000806115896116bb565b6000848152600b60205260409020600101549091506115b9908290600160401b90046001600160801b03166129e2565b9392505050565b6115c8612416565b6006805460ff60c01b19169055565b6115df612416565b6006805460ff60d01b19169055565b6001600160a01b03831633148061160a575061160a8333610b35565b6116265760405162461bcd60e51b8152600401610dcd90613f63565b61112a838383612a86565b611639612416565b63ffffffff16600755565b61164c612416565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b611676612416565b6114536000612c22565b611688612416565b600654600160c81b900460ff16156116b3576040516311f9636d60e21b815260040160405180910390fd5b611453612c74565b600080600a60009054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015611711573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117359190613ffa565b509195945050505050565b611748612416565b6000828152600b6020526040902060020154600160881b900460ff166117805760405162461bcd60e51b8152600401610dcd90613de6565b6000918252600b6020526040909120600201805467ffffffffffffffff19166001600160401b03909216919091179055565b6117bd338383612cb7565b5050565b6003546001600160a01b03163314806117e457506005546001600160a01b031633145b6118305760405162461bcd60e51b815260206004820152601760248201527f4f6e6c79206f776e6572206f7220646576656c6f7065720000000000000000006044820152606401610dcd565b6000828152600b6020908152604080832060020154600c9092529091205483918391600160401b9091046001600160401b03169061186f908390613d95565b111561188e576040516308345b1d60e21b815260040160405180910390fd5b6005546040805160208101909152600081526118b7916001600160a01b03169086908690612521565b6000848152600c6020526040812080548592906118d5908490613d95565b909155505050505050565b6118e8612416565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b611912612416565b6006546040516000916001600160a01b03169047908381818185875af1925050503d806000811461195f576040519150601f19603f3d011682016040523d82523d6000602084013e611964565b606091505b50509050806119a75760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606401610dcd565b50565b600b602052600090815260409020805481906119c590613d45565b80601f01602080910402602001604051908101604052809291908181526020018280546119f190613d45565b8015611a3e5780601f10611a1357610100808354040283529160200191611a3e565b820191906000526020600020905b815481529060010190602001808311611a2157829003601f168201915b50505050600183015460029093015491926001600160401b0380821693600160401b8084046001600160801b03169450600160c01b909304821692828216929082041690600160801b810460ff90811691600160881b90041688565b611aa2612416565b600654600160d81b900460ff1615611acd576040516312c44b6d60e01b815260040160405180910390fd5b60006007546001611ade9190613d95565b90506000611aed826001613d95565b6000838152600b60205260409020909150611b088d82613e63565b506000828152600b6020526040902060010180546001600160401b038a8116600160c01b026001600160c01b036001600160801b038e16600160401b026001600160c01b0319909416928f16929092179290921716179055611b6c87610e1061404a565b611b769089614075565b6000838152600b6020526040808220600201805460ff60881b19881515600160801b021661ffff60801b196001600160401b038b8116600160401b026fffffffffffffffffffffffffffffffff19909416971696909617919091179490941693909317600160881b1790925582815220611bf08c82613e63565b506000818152600b602052604090206001600160401b038716600160c01b02600190910155611c2185610e1061404a565b611c2b9087614075565b6000828152600b60205260409020600201805460ff60881b1970ffffffffffffffffffffffffffffffffff199091166001600160401b039390931692909217600160801b1791909116600160881b17905560078190557f7433e1c6079568166a1dfc41b61772346ff8162f0de188455e48e37fb0dfab06828d8d8d8d8d611cb48e610e1061404a565b8f611cbf9190614075565b8d611ccc8e610e1061404a565b8f611cd79190614075565b8d8d604051611cf09b9a99989796959493929190614095565b60405180910390a1505050505050505050505050565b600080611d116116bb565b90506115b981846129e2565b611d25612416565b600955565b611d32612416565b600654600160c01b900460ff1615611d59576006805460ff60c81b1916600160c81b179055565b604051636607e9a360e11b815260040160405180910390fd5b6000818152600b6020526040812060010154600160c01b90046001600160401b03164210801590610df95750506000908152600b60205260409020600201546001600160401b031642111590565b611dc8612416565b6000828152600b6020526040902060020154600160881b900460ff16611e005760405162461bcd60e51b8152600401610dcd90613de6565b6000828152600b6020526040902060020154600160801b900460ff1615611e3a5760405163d701498160e01b815260040160405180910390fd5b6000918252600b602052604090912060020180546001600160401b03909216600160401b026fffffffffffffffff000000000000000019909216919091179055565b6040805161010081018252606080825260006020830181905292820183905281018290526080810182905260a0810182905260c0810182905260e08101919091526000828152600b60205260409081902081516101008101909252805482908290611ee690613d45565b80601f0160208091040260200160405190810160405280929190818152602001828054611f1290613d45565b8015611f5f5780601f10611f3457610100808354040283529160200191611f5f565b820191906000526020600020905b815481529060010190602001808311611f4257829003601f168201915b505050918352505060018201546001600160401b038082166020840152600160401b8083046001600160801b03166040850152600160c01b90920481166060840152600290930154808416608084015290810490921660a0820152600160801b820460ff908116151560c0830152600160881b909204909116151560e09091015292915050565b611fee612416565b6006805461ffff60a01b1916600160a01b61ffff8481168202929092179283905560405192041681527fd00b5e6e353fecced12d5c6cd88072ca056d6439d28237d88394fce16b00825190602001610e7b565b60008061204c612416565b505060065461ffff600160a01b8204811691600160b01b9004169091565b612072612416565b6006546040516000916001600160a01b03169083908381818185875af1925050503d80600081146120bf576040519150601f19603f3d011682016040523d82523d6000602084013e6120c4565b606091505b50509050806117bd5760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606401610dcd565b6001600160a01b03851633148061212357506121238533610b35565b61213f5760405162461bcd60e51b8152600401610dcd90613f63565b61143c8585858585612d97565b612154612416565b6001600160a01b0381166121b95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610dcd565b6119a781612c22565b6121ca612416565b600654600160d01b900460ff16156121f1576006805460ff60d81b1916600160d81b179055565b6040516348ae092960e01b815260040160405180910390fd5b6001600160a01b03831633148061222657506122268333610b35565b6122425760405162461bcd60e51b8152600401610dcd90613f63565b61112a838383612ecf565b612255612416565b6000828152600b6020526040902060020154600160881b900460ff1661228d5760405162461bcd60e51b8152600401610dcd90613de6565b806001600160401b03166000036123005760405162461bcd60e51b815260206004820152603160248201527f43616e6e6f742073657420746f20756e6c696d6974656420616674657220696e60448201527034ba34b0b610383ab13634b1b0ba34b7b760791b6064820152608401610dcd565b6000828152600b60205260409020600101546001600160401b03161561238c576000828152600b60205260409020600101546001600160401b0380831691161161238c5760405162461bcd60e51b815260206004820152601c60248201527f537570706c792063616e206f6e6c7920626520646563726561736564000000006044820152606401610dcd565b6000918252600b6020526040909120600101805467ffffffffffffffff19166001600160401b03909216919091179055565b60006123c86116bb565b905090565b6123d5612416565b6006805460ff60d01b1916600160d01b179055565b6123f2612416565b6000908152600b60205260409020600201805460ff60801b1916600160801b179055565b6003546001600160a01b031633146114535760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610dcd565b60006001600160e01b03198216636cdb3d1360e11b14806124a157506001600160e01b031982166303a24d0760e21b145b80610df957506301ffc9a760e01b6001600160e01b0319831614610df9565b600354600160a01b900460ff16156114535760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610dcd565b600061251a60028361412d565b1592915050565b6001600160a01b0384166125815760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610dcd565b33600061258d85612fe7565b9050600061259a85612fe7565b90506125ab83600089858589613032565b6000868152602081815260408083206001600160a01b038b168452909152812080548792906125db908490613d95565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461263b83600089898989613048565b50505050505050565b600061265160028361412d565b151592915050565b6000828152600b60205260408120600101546001600160401b0316801580159061269b575060008481526004602052604090205481906126999085613d95565b115b156126aa576001915050610df9565b6000915050610df9565b5092915050565b600080806126c88561157e565b90506126d48482613f22565b95945050505050565b6006546000906103e8906126fc90600160b01b900461ffff1684613f22565b6127069190613f4f565b9050808310156127625760405162461bcd60e51b815260206004820152602160248201527f496e73756666696369656e74204554482070617373656420666f72206f7264656044820152603960f91b6064820152608401610dcd565b6006546000906103e89061278190600160a01b900461ffff1685613f22565b61278b9190613f4f565b9050808411156127dd5760405162461bcd60e51b815260206004820152601d60248201527f546f6f206d756368204554482070617373656420666f72206f726465720000006044820152606401610dcd565b50505050565b81518351146128045760405162461bcd60e51b8152600401610dcd90614141565b6001600160a01b03841661282a5760405162461bcd60e51b8152600401610dcd90614189565b33612839818787878787613032565b60005b845181101561291f57600085828151811061285957612859613fb1565b60200260200101519050600085838151811061287757612877613fb1565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156128c75760405162461bcd60e51b8152600401610dcd906141ce565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290612904908490613d95565b925050819055505050508061291890613fc7565b905061283c565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161296f929190614218565b60405180910390a46129858187878787876131a3565b505050505050565b61299561325e565b6003805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600080831180156129f857506509184e729fff83105b612a345760405162461bcd60e51b815260206004820152600d60248201526c283934b1b4b7339022b93937b960991b6044820152606401610dcd565b6000612a4b846a52b7d2dcc80cd2e4000000613f4f565b90506000612a598483613f22565b9050612a6b655af3107a400082613f4f565b612a76906001613d95565b6126d490655af3107a4000613f22565b6001600160a01b038316612aac5760405162461bcd60e51b8152600401610dcd9061423d565b8051825114612acd5760405162461bcd60e51b8152600401610dcd90614141565b6000339050612af081856000868660405180602001604052806000815250613032565b60005b8351811015612bb5576000848281518110612b1057612b10613fb1565b602002602001015190506000848381518110612b2e57612b2e613fb1565b602090810291909101810151600084815280835260408082206001600160a01b038c168352909352919091205490915081811015612b7e5760405162461bcd60e51b8152600401610dcd90614280565b6000928352602083815260408085206001600160a01b038b1686529091529092209103905580612bad81613fc7565b915050612af3565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051612c06929190614218565b60405180910390a46040805160208101909152600090526127dd565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b612c7c6124c0565b6003805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586129c53390565b816001600160a01b0316836001600160a01b031603612d2a5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610dcd565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b038416612dbd5760405162461bcd60e51b8152600401610dcd90614189565b336000612dc985612fe7565b90506000612dd685612fe7565b9050612de6838989858589613032565b6000868152602081815260408083206001600160a01b038c16845290915290205485811015612e275760405162461bcd60e51b8152600401610dcd906141ce565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a16825281208054889290612e64908490613d95565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4612ec4848a8a8a8a8a613048565b505050505050505050565b6001600160a01b038316612ef55760405162461bcd60e51b8152600401610dcd9061423d565b336000612f0184612fe7565b90506000612f0e84612fe7565b9050612f2e83876000858560405180602001604052806000815250613032565b6000858152602081815260408083206001600160a01b038a16845290915290205484811015612f6f5760405162461bcd60e51b8152600401610dcd90614280565b6000868152602081815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a90529092908816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a460408051602081019091526000905261263b565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061302157613021613fb1565b602090810291909101015292915050565b61303a6124c0565b6129858686868686866132ae565b6001600160a01b0384163b156129855760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e619061308c90899089908890889088906004016142c4565b6020604051808303816000875af19250505080156130c7575060408051601f3d908101601f191682019092526130c4918101906142fe565b60015b613173576130d361431b565b806308c379a00361310c57506130e7614337565b806130f2575061310e565b8060405162461bcd60e51b8152600401610dcd9190613522565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610dcd565b6001600160e01b0319811663f23a6e6160e01b1461263b5760405162461bcd60e51b8152600401610dcd906143c0565b6001600160a01b0384163b156129855760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906131e79089908990889088908890600401614408565b6020604051808303816000875af1925050508015613222575060408051601f3d908101601f1916820190925261321f918101906142fe565b60015b61322e576130d361431b565b6001600160e01b0319811663bc197c8160e01b1461263b5760405162461bcd60e51b8152600401610dcd906143c0565b600354600160a01b900460ff166114535760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610dcd565b6001600160a01b0385166133355760005b8351811015613333578281815181106132da576132da613fb1565b6020026020010151600460008684815181106132f8576132f8613fb1565b60200260200101518152602001908152602001600020600082825461331d9190613d95565b9091555061332c905081613fc7565b90506132bf565b505b6001600160a01b0384166129855760005b835181101561263b57600084828151811061336357613363613fb1565b60200260200101519050600084838151811061338157613381613fb1565b60200260200101519050600060046000848152602001908152602001600020549050818110156134045760405162461bcd60e51b815260206004820152602860248201527f455243313135353a206275726e20616d6f756e74206578636565647320746f74604482015267616c537570706c7960c01b6064820152608401610dcd565b6000928352600460205260409092209103905561342081613fc7565b9050613346565b6001600160a01b03811681146119a757600080fd5b60006020828403121561344e57600080fd5b81356115b981613427565b6000806040838503121561346c57600080fd5b823561347781613427565b946020939093013593505050565b6001600160e01b0319811681146119a757600080fd5b6000602082840312156134ad57600080fd5b81356115b981613485565b6000602082840312156134ca57600080fd5b813561ffff811681146115b957600080fd5b6000815180845260005b81811015613502576020818501810151868301820152016134e6565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006115b960208301846134dc565b60006020828403121561354757600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b03811182821017156135895761358961354e565b6040525050565b600082601f8301126135a157600080fd5b81356001600160401b038111156135ba576135ba61354e565b6040516135d1601f8301601f191660200182613564565b8181528460208386010111156135e657600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000806080858703121561361957600080fd5b84359350602085013592506040850135915060608501356001600160401b0381111561364457600080fd5b61365087828801613590565b91505092959194509250565b6000806040838503121561366f57600080fd5b8235915060208301356001600160401b0381111561368c57600080fd5b61369885828601613590565b9150509250929050565b80356001600160801b03811681146136b957600080fd5b919050565b600080604083850312156136d157600080fd5b823591506136e1602084016136a2565b90509250929050565b600080604083850312156136fd57600080fd5b50508035926020909101359150565b80356001600160401b03811681146136b957600080fd5b6000806040838503121561373657600080fd5b823591506136e16020840161370c565b60006001600160401b0382111561375f5761375f61354e565b5060051b60200190565b600082601f83011261377a57600080fd5b8135602061378782613746565b6040516137948282613564565b83815260059390931b85018201928281019150868411156137b457600080fd5b8286015b848110156137cf57803583529183019183016137b8565b509695505050505050565b600080600080600060a086880312156137f257600080fd5b85356137fd81613427565b9450602086013561380d81613427565b935060408601356001600160401b038082111561382957600080fd5b61383589838a01613769565b9450606088013591508082111561384b57600080fd5b61385789838a01613769565b9350608088013591508082111561386d57600080fd5b5061387a88828901613590565b9150509295509295909350565b6000806040838503121561389a57600080fd5b82356001600160401b03808211156138b157600080fd5b818501915085601f8301126138c557600080fd5b813560206138d282613746565b6040516138df8282613564565b83815260059390931b85018201928281019150898411156138ff57600080fd5b948201945b8386101561392657853561391781613427565b82529482019490820190613904565b9650508601359250508082111561393c57600080fd5b5061369885828601613769565b600081518084526020808501945080840160005b838110156139795781518752958201959082019060010161395d565b509495945050505050565b6020815260006115b96020830184613949565b6000806000606084860312156139ac57600080fd5b83356139b781613427565b925060208401356001600160401b03808211156139d357600080fd5b6139df87838801613769565b935060408601359150808211156139f557600080fd5b50613a0286828701613769565b9150509250925092565b600060208284031215613a1e57600080fd5b813563ffffffff811681146115b957600080fd5b803580151581146136b957600080fd5b60008060408385031215613a5557600080fd5b8235613a6081613427565b91506136e160208401613a32565b6000610100808352613a828184018c6134dc565b6001600160401b039a8b1660208501526001600160801b03999099166040840152505094871660608601529286166080850152941660a083015292151560c082015291151560e090920191909152919050565b6000806000806000806000806000806101408b8d031215613af557600080fd5b8a356001600160401b0380821115613b0c57600080fd5b613b188e838f01613590565b9b5060208d0135915080821115613b2e57600080fd5b50613b3b8d828e01613590565b995050613b4a60408c0161370c565b9750613b5860608c016136a2565b9650613b6660808c0161370c565b9550613b7460a08c0161370c565b9450613b8260c08c0161370c565b9350613b9060e08c0161370c565b9250613b9f6101008c0161370c565b9150613bae6101208c01613a32565b90509295989b9194979a5092959850565b60008060408385031215613bd257600080fd5b8235613bdd81613427565b91506020830135613bed81613427565b809150509250929050565b6020815260008251610100806020850152613c176101208501836134dc565b91506001600160401b0360208601511660408501526001600160801b0360408601511660608501526060850151613c5960808601826001600160401b03169052565b5060808501516001600160401b03811660a08601525060a08501516001600160401b03811660c08601525060c085015180151560e08601525060e0850151801515858301525090949350505050565b600080600080600060a08688031215613cc057600080fd5b8535613ccb81613427565b94506020860135613cdb81613427565b9350604086013592506060860135915060808601356001600160401b03811115613d0457600080fd5b61387a88828901613590565b600080600060608486031215613d2557600080fd5b8335613d3081613427565b95602085013595506040909401359392505050565b600181811c90821680613d5957607f821691505b602082108103613d7957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b80820180821115610df957610df9613d7f565b60018060a01b038616815284602082015283604082015282606082015260a060808201526000613ddb60a08301846134dc565b979650505050505050565b60208082526017908201527f546f6b656e20494420646f6573206e6f74206578697374000000000000000000604082015260600190565b601f82111561112a57600081815260208120601f850160051c81016020861015613e445750805b601f850160051c820191505b8181101561298557828155600101613e50565b81516001600160401b03811115613e7c57613e7c61354e565b613e9081613e8a8454613d45565b84613e1d565b602080601f831160018114613ec55760008415613ead5750858301515b600019600386901b1c1916600185901b178555612985565b600085815260208120601f198616915b82811015613ef457888601518255948401946001909101908401613ed5565b5085821015613f125787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b8082028115828204841417610df957610df9613d7f565b634e487b7160e01b600052601260045260246000fd5b600082613f5e57613f5e613f39565b500490565b6020808252602e908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526d195c881bdc88185c1c1c9bdd995960921b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b600060018201613fd957613fd9613d7f565b5060010190565b805169ffffffffffffffffffff811681146136b957600080fd5b600080600080600060a0868803121561401257600080fd5b61401b86613fe0565b945060208601519350604086015192506060860151915061403e60808701613fe0565b90509295509295909350565b6001600160401b0381811683821602808216919082811461406d5761406d613d7f565b505092915050565b6001600160401b038181168382160190808211156126b4576126b4613d7f565b60006101608d83528060208401526140af8184018e6134dc565b905082810360408401526140c3818d6134dc565b6001600160401b038c811660608601526001600160801b038c1660808601528a811660a086015289811660c086015288811660e0860152878116610100860152861661012085015291506141149050565b8215156101408301529c9b505050505050505050505050565b60008261413c5761413c613f39565b500690565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b60408152600061422b6040830185613949565b82810360208401526126d48185613949565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090613ddb908301846134dc565b60006020828403121561431057600080fd5b81516115b981613485565b600060033d11156143345760046000803e5060005160e01c5b90565b600060443d10156143455790565b6040516003193d81016004833e81513d6001600160401b03816024840111818411171561437457505050505090565b828501915081518181111561438c5750505050505090565b843d87010160208285010111156143a65750505050505090565b6143b560208286010187613564565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b0386811682528516602082015260a06040820181905260009061443490830186613949565b82810360608401526144468186613949565b9050828103608084015261445a81856134dc565b9897505050505050505056fea2646970667358221220968b89e1b1d381b4330fc5fb8107f190c0651dee21b365a239ce594d522e317d64736f6c6343000811003300000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000b21f2a5c2478b255dca85cb0d4b178db7ae42071000000000000000000000000de3ff2a50bd1ba1bd6a608ea0138946dddf595bc0000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b84190000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000003f200000000000000000000000000000000000000000000000000000000000003de0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000046000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008200000000000000000000000000000000000000000000000000000000636eb7d00000000000000000000000000000000000000000000000000000000063780060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000003f697066733a2f2f516d504c464748483431437358644d4d46563374555976774a4e5469575842794655757a4d6139433862665768522f7b69647d2e6a736f6e00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000003e700000000000000000000000000000000000000000000000000000000636ec5e00000000000000000000000000000000000000000000000000000000063780060000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000003f697066733a2f2f516d504c464748483431437358644d4d46563374555976774a4e5469575842794655757a4d6139433862665768522f7b69647d2e6a736f6e00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106104075760003560e01c80638da5cb5b11610213578063e6aefa1b11610123578063f242432a116100ab578063f7551ef11161007a578063f7551ef114610cb1578063f7fb07b014610cd1578063fb0f94a414610ce6578063fc2b2da414610cfb578063feb8012314610d1c57600080fd5b8063f242432a14610c3c578063f2fde38b14610c5c578063f40a19cf14610c7c578063f5298aca14610c9157600080fd5b8063ea075e9c116100f2578063ea075e9c14610b83578063ea6be86c14610ba5578063ec6cd1e214610bd2578063f088302e14610bf2578063f14210a614610c1c57600080fd5b8063e6aefa1b14610ac5578063e8648b0b14610ae5578063e985e9c514610b1a578063e9be474414610b6357600080fd5b8063b52ddfbc116101a6578063c9732bc811610175578063c9732bc814610a30578063ca4b208b14610a50578063d56a7cd614610a70578063e042e98c14610a90578063e19292e514610ab057600080fd5b8063b52ddfbc1461099a578063bd85b039146109ba578063bfab3db9146109e7578063c441443b146109fc57600080fd5b80639b3a069b116101e25780639b3a069b146109315780639dd3417c14610951578063a22cb46514610967578063ac2ba0891461098757600080fd5b80638da5cb5b146108a15780638e15f473146108bf578063939e136e146108d457806395d89b411461090157600080fd5b80632a58fe0e11610319578063543c6056116102a15780636b20c454116102705780636b20c454146108175780636f2b6828146108375780636fa19fee14610857578063715018a6146108775780638456cb591461088c57600080fd5b8063543c6056146107b85780635c975abb146107cd578063641e7e6e146107ec5780636586b2071461080257600080fd5b80633f4ba83a116102e85780633f4ba83a14610707578063453709811461071c5780634e1273f41461073c5780634f558e79146107695780634fd514981461079857600080fd5b80632a58fe0e146106915780632eb2c2d6146106a657806335941b9c146106c657806338af3eed146106e757600080fd5b80630f0f30b21161039c5780631a9c67861161036b5780631a9c6786146105de5780631b75e482146105ff578063282048cc1461061f57806329e11186146106325780632a55205a1461065257600080fd5b80630f0f30b21461055757806316f9f5b31461058957806318160ddd146105a957806318e97fd1146105be57600080fd5b806306358427116103d857806306358427146104bc57806306fdde03146104dc5780630aaffd2a146105175780630e89341c1461053757600080fd5b80629ee39c14610416578062fdd58e1461043857806301ffc9a71461046b57806302a1ec971461049b57600080fd5b3661041157600080fd5b600080fd5b34801561042257600080fd5b5061043661043136600461343c565b610d3c565b005b34801561044457600080fd5b50610458610453366004613459565b610d66565b6040519081526020015b60405180910390f35b34801561047757600080fd5b5061048b61048636600461349b565b610dff565b6040519015158152602001610462565b3480156104a757600080fd5b5060065461048b90600160d81b900460ff1681565b3480156104c857600080fd5b506104366104d73660046134b8565b610e24565b3480156104e857600080fd5b506040805180820190915260098152683bb4379530b737b71560b91b60208201525b6040516104629190613522565b34801561052357600080fd5b5061043661053236600461343c565b610e86565b34801561054357600080fd5b5061050a610552366004613535565b610eb0565b34801561056357600080fd5b50600a546001600160a01b03165b6040516001600160a01b039091168152602001610462565b34801561059557600080fd5b506104366105a4366004613603565b610f52565b3480156105b557600080fd5b5061045861109d565b3480156105ca57600080fd5b506104366105d936600461365c565b6110d2565b3480156105ea57600080fd5b5060065461048b90600160c01b900460ff1681565b34801561060b57600080fd5b5061043661061a3660046136be565b61112f565b61043661062d3660046136ea565b6111b9565b34801561063e57600080fd5b5061043661064d366004613723565b61132b565b34801561065e57600080fd5b5061067261066d3660046136ea565b6113a3565b604080516001600160a01b039093168352602083019190915201610462565b34801561069d57600080fd5b506104366113da565b3480156106b257600080fd5b506104366106c13660046137da565b6113f7565b3480156106d257600080fd5b5060065461048b90600160c81b900460ff1681565b3480156106f357600080fd5b50600654610571906001600160a01b031681565b34801561071357600080fd5b50610436611443565b34801561072857600080fd5b50600854610571906001600160a01b031681565b34801561074857600080fd5b5061075c610757366004613887565b611455565b6040516104629190613984565b34801561077557600080fd5b5061048b610784366004613535565b600090815260046020526040902054151590565b3480156107a457600080fd5b506104586107b3366004613535565b61157e565b3480156107c457600080fd5b506104366115c0565b3480156107d957600080fd5b50600354600160a01b900460ff1661048b565b3480156107f857600080fd5b5061045860075481565b34801561080e57600080fd5b506104366115d7565b34801561082357600080fd5b50610436610832366004613997565b6115ee565b34801561084357600080fd5b50610436610852366004613a0c565b611631565b34801561086357600080fd5b5061043661087236600461343c565b611644565b34801561088357600080fd5b5061043661166e565b34801561089857600080fd5b50610436611680565b3480156108ad57600080fd5b506003546001600160a01b0316610571565b3480156108cb57600080fd5b506104586116bb565b3480156108e057600080fd5b506104586108ef366004613535565b600c6020526000908152604090205481565b34801561090d57600080fd5b506040805180820190915260078152662ba427a0a727a760c91b602082015261050a565b34801561093d57600080fd5b5061043661094c366004613723565b611740565b34801561095d57600080fd5b5061045860095481565b34801561097357600080fd5b50610436610982366004613a42565b6117b2565b6104366109953660046136ea565b6117c1565b3480156109a657600080fd5b506104366109b536600461343c565b6118e0565b3480156109c657600080fd5b506104586109d5366004613535565b60009081526004602052604090205490565b3480156109f357600080fd5b5061043661190a565b348015610a0857600080fd5b50610a1c610a17366004613535565b6119aa565b604051610462989796959493929190613a6e565b348015610a3c57600080fd5b50610436610a4b366004613ad5565b611a9a565b348015610a5c57600080fd5b50600554610571906001600160a01b031681565b348015610a7c57600080fd5b50610458610a8b366004613535565b611d06565b348015610a9c57600080fd5b50610436610aab366004613535565b611d1d565b348015610abc57600080fd5b50610436611d2a565b348015610ad157600080fd5b5061048b610ae0366004613535565b611d72565b348015610af157600080fd5b50600654610b0790600160b01b900461ffff1681565b60405161ffff9091168152602001610462565b348015610b2657600080fd5b5061048b610b35366004613bbf565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b348015610b6f57600080fd5b50610436610b7e366004613723565b611dc0565b348015610b8f57600080fd5b50600654610b0790600160a01b900461ffff1681565b348015610bb157600080fd5b50610bc5610bc0366004613535565b611e7c565b6040516104629190613bf8565b348015610bde57600080fd5b50610436610bed3660046134b8565b611fe6565b348015610bfe57600080fd5b50610c07612041565b60408051928352602083019190915201610462565b348015610c2857600080fd5b50610436610c37366004613535565b61206a565b348015610c4857600080fd5b50610436610c57366004613ca8565b612107565b348015610c6857600080fd5b50610436610c7736600461343c565b61214c565b348015610c8857600080fd5b506104366121c2565b348015610c9d57600080fd5b50610436610cac366004613d10565b61220a565b348015610cbd57600080fd5b50610436610ccc366004613723565b61224d565b348015610cdd57600080fd5b506104586123be565b348015610cf257600080fd5b506104366123cd565b348015610d0757600080fd5b5060065461048b90600160d01b900460ff1681565b348015610d2857600080fd5b50610436610d37366004613535565b6123ea565b610d44612416565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160a01b038316610dd65760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b506000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b60006001600160e01b0319821663152a902d60e11b1480610df95750610df982612470565b610e2c612416565b6006805461ffff60b01b1916600160b01b61ffff8481168202929092179283905560405192041681527f06fe0fd3278e87f46db9f52a32849cbfd5dcefb0d23ea15cd8f7047680ebe11a906020015b60405180910390a150565b610e8e612416565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152600b60205260409020805460609190610ecd90613d45565b80601f0160208091040260200160405190810160405280929190818152602001828054610ef990613d45565b8015610f465780601f10610f1b57610100808354040283529160200191610f46565b820191906000526020600020905b815481529060010190602001808311610f2957829003601f168201915b50505050509050919050565b610f5d846001613d95565b610f6681611d72565b610fa85760405162461bcd60e51b815260206004820152601360248201527226b4b73a34b7339034b9903737ba1037b832b760691b6044820152606401610dcd565b610fb06124c0565b610fb98561250d565b15610fd75760405163cc3ea67160e01b815260040160405180910390fd5b836000036110275760405162461bcd60e51b815260206004820152601e60248201527f526564656d7074696f6e206d75737420626520666f7220616e206974656d00006044820152606401610dcd565b61103233868661220a565b61105733611041876001613d95565b8660405180602001604052806000815250612521565b7fb939ee10986cac83ee56f03462ee8ebd7d5d664696db574c5f42eb730b31c90f338686868660405161108e959493929190613da8565b60405180910390a15050505050565b600060015b60075481116110ce576000818152600460205260409020546110c49083613d95565b91506001016110a2565b5090565b6110da612416565b6000828152600b6020526040902060020154600160881b900460ff166111125760405162461bcd60e51b8152600401610dcd90613de6565b6000828152600b6020526040902061112a8282613e63565b505050565b611137612416565b6000828152600b6020526040902060020154600160881b900460ff1661116f5760405162461bcd60e51b8152600401610dcd90613de6565b6000918252600b602052604090912060010180546001600160801b03909216600160401b0277ffffffffffffffffffffffffffffffff000000000000000019909216919091179055565b816111c381611d72565b6112055760405162461bcd60e51b815260206004820152601360248201527226b4b73a34b7339034b9903737ba1037b832b760691b6044820152606401610dcd565b61120d6124c0565b8160000361125d5760405162461bcd60e51b815260206004820152601960248201527f4f72646572206d75737420626520666f7220616e206974656d000000000000006044820152606401610dcd565b61126683612644565b61128357604051631afe061f60e21b815260040160405180910390fd5b61128d8383612659565b156112ab57604051637d3d824960e01b815260040160405180910390fd5b60006112b784846126bb565b90506112c334826126dd565b6112de33858560405180602001604052806000815250612521565b60408051338152602081018690529081018490523460608201527f14108c40853eafebc8d570ba3c24ab69eca575937c341a1bf4e6ab5c4f4e45b19060800160405180910390a150505050565b611333612416565b6000828152600b6020526040902060020154600160881b900460ff1661136b5760405162461bcd60e51b8152600401610dcd90613de6565b6000918252600b602052604090912060010180546001600160401b03909216600160c01b026001600160c01b03909216919091179055565b6000806000612710600954856113b99190613f22565b6113c39190613f4f565b6008546001600160a01b0316969095509350505050565b6113e2612416565b6006805460ff60c01b1916600160c01b179055565b6001600160a01b03851633148061141357506114138533610b35565b61142f5760405162461bcd60e51b8152600401610dcd90613f63565b61143c85858585856127e3565b5050505050565b61144b612416565b61145361298d565b565b606081518351146114ba5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610dcd565b600083516001600160401b038111156114d5576114d561354e565b6040519080825280602002602001820160405280156114fe578160200160208202803683370190505b50905060005b84518110156115765761154985828151811061152257611522613fb1565b602002602001015185838151811061153c5761153c613fb1565b6020026020010151610d66565b82828151811061155b5761155b613fb1565b602090810291909101015261156f81613fc7565b9050611504565b509392505050565b6000806115896116bb565b6000848152600b60205260409020600101549091506115b9908290600160401b90046001600160801b03166129e2565b9392505050565b6115c8612416565b6006805460ff60c01b19169055565b6115df612416565b6006805460ff60d01b19169055565b6001600160a01b03831633148061160a575061160a8333610b35565b6116265760405162461bcd60e51b8152600401610dcd90613f63565b61112a838383612a86565b611639612416565b63ffffffff16600755565b61164c612416565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b611676612416565b6114536000612c22565b611688612416565b600654600160c81b900460ff16156116b3576040516311f9636d60e21b815260040160405180910390fd5b611453612c74565b600080600a60009054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015611711573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117359190613ffa565b509195945050505050565b611748612416565b6000828152600b6020526040902060020154600160881b900460ff166117805760405162461bcd60e51b8152600401610dcd90613de6565b6000918252600b6020526040909120600201805467ffffffffffffffff19166001600160401b03909216919091179055565b6117bd338383612cb7565b5050565b6003546001600160a01b03163314806117e457506005546001600160a01b031633145b6118305760405162461bcd60e51b815260206004820152601760248201527f4f6e6c79206f776e6572206f7220646576656c6f7065720000000000000000006044820152606401610dcd565b6000828152600b6020908152604080832060020154600c9092529091205483918391600160401b9091046001600160401b03169061186f908390613d95565b111561188e576040516308345b1d60e21b815260040160405180910390fd5b6005546040805160208101909152600081526118b7916001600160a01b03169086908690612521565b6000848152600c6020526040812080548592906118d5908490613d95565b909155505050505050565b6118e8612416565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b611912612416565b6006546040516000916001600160a01b03169047908381818185875af1925050503d806000811461195f576040519150601f19603f3d011682016040523d82523d6000602084013e611964565b606091505b50509050806119a75760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606401610dcd565b50565b600b602052600090815260409020805481906119c590613d45565b80601f01602080910402602001604051908101604052809291908181526020018280546119f190613d45565b8015611a3e5780601f10611a1357610100808354040283529160200191611a3e565b820191906000526020600020905b815481529060010190602001808311611a2157829003601f168201915b50505050600183015460029093015491926001600160401b0380821693600160401b8084046001600160801b03169450600160c01b909304821692828216929082041690600160801b810460ff90811691600160881b90041688565b611aa2612416565b600654600160d81b900460ff1615611acd576040516312c44b6d60e01b815260040160405180910390fd5b60006007546001611ade9190613d95565b90506000611aed826001613d95565b6000838152600b60205260409020909150611b088d82613e63565b506000828152600b6020526040902060010180546001600160401b038a8116600160c01b026001600160c01b036001600160801b038e16600160401b026001600160c01b0319909416928f16929092179290921716179055611b6c87610e1061404a565b611b769089614075565b6000838152600b6020526040808220600201805460ff60881b19881515600160801b021661ffff60801b196001600160401b038b8116600160401b026fffffffffffffffffffffffffffffffff19909416971696909617919091179490941693909317600160881b1790925582815220611bf08c82613e63565b506000818152600b602052604090206001600160401b038716600160c01b02600190910155611c2185610e1061404a565b611c2b9087614075565b6000828152600b60205260409020600201805460ff60881b1970ffffffffffffffffffffffffffffffffff199091166001600160401b039390931692909217600160801b1791909116600160881b17905560078190557f7433e1c6079568166a1dfc41b61772346ff8162f0de188455e48e37fb0dfab06828d8d8d8d8d611cb48e610e1061404a565b8f611cbf9190614075565b8d611ccc8e610e1061404a565b8f611cd79190614075565b8d8d604051611cf09b9a99989796959493929190614095565b60405180910390a1505050505050505050505050565b600080611d116116bb565b90506115b981846129e2565b611d25612416565b600955565b611d32612416565b600654600160c01b900460ff1615611d59576006805460ff60c81b1916600160c81b179055565b604051636607e9a360e11b815260040160405180910390fd5b6000818152600b6020526040812060010154600160c01b90046001600160401b03164210801590610df95750506000908152600b60205260409020600201546001600160401b031642111590565b611dc8612416565b6000828152600b6020526040902060020154600160881b900460ff16611e005760405162461bcd60e51b8152600401610dcd90613de6565b6000828152600b6020526040902060020154600160801b900460ff1615611e3a5760405163d701498160e01b815260040160405180910390fd5b6000918252600b602052604090912060020180546001600160401b03909216600160401b026fffffffffffffffff000000000000000019909216919091179055565b6040805161010081018252606080825260006020830181905292820183905281018290526080810182905260a0810182905260c0810182905260e08101919091526000828152600b60205260409081902081516101008101909252805482908290611ee690613d45565b80601f0160208091040260200160405190810160405280929190818152602001828054611f1290613d45565b8015611f5f5780601f10611f3457610100808354040283529160200191611f5f565b820191906000526020600020905b815481529060010190602001808311611f4257829003601f168201915b505050918352505060018201546001600160401b038082166020840152600160401b8083046001600160801b03166040850152600160c01b90920481166060840152600290930154808416608084015290810490921660a0820152600160801b820460ff908116151560c0830152600160881b909204909116151560e09091015292915050565b611fee612416565b6006805461ffff60a01b1916600160a01b61ffff8481168202929092179283905560405192041681527fd00b5e6e353fecced12d5c6cd88072ca056d6439d28237d88394fce16b00825190602001610e7b565b60008061204c612416565b505060065461ffff600160a01b8204811691600160b01b9004169091565b612072612416565b6006546040516000916001600160a01b03169083908381818185875af1925050503d80600081146120bf576040519150601f19603f3d011682016040523d82523d6000602084013e6120c4565b606091505b50509050806117bd5760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606401610dcd565b6001600160a01b03851633148061212357506121238533610b35565b61213f5760405162461bcd60e51b8152600401610dcd90613f63565b61143c8585858585612d97565b612154612416565b6001600160a01b0381166121b95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610dcd565b6119a781612c22565b6121ca612416565b600654600160d01b900460ff16156121f1576006805460ff60d81b1916600160d81b179055565b6040516348ae092960e01b815260040160405180910390fd5b6001600160a01b03831633148061222657506122268333610b35565b6122425760405162461bcd60e51b8152600401610dcd90613f63565b61112a838383612ecf565b612255612416565b6000828152600b6020526040902060020154600160881b900460ff1661228d5760405162461bcd60e51b8152600401610dcd90613de6565b806001600160401b03166000036123005760405162461bcd60e51b815260206004820152603160248201527f43616e6e6f742073657420746f20756e6c696d6974656420616674657220696e60448201527034ba34b0b610383ab13634b1b0ba34b7b760791b6064820152608401610dcd565b6000828152600b60205260409020600101546001600160401b03161561238c576000828152600b60205260409020600101546001600160401b0380831691161161238c5760405162461bcd60e51b815260206004820152601c60248201527f537570706c792063616e206f6e6c7920626520646563726561736564000000006044820152606401610dcd565b6000918252600b6020526040909120600101805467ffffffffffffffff19166001600160401b03909216919091179055565b60006123c86116bb565b905090565b6123d5612416565b6006805460ff60d01b1916600160d01b179055565b6123f2612416565b6000908152600b60205260409020600201805460ff60801b1916600160801b179055565b6003546001600160a01b031633146114535760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610dcd565b60006001600160e01b03198216636cdb3d1360e11b14806124a157506001600160e01b031982166303a24d0760e21b145b80610df957506301ffc9a760e01b6001600160e01b0319831614610df9565b600354600160a01b900460ff16156114535760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610dcd565b600061251a60028361412d565b1592915050565b6001600160a01b0384166125815760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610dcd565b33600061258d85612fe7565b9050600061259a85612fe7565b90506125ab83600089858589613032565b6000868152602081815260408083206001600160a01b038b168452909152812080548792906125db908490613d95565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461263b83600089898989613048565b50505050505050565b600061265160028361412d565b151592915050565b6000828152600b60205260408120600101546001600160401b0316801580159061269b575060008481526004602052604090205481906126999085613d95565b115b156126aa576001915050610df9565b6000915050610df9565b5092915050565b600080806126c88561157e565b90506126d48482613f22565b95945050505050565b6006546000906103e8906126fc90600160b01b900461ffff1684613f22565b6127069190613f4f565b9050808310156127625760405162461bcd60e51b815260206004820152602160248201527f496e73756666696369656e74204554482070617373656420666f72206f7264656044820152603960f91b6064820152608401610dcd565b6006546000906103e89061278190600160a01b900461ffff1685613f22565b61278b9190613f4f565b9050808411156127dd5760405162461bcd60e51b815260206004820152601d60248201527f546f6f206d756368204554482070617373656420666f72206f726465720000006044820152606401610dcd565b50505050565b81518351146128045760405162461bcd60e51b8152600401610dcd90614141565b6001600160a01b03841661282a5760405162461bcd60e51b8152600401610dcd90614189565b33612839818787878787613032565b60005b845181101561291f57600085828151811061285957612859613fb1565b60200260200101519050600085838151811061287757612877613fb1565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156128c75760405162461bcd60e51b8152600401610dcd906141ce565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290612904908490613d95565b925050819055505050508061291890613fc7565b905061283c565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161296f929190614218565b60405180910390a46129858187878787876131a3565b505050505050565b61299561325e565b6003805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600080831180156129f857506509184e729fff83105b612a345760405162461bcd60e51b815260206004820152600d60248201526c283934b1b4b7339022b93937b960991b6044820152606401610dcd565b6000612a4b846a52b7d2dcc80cd2e4000000613f4f565b90506000612a598483613f22565b9050612a6b655af3107a400082613f4f565b612a76906001613d95565b6126d490655af3107a4000613f22565b6001600160a01b038316612aac5760405162461bcd60e51b8152600401610dcd9061423d565b8051825114612acd5760405162461bcd60e51b8152600401610dcd90614141565b6000339050612af081856000868660405180602001604052806000815250613032565b60005b8351811015612bb5576000848281518110612b1057612b10613fb1565b602002602001015190506000848381518110612b2e57612b2e613fb1565b602090810291909101810151600084815280835260408082206001600160a01b038c168352909352919091205490915081811015612b7e5760405162461bcd60e51b8152600401610dcd90614280565b6000928352602083815260408085206001600160a01b038b1686529091529092209103905580612bad81613fc7565b915050612af3565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051612c06929190614218565b60405180910390a46040805160208101909152600090526127dd565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b612c7c6124c0565b6003805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586129c53390565b816001600160a01b0316836001600160a01b031603612d2a5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610dcd565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b038416612dbd5760405162461bcd60e51b8152600401610dcd90614189565b336000612dc985612fe7565b90506000612dd685612fe7565b9050612de6838989858589613032565b6000868152602081815260408083206001600160a01b038c16845290915290205485811015612e275760405162461bcd60e51b8152600401610dcd906141ce565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a16825281208054889290612e64908490613d95565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4612ec4848a8a8a8a8a613048565b505050505050505050565b6001600160a01b038316612ef55760405162461bcd60e51b8152600401610dcd9061423d565b336000612f0184612fe7565b90506000612f0e84612fe7565b9050612f2e83876000858560405180602001604052806000815250613032565b6000858152602081815260408083206001600160a01b038a16845290915290205484811015612f6f5760405162461bcd60e51b8152600401610dcd90614280565b6000868152602081815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a90529092908816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a460408051602081019091526000905261263b565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061302157613021613fb1565b602090810291909101015292915050565b61303a6124c0565b6129858686868686866132ae565b6001600160a01b0384163b156129855760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e619061308c90899089908890889088906004016142c4565b6020604051808303816000875af19250505080156130c7575060408051601f3d908101601f191682019092526130c4918101906142fe565b60015b613173576130d361431b565b806308c379a00361310c57506130e7614337565b806130f2575061310e565b8060405162461bcd60e51b8152600401610dcd9190613522565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610dcd565b6001600160e01b0319811663f23a6e6160e01b1461263b5760405162461bcd60e51b8152600401610dcd906143c0565b6001600160a01b0384163b156129855760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906131e79089908990889088908890600401614408565b6020604051808303816000875af1925050508015613222575060408051601f3d908101601f1916820190925261321f918101906142fe565b60015b61322e576130d361431b565b6001600160e01b0319811663bc197c8160e01b1461263b5760405162461bcd60e51b8152600401610dcd906143c0565b600354600160a01b900460ff166114535760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610dcd565b6001600160a01b0385166133355760005b8351811015613333578281815181106132da576132da613fb1565b6020026020010151600460008684815181106132f8576132f8613fb1565b60200260200101518152602001908152602001600020600082825461331d9190613d95565b9091555061332c905081613fc7565b90506132bf565b505b6001600160a01b0384166129855760005b835181101561263b57600084828151811061336357613363613fb1565b60200260200101519050600084838151811061338157613381613fb1565b60200260200101519050600060046000848152602001908152602001600020549050818110156134045760405162461bcd60e51b815260206004820152602860248201527f455243313135353a206275726e20616d6f756e74206578636565647320746f74604482015267616c537570706c7960c01b6064820152608401610dcd565b6000928352600460205260409092209103905561342081613fc7565b9050613346565b6001600160a01b03811681146119a757600080fd5b60006020828403121561344e57600080fd5b81356115b981613427565b6000806040838503121561346c57600080fd5b823561347781613427565b946020939093013593505050565b6001600160e01b0319811681146119a757600080fd5b6000602082840312156134ad57600080fd5b81356115b981613485565b6000602082840312156134ca57600080fd5b813561ffff811681146115b957600080fd5b6000815180845260005b81811015613502576020818501810151868301820152016134e6565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006115b960208301846134dc565b60006020828403121561354757600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b03811182821017156135895761358961354e565b6040525050565b600082601f8301126135a157600080fd5b81356001600160401b038111156135ba576135ba61354e565b6040516135d1601f8301601f191660200182613564565b8181528460208386010111156135e657600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000806080858703121561361957600080fd5b84359350602085013592506040850135915060608501356001600160401b0381111561364457600080fd5b61365087828801613590565b91505092959194509250565b6000806040838503121561366f57600080fd5b8235915060208301356001600160401b0381111561368c57600080fd5b61369885828601613590565b9150509250929050565b80356001600160801b03811681146136b957600080fd5b919050565b600080604083850312156136d157600080fd5b823591506136e1602084016136a2565b90509250929050565b600080604083850312156136fd57600080fd5b50508035926020909101359150565b80356001600160401b03811681146136b957600080fd5b6000806040838503121561373657600080fd5b823591506136e16020840161370c565b60006001600160401b0382111561375f5761375f61354e565b5060051b60200190565b600082601f83011261377a57600080fd5b8135602061378782613746565b6040516137948282613564565b83815260059390931b85018201928281019150868411156137b457600080fd5b8286015b848110156137cf57803583529183019183016137b8565b509695505050505050565b600080600080600060a086880312156137f257600080fd5b85356137fd81613427565b9450602086013561380d81613427565b935060408601356001600160401b038082111561382957600080fd5b61383589838a01613769565b9450606088013591508082111561384b57600080fd5b61385789838a01613769565b9350608088013591508082111561386d57600080fd5b5061387a88828901613590565b9150509295509295909350565b6000806040838503121561389a57600080fd5b82356001600160401b03808211156138b157600080fd5b818501915085601f8301126138c557600080fd5b813560206138d282613746565b6040516138df8282613564565b83815260059390931b85018201928281019150898411156138ff57600080fd5b948201945b8386101561392657853561391781613427565b82529482019490820190613904565b9650508601359250508082111561393c57600080fd5b5061369885828601613769565b600081518084526020808501945080840160005b838110156139795781518752958201959082019060010161395d565b509495945050505050565b6020815260006115b96020830184613949565b6000806000606084860312156139ac57600080fd5b83356139b781613427565b925060208401356001600160401b03808211156139d357600080fd5b6139df87838801613769565b935060408601359150808211156139f557600080fd5b50613a0286828701613769565b9150509250925092565b600060208284031215613a1e57600080fd5b813563ffffffff811681146115b957600080fd5b803580151581146136b957600080fd5b60008060408385031215613a5557600080fd5b8235613a6081613427565b91506136e160208401613a32565b6000610100808352613a828184018c6134dc565b6001600160401b039a8b1660208501526001600160801b03999099166040840152505094871660608601529286166080850152941660a083015292151560c082015291151560e090920191909152919050565b6000806000806000806000806000806101408b8d031215613af557600080fd5b8a356001600160401b0380821115613b0c57600080fd5b613b188e838f01613590565b9b5060208d0135915080821115613b2e57600080fd5b50613b3b8d828e01613590565b995050613b4a60408c0161370c565b9750613b5860608c016136a2565b9650613b6660808c0161370c565b9550613b7460a08c0161370c565b9450613b8260c08c0161370c565b9350613b9060e08c0161370c565b9250613b9f6101008c0161370c565b9150613bae6101208c01613a32565b90509295989b9194979a5092959850565b60008060408385031215613bd257600080fd5b8235613bdd81613427565b91506020830135613bed81613427565b809150509250929050565b6020815260008251610100806020850152613c176101208501836134dc565b91506001600160401b0360208601511660408501526001600160801b0360408601511660608501526060850151613c5960808601826001600160401b03169052565b5060808501516001600160401b03811660a08601525060a08501516001600160401b03811660c08601525060c085015180151560e08601525060e0850151801515858301525090949350505050565b600080600080600060a08688031215613cc057600080fd5b8535613ccb81613427565b94506020860135613cdb81613427565b9350604086013592506060860135915060808601356001600160401b03811115613d0457600080fd5b61387a88828901613590565b600080600060608486031215613d2557600080fd5b8335613d3081613427565b95602085013595506040909401359392505050565b600181811c90821680613d5957607f821691505b602082108103613d7957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b80820180821115610df957610df9613d7f565b60018060a01b038616815284602082015283604082015282606082015260a060808201526000613ddb60a08301846134dc565b979650505050505050565b60208082526017908201527f546f6b656e20494420646f6573206e6f74206578697374000000000000000000604082015260600190565b601f82111561112a57600081815260208120601f850160051c81016020861015613e445750805b601f850160051c820191505b8181101561298557828155600101613e50565b81516001600160401b03811115613e7c57613e7c61354e565b613e9081613e8a8454613d45565b84613e1d565b602080601f831160018114613ec55760008415613ead5750858301515b600019600386901b1c1916600185901b178555612985565b600085815260208120601f198616915b82811015613ef457888601518255948401946001909101908401613ed5565b5085821015613f125787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b8082028115828204841417610df957610df9613d7f565b634e487b7160e01b600052601260045260246000fd5b600082613f5e57613f5e613f39565b500490565b6020808252602e908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526d195c881bdc88185c1c1c9bdd995960921b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b600060018201613fd957613fd9613d7f565b5060010190565b805169ffffffffffffffffffff811681146136b957600080fd5b600080600080600060a0868803121561401257600080fd5b61401b86613fe0565b945060208601519350604086015192506060860151915061403e60808701613fe0565b90509295509295909350565b6001600160401b0381811683821602808216919082811461406d5761406d613d7f565b505092915050565b6001600160401b038181168382160190808211156126b4576126b4613d7f565b60006101608d83528060208401526140af8184018e6134dc565b905082810360408401526140c3818d6134dc565b6001600160401b038c811660608601526001600160801b038c1660808601528a811660a086015289811660c086015288811660e0860152878116610100860152861661012085015291506141149050565b8215156101408301529c9b505050505050505050505050565b60008261413c5761413c613f39565b500690565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b60408152600061422b6040830185613949565b82810360208401526126d48185613949565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090613ddb908301846134dc565b60006020828403121561431057600080fd5b81516115b981613485565b600060033d11156143345760046000803e5060005160e01c5b90565b600060443d10156143455790565b6040516003193d81016004833e81513d6001600160401b03816024840111818411171561437457505050505090565b828501915081518181111561438c5750505050505090565b843d87010160208285010111156143a65750505050505090565b6143b560208286010187613564565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b0386811682528516602082015260a06040820181905260009061443490830186613949565b82810360608401526144468186613949565b9050828103608084015261445a81856134dc565b9897505050505050505056fea2646970667358221220968b89e1b1d381b4330fc5fb8107f190c0651dee21b365a239ce594d522e317d64736f6c63430008110033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000b21f2a5c2478b255dca85cb0d4b178db7ae42071000000000000000000000000de3ff2a50bd1ba1bd6a608ea0138946dddf595bc0000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b84190000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000003f200000000000000000000000000000000000000000000000000000000000003de0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000046000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008200000000000000000000000000000000000000000000000000000000636eb7d00000000000000000000000000000000000000000000000000000000063780060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000003f697066733a2f2f516d504c464748483431437358644d4d46563374555976774a4e5469575842794655757a4d6139433862665768522f7b69647d2e6a736f6e00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000003e700000000000000000000000000000000000000000000000000000000636ec5e00000000000000000000000000000000000000000000000000000000063780060000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000003f697066733a2f2f516d504c464748483431437358644d4d46563374555976774a4e5469575842794655757a4d6139433862665768522f7b69647d2e6a736f6e00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : priceBuffers_ (uint16[]): 1010,990
Arg [1] : beneficiary_ (address): 0xb21F2a5c2478B255DCA85CB0D4B178Db7AE42071
Arg [2] : developer_ (address): 0xDE3FF2A50bd1BA1bd6a608EA0138946Dddf595bc
Arg [3] : priceFeedAddress_ (address): 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419
Arg [4] : firstEditions_ (tuple[]): System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput]

-----Encoded View---------------
53 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 000000000000000000000000b21f2a5c2478b255dca85cb0d4b178db7ae42071
Arg [2] : 000000000000000000000000de3ff2a50bd1ba1bd6a608ea0138946dddf595bc
Arg [3] : 0000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b8419
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [6] : 00000000000000000000000000000000000000000000000000000000000003f2
Arg [7] : 00000000000000000000000000000000000000000000000000000000000003de
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [10] : 00000000000000000000000000000000000000000000000000000000000001e0
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000300
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000460
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [15] : 0000000000000000000000000000000000000000000000000000000000000082
Arg [16] : 00000000000000000000000000000000000000000000000000000000636eb7d0
Arg [17] : 0000000000000000000000000000000000000000000000000000000063780060
Arg [18] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [19] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [20] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [21] : 000000000000000000000000000000000000000000000000000000000000003f
Arg [22] : 697066733a2f2f516d504c464748483431437358644d4d46563374555976774a
Arg [23] : 4e5469575842794655757a4d6139433862665768522f7b69647d2e6a736f6e00
Arg [24] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [25] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [26] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [27] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [28] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [29] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [30] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [31] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [32] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [33] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [34] : 00000000000000000000000000000000000000000000000000000000000000c8
Arg [35] : 00000000000000000000000000000000000000000000000000000000000003e7
Arg [36] : 00000000000000000000000000000000000000000000000000000000636ec5e0
Arg [37] : 0000000000000000000000000000000000000000000000000000000063780060
Arg [38] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [39] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [40] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [41] : 000000000000000000000000000000000000000000000000000000000000003f
Arg [42] : 697066733a2f2f516d504c464748483431437358644d4d46563374555976774a
Arg [43] : 4e5469575842794655757a4d6139433862665768522f7b69647d2e6a736f6e00
Arg [44] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [45] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [46] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [47] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [48] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [49] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [50] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [51] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [52] : 0000000000000000000000000000000000000000000000000000000000000000


Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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