ETH Price: $2,352.96 (+1.73%)

Contract

0x325A468f3453EA52c5CF3D0fA0bA68d4CbC0F8A4
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Transfer From131373242021-09-01 3:16:191105 days ago1630466179IN
0x325A468f...4CbC0F8A4
0 ETH0.00468129102.34805092
Transfer From131373212021-09-01 3:14:001105 days ago1630466040IN
0x325A468f...4CbC0F8A4
0 ETH0.0064194694.90769182
Set Approval For...131135832021-08-28 11:25:381109 days ago1630149938IN
0x325A468f...4CbC0F8A4
0 ETH0.0023138349.62446097
Set Approval For...131101322021-08-27 22:27:241109 days ago1630103244IN
0x325A468f...4CbC0F8A4
0 ETH0.0043232892.72056122
Set Approval For...131072412021-08-27 11:39:281110 days ago1630064368IN
0x325A468f...4CbC0F8A4
0 ETH0.003316371.12421153
Set Approval For...131023052021-08-26 17:15:451110 days ago1629998145IN
0x325A468f...4CbC0F8A4
0 ETH0.00663972142.4008379
Set Approval For...131020482021-08-26 16:20:251110 days ago1629994825IN
0x325A468f...4CbC0F8A4
0 ETH0.00818877175.62302139
Set Approval For...130935792021-08-25 8:49:281112 days ago1629881368IN
0x325A468f...4CbC0F8A4
0 ETH0.0035228375.55352943
Set Approval For...130927312021-08-25 5:48:011112 days ago1629870481IN
0x325A468f...4CbC0F8A4
0 ETH0.0025254554.1629922
Set Approval For...130902862021-08-24 20:33:011112 days ago1629837181IN
0x325A468f...4CbC0F8A4
0 ETH0.00525439112.6898739
Set Approval For...130856912021-08-24 3:50:541113 days ago1629777054IN
0x325A468f...4CbC0F8A4
0 ETH0.0030446365.2977584
Set Approval For...130853532021-08-24 2:30:351113 days ago1629772235IN
0x325A468f...4CbC0F8A4
0 ETH0.0043363193
Set Approval For...130853022021-08-24 2:20:291113 days ago1629771629IN
0x325A468f...4CbC0F8A4
0 ETH0.0033453771.74753089
Set Approval For...130835082021-08-23 19:41:101113 days ago1629747670IN
0x325A468f...4CbC0F8A4
0 ETH0.0026577357
Set Approval For...130747312021-08-22 11:05:511115 days ago1629630351IN
0x325A468f...4CbC0F8A4
0 ETH0.0009545820.47280122
Set Approval For...130471312021-08-18 4:34:521119 days ago1629261292IN
0x325A468f...4CbC0F8A4
0 ETH0.0020982145
Set Approval For...130208592021-08-14 3:28:141123 days ago1628911694IN
0x325A468f...4CbC0F8A4
0 ETH0.0020259643.45044614
Set Approval For...130036972021-08-11 11:48:371126 days ago1628682517IN
0x325A468f...4CbC0F8A4
0 ETH0.0020515844
Withdraw129892972021-08-09 6:28:061128 days ago1628490486IN
0x325A468f...4CbC0F8A4
0 ETH0.0010087833.08899075
Transfer From129877522021-08-09 0:38:461128 days ago1628469526IN
0x325A468f...4CbC0F8A4
0 ETH0.0023674537.67488407
Set Approval For...129876492021-08-09 0:17:581128 days ago1628468278IN
0x325A468f...4CbC0F8A4
0 ETH0.0016664535.7401309
Set Approval For...129869102021-08-08 21:30:581128 days ago1628458258IN
0x325A468f...4CbC0F8A4
0 ETH0.0016319435
Set Approval For...129844372021-08-08 12:32:451129 days ago1628425965IN
0x325A468f...4CbC0F8A4
0 ETH0.0018650840
Set Approval For...129843862021-08-08 12:20:501129 days ago1628425250IN
0x325A468f...4CbC0F8A4
0 ETH0.0016502735.39311258
Transfer From129843802021-08-08 12:18:501129 days ago1628425130IN
0x325A468f...4CbC0F8A4
0 ETH0.0014120630.87229291
View all transactions

Latest 7 internal transactions

Advanced mode:
Parent Transaction Hash Block From To
129892972021-08-09 6:28:061128 days ago1628490486
0x325A468f...4CbC0F8A4
2.42 ETH
129807872021-08-07 22:56:221129 days ago1628376982
0x325A468f...4CbC0F8A4
0.99 ETH
129807732021-08-07 22:53:051129 days ago1628376785
0x325A468f...4CbC0F8A4
0.92 ETH
129807672021-08-07 22:50:361129 days ago1628376636
0x325A468f...4CbC0F8A4
0.88 ETH
129807562021-08-07 22:48:161129 days ago1628376496
0x325A468f...4CbC0F8A4
0.78 ETH
129707862021-08-06 10:06:491131 days ago1628244409
0x325A468f...4CbC0F8A4
16.56 ETH
129705052021-08-06 9:05:481131 days ago1628240748
0x325A468f...4CbC0F8A4
1 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
NFTSprites

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-03-27
*/

pragma solidity 0.8.0;

/**
 * @dev ERC-721 interface for accepting safe transfers.
 * See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md.
 */
interface ERC721TokenReceiver
{

  /**
   * @dev Handle the receipt of a NFT. The ERC721 smart contract calls this function on the
   * recipient after a `transfer`. This function MAY throw to revert and reject the transfer. Return
   * of other than the magic value MUST result in the transaction being reverted.
   * Returns `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` unless throwing.
   * @notice The contract address is always the message sender. A wallet/broker/auction application
   * MUST implement the wallet interface if it will accept safe transfers.
   * @param _operator The address which called `safeTransferFrom` function.
   * @param _from The address which previously owned the token.
   * @param _tokenId The NFT identifier which is being transferred.
   * @param _data Additional data with no specified format.
   * @return Returns `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`.
   */
  function onERC721Received(
    address _operator,
    address _from,
    uint256 _tokenId,
    bytes calldata _data
  )
    external
    returns(bytes4);

}

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

  /**
   * @dev Emits when ownership of any NFT changes by any mechanism. This event emits when NFTs are
   * created (`from` == 0) and destroyed (`to` == 0). Exception: during contract creation, any
   * number of NFTs may be created and assigned without emitting Transfer. At the time of any
   * transfer, the approved address for that NFT (if any) is reset to none.
   */
  event Transfer(
    address indexed _from,
    address indexed _to,
    uint256 indexed _tokenId
  );

  /**
   * @dev This emits when the approved address for an NFT is changed or reaffirmed. The zero
   * address indicates there is no approved address. When a Transfer event emits, this also
   * indicates that the approved address for that NFT (if any) is reset to none.
   */
  event Approval(
    address indexed _owner,
    address indexed _approved,
    uint256 indexed _tokenId
  );

  /**
   * @dev This emits when an operator is enabled or disabled for an owner. The operator can manage
   * all NFTs of the owner.
   */
  event ApprovalForAll(
    address indexed _owner,
    address indexed _operator,
    bool _approved
  );

  /**
   * @dev Transfers the ownership of an NFT from one address to another address.
   * @notice Throws unless `msg.sender` is the current owner, an authorized operator, or the
   * approved address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is
   * the zero address. Throws if `_tokenId` is not a valid NFT. When transfer is complete, this
   * function checks if `_to` is a smart contract (code size > 0). If so, it calls
   * `onERC721Received` on `_to` and throws if the return value is not
   * `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`.
   * @param _from The current owner of the NFT.
   * @param _to The new owner.
   * @param _tokenId The NFT to transfer.
   * @param _data Additional data with no specified format, sent in call to `_to`.
   */
  function safeTransferFrom(
    address _from,
    address _to,
    uint256 _tokenId,
    bytes calldata _data
  )
    external;

  /**
   * @dev Transfers the ownership of an NFT from one address to another address.
   * @notice This works identically to the other function with an extra data parameter, except this
   * function just sets data to ""
   * @param _from The current owner of the NFT.
   * @param _to The new owner.
   * @param _tokenId The NFT to transfer.
   */
  function safeTransferFrom(
    address _from,
    address _to,
    uint256 _tokenId
  )
    external;

  /**
   * @dev Throws unless `msg.sender` is the current owner, an authorized operator, or the approved
   * address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is the zero
   * address. Throws if `_tokenId` is not a valid NFT.
   * @notice The caller is responsible to confirm that `_to` is capable of receiving NFTs or else
   * they mayb be permanently lost.
   * @param _from The current owner of the NFT.
   * @param _to The new owner.
   * @param _tokenId The NFT to transfer.
   */
  function transferFrom(
    address _from,
    address _to,
    uint256 _tokenId
  )
    external;

  /**
   * @dev Set or reaffirm the approved address for an NFT.
   * @notice The zero address indicates there is no approved address. Throws unless `msg.sender` is
   * the current NFT owner, or an authorized operator of the current owner.
   * @param _approved The new approved NFT controller.
   * @param _tokenId The NFT to approve.
   */
  function approve(
    address _approved,
    uint256 _tokenId
  )
    external;

  /**
   * @dev Enables or disables approval for a third party ("operator") to manage all of
   * `msg.sender`'s assets. It also emits the ApprovalForAll event.
   * @notice The contract MUST allow multiple operators per owner.
   * @param _operator Address to add to the set of authorized operators.
   * @param _approved True if the operators is approved, false to revoke approval.
   */
  function setApprovalForAll(
    address _operator,
    bool _approved
  )
    external;

  /**
   * @dev Returns the number of NFTs owned by `_owner`. NFTs assigned to the zero address are
   * considered invalid, and this function throws for queries about the zero address.
   * @param _owner Address for whom to query the balance.
   * @return Balance of _owner.
   */
  function balanceOf(
    address _owner
  )
    external
    view
    returns (uint256);

  /**
   * @dev Returns the address of the owner of the NFT. NFTs assigned to zero address are considered
   * invalid, and queries about them do throw.
   * @param _tokenId The identifier for an NFT.
   * @return Address of _tokenId owner.
   */
  function ownerOf(
    uint256 _tokenId
  )
    external
    view
    returns (address);

  /**
   * @dev Get the approved address for a single NFT.
   * @notice Throws if `_tokenId` is not a valid NFT.
   * @param _tokenId The NFT to find the approved address for.
   * @return Address that _tokenId is approved for.
   */
  function getApproved(
    uint256 _tokenId
  )
    external
    view
    returns (address);

  /**
   * @dev Returns true if `_operator` is an approved operator for `_owner`, false otherwise.
   * @param _owner The address that owns the NFTs.
   * @param _operator The address that acts on behalf of the owner.
   * @return True if approved for all, false otherwise.
   */
  function isApprovedForAll(
    address _owner,
    address _operator
  )
    external
    view
    returns (bool);

}


/**
 * @dev Utility library of inline functions on addresses.
 * @notice Based on:
 * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol
 * Requires EIP-1052.
 */
library AddressUtils
{

  /**
   * @dev Returns whether the target address is a contract.
   * @param _addr Address to check.
   * @return addressCheck True if _addr is a contract, false if not.
   */
  function isContract(
    address _addr
  )
    internal
    view
    returns (bool addressCheck)
  {
    // This method relies in extcodesize, which returns 0 for contracts in
    // construction, since the code is only stored at the end of the
    // constructor execution.

    // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
    // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
    // for accounts without code, i.e. `keccak256('')`
    bytes32 codehash;
    bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
    assembly { codehash := extcodehash(_addr) } // solhint-disable-line
    addressCheck = (codehash != 0x0 && codehash != accountHash);
  }

}


interface ERC165
{

  /**
   * @dev Checks if the smart contract includes a specific interface.
   * This function uses less than 30,000 gas.
   * @param _interfaceID The interface identifier, as specified in ERC-165.
   * @return True if _interfaceID is supported, false otherwise.
   */
  function supportsInterface(
    bytes4 _interfaceID
  )
    external
    view
    returns (bool);
    
}

/**
 * @dev Implementation of standard for detect smart contract interfaces.
 */
contract SupportsInterface is
  ERC165
{

  /**
   * @dev Mapping of supported intefraces. You must not set element 0xffffffff to true.
   */
  mapping(bytes4 => bool) internal supportedInterfaces;

  /**
   * @dev Contract constructor.
   */
  constructor()
  {
    supportedInterfaces[0x01ffc9a7] = true; // ERC165
  }

  /**
   * @dev Function to check which interfaces are suported by this contract.
   * @param _interfaceID Id of the interface.
   * @return True if _interfaceID is supported, false otherwise.
   */
  function supportsInterface(
    bytes4 _interfaceID
  )
    external
    override
    view
    returns (bool)
  {
    return supportedInterfaces[_interfaceID];
  }

}



contract NFTSprites is
  ERC721,
  SupportsInterface
{
  using AddressUtils for address;

  /**
   * @dev List of revert message codes. Implementing dApp should handle showing the correct message.
   * Based on 0xcert framework error codes.
   */
  string constant ZERO_ADDRESS = "003001";
  string constant NOT_VALID_NFT = "003002";
  string constant NOT_OWNER_OR_OPERATOR = "003003";
  string constant NOT_OWNER_APPROVED_OR_OPERATOR = "003004";
  string constant NOT_ABLE_TO_RECEIVE_NFT = "003005";
  string constant NFT_ALREADY_EXISTS = "003006";
  string constant NOT_OWNER = "003007";
  string constant IS_OWNER = "003008";
  
  string internal nftName = "NFT Sprites";
  string internal nftSymbol = "NFTS";
  
  uint public latestNewSpriteForSale;
  
  address owner;
    
  struct Sprite {
    address owner;
    bool currentlyForSale;
    uint price;
    uint timesSold;
  }
  
  mapping (uint => Sprite) public sprites;
  
  function getSpriteInfo (uint spriteNumber) public view returns (address, bool, uint, uint) {
    return (sprites[spriteNumber].owner, sprites[spriteNumber].currentlyForSale, sprites[spriteNumber].price, sprites[spriteNumber].timesSold);
  }
  
  // ownerOf does this as well
  function getSpriteOwner (uint spriteNumber) public view returns (address) {
    return (sprites[spriteNumber].owner);
  }
  
  mapping (address => uint[]) public spriteOwners;
  function spriteOwningHistory (address _address) public view returns (uint[] memory owningHistory) {
    owningHistory = spriteOwners[_address];
  }
  
  function name() external view returns (string memory _name) {
    _name = nftName;
  }
  
  function symbol() external view returns (string memory _symbol) {
    _symbol = nftSymbol;
  }

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

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

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

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

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

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

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

  /**
   * @dev Guarantees that _tokenId is a valid Token.
   * @param _tokenId ID of the NFT to validate.
   */
  modifier validNFToken(uint256 _tokenId) {
    require(idToOwner[_tokenId] != address(0), NOT_VALID_NFT);
    _;
  }

  /**
   * @dev Contract constructor.
   */
  constructor() {
    supportedInterfaces[0x80ac58cd] = true; // ERC721
    
    sprites[0].owner = msg.sender;
    sprites[0].currentlyForSale = true;
    sprites[0].price = (10**15)*5;
    sprites[0].timesSold = 0;
    
    owner = msg.sender;
  }
    
  function buySprite (uint spriteNumber) public payable {
    require(sprites[spriteNumber].currentlyForSale == true);
    require(msg.value == sprites[spriteNumber].price);
    require(spriteNumber < 100);
    sprites[spriteNumber].timesSold++;
    spriteOwners[msg.sender].push(spriteNumber);
    sprites[spriteNumber].currentlyForSale = false;
    if (spriteNumber != latestNewSpriteForSale) {
        // buying sprite that is already owned from someone
        address currentSpriteOwner = getSpriteOwner(spriteNumber);
        idToApproval[spriteNumber] = msg.sender;
        // _safeTransferFrom calls _transfer which updates the sprite owner
        _safeTransferFrom(currentSpriteOwner, msg.sender, spriteNumber, "");
        // give existing sprite owner their money
        payable(sprites[spriteNumber].owner).transfer(sprites[spriteNumber].price);
    } else {
        // buying brand new latest sprite
        sprites[spriteNumber].owner = msg.sender;
        if (latestNewSpriteForSale != 99) {
            latestNewSpriteForSale++;
            sprites[latestNewSpriteForSale].price = latestNewSpriteForSale**2 * (10**15)*5;
            sprites[latestNewSpriteForSale].currentlyForSale = true;
        }
        _mint(msg.sender, spriteNumber);
    }
  }
  
  function sellSprite (uint spriteNumber, uint price) public {
    require(msg.sender == sprites[spriteNumber].owner);
    require(price > 0);
    sprites[spriteNumber].price = price;
    sprites[spriteNumber].currentlyForSale = true;
  }
  
  function dontSellSprite (uint spriteNumber) public {
    require(msg.sender == sprites[spriteNumber].owner);
    sprites[spriteNumber].currentlyForSale = false;
  }
  
  function giftSprite (uint spriteNumber, address receiver) public {
    require(receiver != address(0), ZERO_ADDRESS);
    require(msg.sender == sprites[spriteNumber].owner);
    spriteOwners[receiver].push(spriteNumber);
    _safeTransferFrom(msg.sender, receiver, spriteNumber, "");
  }
  
  function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes calldata _data) external override {
    _safeTransferFrom(_from, _to, _tokenId, _data);
  }
  
  /**
   * @dev Transfers the ownership of an NFT from one address to another address. This function can
   * be changed to payable.
   * @notice This works identically to the other function with an extra data parameter, except this
   * function just sets data to ""
   * @param _from The current owner of the NFT.
   * @param _to The new owner.
   * @param _tokenId The NFT to transfer.
   */
  function safeTransferFrom(address _from, address _to, uint256 _tokenId) external override {
    _safeTransferFrom(_from, _to, _tokenId, "");
  }

  /**
   * @dev Set or reaffirm the approved address for an NFT. This function can be changed to payable.
   * @notice The zero address indicates there is no approved address. Throws unless `msg.sender` is
   * the current NFT owner, or an authorized operator of the current owner.
   * @param _approved Address to be approved for the given NFT ID.
   * @param _tokenId ID of the token to be approved.
   */
  function approve(address _approved, uint256 _tokenId) external override canOperate(_tokenId) validNFToken(_tokenId) {
    address tokenOwner = idToOwner[_tokenId];
    require(_approved != tokenOwner, IS_OWNER);

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

  /**
   * @dev Enables or disables approval for a third party ("operator") to manage all of
   * `msg.sender`'s assets. It also emits the ApprovalForAll event.
   * @notice This works even if sender doesn't own any tokens at the time.
   * @param _operator Address to add to the set of authorized operators.
   * @param _approved True if the operators is approved, false to revoke approval.
   */
  function setApprovalForAll(address _operator, bool _approved) external override {
    ownerToOperators[msg.sender][_operator] = _approved;
    emit ApprovalForAll(msg.sender, _operator, _approved);
  }

  /**
   * @dev Returns the number of NFTs owned by `_owner`. NFTs assigned to the zero address are
   * considered invalid, and this function throws for queries about the zero address.
   * @param _owner Address for whom to query the balance.
   * @return Balance of _owner.
   */
  function balanceOf(address _owner) external override view returns (uint256) {
    require(_owner != address(0), ZERO_ADDRESS);
    return _getOwnerNFTCount(_owner);
  }

  /**
   * @dev Returns the address of the owner of the NFT. NFTs assigned to zero address are considered
   * invalid, and queries about them do throw.
   * @param _tokenId The identifier for an NFT.
   * @return _owner Address of _tokenId owner.
   */
  function ownerOf(uint256 _tokenId) external override view returns (address _owner) {
    _owner = idToOwner[_tokenId];
    require(_owner != address(0), NOT_VALID_NFT);
  }

  /**
   * @dev Get the approved address for a single NFT.
   * @notice Throws if `_tokenId` is not a valid NFT.
   * @param _tokenId ID of the NFT to query the approval of.
   * @return Address that _tokenId is approved for.
   */
  function getApproved(uint256 _tokenId) external override view validNFToken(_tokenId) returns (address) {
    return idToApproval[_tokenId];
  }

  /**
   * @dev Checks if `_operator` is an approved operator for `_owner`.
   * @param _owner The address that owns the NFTs.
   * @param _operator The address that acts on behalf of the owner.
   * @return True if approved for all, false otherwise.
   */
  function isApprovedForAll(address _owner, address _operator) external override view returns (bool) {
    return ownerToOperators[_owner][_operator];
  }

  /**
   * @dev Actually preforms the transfer.
   * @notice Does NO checks.
   * @param _to Address of a new owner.
   * @param _tokenId The NFT that is being transferred.
   */
  function _transfer(address _to, uint256 _tokenId) internal {
    address from = idToOwner[_tokenId];
    _clearApproval(_tokenId);

    _removeNFToken(from, _tokenId);
    _addNFToken(_to, _tokenId);
    
    // update sprite struct - may have already been done in buySprite
    sprites[_tokenId].owner = _to;

    emit Transfer(from, _to, _tokenId);
  }

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

    _addNFToken(_to, _tokenId);

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

  /**
   * @dev Burns a NFT.
   * @notice This is an internal function which should be called from user-implemented external burn
   * function. Its purpose is to show and properly initialize data structures when using this
   * implementation. Also, note that this burn implementation allows the minter to re-mint a burned
   * NFT.
   * @param _tokenId ID of the NFT to be burned.
   */
  function _burn(uint256 _tokenId) internal virtual validNFToken(_tokenId) {
    address tokenOwner = idToOwner[_tokenId];
    _clearApproval(_tokenId);
    _removeNFToken(tokenOwner, _tokenId);
    emit Transfer(tokenOwner, address(0), _tokenId);
  }
  
  /**
   * @dev Removes a NFT from owner.
   * @notice Use and override this function with caution. Wrong usage can have serious consequences.
   * @param _from Address from wich we want to remove the NFT.
   * @param _tokenId Which NFT we want to remove.
   */
  function _removeNFToken(address _from, uint256 _tokenId) internal virtual {
    require(idToOwner[_tokenId] == _from, NOT_OWNER);
    ownerToNFTokenCount[_from] = ownerToNFTokenCount[_from] - 1;
    delete idToOwner[_tokenId];
  }

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

    idToOwner[_tokenId] = _to;
    ownerToNFTokenCount[_to] = ownerToNFTokenCount[_to] + 1;
  }

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

  /**
   * @dev Actually perform the safeTransferFrom.
   * @param _from The current owner of the NFT.
   * @param _to The new owner.
   * @param _tokenId The NFT to transfer.
   * @param _data Additional data with no specified format, sent in call to `_to`.
   */
  function _safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes memory _data) private canTransfer(_tokenId) validNFToken(_tokenId) {
    address tokenOwner = idToOwner[_tokenId];
    require(tokenOwner == _from, NOT_OWNER);
    require(_to != address(0), ZERO_ADDRESS);

    _transfer(_to, _tokenId);

    // isContract is function from address-utils.sol
    if (_to.isContract()) {
      bytes4 retval = ERC721TokenReceiver(_to).onERC721Received(msg.sender, _from, _tokenId, _data);
      require(retval == MAGIC_ON_ERC721_RECEIVED, NOT_ABLE_TO_RECEIVE_NFT);
    }
  }

  /**
   * @dev Clears the current approval of a given NFT ID.
   * @param _tokenId ID of the NFT to be transferred.
   */
  function _clearApproval(uint256 _tokenId) private {
    if (idToApproval[_tokenId] != address(0)) {
      delete idToApproval[_tokenId];
    }
  }
  
  modifier onlyOwner {
    require(msg.sender == owner);
    _;
  }
  
  function withdraw() public onlyOwner {
    payable(owner).transfer(address(this).balance);
  }
  
    /**
   * @dev Throws unless `msg.sender` is the current owner, an authorized operator, or the approved
   * address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is the zero
   * address. Throws if `_tokenId` is not a valid NFT. This function can be changed to payable.
   * @notice The caller is responsible to confirm that `_to` is capable of receiving NFTs or else
   * they maybe be permanently lost.
   * @param _from The current owner of the NFT.
   * @param _to The new owner.
   * @param _tokenId The NFT to transfer.
   */
  function transferFrom(address _from, address _to, uint256 _tokenId) external override canTransfer(_tokenId) validNFToken(_tokenId) {
    address tokenOwner = idToOwner[_tokenId];
    require(tokenOwner == _from, NOT_OWNER);
    require(_to != address(0), ZERO_ADDRESS);

    _transfer(_to, _tokenId);
  }
  
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"_approved","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"spriteNumber","type":"uint256"}],"name":"buySprite","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"spriteNumber","type":"uint256"}],"name":"dontSellSprite","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"spriteNumber","type":"uint256"}],"name":"getSpriteInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"spriteNumber","type":"uint256"}],"name":"getSpriteOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"spriteNumber","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"giftSprite","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestNewSpriteForSale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"_name","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"_owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"spriteNumber","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"}],"name":"sellSprite","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":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"spriteOwners","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"spriteOwningHistory","outputs":[{"internalType":"uint256[]","name":"owningHistory","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"sprites","outputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"bool","name":"currentlyForSale","type":"bool"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"timesSold","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"_symbol","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526040518060400160405280600b81526020017f4e46542053707269746573000000000000000000000000000000000000000000815250600190805190602001906200005192919062000259565b506040518060400160405280600481526020017f4e46545300000000000000000000000000000000000000000000000000000000815250600290805190602001906200009f92919062000259565b50348015620000ad57600080fd5b5060016000806301ffc9a760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555060016000806380ac58cd60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff021916908315150217905550336005600080815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060016005600080815260200190815260200160002060000160146101000a81548160ff0219169083151502179055506611c37937e0800060056000808152602001908152602001600020600101819055506000600560008081526020019081526020016000206002018190555033600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200036e565b828054620002679062000309565b90600052602060002090601f0160209004810192826200028b5760008555620002d7565b82601f10620002a657805160ff1916838001178555620002d7565b82800160010185558215620002d7579182015b82811115620002d6578251825591602001919060010190620002b9565b5b509050620002e69190620002ea565b5090565b5b8082111562000305576000816000905550600101620002eb565b5090565b600060028204905060018216806200032257607f821691505b602082108114156200033957620003386200033f565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61353c806200037e6000396000f3fe6080604052600436106101405760003560e01c80636352211e116100b6578063c2afbfb51161006f578063c2afbfb514610489578063c66cd93e146104b2578063ccb13693146104db578063e985e9c514610506578063eb9ce7c714610543578063f777a34e1461056c57610140565b80636352211e1461035257806370a082311461038f5780638c91f84d146103cc57806395d89b411461040c578063a22cb46514610437578063b88d4fde1461046057610140565b80632571a356116101085780632571a3561461023c5780632c756d811461027c5780633ccfd60b146102b957806342842e0e146102d05780634b4dc1f1146102f957806351c54c681461033657610140565b806301ffc9a71461014557806306fdde0314610182578063081812fc146101ad578063095ea7b3146101ea57806323b872dd14610213575b600080fd5b34801561015157600080fd5b5061016c60048036038101906101679190612cfc565b6105a9565b6040516101799190612fe1565b60405180910390f35b34801561018e57600080fd5b50610197610610565b6040516101a49190612ffc565b60405180910390f35b3480156101b957600080fd5b506101d460048036038101906101cf9190612d4e565b6106a2565b6040516101e19190612f13565b60405180910390f35b3480156101f657600080fd5b50610211600480360381019061020c9190612cc0565b6107bd565b005b34801561021f57600080fd5b5061023a60048036038101906102359190612bb5565b610ba0565b005b34801561024857600080fd5b50610263600480360381019061025e9190612d4e565b610ff2565b6040516102739493929190612f7a565b60405180910390f35b34801561028857600080fd5b506102a3600480360381019061029e9190612d4e565b611090565b6040516102b09190612f13565b60405180910390f35b3480156102c557600080fd5b506102ce6110d0565b005b3480156102dc57600080fd5b506102f760048036038101906102f29190612bb5565b611195565b005b34801561030557600080fd5b50610320600480360381019061031b9190612b50565b6111b5565b60405161032d9190612fbf565b60405180910390f35b610350600480360381019061034b9190612d4e565b61124c565b005b34801561035e57600080fd5b5061037960048036038101906103749190612d4e565b61158c565b6040516103869190612f13565b60405180910390f35b34801561039b57600080fd5b506103b660048036038101906103b19190612b50565b611672565b6040516103c3919061301e565b60405180910390f35b3480156103d857600080fd5b506103f360048036038101906103ee9190612d4e565b61172c565b6040516104039493929190612f7a565b60405180910390f35b34801561041857600080fd5b50610421611789565b60405161042e9190612ffc565b60405180910390f35b34801561044357600080fd5b5061045e60048036038101906104599190612c84565b61181b565b005b34801561046c57600080fd5b5061048760048036038101906104829190612c04565b611918565b005b34801561049557600080fd5b506104b060048036038101906104ab9190612db3565b61196f565b005b3480156104be57600080fd5b506104d960048036038101906104d49190612d77565b611a38565b005b3480156104e757600080fd5b506104f0611bd4565b6040516104fd919061301e565b60405180910390f35b34801561051257600080fd5b5061052d60048036038101906105289190612b79565b611bda565b60405161053a9190612fe1565b60405180910390f35b34801561054f57600080fd5b5061056a60048036038101906105659190612d4e565b611c6e565b005b34801561057857600080fd5b50610593600480360381019061058e9190612cc0565b611d0e565b6040516105a0919061301e565b60405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b60606001805461061f906133b3565b80601f016020809104026020016040519081016040528092919081815260200182805461064b906133b3565b80156106985780601f1061066d57610100808354040283529160200191610698565b820191906000526020600020905b81548152906001019060200180831161067b57829003601f168201915b5050505050905090565b600081600073ffffffffffffffffffffffffffffffffffffffff166007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090610780576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107779190612ffc565b60405180910390fd5b506008600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b8060006007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614806108b65750600a60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f30303330303300000000000000000000000000000000000000000000000000008152509061092d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109249190612ffc565b60405180910390fd5b5082600073ffffffffffffffffffffffffffffffffffffffff166007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090610a0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a019190612ffc565b60405180910390fd5b5060006007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303038000000000000000000000000000000000000000000000000000081525090610aea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae19190612ffc565b60405180910390fd5b50856008600087815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550848673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050505050565b8060006007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480610c7157503373ffffffffffffffffffffffffffffffffffffffff166008600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b80610d025750600a60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303034000000000000000000000000000000000000000000000000000081525090610d79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d709190612ffc565b60405180910390fd5b5082600073ffffffffffffffffffffffffffffffffffffffff166007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090610e56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4d9190612ffc565b60405180910390fd5b5060006007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303037000000000000000000000000000000000000000000000000000081525090610f35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2c9190612ffc565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090610fde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd59190612ffc565b60405180910390fd5b50610fe98686611d3f565b50505050505050565b6000806000806005600086815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166005600087815260200190815260200160002060000160149054906101000a900460ff166005600088815260200190815260200160002060010154600560008981526020019081526020016000206002015493509350935093509193509193565b60006005600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461112a57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611192573d6000803e3d6000fd5b50565b6111b083838360405180602001604052806000815250611e49565b505050565b6060600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561124057602002820191906000526020600020905b81548152602001906001019080831161122c575b50505050509050919050565b600115156005600083815260200190815260200160002060000160149054906101000a900460ff1615151461128057600080fd5b600560008281526020019081526020016000206001015434146112a257600080fd5b606481106112af57600080fd5b6005600082815260200190815260200160002060020160008154809291906112d6906133e5565b9190505550600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081908060018154018082558091505060019003906000526020600020016000909190919091505560006005600083815260200190815260200160002060000160146101000a81548160ff021916908315150217905550600354811461148c57600061138482611090565b9050336008600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506113f381338460405180602001604052806000815250611e49565b6005600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc60056000858152602001908152602001600020600101549081150290604051600060405180830381858888f19350505050158015611485573d6000803e3d6000fd5b5050611589565b336005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060636003541461157e57600360008154809291906114fe906133e5565b9190505550600566038d7ea4c68000600260035461151c9190613153565b6115269190613271565b6115309190613271565b60056000600354815260200190815260200160002060010181905550600160056000600354815260200190815260200160002060000160146101000a81548160ff0219169083151502179055505b6115883382612417565b5b50565b60006007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f30303330303200000000000000000000000000000000000000000000000000008152509061166c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116639190612ffc565b60405180910390fd5b50919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f30303330303100000000000000000000000000000000000000000000000000008152509061171b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117129190612ffc565b60405180910390fd5b5061172582612605565b9050919050565b60056020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060000160149054906101000a900460ff16908060010154908060020154905084565b606060028054611798906133b3565b80601f01602080910402602001604051908101604052809291908181526020018280546117c4906133b3565b80156118115780601f106117e657610100808354040283529160200191611811565b820191906000526020600020905b8154815290600101906020018083116117f457829003601f168201915b5050505050905090565b80600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161190c9190612fe1565b60405180910390a35050565b61196885858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611e49565b5050505050565b6005600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146119dd57600080fd5b600081116119ea57600080fd5b80600560008481526020019081526020016000206001018190555060016005600084815260200190815260200160002060000160146101000a81548160ff0219169083151502179055505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090611ae0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad79190612ffc565b60405180910390fd5b506005600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b4f57600080fd5b600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020829080600181540180825580915050600190039060005260206000200160009091909190915055611bd033828460405180602001604052806000815250611e49565b5050565b60035481565b6000600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6005600082815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611cdc57600080fd5b60006005600083815260200190815260200160002060000160146101000a81548160ff02191690831515021790555050565b60066020528160005260406000208181548110611d2a57600080fd5b90600052602060002001600091509150505481565b60006007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050611d808261264e565b611d8a81836126ef565b611d948383612892565b826005600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b8160006007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480611f1a57503373ffffffffffffffffffffffffffffffffffffffff166008600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b80611fab5750600a60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303034000000000000000000000000000000000000000000000000000081525090612022576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120199190612ffc565b60405180910390fd5b5083600073ffffffffffffffffffffffffffffffffffffffff166007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906120ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f69190612ffc565b60405180910390fd5b5060006007600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3030333030370000000000000000000000000000000000000000000000000000815250906121de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d59190612ffc565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090612287576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227e9190612ffc565b60405180910390fd5b506122928787611d3f565b6122b18773ffffffffffffffffffffffffffffffffffffffff16612a52565b1561240d5760008773ffffffffffffffffffffffffffffffffffffffff1663150b7a02338b8a8a6040518563ffffffff1660e01b81526004016122f79493929190612f2e565b602060405180830381600087803b15801561231157600080fd5b505af1158015612325573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123499190612d25565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146040518060400160405280600681526020017f30303330303500000000000000000000000000000000000000000000000000008152509061240a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124019190612ffc565b60405180910390fd5b50505b5050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030310000000000000000000000000000000000000000000000000000815250906124bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b69190612ffc565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff166007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f30303330303600000000000000000000000000000000000000000000000000008152509061259a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125919190612ffc565b60405180910390fd5b506125a58282612892565b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600073ffffffffffffffffffffffffffffffffffffffff166008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146126ec576008600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b50565b8173ffffffffffffffffffffffffffffffffffffffff166007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3030333030370000000000000000000000000000000000000000000000000000815250906127c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127bf9190612ffc565b60405180910390fd5b506001600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461281591906132cb565b600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506007600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555050565b600073ffffffffffffffffffffffffffffffffffffffff166007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f30303330303600000000000000000000000000000000000000000000000000008152509061296c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129639190612ffc565b60405180910390fd5b50816007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612a0b91906130aa565b600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91506000801b8214158015612a945750808214155b92505050919050565b600081359050612aac816134aa565b92915050565b600081359050612ac1816134c1565b92915050565b600081359050612ad6816134d8565b92915050565b600081519050612aeb816134d8565b92915050565b60008083601f840112612b0357600080fd5b8235905067ffffffffffffffff811115612b1c57600080fd5b602083019150836001820283011115612b3457600080fd5b9250929050565b600081359050612b4a816134ef565b92915050565b600060208284031215612b6257600080fd5b6000612b7084828501612a9d565b91505092915050565b60008060408385031215612b8c57600080fd5b6000612b9a85828601612a9d565b9250506020612bab85828601612a9d565b9150509250929050565b600080600060608486031215612bca57600080fd5b6000612bd886828701612a9d565b9350506020612be986828701612a9d565b9250506040612bfa86828701612b3b565b9150509250925092565b600080600080600060808688031215612c1c57600080fd5b6000612c2a88828901612a9d565b9550506020612c3b88828901612a9d565b9450506040612c4c88828901612b3b565b935050606086013567ffffffffffffffff811115612c6957600080fd5b612c7588828901612af1565b92509250509295509295909350565b60008060408385031215612c9757600080fd5b6000612ca585828601612a9d565b9250506020612cb685828601612ab2565b9150509250929050565b60008060408385031215612cd357600080fd5b6000612ce185828601612a9d565b9250506020612cf285828601612b3b565b9150509250929050565b600060208284031215612d0e57600080fd5b6000612d1c84828501612ac7565b91505092915050565b600060208284031215612d3757600080fd5b6000612d4584828501612adc565b91505092915050565b600060208284031215612d6057600080fd5b6000612d6e84828501612b3b565b91505092915050565b60008060408385031215612d8a57600080fd5b6000612d9885828601612b3b565b9250506020612da985828601612a9d565b9150509250929050565b60008060408385031215612dc657600080fd5b6000612dd485828601612b3b565b9250506020612de585828601612b3b565b9150509250929050565b6000612dfb8383612ef5565b60208301905092915050565b612e10816132ff565b82525050565b6000612e2182613049565b612e2b8185613077565b9350612e3683613039565b8060005b83811015612e67578151612e4e8882612def565b9750612e598361306a565b925050600181019050612e3a565b5085935050505092915050565b612e7d81613311565b82525050565b6000612e8e82613054565b612e988185613088565b9350612ea8818560208601613380565b612eb18161348c565b840191505092915050565b6000612ec78261305f565b612ed18185613099565b9350612ee1818560208601613380565b612eea8161348c565b840191505092915050565b612efe81613369565b82525050565b612f0d81613369565b82525050565b6000602082019050612f286000830184612e07565b92915050565b6000608082019050612f436000830187612e07565b612f506020830186612e07565b612f5d6040830185612f04565b8181036060830152612f6f8184612e83565b905095945050505050565b6000608082019050612f8f6000830187612e07565b612f9c6020830186612e74565b612fa96040830185612f04565b612fb66060830184612f04565b95945050505050565b60006020820190508181036000830152612fd98184612e16565b905092915050565b6000602082019050612ff66000830184612e74565b92915050565b600060208201905081810360008301526130168184612ebc565b905092915050565b60006020820190506130336000830184612f04565b92915050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b60006130b582613369565b91506130c083613369565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156130f5576130f461342e565b5b828201905092915050565b6000808291508390505b600185111561314a578086048111156131265761312561342e565b5b60018516156131355780820291505b80810290506131438561349d565b945061310a565b94509492505050565b600061315e82613369565b915061316983613373565b92506131967fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848461319e565b905092915050565b6000826131ae576001905061326a565b816131bc576000905061326a565b81600181146131d257600281146131dc5761320b565b600191505061326a565b60ff8411156131ee576131ed61342e565b5b8360020a9150848211156132055761320461342e565b5b5061326a565b5060208310610133831016604e8410600b84101617156132405782820a90508381111561323b5761323a61342e565b5b61326a565b61324d8484846001613100565b925090508184048111156132645761326361342e565b5b81810290505b9392505050565b600061327c82613369565b915061328783613369565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156132c0576132bf61342e565b5b828202905092915050565b60006132d682613369565b91506132e183613369565b9250828210156132f4576132f361342e565b5b828203905092915050565b600061330a82613349565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b8381101561339e578082015181840152602081019050613383565b838111156133ad576000848401525b50505050565b600060028204905060018216806133cb57607f821691505b602082108114156133df576133de61345d565b5b50919050565b60006133f082613369565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156134235761342261342e565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b60008160011c9050919050565b6134b3816132ff565b81146134be57600080fd5b50565b6134ca81613311565b81146134d557600080fd5b50565b6134e18161331d565b81146134ec57600080fd5b50565b6134f881613369565b811461350357600080fd5b5056fea2646970667358221220812b461eee37befc9ba10c5f83b2b794f53b2222d9cdbe25b763c27c6b4188b464736f6c63430008000033

Deployed Bytecode

0x6080604052600436106101405760003560e01c80636352211e116100b6578063c2afbfb51161006f578063c2afbfb514610489578063c66cd93e146104b2578063ccb13693146104db578063e985e9c514610506578063eb9ce7c714610543578063f777a34e1461056c57610140565b80636352211e1461035257806370a082311461038f5780638c91f84d146103cc57806395d89b411461040c578063a22cb46514610437578063b88d4fde1461046057610140565b80632571a356116101085780632571a3561461023c5780632c756d811461027c5780633ccfd60b146102b957806342842e0e146102d05780634b4dc1f1146102f957806351c54c681461033657610140565b806301ffc9a71461014557806306fdde0314610182578063081812fc146101ad578063095ea7b3146101ea57806323b872dd14610213575b600080fd5b34801561015157600080fd5b5061016c60048036038101906101679190612cfc565b6105a9565b6040516101799190612fe1565b60405180910390f35b34801561018e57600080fd5b50610197610610565b6040516101a49190612ffc565b60405180910390f35b3480156101b957600080fd5b506101d460048036038101906101cf9190612d4e565b6106a2565b6040516101e19190612f13565b60405180910390f35b3480156101f657600080fd5b50610211600480360381019061020c9190612cc0565b6107bd565b005b34801561021f57600080fd5b5061023a60048036038101906102359190612bb5565b610ba0565b005b34801561024857600080fd5b50610263600480360381019061025e9190612d4e565b610ff2565b6040516102739493929190612f7a565b60405180910390f35b34801561028857600080fd5b506102a3600480360381019061029e9190612d4e565b611090565b6040516102b09190612f13565b60405180910390f35b3480156102c557600080fd5b506102ce6110d0565b005b3480156102dc57600080fd5b506102f760048036038101906102f29190612bb5565b611195565b005b34801561030557600080fd5b50610320600480360381019061031b9190612b50565b6111b5565b60405161032d9190612fbf565b60405180910390f35b610350600480360381019061034b9190612d4e565b61124c565b005b34801561035e57600080fd5b5061037960048036038101906103749190612d4e565b61158c565b6040516103869190612f13565b60405180910390f35b34801561039b57600080fd5b506103b660048036038101906103b19190612b50565b611672565b6040516103c3919061301e565b60405180910390f35b3480156103d857600080fd5b506103f360048036038101906103ee9190612d4e565b61172c565b6040516104039493929190612f7a565b60405180910390f35b34801561041857600080fd5b50610421611789565b60405161042e9190612ffc565b60405180910390f35b34801561044357600080fd5b5061045e60048036038101906104599190612c84565b61181b565b005b34801561046c57600080fd5b5061048760048036038101906104829190612c04565b611918565b005b34801561049557600080fd5b506104b060048036038101906104ab9190612db3565b61196f565b005b3480156104be57600080fd5b506104d960048036038101906104d49190612d77565b611a38565b005b3480156104e757600080fd5b506104f0611bd4565b6040516104fd919061301e565b60405180910390f35b34801561051257600080fd5b5061052d60048036038101906105289190612b79565b611bda565b60405161053a9190612fe1565b60405180910390f35b34801561054f57600080fd5b5061056a60048036038101906105659190612d4e565b611c6e565b005b34801561057857600080fd5b50610593600480360381019061058e9190612cc0565b611d0e565b6040516105a0919061301e565b60405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b60606001805461061f906133b3565b80601f016020809104026020016040519081016040528092919081815260200182805461064b906133b3565b80156106985780601f1061066d57610100808354040283529160200191610698565b820191906000526020600020905b81548152906001019060200180831161067b57829003601f168201915b5050505050905090565b600081600073ffffffffffffffffffffffffffffffffffffffff166007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090610780576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107779190612ffc565b60405180910390fd5b506008600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b8060006007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614806108b65750600a60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f30303330303300000000000000000000000000000000000000000000000000008152509061092d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109249190612ffc565b60405180910390fd5b5082600073ffffffffffffffffffffffffffffffffffffffff166007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090610a0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a019190612ffc565b60405180910390fd5b5060006007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303038000000000000000000000000000000000000000000000000000081525090610aea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae19190612ffc565b60405180910390fd5b50856008600087815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550848673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050505050565b8060006007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480610c7157503373ffffffffffffffffffffffffffffffffffffffff166008600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b80610d025750600a60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303034000000000000000000000000000000000000000000000000000081525090610d79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d709190612ffc565b60405180910390fd5b5082600073ffffffffffffffffffffffffffffffffffffffff166007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090610e56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4d9190612ffc565b60405180910390fd5b5060006007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303037000000000000000000000000000000000000000000000000000081525090610f35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2c9190612ffc565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090610fde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd59190612ffc565b60405180910390fd5b50610fe98686611d3f565b50505050505050565b6000806000806005600086815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166005600087815260200190815260200160002060000160149054906101000a900460ff166005600088815260200190815260200160002060010154600560008981526020019081526020016000206002015493509350935093509193509193565b60006005600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461112a57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611192573d6000803e3d6000fd5b50565b6111b083838360405180602001604052806000815250611e49565b505050565b6060600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561124057602002820191906000526020600020905b81548152602001906001019080831161122c575b50505050509050919050565b600115156005600083815260200190815260200160002060000160149054906101000a900460ff1615151461128057600080fd5b600560008281526020019081526020016000206001015434146112a257600080fd5b606481106112af57600080fd5b6005600082815260200190815260200160002060020160008154809291906112d6906133e5565b9190505550600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081908060018154018082558091505060019003906000526020600020016000909190919091505560006005600083815260200190815260200160002060000160146101000a81548160ff021916908315150217905550600354811461148c57600061138482611090565b9050336008600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506113f381338460405180602001604052806000815250611e49565b6005600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc60056000858152602001908152602001600020600101549081150290604051600060405180830381858888f19350505050158015611485573d6000803e3d6000fd5b5050611589565b336005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060636003541461157e57600360008154809291906114fe906133e5565b9190505550600566038d7ea4c68000600260035461151c9190613153565b6115269190613271565b6115309190613271565b60056000600354815260200190815260200160002060010181905550600160056000600354815260200190815260200160002060000160146101000a81548160ff0219169083151502179055505b6115883382612417565b5b50565b60006007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f30303330303200000000000000000000000000000000000000000000000000008152509061166c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116639190612ffc565b60405180910390fd5b50919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f30303330303100000000000000000000000000000000000000000000000000008152509061171b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117129190612ffc565b60405180910390fd5b5061172582612605565b9050919050565b60056020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060000160149054906101000a900460ff16908060010154908060020154905084565b606060028054611798906133b3565b80601f01602080910402602001604051908101604052809291908181526020018280546117c4906133b3565b80156118115780601f106117e657610100808354040283529160200191611811565b820191906000526020600020905b8154815290600101906020018083116117f457829003601f168201915b5050505050905090565b80600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161190c9190612fe1565b60405180910390a35050565b61196885858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611e49565b5050505050565b6005600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146119dd57600080fd5b600081116119ea57600080fd5b80600560008481526020019081526020016000206001018190555060016005600084815260200190815260200160002060000160146101000a81548160ff0219169083151502179055505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090611ae0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad79190612ffc565b60405180910390fd5b506005600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b4f57600080fd5b600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020829080600181540180825580915050600190039060005260206000200160009091909190915055611bd033828460405180602001604052806000815250611e49565b5050565b60035481565b6000600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6005600082815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611cdc57600080fd5b60006005600083815260200190815260200160002060000160146101000a81548160ff02191690831515021790555050565b60066020528160005260406000208181548110611d2a57600080fd5b90600052602060002001600091509150505481565b60006007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050611d808261264e565b611d8a81836126ef565b611d948383612892565b826005600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b8160006007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480611f1a57503373ffffffffffffffffffffffffffffffffffffffff166008600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b80611fab5750600a60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303034000000000000000000000000000000000000000000000000000081525090612022576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120199190612ffc565b60405180910390fd5b5083600073ffffffffffffffffffffffffffffffffffffffff166007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906120ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f69190612ffc565b60405180910390fd5b5060006007600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3030333030370000000000000000000000000000000000000000000000000000815250906121de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d59190612ffc565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090612287576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227e9190612ffc565b60405180910390fd5b506122928787611d3f565b6122b18773ffffffffffffffffffffffffffffffffffffffff16612a52565b1561240d5760008773ffffffffffffffffffffffffffffffffffffffff1663150b7a02338b8a8a6040518563ffffffff1660e01b81526004016122f79493929190612f2e565b602060405180830381600087803b15801561231157600080fd5b505af1158015612325573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123499190612d25565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146040518060400160405280600681526020017f30303330303500000000000000000000000000000000000000000000000000008152509061240a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124019190612ffc565b60405180910390fd5b50505b5050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030310000000000000000000000000000000000000000000000000000815250906124bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b69190612ffc565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff166007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f30303330303600000000000000000000000000000000000000000000000000008152509061259a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125919190612ffc565b60405180910390fd5b506125a58282612892565b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600073ffffffffffffffffffffffffffffffffffffffff166008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146126ec576008600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b50565b8173ffffffffffffffffffffffffffffffffffffffff166007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3030333030370000000000000000000000000000000000000000000000000000815250906127c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127bf9190612ffc565b60405180910390fd5b506001600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461281591906132cb565b600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506007600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555050565b600073ffffffffffffffffffffffffffffffffffffffff166007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f30303330303600000000000000000000000000000000000000000000000000008152509061296c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129639190612ffc565b60405180910390fd5b50816007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612a0b91906130aa565b600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91506000801b8214158015612a945750808214155b92505050919050565b600081359050612aac816134aa565b92915050565b600081359050612ac1816134c1565b92915050565b600081359050612ad6816134d8565b92915050565b600081519050612aeb816134d8565b92915050565b60008083601f840112612b0357600080fd5b8235905067ffffffffffffffff811115612b1c57600080fd5b602083019150836001820283011115612b3457600080fd5b9250929050565b600081359050612b4a816134ef565b92915050565b600060208284031215612b6257600080fd5b6000612b7084828501612a9d565b91505092915050565b60008060408385031215612b8c57600080fd5b6000612b9a85828601612a9d565b9250506020612bab85828601612a9d565b9150509250929050565b600080600060608486031215612bca57600080fd5b6000612bd886828701612a9d565b9350506020612be986828701612a9d565b9250506040612bfa86828701612b3b565b9150509250925092565b600080600080600060808688031215612c1c57600080fd5b6000612c2a88828901612a9d565b9550506020612c3b88828901612a9d565b9450506040612c4c88828901612b3b565b935050606086013567ffffffffffffffff811115612c6957600080fd5b612c7588828901612af1565b92509250509295509295909350565b60008060408385031215612c9757600080fd5b6000612ca585828601612a9d565b9250506020612cb685828601612ab2565b9150509250929050565b60008060408385031215612cd357600080fd5b6000612ce185828601612a9d565b9250506020612cf285828601612b3b565b9150509250929050565b600060208284031215612d0e57600080fd5b6000612d1c84828501612ac7565b91505092915050565b600060208284031215612d3757600080fd5b6000612d4584828501612adc565b91505092915050565b600060208284031215612d6057600080fd5b6000612d6e84828501612b3b565b91505092915050565b60008060408385031215612d8a57600080fd5b6000612d9885828601612b3b565b9250506020612da985828601612a9d565b9150509250929050565b60008060408385031215612dc657600080fd5b6000612dd485828601612b3b565b9250506020612de585828601612b3b565b9150509250929050565b6000612dfb8383612ef5565b60208301905092915050565b612e10816132ff565b82525050565b6000612e2182613049565b612e2b8185613077565b9350612e3683613039565b8060005b83811015612e67578151612e4e8882612def565b9750612e598361306a565b925050600181019050612e3a565b5085935050505092915050565b612e7d81613311565b82525050565b6000612e8e82613054565b612e988185613088565b9350612ea8818560208601613380565b612eb18161348c565b840191505092915050565b6000612ec78261305f565b612ed18185613099565b9350612ee1818560208601613380565b612eea8161348c565b840191505092915050565b612efe81613369565b82525050565b612f0d81613369565b82525050565b6000602082019050612f286000830184612e07565b92915050565b6000608082019050612f436000830187612e07565b612f506020830186612e07565b612f5d6040830185612f04565b8181036060830152612f6f8184612e83565b905095945050505050565b6000608082019050612f8f6000830187612e07565b612f9c6020830186612e74565b612fa96040830185612f04565b612fb66060830184612f04565b95945050505050565b60006020820190508181036000830152612fd98184612e16565b905092915050565b6000602082019050612ff66000830184612e74565b92915050565b600060208201905081810360008301526130168184612ebc565b905092915050565b60006020820190506130336000830184612f04565b92915050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b60006130b582613369565b91506130c083613369565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156130f5576130f461342e565b5b828201905092915050565b6000808291508390505b600185111561314a578086048111156131265761312561342e565b5b60018516156131355780820291505b80810290506131438561349d565b945061310a565b94509492505050565b600061315e82613369565b915061316983613373565b92506131967fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848461319e565b905092915050565b6000826131ae576001905061326a565b816131bc576000905061326a565b81600181146131d257600281146131dc5761320b565b600191505061326a565b60ff8411156131ee576131ed61342e565b5b8360020a9150848211156132055761320461342e565b5b5061326a565b5060208310610133831016604e8410600b84101617156132405782820a90508381111561323b5761323a61342e565b5b61326a565b61324d8484846001613100565b925090508184048111156132645761326361342e565b5b81810290505b9392505050565b600061327c82613369565b915061328783613369565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156132c0576132bf61342e565b5b828202905092915050565b60006132d682613369565b91506132e183613369565b9250828210156132f4576132f361342e565b5b828203905092915050565b600061330a82613349565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b8381101561339e578082015181840152602081019050613383565b838111156133ad576000848401525b50505050565b600060028204905060018216806133cb57607f821691505b602082108114156133df576133de61345d565b5b50919050565b60006133f082613369565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156134235761342261342e565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b60008160011c9050919050565b6134b3816132ff565b81146134be57600080fd5b50565b6134ca81613311565b81146134d557600080fd5b50565b6134e18161331d565b81146134ec57600080fd5b50565b6134f881613369565b811461350357600080fd5b5056fea2646970667358221220812b461eee37befc9ba10c5f83b2b794f53b2222d9cdbe25b763c27c6b4188b464736f6c63430008000033

Deployed Bytecode Sourcemap

9549:15370:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9364:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11140:88;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18799:145;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16720:314;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24602:310;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10518:242;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;10800:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23924:96;;;;;;;;;;;;;:::i;:::-;;16153:146;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10983:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13547:1291;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18380:175;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17943:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10470:39;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;11236:96;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17445:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15570:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14846:241;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15270:292;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10289:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19213:154;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15095:167;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10931:47;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9364:172;9474:4;9497:19;:33;9517:12;9497:33;;;;;;;;;;;;;;;;;;;;;;;;;;;9490:40;;9364:172;;;:::o;11140:88::-;11179:19;11215:7;11207:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11140:88;:::o;18799:145::-;18893:7;18874:8;13196:1;13165:33;;:9;:19;13175:8;13165:19;;;;;;;;;;;;;;;;;;;;;:33;;;;13200:13;;;;;;;;;;;;;;;;;13157:57;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;18916:12:::1;:22;18929:8;18916:22;;;;;;;;;;;;;;;;;;;;;18909:29;;18799:145:::0;;;;:::o;16720:314::-;16803:8;12322:18;12343:9;:19;12353:8;12343:19;;;;;;;;;;;;;;;;;;;;;12322:40;;12399:10;12385:24;;:10;:24;;;:68;;;;12413:16;:28;12430:10;12413:28;;;;;;;;;;;;;;;:40;12442:10;12413:40;;;;;;;;;;;;;;;;;;;;;;;;;12385:68;12462:21;;;;;;;;;;;;;;;;;12369:121;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;16826:8:::1;13196:1;13165:33;;:9;:19;13175:8;13165:19;;;;;;;;;;;;;;;;;;;;;:33;;;;13200:13;;;;;;;;;;;;;;;;::::0;13157:57:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;16843:18:::2;16864:9;:19;16874:8;16864:19;;;;;;;;;;;;;;;;;;;;;16843:40;;16911:10;16898:23;;:9;:23;;;;16923:8;;;;;;;;;;;;;;;;::::0;16890:42:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;16966:9;16941:12;:22;16954:8;16941:22;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;17019:8;17008:9;16987:41;;16996:10;16987:41;;;;;;;;;;;;13221:1;12497::::1;16720:314:::0;;;;:::o;24602:310::-;24700:8;12742:18;12763:9;:19;12773:8;12763:19;;;;;;;;;;;;;;;;;;;;;12742:40;;12819:10;12805:24;;:10;:24;;;:71;;;;12866:10;12840:36;;:12;:22;12853:8;12840:22;;;;;;;;;;;;;;;;;;;;;:36;;;12805:71;:122;;;;12887:16;:28;12904:10;12887:28;;;;;;;;;;;;;;;:40;12916:10;12887:40;;;;;;;;;;;;;;;;;;;;;;;;;12805:122;12936:30;;;;;;;;;;;;;;;;;12789:184;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;24723:8:::1;13196:1;13165:33;;:9;:19;13175:8;13165:19;;;;;;;;;;;;;;;;;;;;;:33;;;;13200:13;;;;;;;;;;;;;;;;::::0;13157:57:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;24740:18:::2;24761:9;:19;24771:8;24761:19;;;;;;;;;;;;;;;;;;;;;24740:40;;24809:5;24795:19;;:10;:19;;;24816:9;;;;;;;;;;;;;;;;::::0;24787:39:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;24856:1;24841:17;;:3;:17;;;;24860:12;;;;;;;;;;;;;;;;::::0;24833:40:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;24882:24;24892:3;24897:8;24882:9;:24::i;:::-;13221:1;12980::::1;24602:310:::0;;;;;:::o;10518:242::-;10582:7;10591:4;10597;10603;10624:7;:21;10632:12;10624:21;;;;;;;;;;;:27;;;;;;;;;;;;10653:7;:21;10661:12;10653:21;;;;;;;;;;;:38;;;;;;;;;;;;10693:7;:21;10701:12;10693:21;;;;;;;;;;;:27;;;10722:7;:21;10730:12;10722:21;;;;;;;;;;;:31;;;10616:138;;;;;;;;10518:242;;;;;:::o;10800:123::-;10865:7;10889;:21;10897:12;10889:21;;;;;;;;;;;:27;;;;;;;;;;;;10881:36;;10800:123;;;:::o;23924:96::-;23896:5;;;;;;;;;;;23882:19;;:10;:19;;;23874:28;;;;;;23976:5:::1;;;;;;;;;;;23968:23;;:46;23992:21;23968:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;23924:96::o:0;16153:146::-;16250:43;16268:5;16275:3;16280:8;16250:43;;;;;;;;;;;;:17;:43::i;:::-;16153:146;;;:::o;10983:149::-;11052:27;11104:12;:22;11117:8;11104:22;;;;;;;;;;;;;;;11088:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10983:149;;;:::o;13547:1291::-;13658:4;13616:46;;:7;:21;13624:12;13616:21;;;;;;;;;;;:38;;;;;;;;;;;;:46;;;13608:55;;;;;;13691:7;:21;13699:12;13691:21;;;;;;;;;;;:27;;;13678:9;:40;13670:49;;;;;;13749:3;13734:12;:18;13726:27;;;;;;13760:7;:21;13768:12;13760:21;;;;;;;;;;;:31;;;:33;;;;;;;;;:::i;:::-;;;;;;13800:12;:24;13813:10;13800:24;;;;;;;;;;;;;;;13830:12;13800:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13891:5;13850:7;:21;13858:12;13850:21;;;;;;;;;;;:38;;;:46;;;;;;;;;;;;;;;;;;13923:22;;13907:12;:38;13903:930;;14019:26;14048:28;14063:12;14048:14;:28::i;:::-;14019:57;;14116:10;14087:12;:26;14100:12;14087:26;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;14214:67;14232:18;14252:10;14264:12;14214:67;;;;;;;;;;;;:17;:67::i;:::-;14351:7;:21;14359:12;14351:21;;;;;;;;;;;:27;;;;;;;;;;;;14343:45;;:74;14389:7;:21;14397:12;14389:21;;;;;;;;;;;:27;;;14343:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13903:930;;;;14515:10;14485:7;:21;14493:12;14485:21;;;;;;;;;;;:27;;;:40;;;;;;;;;;;;;;;;;;14566:2;14540:22;;:28;14536:248;;14585:22;;:24;;;;;;;;;:::i;:::-;;;;;;14701:1;14693:6;14688:1;14664:22;;:25;;;;:::i;:::-;:36;;;;:::i;:::-;:38;;;;:::i;:::-;14624:7;:31;14632:22;;14624:31;;;;;;;;;;;:37;;:78;;;;14768:4;14717:7;:31;14725:22;;14717:31;;;;;;;;;;;:48;;;:55;;;;;;;;;;;;;;;;;;14536:248;14794:31;14800:10;14812:12;14794:5;:31::i;:::-;13903:930;13547:1291;:::o;18380:175::-;18447:14;18479:9;:19;18489:8;18479:19;;;;;;;;;;;;;;;;;;;;;18470:28;;18531:1;18513:20;;:6;:20;;;;18535:13;;;;;;;;;;;;;;;;;18505:44;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;18380:175;;;:::o;17943:171::-;18010:7;18052:1;18034:20;;:6;:20;;;;18056:12;;;;;;;;;;;;;;;;;18026:43;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;18083:25;18101:6;18083:17;:25::i;:::-;18076:32;;17943:171;;;:::o;10470:39::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;11236:96::-;11277:21;11317:9;11307:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11236:96;:::o;17445:204::-;17574:9;17532:16;:28;17549:10;17532:28;;;;;;;;;;;;;;;:39;17561:9;17532:39;;;;;;;;;;;;;;;;:51;;;;;;;;;;;;;;;;;;17622:9;17595:48;;17610:10;17595:48;;;17633:9;17595:48;;;;;;:::i;:::-;;;;;;;;17445:204;;:::o;15570:171::-;15689:46;15707:5;15714:3;15719:8;15729:5;;15689:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:17;:46::i;:::-;15570:171;;;;;:::o;14846:241::-;14934:7;:21;14942:12;14934:21;;;;;;;;;;;:27;;;;;;;;;;;;14920:41;;:10;:41;;;14912:50;;;;;;14985:1;14977:5;:9;14969:18;;;;;;15024:5;14994:7;:21;15002:12;14994:21;;;;;;;;;;;:27;;:35;;;;15077:4;15036:7;:21;15044:12;15036:21;;;;;;;;;;;:38;;;:45;;;;;;;;;;;;;;;;;;14846:241;;:::o;15270:292::-;15370:1;15350:22;;:8;:22;;;;15374:12;;;;;;;;;;;;;;;;;15342:45;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;15416:7;:21;15424:12;15416:21;;;;;;;;;;;:27;;;;;;;;;;;;15402:41;;:10;:41;;;15394:50;;;;;;15451:12;:22;15464:8;15451:22;;;;;;;;;;;;;;;15479:12;15451:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15499:57;15517:10;15529:8;15539:12;15499:57;;;;;;;;;;;;:17;:57::i;:::-;15270:292;;:::o;10289:34::-;;;;:::o;19213:154::-;19306:4;19326:16;:24;19343:6;19326:24;;;;;;;;;;;;;;;:35;19351:9;19326:35;;;;;;;;;;;;;;;;;;;;;;;;;19319:42;;19213:154;;;;:::o;15095:167::-;15175:7;:21;15183:12;15175:21;;;;;;;;;;;:27;;;;;;;;;;;;15161:41;;:10;:41;;;15153:50;;;;;;15251:5;15210:7;:21;15218:12;15210:21;;;;;;;;;;;:38;;;:46;;;;;;;;;;;;;;;;;;15095:167;:::o;10931:47::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;19558:365::-;19624:12;19639:9;:19;19649:8;19639:19;;;;;;;;;;;;;;;;;;;;;19624:34;;19665:24;19680:8;19665:14;:24::i;:::-;19698:30;19713:4;19719:8;19698:14;:30::i;:::-;19735:26;19747:3;19752:8;19735:11;:26::i;:::-;19871:3;19845:7;:17;19853:8;19845:17;;;;;;;;;;;:23;;;:29;;;;;;;;;;;;;;;;;;19908:8;19903:3;19888:29;;19897:4;19888:29;;;;;;;;;;;;19558:365;;;:::o;22961:596::-;23074:8;12742:18;12763:9;:19;12773:8;12763:19;;;;;;;;;;;;;;;;;;;;;12742:40;;12819:10;12805:24;;:10;:24;;;:71;;;;12866:10;12840:36;;:12;:22;12853:8;12840:22;;;;;;;;;;;;;;;;;;;;;:36;;;12805:71;:122;;;;12887:16;:28;12904:10;12887:28;;;;;;;;;;;;;;;:40;12916:10;12887:40;;;;;;;;;;;;;;;;;;;;;;;;;12805:122;12936:30;;;;;;;;;;;;;;;;;12789:184;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;23097:8:::1;13196:1;13165:33;;:9;:19;13175:8;13165:19;;;;;;;;;;;;;;;;;;;;;:33;;;;13200:13;;;;;;;;;;;;;;;;::::0;13157:57:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;23114:18:::2;23135:9;:19;23145:8;23135:19;;;;;;;;;;;;;;;;;;;;;23114:40;;23183:5;23169:19;;:10;:19;;;23190:9;;;;;;;;;;;;;;;;::::0;23161:39:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;23230:1;23215:17;;:3;:17;;;;23234:12;;;;;;;;;;;;;;;;::::0;23207:40:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;23256:24;23266:3;23271:8;23256:9;:24::i;:::-;23347:16;:3;:14;;;:16::i;:::-;23343:209;;;23374:13;23410:3;23390:41;;;23432:10;23444:5;23451:8;23461:5;23390:77;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23374:93;;11555:10;23494:24;;23484:34;;;:6;:34;;;;23520:23;;;;;;;;;;;;;;;;::::0;23476:68:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;23343:209;;13221:1;12980::::1;22961:596:::0;;;;;;:::o;20314:269::-;20407:1;20392:17;;:3;:17;;;;20411:12;;;;;;;;;;;;;;;;;20384:40;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;20470:1;20439:33;;:9;:19;20449:8;20439:19;;;;;;;;;;;;;;;;;;;;;:33;;;20474:18;;;;;;;;;;;;;;;;;20431:62;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;20502:26;20514:3;20519:8;20502:11;:26::i;:::-;20568:8;20563:3;20542:35;;20559:1;20542:35;;;;;;;;;;;;20314:269;;:::o;22553:130::-;22627:7;22650:19;:27;22670:6;22650:27;;;;;;;;;;;;;;;;22643:34;;22553:130;;;:::o;23690:150::-;23785:1;23751:36;;:12;:22;23764:8;23751:22;;;;;;;;;;;;;;;;;;;;;:36;;;23747:88;;23805:12;:22;23818:8;23805:22;;;;;;;;;;;;23798:29;;;;;;;;;;;23747:88;23690:150;:::o;21516:234::-;21628:5;21605:28;;:9;:19;21615:8;21605:19;;;;;;;;;;;;;;;;;;;;;:28;;;21635:9;;;;;;;;;;;;;;;;;21597:48;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;21710:1;21681:19;:26;21701:5;21681:26;;;;;;;;;;;;;;;;:30;;;;:::i;:::-;21652:19;:26;21672:5;21652:26;;;;;;;;;;;;;;;:59;;;;21725:9;:19;21735:8;21725:19;;;;;;;;;;;;21718:26;;;;;;;;;;;21516:234;;:::o;22017:240::-;22132:1;22101:33;;:9;:19;22111:8;22101:19;;;;;;;;;;;;;;;;;;;;;:33;;;22136:18;;;;;;;;;;;;;;;;;22093:62;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;22186:3;22164:9;:19;22174:8;22164:19;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;22250:1;22223:19;:24;22243:3;22223:24;;;;;;;;;;;;;;;;:28;;;;:::i;:::-;22196:19;:24;22216:3;22196:24;;;;;;;;;;;;;;;:55;;;;22017:240;;:::o;7529:780::-;7612:17;8053:16;8076:19;8098:66;8076:88;;;;8206:5;8194:18;8182:30;;8272:3;8260:15;;:8;:15;;:42;;;;;8291:11;8279:8;:23;;8260:42;8244:59;;7529:780;;;;;:::o;7:139:1:-;;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;59:87;;;;:::o;152:133::-;;233:6;220:20;211:29;;249:30;273:5;249:30;:::i;:::-;201:84;;;;:::o;291:137::-;;374:6;361:20;352:29;;390:32;416:5;390:32;:::i;:::-;342:86;;;;:::o;434:141::-;;521:6;515:13;506:22;;537:32;563:5;537:32;:::i;:::-;496:79;;;;:::o;594:351::-;;;711:3;704:4;696:6;692:17;688:27;678:2;;729:1;726;719:12;678:2;765:6;752:20;742:30;;795:18;787:6;784:30;781:2;;;827:1;824;817:12;781:2;864:4;856:6;852:17;840:29;;918:3;910:4;902:6;898:17;888:8;884:32;881:41;878:2;;;935:1;932;925:12;878:2;668:277;;;;;:::o;951:139::-;;1035:6;1022:20;1013:29;;1051:33;1078:5;1051:33;:::i;:::-;1003:87;;;;:::o;1096:262::-;;1204:2;1192:9;1183:7;1179:23;1175:32;1172:2;;;1220:1;1217;1210:12;1172:2;1263:1;1288:53;1333:7;1324:6;1313:9;1309:22;1288:53;:::i;:::-;1278:63;;1234:117;1162:196;;;;:::o;1364:407::-;;;1489:2;1477:9;1468:7;1464:23;1460:32;1457:2;;;1505:1;1502;1495:12;1457:2;1548:1;1573:53;1618:7;1609:6;1598:9;1594:22;1573:53;:::i;:::-;1563:63;;1519:117;1675:2;1701:53;1746:7;1737:6;1726:9;1722:22;1701:53;:::i;:::-;1691:63;;1646:118;1447:324;;;;;:::o;1777:552::-;;;;1919:2;1907:9;1898:7;1894:23;1890:32;1887:2;;;1935:1;1932;1925:12;1887:2;1978:1;2003:53;2048:7;2039:6;2028:9;2024:22;2003:53;:::i;:::-;1993:63;;1949:117;2105:2;2131:53;2176:7;2167:6;2156:9;2152:22;2131:53;:::i;:::-;2121:63;;2076:118;2233:2;2259:53;2304:7;2295:6;2284:9;2280:22;2259:53;:::i;:::-;2249:63;;2204:118;1877:452;;;;;:::o;2335:829::-;;;;;;2513:3;2501:9;2492:7;2488:23;2484:33;2481:2;;;2530:1;2527;2520:12;2481:2;2573:1;2598:53;2643:7;2634:6;2623:9;2619:22;2598:53;:::i;:::-;2588:63;;2544:117;2700:2;2726:53;2771:7;2762:6;2751:9;2747:22;2726:53;:::i;:::-;2716:63;;2671:118;2828:2;2854:53;2899:7;2890:6;2879:9;2875:22;2854:53;:::i;:::-;2844:63;;2799:118;2984:2;2973:9;2969:18;2956:32;3015:18;3007:6;3004:30;3001:2;;;3047:1;3044;3037:12;3001:2;3083:64;3139:7;3130:6;3119:9;3115:22;3083:64;:::i;:::-;3065:82;;;;2927:230;2471:693;;;;;;;;:::o;3170:401::-;;;3292:2;3280:9;3271:7;3267:23;3263:32;3260:2;;;3308:1;3305;3298:12;3260:2;3351:1;3376:53;3421:7;3412:6;3401:9;3397:22;3376:53;:::i;:::-;3366:63;;3322:117;3478:2;3504:50;3546:7;3537:6;3526:9;3522:22;3504:50;:::i;:::-;3494:60;;3449:115;3250:321;;;;;:::o;3577:407::-;;;3702:2;3690:9;3681:7;3677:23;3673:32;3670:2;;;3718:1;3715;3708:12;3670:2;3761:1;3786:53;3831:7;3822:6;3811:9;3807:22;3786:53;:::i;:::-;3776:63;;3732:117;3888:2;3914:53;3959:7;3950:6;3939:9;3935:22;3914:53;:::i;:::-;3904:63;;3859:118;3660:324;;;;;:::o;3990:260::-;;4097:2;4085:9;4076:7;4072:23;4068:32;4065:2;;;4113:1;4110;4103:12;4065:2;4156:1;4181:52;4225:7;4216:6;4205:9;4201:22;4181:52;:::i;:::-;4171:62;;4127:116;4055:195;;;;:::o;4256:282::-;;4374:2;4362:9;4353:7;4349:23;4345:32;4342:2;;;4390:1;4387;4380:12;4342:2;4433:1;4458:63;4513:7;4504:6;4493:9;4489:22;4458:63;:::i;:::-;4448:73;;4404:127;4332:206;;;;:::o;4544:262::-;;4652:2;4640:9;4631:7;4627:23;4623:32;4620:2;;;4668:1;4665;4658:12;4620:2;4711:1;4736:53;4781:7;4772:6;4761:9;4757:22;4736:53;:::i;:::-;4726:63;;4682:117;4610:196;;;;:::o;4812:407::-;;;4937:2;4925:9;4916:7;4912:23;4908:32;4905:2;;;4953:1;4950;4943:12;4905:2;4996:1;5021:53;5066:7;5057:6;5046:9;5042:22;5021:53;:::i;:::-;5011:63;;4967:117;5123:2;5149:53;5194:7;5185:6;5174:9;5170:22;5149:53;:::i;:::-;5139:63;;5094:118;4895:324;;;;;:::o;5225:407::-;;;5350:2;5338:9;5329:7;5325:23;5321:32;5318:2;;;5366:1;5363;5356:12;5318:2;5409:1;5434:53;5479:7;5470:6;5459:9;5455:22;5434:53;:::i;:::-;5424:63;;5380:117;5536:2;5562:53;5607:7;5598:6;5587:9;5583:22;5562:53;:::i;:::-;5552:63;;5507:118;5308:324;;;;;:::o;5638:179::-;;5728:46;5770:3;5762:6;5728:46;:::i;:::-;5806:4;5801:3;5797:14;5783:28;;5718:99;;;;:::o;5823:118::-;5910:24;5928:5;5910:24;:::i;:::-;5905:3;5898:37;5888:53;;:::o;5977:732::-;;6125:54;6173:5;6125:54;:::i;:::-;6195:86;6274:6;6269:3;6195:86;:::i;:::-;6188:93;;6305:56;6355:5;6305:56;:::i;:::-;6384:7;6415:1;6400:284;6425:6;6422:1;6419:13;6400:284;;;6501:6;6495:13;6528:63;6587:3;6572:13;6528:63;:::i;:::-;6521:70;;6614:60;6667:6;6614:60;:::i;:::-;6604:70;;6460:224;6447:1;6444;6440:9;6435:14;;6400:284;;;6404:14;6700:3;6693:10;;6101:608;;;;;;;:::o;6715:109::-;6796:21;6811:5;6796:21;:::i;:::-;6791:3;6784:34;6774:50;;:::o;6830:360::-;;6944:38;6976:5;6944:38;:::i;:::-;6998:70;7061:6;7056:3;6998:70;:::i;:::-;6991:77;;7077:52;7122:6;7117:3;7110:4;7103:5;7099:16;7077:52;:::i;:::-;7154:29;7176:6;7154:29;:::i;:::-;7149:3;7145:39;7138:46;;6920:270;;;;;:::o;7196:364::-;;7312:39;7345:5;7312:39;:::i;:::-;7367:71;7431:6;7426:3;7367:71;:::i;:::-;7360:78;;7447:52;7492:6;7487:3;7480:4;7473:5;7469:16;7447:52;:::i;:::-;7524:29;7546:6;7524:29;:::i;:::-;7519:3;7515:39;7508:46;;7288:272;;;;;:::o;7566:108::-;7643:24;7661:5;7643:24;:::i;:::-;7638:3;7631:37;7621:53;;:::o;7680:118::-;7767:24;7785:5;7767:24;:::i;:::-;7762:3;7755:37;7745:53;;:::o;7804:222::-;;7935:2;7924:9;7920:18;7912:26;;7948:71;8016:1;8005:9;8001:17;7992:6;7948:71;:::i;:::-;7902:124;;;;:::o;8032:640::-;;8265:3;8254:9;8250:19;8242:27;;8279:71;8347:1;8336:9;8332:17;8323:6;8279:71;:::i;:::-;8360:72;8428:2;8417:9;8413:18;8404:6;8360:72;:::i;:::-;8442;8510:2;8499:9;8495:18;8486:6;8442:72;:::i;:::-;8561:9;8555:4;8551:20;8546:2;8535:9;8531:18;8524:48;8589:76;8660:4;8651:6;8589:76;:::i;:::-;8581:84;;8232:440;;;;;;;:::o;8678:541::-;;8887:3;8876:9;8872:19;8864:27;;8901:71;8969:1;8958:9;8954:17;8945:6;8901:71;:::i;:::-;8982:66;9044:2;9033:9;9029:18;9020:6;8982:66;:::i;:::-;9058:72;9126:2;9115:9;9111:18;9102:6;9058:72;:::i;:::-;9140;9208:2;9197:9;9193:18;9184:6;9140:72;:::i;:::-;8854:365;;;;;;;:::o;9225:373::-;;9406:2;9395:9;9391:18;9383:26;;9455:9;9449:4;9445:20;9441:1;9430:9;9426:17;9419:47;9483:108;9586:4;9577:6;9483:108;:::i;:::-;9475:116;;9373:225;;;;:::o;9604:210::-;;9729:2;9718:9;9714:18;9706:26;;9742:65;9804:1;9793:9;9789:17;9780:6;9742:65;:::i;:::-;9696:118;;;;:::o;9820:313::-;;9971:2;9960:9;9956:18;9948:26;;10020:9;10014:4;10010:20;10006:1;9995:9;9991:17;9984:47;10048:78;10121:4;10112:6;10048:78;:::i;:::-;10040:86;;9938:195;;;;:::o;10139:222::-;;10270:2;10259:9;10255:18;10247:26;;10283:71;10351:1;10340:9;10336:17;10327:6;10283:71;:::i;:::-;10237:124;;;;:::o;10367:132::-;;10457:3;10449:11;;10487:4;10482:3;10478:14;10470:22;;10439:60;;;:::o;10505:114::-;;10606:5;10600:12;10590:22;;10579:40;;;:::o;10625:98::-;;10710:5;10704:12;10694:22;;10683:40;;;:::o;10729:99::-;;10815:5;10809:12;10799:22;;10788:40;;;:::o;10834:113::-;;10936:4;10931:3;10927:14;10919:22;;10909:38;;;:::o;10953:184::-;;11086:6;11081:3;11074:19;11126:4;11121:3;11117:14;11102:29;;11064:73;;;;:::o;11143:168::-;;11260:6;11255:3;11248:19;11300:4;11295:3;11291:14;11276:29;;11238:73;;;;:::o;11317:169::-;;11435:6;11430:3;11423:19;11475:4;11470:3;11466:14;11451:29;;11413:73;;;;:::o;11492:305::-;;11551:20;11569:1;11551:20;:::i;:::-;11546:25;;11585:20;11603:1;11585:20;:::i;:::-;11580:25;;11739:1;11671:66;11667:74;11664:1;11661:81;11658:2;;;11745:18;;:::i;:::-;11658:2;11789:1;11786;11782:9;11775:16;;11536:261;;;;:::o;11803:848::-;;;11895:6;11886:15;;11919:5;11910:14;;11933:712;11954:1;11944:8;11941:15;11933:712;;;12049:4;12044:3;12040:14;12034:4;12031:24;12028:2;;;12058:18;;:::i;:::-;12028:2;12108:1;12098:8;12094:16;12091:2;;;12523:4;12516:5;12512:16;12503:25;;12091:2;12573:4;12567;12563:15;12555:23;;12603:32;12626:8;12603:32;:::i;:::-;12591:44;;11933:712;;;11876:775;;;;;;;:::o;12657:281::-;;12739:23;12757:4;12739:23;:::i;:::-;12731:31;;12783:25;12799:8;12783:25;:::i;:::-;12771:37;;12827:104;12864:66;12854:8;12848:4;12827:104;:::i;:::-;12818:113;;12721:217;;;;:::o;12944:1073::-;;13189:8;13179:2;;13210:1;13201:10;;13212:5;;13179:2;13238:4;13228:2;;13255:1;13246:10;;13257:5;;13228:2;13324:4;13372:1;13367:27;;;;13408:1;13403:191;;;;13317:277;;13367:27;13385:1;13376:10;;13387:5;;;13403:191;13448:3;13438:8;13435:17;13432:2;;;13455:18;;:::i;:::-;13432:2;13504:8;13501:1;13497:16;13488:25;;13539:3;13532:5;13529:14;13526:2;;;13546:18;;:::i;:::-;13526:2;13579:5;;;13317:277;;13703:2;13693:8;13690:16;13684:3;13678:4;13675:13;13671:36;13653:2;13643:8;13640:16;13635:2;13629:4;13626:12;13622:35;13606:111;13603:2;;;13759:8;13753:4;13749:19;13740:28;;13794:3;13787:5;13784:14;13781:2;;;13801:18;;:::i;:::-;13781:2;13834:5;;13603:2;13874:42;13912:3;13902:8;13896:4;13893:1;13874:42;:::i;:::-;13859:57;;;;13948:4;13943:3;13939:14;13932:5;13929:25;13926:2;;;13957:18;;:::i;:::-;13926:2;14006:4;13999:5;13995:16;13986:25;;13004:1013;;;;;;:::o;14023:348::-;;14086:20;14104:1;14086:20;:::i;:::-;14081:25;;14120:20;14138:1;14120:20;:::i;:::-;14115:25;;14308:1;14240:66;14236:74;14233:1;14230:81;14225:1;14218:9;14211:17;14207:105;14204:2;;;14315:18;;:::i;:::-;14204:2;14363:1;14360;14356:9;14345:20;;14071:300;;;;:::o;14377:191::-;;14437:20;14455:1;14437:20;:::i;:::-;14432:25;;14471:20;14489:1;14471:20;:::i;:::-;14466:25;;14510:1;14507;14504:8;14501:2;;;14515:18;;:::i;:::-;14501:2;14560:1;14557;14553:9;14545:17;;14422:146;;;;:::o;14574:96::-;;14640:24;14658:5;14640:24;:::i;:::-;14629:35;;14619:51;;;:::o;14676:90::-;;14753:5;14746:13;14739:21;14728:32;;14718:48;;;:::o;14772:149::-;;14848:66;14841:5;14837:78;14826:89;;14816:105;;;:::o;14927:126::-;;15004:42;14997:5;14993:54;14982:65;;14972:81;;;:::o;15059:77::-;;15125:5;15114:16;;15104:32;;;:::o;15142:86::-;;15217:4;15210:5;15206:16;15195:27;;15185:43;;;:::o;15234:307::-;15302:1;15312:113;15326:6;15323:1;15320:13;15312:113;;;15411:1;15406:3;15402:11;15396:18;15392:1;15387:3;15383:11;15376:39;15348:2;15345:1;15341:10;15336:15;;15312:113;;;15443:6;15440:1;15437:13;15434:2;;;15523:1;15514:6;15509:3;15505:16;15498:27;15434:2;15283:258;;;;:::o;15547:320::-;;15628:1;15622:4;15618:12;15608:22;;15675:1;15669:4;15665:12;15696:18;15686:2;;15752:4;15744:6;15740:17;15730:27;;15686:2;15814;15806:6;15803:14;15783:18;15780:38;15777:2;;;15833:18;;:::i;:::-;15777:2;15598:269;;;;:::o;15873:233::-;;15935:24;15953:5;15935:24;:::i;:::-;15926:33;;15981:66;15974:5;15971:77;15968:2;;;16051:18;;:::i;:::-;15968:2;16098:1;16091:5;16087:13;16080:20;;15916:190;;;:::o;16112:180::-;16160:77;16157:1;16150:88;16257:4;16254:1;16247:15;16281:4;16278:1;16271:15;16298:180;16346:77;16343:1;16336:88;16443:4;16440:1;16433:15;16467:4;16464:1;16457:15;16484:102;;16576:2;16572:7;16567:2;16560:5;16556:14;16552:28;16542:38;;16532:54;;;:::o;16592:102::-;;16681:5;16678:1;16674:13;16653:34;;16643:51;;;:::o;16700:122::-;16773:24;16791:5;16773:24;:::i;:::-;16766:5;16763:35;16753:2;;16812:1;16809;16802:12;16753:2;16743:79;:::o;16828:116::-;16898:21;16913:5;16898:21;:::i;:::-;16891:5;16888:32;16878:2;;16934:1;16931;16924:12;16878:2;16868:76;:::o;16950:120::-;17022:23;17039:5;17022:23;:::i;:::-;17015:5;17012:34;17002:2;;17060:1;17057;17050:12;17002:2;16992:78;:::o;17076:122::-;17149:24;17167:5;17149:24;:::i;:::-;17142:5;17139:35;17129:2;;17188:1;17185;17178:12;17129:2;17119:79;:::o

Swarm Source

ipfs://812b461eee37befc9ba10c5f83b2b794f53b2222d9cdbe25b763c27c6b4188b4

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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