Token Emblem Vault V2

 

Overview ERC-721

Total Supply:
40 Emblem.pro

Holders:
10 addresses
Balance
0 Emblem.pro
0x0000000000000000000000000000000000000000
Loading
[ Download CSV Export  ] 
Loading
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
EmblemVault

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// File: browser/github/0xcert/ethereum-erc721/src/contracts/ownership/ownable.sol

pragma solidity 0.6.12;

/**
 * @dev The contract has an owner address, and provides basic authorization control whitch
 * simplifies the implementation of user permissions. This contract is based on the source code at:
 * https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/ownership/Ownable.sol
 */
contract Ownable
{

  /**
   * @dev Error constants.
   */
  string public constant NOT_CURRENT_OWNER = "018001";
  string public constant CANNOT_TRANSFER_TO_ZERO_ADDRESS = "018002";

  /**
   * @dev Current owner address.
   */
  address public owner;

  /**
   * @dev An event which is triggered when the owner is changed.
   * @param previousOwner The address of the previous owner.
   * @param newOwner The address of the new owner.
   */
  event OwnershipTransferred(
    address indexed previousOwner,
    address indexed newOwner
  );

  /**
   * @dev The constructor sets the original `owner` of the contract to the sender account.
   */
  constructor()
    public
  {
    owner = msg.sender;
  }

  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner()
  {
    require(msg.sender == owner, NOT_CURRENT_OWNER);
    _;
  }

  /**
   * @dev Allows the current owner to transfer control of the contract to a newOwner.
   * @param _newOwner The address to transfer ownership to.
   */
  function transferOwnership(
    address _newOwner
  )
    public
    onlyOwner
  {
    require(_newOwner != address(0), CANNOT_TRANSFER_TO_ZERO_ADDRESS);
    emit OwnershipTransferred(owner, _newOwner);
    owner = _newOwner;
  }

}

// File: browser/github/0xcert/ethereum-erc721/src/contracts/tokens/erc721-enumerable.sol

pragma solidity 0.6.12;

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

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

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

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

}

// File: browser/github/0xcert/ethereum-erc721/src/contracts/tokens/erc721-metadata.sol

pragma solidity 0.6.12;

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

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

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

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

}

// File: browser/github/0xcert/ethereum-erc721/src/contracts/utils/address-utils.sol

pragma solidity 0.6.12;

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

}

// File: browser/github/0xcert/ethereum-erc721/src/contracts/utils/erc165.sol

pragma solidity 0.6.12;

/**
 * @dev A standard for detecting smart contract interfaces. 
 * See: https://eips.ethereum.org/EIPS/eip-165.
 */
interface ERC165
{

  /**
   * @dev Checks if the smart contract includes a specific interface.
   * @notice 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);
    
}

// File: browser/github/0xcert/ethereum-erc721/src/contracts/utils/supports-interface.sol

pragma solidity 0.6.12;


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

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

  /**
   * @dev Contract constructor.
   */
  constructor()
    public
  {
    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];
  }

}

// File: browser/github/0xcert/ethereum-erc721/src/contracts/math/safe-math.sol

pragma solidity 0.6.12;

/**
 * @dev Math operations with safety checks that throw on error. This contract is based on the
 * source code at:
 * https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/math/SafeMath.sol.
 */
library SafeMath
{
  /**
   * List of revert message codes. Implementing dApp should handle showing the correct message.
   * Based on 0xcert framework error codes.
   */
  string constant OVERFLOW = "008001";
  string constant SUBTRAHEND_GREATER_THEN_MINUEND = "008002";
  string constant DIVISION_BY_ZERO = "008003";

  /**
   * @dev Multiplies two numbers, reverts on overflow.
   * @param _factor1 Factor number.
   * @param _factor2 Factor number.
   * @return product The product of the two factors.
   */
  function mul(
    uint256 _factor1,
    uint256 _factor2
  )
    internal
    pure
    returns (uint256 product)
  {
    // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
    // benefit is lost if 'b' is also tested.
    // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
    if (_factor1 == 0)
    {
      return 0;
    }

    product = _factor1 * _factor2;
    require(product / _factor1 == _factor2, OVERFLOW);
  }

  /**
   * @dev Integer division of two numbers, truncating the quotient, reverts on division by zero.
   * @param _dividend Dividend number.
   * @param _divisor Divisor number.
   * @return quotient The quotient.
   */
  function div(
    uint256 _dividend,
    uint256 _divisor
  )
    internal
    pure
    returns (uint256 quotient)
  {
    // Solidity automatically asserts when dividing by 0, using all gas.
    require(_divisor > 0, DIVISION_BY_ZERO);
    quotient = _dividend / _divisor;
    // assert(_dividend == _divisor * quotient + _dividend % _divisor); // There is no case in which this doesn't hold.
  }

  /**
   * @dev Substracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
   * @param _minuend Minuend number.
   * @param _subtrahend Subtrahend number.
   * @return difference Difference.
   */
  function sub(
    uint256 _minuend,
    uint256 _subtrahend
  )
    internal
    pure
    returns (uint256 difference)
  {
    require(_subtrahend <= _minuend, SUBTRAHEND_GREATER_THEN_MINUEND);
    difference = _minuend - _subtrahend;
  }

  /**
   * @dev Adds two numbers, reverts on overflow.
   * @param _addend1 Number.
   * @param _addend2 Number.
   * @return sum Sum.
   */
  function add(
    uint256 _addend1,
    uint256 _addend2
  )
    internal
    pure
    returns (uint256 sum)
  {
    sum = _addend1 + _addend2;
    require(sum >= _addend1, OVERFLOW);
  }

  /**
    * @dev Divides two numbers and returns the remainder (unsigned integer modulo), reverts when
    * dividing by zero.
    * @param _dividend Number.
    * @param _divisor Number.
    * @return remainder Remainder.
    */
  function mod(
    uint256 _dividend,
    uint256 _divisor
  )
    internal
    pure
    returns (uint256 remainder)
  {
    require(_divisor != 0, DIVISION_BY_ZERO);
    remainder = _dividend % _divisor;
  }

}

// File: browser/github/0xcert/ethereum-erc721/src/contracts/tokens/erc721-token-receiver.sol

pragma solidity 0.6.12;

/**
 * @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);

}

// File: browser/github/0xcert/ethereum-erc721/src/contracts/tokens/erc721.sol

pragma solidity 0.6.12;

/**
 * @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);

}

// File: browser/github/0xcert/ethereum-erc721/src/contracts/tokens/nf-token.sol

pragma solidity 0.6.12;






/**
 * @dev Implementation of ERC-721 non-fungible token standard.
 */
contract NFToken is
  ERC721,
  SupportsInterface
{
  using SafeMath for uint256;
  using AddressUtils for address;

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

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

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

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

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

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

  /**
   * @dev 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.
   * @param _from Sender of NFT (if address is zero address it indicates token creation).
   * @param _to Receiver of NFT (if address is zero address it indicates token destruction).
   * @param _tokenId The NFT that got transfered.
   */
  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.
   * @param _owner Owner of NFT.
   * @param _approved Address that we are approving.
   * @param _tokenId NFT which we are approving.
   */
  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.
   * @param _owner Owner of NFT.
   * @param _operator Address to which we are setting operator rights.
   * @param _approved Status of operator rights(true if operator rights are given and false if
   * revoked).
   */
  event ApprovalForAll(
    address indexed _owner,
    address indexed _operator,
    bool _approved
  );

  /**
   * @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.
   */
  modifier canTransfer(
    uint256 _tokenId
  )
  {
    address tokenOwner = idToOwner[_tokenId];
    require(
      tokenOwner == msg.sender
      || idToApproval[_tokenId] == msg.sender
      || ownerToOperators[tokenOwner][msg.sender],
      NOT_OWNER_APPROWED_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()
    public
  {
    supportedInterfaces[0x80ac58cd] = true; // ERC721
  }

  /**
   * @dev Transfers the ownership of an NFT from one address to another address. This function can
   * be changed to payable.
   * @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
    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 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);
  }

  /**
   * @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);

    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].add(1);
  }

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

  /**
   * @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);

    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];
    }
  }

}

// File: browser/github/0xcert/ethereum-erc721/src/contracts/tokens/nf-token-enumerable-metadata.sol

pragma solidity 0.6.12;




/**
 * @dev Optional metadata implementation for ERC-721 non-fungible token standard.
 */
abstract contract NFTokenEnumerableMetadata is
    NFToken,
    ERC721Metadata,
    ERC721Enumerable
{

  /**
   * @dev A descriptive name for a collection of NFTs.
   */
  string internal nftName;

  /**
   * @dev An abbreviated name for NFTokens.
   */
  string internal nftSymbol;
  
    /**
   * @dev An uri to represent the metadata for this contract.
   */
  string internal nftContractMetadataUri;

  /**
   * @dev Mapping from NFT ID to metadata uri.
   */
  mapping (uint256 => string) internal idToUri;
  
  /**
   * @dev Mapping from NFT ID to encrypted value.
   */
  mapping (uint256 => string) internal idToPayload;

  /**
   * @dev Contract constructor.
   * @notice When implementing this contract don't forget to set nftName and nftSymbol.
   */
  constructor()
    public
  {
    supportedInterfaces[0x5b5e139f] = true; // ERC721Metadata
    supportedInterfaces[0x780e9d63] = true; // ERC721Enumerable
  }

  /**
   * @dev Returns a descriptive name for a collection of NFTokens.
   * @return _name Representing name.
   */
  function name()
    external
    override
    view
    returns (string memory _name)
  {
    _name = nftName;
  }

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

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

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

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

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

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

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

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

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

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

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

    tokens[tokenIndex] = lastToken;

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

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

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

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

    ownerToIds[_from].pop();
  }

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

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

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

}

// File: browser/EmblemVault_v2.sol

pragma experimental ABIEncoderV2;
pragma solidity 0.6.12;



/**
 * @dev This is an example contract implementation of NFToken with metadata extension.
 */
contract EmblemVault is
  NFTokenEnumerableMetadata,
  Ownable
{

  /**
   * @dev Contract constructor. Sets metadata extension `name` and `symbol`.
   */
  constructor() public {
    nftName = "Emblem Vault V2";
    nftSymbol = "Emblem.pro";
  }
  
  function changeName(string calldata name, string calldata symbol) external onlyOwner {
      nftName = name;
      nftSymbol = symbol;
  }

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

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_from","type":"string"},{"indexed":false,"internalType":"string","name":"_to","type":"string"}],"name":"UpdatedContractURI","type":"event"},{"inputs":[],"name":"CANNOT_TRANSFER_TO_ZERO_ADDRESS","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NOT_CURRENT_OWNER","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_approved","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"}],"name":"changeName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"getOwnerNFTCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_uri","type":"string"},{"internalType":"string","name":"_payload","type":"string"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"_name","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"_owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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":"uint256","name":"_index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenPayload","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"updateContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_uri","type":"string"}],"name":"updateTokenUri","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b50600060208181527f67be87c3ff9960ca1e9cfac5cab2ff4747269cf9ed20c9b7306235ac35a491c5805460ff1990811660019081179092557ff7815fccbf112960a73756e185887fedcb9fc64ca0a16cc5923b7960ed78080080548216831790557f9562381dfbc2d8b8b66e765249f330164b73e329e5f01670660643571d1974df805482168317905563780e9d6360e01b9093527f77b7bbe0e49b76487c9476b5db3354cf5270619d0037ccb899c2a4c4a75b4318805490931617909155600e80546001600160a01b0319163317905560408051808201909152600f8082526e22b6b13632b6902b30bab63a102b1960891b919092019081526200011b916005919062000156565b5060408051808201909152600a80825269456d626c656d2e70726f60b01b60209092019182526200014f9160069162000156565b50620001f2565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200019957805160ff1916838001178555620001c9565b82800160010185558215620001c9579182015b82811115620001c9578251825591602001919060010190620001ac565b50620001d7929150620001db565b5090565b5b80821115620001d75760008155600101620001dc565b6122e980620002026000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c8063860d248a116100f9578063bd7f4c8d11610097578063e8a3d48511610071578063e8a3d48514610399578063e985e9c5146103a1578063f2fde38b146103b4578063f3fe3bc3146103c7576101c4565b8063bd7f4c8d14610360578063c87b56dd14610373578063d31af48414610386576101c4565b806395d89b41116100d357806395d89b411461031f5780639ad9523214610327578063a22cb4651461033a578063b88d4fde1461034d576101c4565b8063860d248a146102fc57806386575e40146103045780638da5cb5b14610317576101c4565b80632fb102cf116101665780634f6ccce7116101405780634f6ccce7146102b05780636352211e146102c357806370a08231146102d65780637e5b1e24146102e9576101c4565b80632fb102cf1461027757806342842e0e1461028a57806342966c681461029d576101c4565b8063095ea7b3116101a2578063095ea7b31461022757806318160ddd1461023c57806323b872dd146102515780632f745c5914610264576101c4565b806301ffc9a7146101c957806306fdde03146101f2578063081812fc14610207575b600080fd5b6101dc6101d7366004611ff5565b6103cf565b6040516101e991906121c2565b60405180910390f35b6101fa6103ee565b6040516101e991906121cd565b61021a6102153660046120c9565b610484565b6040516101e99190612171565b61023a610235366004611f42565b610506565b005b6102446106a8565b6040516101e99190612273565b61023a61025f366004611e58565b6106ae565b610244610272366004611f42565b610869565b61023a610285366004611f6c565b6108fb565b61023a610298366004611e58565b6109d7565b61023a6102ab3660046120c9565b6109f7565b6102446102be3660046120c9565b610aaa565b61021a6102d13660046120c9565b610b0c565b6102446102e4366004611e02565b610b64565b61023a6102f7366004612096565b610bb5565b6101fa610c50565b61023a61031236600461202d565b610c72565b61021a610cdc565b6101fa610ceb565b6101fa6103353660046120c9565b610d4c565b61023a610348366004611f07565b610e48565b61023a61035b366004611e98565b610eb7565b61024461036e366004611e02565b610ef9565b6101fa6103813660046120c9565b610f04565b61023a6103943660046120e1565b610fc8565b6101fa611091565b6101dc6103af366004611e24565b6110f2565b61023a6103c2366004611e02565b611120565b6101fa61120b565b6001600160e01b03191660009081526020819052604090205460ff1690565b60058054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561047a5780601f1061044f5761010080835404028352916020019161047a565b820191906000526020600020905b81548152906001019060200180831161045d57829003601f168201915b5050505050905090565b6000818152600160209081526040808320548151808301909252600682526518181998181960d11b9282019290925283916001600160a01b03166104e45760405162461bcd60e51b81526004016104db91906121cd565b60405180910390fd5b506000838152600260205260409020546001600160a01b031691505b50919050565b60008181526001602052604090205481906001600160a01b03163381148061055157506001600160a01b038116600090815260046020908152604080832033845290915290205460ff165b6040518060400160405280600681526020016530303330303360d01b8152509061058e5760405162461bcd60e51b81526004016104db91906121cd565b50600083815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091528491906001600160a01b03166105e85760405162461bcd60e51b81526004016104db91906121cd565b50600084815260016020908152604091829020548251808401909352600683526506060666060760d31b918301919091526001600160a01b03908116919087168214156106485760405162461bcd60e51b81526004016104db91906121cd565b5060008581526002602052604080822080546001600160a01b0319166001600160a01b038a811691821790925591518893918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050505050565b600a5490565b60008181526001602052604090205481906001600160a01b0316338114806106ec57506000828152600260205260409020546001600160a01b031633145b8061071a57506001600160a01b038116600090815260046020908152604080832033845290915290205460ff165b604051806040016040528060068152602001650c0c0ccc0c0d60d21b815250906107575760405162461bcd60e51b81526004016104db91906121cd565b50600083815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091528491906001600160a01b03166107b15760405162461bcd60e51b81526004016104db91906121cd565b50600084815260016020908152604091829020548251808401909352600683526530303330303760d01b918301919091526001600160a01b039081169190881682146108105760405162461bcd60e51b81526004016104db91906121cd565b5060408051808201909152600681526530303330303160d01b60208201526001600160a01b0387166108555760405162461bcd60e51b81526004016104db91906121cd565b50610860868661122d565b50505050505050565b6001600160a01b0382166000908152600c60209081526040808320548151808301909252600682526530303530303760d01b928201929092529083106108c25760405162461bcd60e51b81526004016104db91906121cd565b506001600160a01b0383166000908152600c602052604090208054839081106108e757fe5b906000526020600020015490505b92915050565b600e5460408051808201909152600681526530313830303160d01b6020820152906001600160a01b031633146109445760405162461bcd60e51b81526004016104db91906121cd565b5061094f86866112a8565b61098f8585858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506112fc92505050565b6109cf8583838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061135592505050565b505050505050565b6109f2838383604051806020016040528060008152506113ce565b505050565b60008181526001602052604090205481906001600160a01b031633811480610a3557506000828152600260205260409020546001600160a01b031633145b80610a6357506001600160a01b038116600090815260046020908152604080832033845290915290205460ff165b604051806040016040528060068152602001650c0c0ccc0c0d60d21b81525090610aa05760405162461bcd60e51b81526004016104db91906121cd565b506109f28361167c565b600a5460408051808201909152600681526530303530303760d01b60208201526000918310610aec5760405162461bcd60e51b81526004016104db91906121cd565b50600a8281548110610afa57fe5b90600052602060002001549050919050565b600081815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091526001600160a01b031690816105005760405162461bcd60e51b81526004016104db91906121cd565b60408051808201909152600681526530303330303160d01b60208201526000906001600160a01b038316610bab5760405162461bcd60e51b81526004016104db91906121cd565b506108f582611790565b600e5460408051808201909152600681526530313830303160d01b6020820152906001600160a01b03163314610bfe5760405162461bcd60e51b81526004016104db91906121cd565b507fc4761b87ec5248fbb0deaff2d6b1651b8dd04322c6597549eefe44d799d480ce600782604051610c319291906121e0565b60405180910390a18051610c4c906007906020840190611be5565b5050565b6040518060400160405280600681526020016518189c18181960d11b81525081565b600e5460408051808201909152600681526530313830303160d01b6020820152906001600160a01b03163314610cbb5760405162461bcd60e51b81526004016104db91906121cd565b50610cc860058585611c63565b50610cd560068383611c63565b5050505050565b600e546001600160a01b031681565b60068054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561047a5780601f1061044f5761010080835404028352916020019161047a565b600081815260016020908152604091829020548251808401909352600683526518181998181960d11b9183019190915260609183916001600160a01b0316610da75760405162461bcd60e51b81526004016104db91906121cd565b5060008381526009602090815260409182902080548351601f600260001961010060018616150201909316929092049182018490048402810184019094528084529091830182828015610e3b5780601f10610e1057610100808354040283529160200191610e3b565b820191906000526020600020905b815481529060010190602001808311610e1e57829003601f168201915b5050505050915050919050565b3360008181526004602090815260408083206001600160a01b038716808552925291829020805460ff191685151517905590519091907f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3190610eab9085906121c2565b60405180910390a35050565b610cd585858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506113ce92505050565b60006108f582611790565b600081815260016020908152604091829020548251808401909352600683526518181998181960d11b9183019190915260609183916001600160a01b0316610f5f5760405162461bcd60e51b81526004016104db91906121cd565b5060008381526008602090815260409182902080548351601f600260001961010060018616150201909316929092049182018490048402810184019094528084529091830182828015610e3b5780601f10610e1057610100808354040283529160200191610e3b565b600082815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091528391906001600160a01b03166110215760405162461bcd60e51b81526004016104db91906121cd565b50600e5460408051808201909152600681526530313830303160d01b6020820152906001600160a01b0316331461106b5760405162461bcd60e51b81526004016104db91906121cd565b506000838152600860209081526040909120835161108b92850190611be5565b50505050565b60078054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561047a5780601f1061044f5761010080835404028352916020019161047a565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b600e5460408051808201909152600681526530313830303160d01b6020820152906001600160a01b031633146111695760405162461bcd60e51b81526004016104db91906121cd565b5060408051808201909152600681526518189c18181960d11b60208201526001600160a01b0382166111ae5760405162461bcd60e51b81526004016104db91906121cd565b50600e546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600e80546001600160a01b0319166001600160a01b0392909216919091179055565b6040518060400160405280600681526020016530313830303160d01b81525081565b6000818152600160205260409020546001600160a01b031661124e826117ab565b61125881836117e8565b611262838361194a565b81836001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6112b28282611a04565b600a80546001810182557fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a801829055546000918252600b6020526040909120600019909101905550565b600082815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091528391906001600160a01b031661106b5760405162461bcd60e51b81526004016104db91906121cd565b600082815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091528391906001600160a01b03166113ae5760405162461bcd60e51b81526004016104db91906121cd565b506000838152600960209081526040909120835161108b92850190611be5565b60008281526001602052604090205482906001600160a01b03163381148061140c57506000828152600260205260409020546001600160a01b031633145b8061143a57506001600160a01b038116600090815260046020908152604080832033845290915290205460ff165b604051806040016040528060068152602001650c0c0ccc0c0d60d21b815250906114775760405162461bcd60e51b81526004016104db91906121cd565b50600084815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091528591906001600160a01b03166114d15760405162461bcd60e51b81526004016104db91906121cd565b50600085815260016020908152604091829020548251808401909352600683526530303330303760d01b918301919091526001600160a01b039081169190891682146115305760405162461bcd60e51b81526004016104db91906121cd565b5060408051808201909152600681526530303330303160d01b60208201526001600160a01b0388166115755760405162461bcd60e51b81526004016104db91906121cd565b50611580878761122d565b611592876001600160a01b0316611ae7565b1561167257604051630a85bd0160e11b81526000906001600160a01b0389169063150b7a02906115cc9033908d908c908c90600401612185565b602060405180830381600087803b1580156115e657600080fd5b505af11580156115fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061161e9190612011565b60408051808201909152600681526530303330303560d01b60208201529091506001600160e01b03198216630a85bd0160e11b1461166f5760405162461bcd60e51b81526004016104db91906121cd565b50505b5050505050505050565b61168581611b23565b60008181526008602052604090205460026000196101006001841615020190911604156116c35760008181526008602052604081206116c391611cd1565b600081815260096020526040902054600260001961010060018416150201909116041561170157600081815260096020526040812061170191611cd1565b6000818152600b6020526040812054600a805491926000198301929091908390811061172957fe5b9060005260206000200154905080600a848154811061174457fe5b600091825260209091200155600a80548061175b57fe5b600082815260208082208301600019908101839055909201909255918152600b90915260408082209390935592835250812055565b6001600160a01b03166000908152600c602052604090205490565b6000818152600260205260409020546001600160a01b0316156117e557600081815260026020526040902080546001600160a01b03191690555b50565b600081815260016020908152604091829020548251808401909352600683526530303330303760d01b918301919091526001600160a01b038481169116146118435760405162461bcd60e51b81526004016104db91906121cd565b50600081815260016020908152604080832080546001600160a01b0319169055600d8252808320546001600160a01b0386168452600c909252909120546000190180821461190d576001600160a01b0384166000908152600c602052604081208054839081106118af57fe5b9060005260206000200154905080600c6000876001600160a01b03166001600160a01b0316815260200190815260200160002084815481106118ed57fe5b6000918252602080832090910192909255918252600d9052604090208290555b6001600160a01b0384166000908152600c6020526040902080548061192e57fe5b6001900381819060005260206000200160009055905550505050565b600081815260016020908152604091829020548251808401909352600683526518181998181b60d11b918301919091526001600160a01b0316156119a15760405162461bcd60e51b81526004016104db91906121cd565b50600081815260016020818152604080842080546001600160a01b0319166001600160a01b03979097169687179055948352600c8152848320805492830181558084528184209092018490559054928252600d9052919091206000199091019055565b60408051808201909152600681526530303330303160d01b60208201526001600160a01b038316611a485760405162461bcd60e51b81526004016104db91906121cd565b50600081815260016020908152604091829020548251808401909352600683526518181998181b60d11b918301919091526001600160a01b031615611aa05760405162461bcd60e51b81526004016104db91906121cd565b50611aab828261194a565b60405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708115801590611b1b5750808214155b949350505050565b600081815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091528291906001600160a01b0316611b7c5760405162461bcd60e51b81526004016104db91906121cd565b506000828152600160205260409020546001600160a01b0316611b9e836117ab565b611ba881846117e8565b60405183906000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a4505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611c2657805160ff1916838001178555611c53565b82800160010185558215611c53579182015b82811115611c53578251825591602001919060010190611c38565b50611c5f929150611d11565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611ca45782800160ff19823516178555611c53565b82800160010185558215611c53579182015b82811115611c53578235825591602001919060010190611cb6565b50805460018160011615610100020316600290046000825580601f10611cf757506117e5565b601f0160209004906000526020600020908101906117e591905b5b80821115611c5f5760008155600101611d12565b80356001600160a01b03811681146108f557600080fd5b60008083601f840112611d4e578182fd5b50813567ffffffffffffffff811115611d65578182fd5b602083019150836020828501011115611d7d57600080fd5b9250929050565b600082601f830112611d94578081fd5b813567ffffffffffffffff80821115611dab578283fd5b604051601f8301601f191681016020018281118282101715611dcb578485fd5b604052828152925082848301602001861015611de657600080fd5b8260208601602083013760006020848301015250505092915050565b600060208284031215611e13578081fd5b611e1d8383611d26565b9392505050565b60008060408385031215611e36578081fd5b611e408484611d26565b9150611e4f8460208501611d26565b90509250929050565b600080600060608486031215611e6c578081fd5b8335611e7781612288565b92506020840135611e8781612288565b929592945050506040919091013590565b600080600080600060808688031215611eaf578081fd5b611eb98787611d26565b9450611ec88760208801611d26565b935060408601359250606086013567ffffffffffffffff811115611eea578182fd5b611ef688828901611d3d565b969995985093965092949392505050565b60008060408385031215611f19578182fd5b611f238484611d26565b915060208301358015158114611f37578182fd5b809150509250929050565b60008060408385031215611f54578182fd5b611f5e8484611d26565b946020939093013593505050565b60008060008060008060808789031215611f84578081fd5b8635611f8f81612288565b955060208701359450604087013567ffffffffffffffff80821115611fb2578283fd5b611fbe8a838b01611d3d565b90965094506060890135915080821115611fd6578283fd5b50611fe389828a01611d3d565b979a9699509497509295939492505050565b600060208284031215612006578081fd5b8135611e1d8161229d565b600060208284031215612022578081fd5b8151611e1d8161229d565b60008060008060408587031215612042578384fd5b843567ffffffffffffffff80821115612059578586fd5b61206588838901611d3d565b9096509450602087013591508082111561207d578384fd5b5061208a87828801611d3d565b95989497509550505050565b6000602082840312156120a7578081fd5b813567ffffffffffffffff8111156120bd578182fd5b611b1b84828501611d84565b6000602082840312156120da578081fd5b5035919050565b600080604083850312156120f3578182fd5b82359150602083013567ffffffffffffffff811115612110578182fd5b61211c85828601611d84565b9150509250929050565b60008151808452815b8181101561214b5760208185018101518683018201520161212f565b8181111561215c5782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906121b890830184612126565b9695505050505050565b901515815260200190565b600060208252611e1d6020830184612126565b6000604082016040835281855460018082166000811461220757600181146122255761225e565b60028304607f16855260ff198316606088015260808701935061225e565b600283048086526122358a61227c565b875b828110156122545781548a82016060015290840190602001612237565b8901606001955050505b50505083810360208501526121b88186612126565b90815260200190565b60009081526020902090565b6001600160a01b03811681146117e557600080fd5b6001600160e01b0319811681146117e557600080fdfea2646970667358221220b3396645be33dd480d22b1a0c49deddfbfa083719e31cc0db8908c72c416aff164736f6c634300060c0033

Deployed ByteCode Sourcemap

41607:1650:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7082:172;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34234:120;;;:::i;:::-;;;;;;;:::i;27715:183::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;25504:352::-;;;;;;:::i;:::-;;:::i;:::-;;36789:120;;;:::i;:::-;;;;;;;:::i;24730:353::-;;;;;;:::i;:::-;;:::i;37486:251::-;;;;;;:::i;:::-;;:::i;42237:242::-;;;;;;:::i;:::-;;:::i;23973:179::-;;;;;;:::i;:::-;;:::i;42487:97::-;;;;;;:::i;:::-;;:::i;37050:199::-;;;;;;:::i;:::-;;:::i;27263:208::-;;;;;;:::i;:::-;;:::i;26793:204::-;;;;;;:::i;:::-;;:::i;42756:163::-;;;;;;:::i;:::-;;:::i;541:65::-;;;:::i;41872:141::-;;;;;;:::i;:::-;;:::i;661:20::-;;;:::i;34470:128::-;;;:::i;35089:175::-;;;;;;:::i;:::-;;:::i;26267:232::-;;;;;;:::i;:::-;;:::i;23354:209::-;;;;;;:::i;:::-;;:::i;42927:145::-;;;;;;:::i;:::-;;:::i;34751:181::-;;;;;;:::i;:::-;;:::i;43080:172::-;;;;;;:::i;:::-;;:::i;42592:101::-;;;:::i;28167:192::-;;;;;;:::i;:::-;;:::i;1498:238::-;;;;;;:::i;:::-;;:::i;485:51::-;;;:::i;7082:172::-;-1:-1:-1;;;;;;7215:33:0;7192:4;7215:33;;;;;;;;;;;;;;7082:172::o;34234:120::-;34341:7;34333:15;;;;;;;;-1:-1:-1;;34333:15:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34302:19;;34333:15;;34341:7;;34333:15;;34341:7;34333:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34234:120;:::o;27715:183::-;27844:7;22274:19;;;:9;:19;;;;;;;;;22309:13;;;;;;;;;;;-1:-1:-1;;;22309:13:0;;;;;;;27820:8;;-1:-1:-1;;;;;22274:19:0;22266:57;;;;-1:-1:-1;;;22266:57:0;;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;27870:22:0::1;::::0;;;:12:::1;:22;::::0;;;;;-1:-1:-1;;;;;27870:22:0::1;::::0;-1:-1:-1;22330:1:0::1;27715:183:::0;;;;:::o;25504:352::-;21479:18;21500:19;;;:9;:19;;;;;;25617:8;;-1:-1:-1;;;;;21500:19:0;21548:10;21534:24;;;:68;;-1:-1:-1;;;;;;21562:28:0;;;;;;:16;:28;;;;;;;;21591:10;21562:40;;;;;;;;;;21534:68;21604:21;;;;;;;;;;;;;-1:-1:-1;;;21604:21:0;;;21526:100;;;;;-1:-1:-1;;;21526:100:0;;;;;;;;:::i;:::-;-1:-1:-1;22305:1:0::1;22274:19:::0;;;:9:::1;:19;::::0;;;;;;;;;22309:13;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;22309:13:0;;::::1;::::0;;;;25645:8;;22309:13;-1:-1:-1;;;;;22274:19:0::1;22266:57;;;;-1:-1:-1::0;;;22266:57:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;25665:18:0::2;25686:19:::0;;;:9:::2;:19;::::0;;;;;;;;;25745:8;;;;::::2;::::0;;;::::2;::::0;;-1:-1:-1;;;25745:8:0;;::::2;::::0;;;;-1:-1:-1;;;;;25686:19:0;;::::2;::::0;25745:8;25720:23;::::2;::::0;::::2;;25712:42;;;;-1:-1:-1::0;;;25712:42:0::2;;;;;;;;:::i;:::-;-1:-1:-1::0;25763:22:0::2;::::0;;;:12:::2;:22;::::0;;;;;:34;;-1:-1:-1;;;;;;25763:34:0::2;-1:-1:-1::0;;;;;25763:34:0;;::::2;::::0;;::::2;::::0;;;25809:41;;25763:22;;25809:41;;::::2;::::0;::::2;::::0;::::2;22330:1;21633::::1;25504:352:::0;;;;:::o;36789:120::-;36890:6;:13;36789:120;:::o;24730:353::-;21838:18;21859:19;;;:9;:19;;;;;;24863:8;;-1:-1:-1;;;;;21859:19:0;21915:10;21901:24;;;:71;;-1:-1:-1;21936:22:0;;;;:12;:22;;;;;;-1:-1:-1;;;;;21936:22:0;21962:10;21936:36;21901:71;:122;;;-1:-1:-1;;;;;;21983:28:0;;;;;;:16;:28;;;;;;;;22012:10;21983:40;;;;;;;;;;21901:122;22032:30;;;;;;;;;;;;;-1:-1:-1;;;22032:30:0;;;21885:184;;;;;-1:-1:-1;;;21885:184:0;;;;;;;;:::i;:::-;-1:-1:-1;22305:1:0::1;22274:19:::0;;;:9:::1;:19;::::0;;;;;;;;;22309:13;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;22309:13:0;;::::1;::::0;;;;24891:8;;22309:13;-1:-1:-1;;;;;22274:19:0::1;22266:57;;;;-1:-1:-1::0;;;22266:57:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;24911:18:0::2;24932:19:::0;;;:9:::2;:19;::::0;;;;;;;;;24987:9;;;;::::2;::::0;;;::::2;::::0;;-1:-1:-1;;;24987:9:0;;::::2;::::0;;;;-1:-1:-1;;;;;24932:19:0;;::::2;::::0;24987:9;24966:19;::::2;::::0;::::2;24958:39;;;;-1:-1:-1::0;;;24958:39:0::2;;;;;;;;:::i;:::-;-1:-1:-1::0;25031:12:0::2;::::0;;;;::::2;::::0;;;::::2;::::0;;-1:-1:-1;;;25031:12:0::2;::::0;::::2;::::0;-1:-1:-1;;;;;25012:17:0;::::2;25004:40;;;;-1:-1:-1::0;;;25004:40:0::2;;;;;;;;:::i;:::-;;25053:24;25063:3;25068:8;25053:9;:24::i;:::-;22330:1;22076::::1;24730:353:::0;;;;;:::o;37486:251::-;-1:-1:-1;;;;;37650:18:0;;37614:7;37650:18;;;:10;:18;;;;;;;;:25;37677:13;;;;;;;;;;;-1:-1:-1;;;37677:13:0;;;;;;;;37641:34;;37633:58;;;;-1:-1:-1;;;37633:58:0;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;37705:18:0;;;;;;:10;:18;;;;;:26;;37724:6;;37705:26;;;;;;;;;;;;;;37698:33;;37486:251;;;;;:::o;42237:242::-;1291:5;;1298:17;;;;;;;;;;;;-1:-1:-1;;;1298:17:0;;;;;-1:-1:-1;;;;;1291:5:0;1277:10;:19;1269:47;;;;-1:-1:-1;;;1269:47:0;;;;;;;;:::i;:::-;;42357:26:::1;42369:3;42374:8;42357:11;:26::i;:::-;42390:34;42409:8;42419:4;;42390:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;42390:18:0::1;::::0;-1:-1:-1;;;42390:34:0:i:1;:::-;42431:42;42454:8;42464;;42431:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;42431:22:0::1;::::0;-1:-1:-1;;;42431:42:0:i:1;:::-;42237:242:::0;;;;;;:::o;23973:179::-;24103:43;24121:5;24128:3;24133:8;24103:43;;;;;;;;;;;;:17;:43::i;:::-;23973:179;;;:::o;42487:97::-;21838:18;21859:19;;;:9;:19;;;;;;42540:8;;-1:-1:-1;;;;;21859:19:0;21915:10;21901:24;;;:71;;-1:-1:-1;21936:22:0;;;;:12;:22;;;;;;-1:-1:-1;;;;;21936:22:0;21962:10;21936:36;21901:71;:122;;;-1:-1:-1;;;;;;21983:28:0;;;;;;:16;:28;;;;;;;;22012:10;21983:40;;;;;;;;;;21901:122;22032:30;;;;;;;;;;;;;-1:-1:-1;;;22032:30:0;;;21885:184;;;;;-1:-1:-1;;;21885:184:0;;;;;;;;:::i;:::-;;42557:21:::1;42569:8;42557:11;:21::i;37050:199::-:0;37186:6;:13;37201;;;;;;;;;;;;-1:-1:-1;;;37201:13:0;;;;37150:7;;37177:22;;37169:46;;;;-1:-1:-1;;;37169:46:0;;;;;;;;:::i;:::-;;37229:6;37236;37229:14;;;;;;;;;;;;;;;;37222:21;;37050:199;;;:::o;27263:208::-;27360:14;27395:19;;;:9;:19;;;;;;;;;;27451:13;;;;;;;;;;;-1:-1:-1;;;27451:13:0;;;;;;;-1:-1:-1;;;;;27395:19:0;;27429:20;27421:44;;;;-1:-1:-1;;;27421:44:0;;;;;;;;:::i;26793:204::-;26939:12;;;;;;;;;;;;-1:-1:-1;;;26939:12:0;;;;26890:7;;-1:-1:-1;;;;;26917:20:0;;26909:43;;;;-1:-1:-1;;;26909:43:0;;;;;;;;:::i;:::-;;26966:25;26984:6;26966:17;:25::i;42756:163::-;1291:5;;1298:17;;;;;;;;;;;;-1:-1:-1;;;1298:17:0;;;;;-1:-1:-1;;;;;1291:5:0;1277:10;:19;1269:47;;;;-1:-1:-1;;;1269:47:0;;;;;;;;:::i;:::-;;42831::::1;42850:22;42874:3;42831:47;;;;;;;:::i;:::-;;;;;;;;42885:28:::0;;::::1;::::0;:22:::1;::::0;:28:::1;::::0;::::1;::::0;::::1;:::i;:::-;;42756:163:::0;:::o;541:65::-;;;;;;;;;;;;;;-1:-1:-1;;;541:65:0;;;;:::o;41872:141::-;1291:5;;1298:17;;;;;;;;;;;;-1:-1:-1;;;1298:17:0;;;;;-1:-1:-1;;;;;1291:5:0;1277:10;:19;1269:47;;;;-1:-1:-1;;;1269:47:0;;;;;;;;:::i;:::-;-1:-1:-1;41966:14:0::1;:7;41976:4:::0;;41966:14:::1;:::i;:::-;-1:-1:-1::0;41989:18:0::1;:9;42001:6:::0;;41989:18:::1;:::i;:::-;;41872:141:::0;;;;:::o;661:20::-;;;-1:-1:-1;;;;;661:20:0;;:::o;34470:128::-;34583:9;34573:19;;;;;;;;-1:-1:-1;;34573:19:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34540:21;;34573:19;;34583:9;;34573:19;;34583:9;34573:19;;;;;;;;;;;;;;;;;;;;;;;;35089:175;22305:1;22274:19;;;:9;:19;;;;;;;;;;22309:13;;;;;;;;;;;-1:-1:-1;;;22309:13:0;;;;;;;35205;;35181:8;;-1:-1:-1;;;;;22274:19:0;22266:57;;;;-1:-1:-1;;;22266:57:0;;;;;;;;:::i;:::-;-1:-1:-1;35237:21:0::1;::::0;;;:11:::1;:21;::::0;;;;;;;;35230:28;;;;::::1;;-1:-1:-1::0;;35230:28:0::1;;::::0;::::1;;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;;35237:21;;35230:28;::::1;35237:21:::0;35230:28;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35089:175:::0;;;;:::o;26267:232::-;26399:10;26382:28;;;;:16;:28;;;;;;;;-1:-1:-1;;;;;26382:39:0;;;;;;;;;;;:51;;-1:-1:-1;;26382:51:0;;;;;;;26445:48;;26382:39;;26399:10;26445:48;;;;26382:51;;26445:48;:::i;:::-;;;;;;;;26267:232;;:::o;23354:209::-;23511:46;23529:5;23536:3;23541:8;23551:5;;23511:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23511:17:0;;-1:-1:-1;;;23511:46:0:i;42927:145::-;42990:7;43015:51;43059:6;43015:43;:51::i;34751:181::-;22305:1;22274:19;;;:9;:19;;;;;;;;;;22309:13;;;;;;;;;;;-1:-1:-1;;;22309:13:0;;;;;;;34877;;34853:8;;-1:-1:-1;;;;;22274:19:0;22266:57;;;;-1:-1:-1;;;22266:57:0;;;;;;;;:::i;:::-;-1:-1:-1;34909:17:0::1;::::0;;;:7:::1;:17;::::0;;;;;;;;34902:24;;;;::::1;;-1:-1:-1::0;;34902:24:0::1;;::::0;::::1;;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;;34909:17;;34902:24;::::1;34909:17:::0;34902:24;;::::1;;;;;;;;;;;;;;;;;;;;;;43080:172:::0;22305:1;22274:19;;;:9;:19;;;;;;;;;;22309:13;;;;;;;;;;;-1:-1:-1;;;22309:13:0;;;;;;;43187:8;;22309:13;-1:-1:-1;;;;;22274:19:0;22266:57;;;;-1:-1:-1;;;22266:57:0;;;;;;;;:::i;:::-;-1:-1:-1;1291:5:0::1;::::0;1298:17:::1;::::0;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;1298:17:0::1;::::0;::::1;::::0;;-1:-1:-1;;;;;1291:5:0::1;1277:10;:19;1269:47;;;;-1:-1:-1::0;;;1269:47:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;43222:17:0::2;::::0;;;:7:::2;:17;::::0;;;;;;;:24;;::::2;::::0;;::::2;::::0;::::2;:::i;:::-;;43080:172:::0;;;:::o;42592:101::-;42665:22;42658:29;;;;;;;;-1:-1:-1;;42658:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42636:13;;42658:29;;42665:22;;42658:29;;42665:22;42658:29;;;;;;;;;;;;;;;;;;;;;;;;28167:192;-1:-1:-1;;;;;28318:24:0;;;28295:4;28318:24;;;:16;:24;;;;;;;;:35;;;;;;;;;;;;;;;28167:192::o;1498:238::-;1291:5;;1298:17;;;;;;;;;;;;-1:-1:-1;;;1298:17:0;;;;;-1:-1:-1;;;;;1291:5:0;1277:10;:19;1269:47;;;;-1:-1:-1;;;1269:47:0;;;;;;;;:::i;:::-;-1:-1:-1;1624:31:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;1624:31:0::1;::::0;::::1;::::0;-1:-1:-1;;;;;1599:23:0;::::1;1591:65;;;;-1:-1:-1::0;;;1591:65:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;1689:5:0::1;::::0;1668:38:::1;::::0;-1:-1:-1;;;;;1668:38:0;;::::1;::::0;1689:5:::1;::::0;1668:38:::1;::::0;1689:5:::1;::::0;1668:38:::1;1713:5;:17:::0;;-1:-1:-1;;;;;;1713:17:0::1;-1:-1:-1::0;;;;;1713:17:0;;;::::1;::::0;;;::::1;::::0;;1498:238::o;485:51::-;;;;;;;;;;;;;;-1:-1:-1;;;485:51:0;;;;:::o;28550:275::-;28639:12;28654:19;;;:9;:19;;;;;;-1:-1:-1;;;;;28654:19:0;28680:24;28664:8;28680:14;:24::i;:::-;28713:30;28728:4;28734:8;28713:14;:30::i;:::-;28750:26;28762:3;28767:8;28750:11;:26::i;:::-;28810:8;28805:3;-1:-1:-1;;;;;28790:29:0;28799:4;-1:-1:-1;;;;;28790:29:0;;;;;;;;;;;28550:275;;;:::o;38128:218::-;38240:26;38252:3;38257:8;38240:11;:26::i;:::-;38273:6;:21;;;;;;;;;;;;38323:13;-1:-1:-1;38301:19:0;;;:9;38273:21;38301:19;;;;;-1:-1:-1;;38323:17:0;;;38301:39;;-1:-1:-1;38128:218:0:o;35659:157::-;22305:1;22274:19;;;:9;:19;;;;;;;;;;22309:13;;;;;;;;;;;-1:-1:-1;;;22309:13:0;;;;;;;35766:8;;22309:13;-1:-1:-1;;;;;22274:19:0;22266:57;;;;-1:-1:-1;;;22266:57:0;;;;;;;;:::i;35822:165::-;22305:1;22274:19;;;:9;:19;;;;;;;;;;22309:13;;;;;;;;;;;-1:-1:-1;;;22309:13:0;;;;;;;35933:8;;22309:13;-1:-1:-1;;;;;22274:19:0;22266:57;;;;-1:-1:-1;;;22266:57:0;;;;;;;;:::i;:::-;-1:-1:-1;35953:21:0::1;::::0;;;:11:::1;:21;::::0;;;;;;;:28;;::::1;::::0;;::::1;::::0;::::1;:::i;32009:590::-:0;21838:18;21859:19;;;:9;:19;;;;;;32157:8;;-1:-1:-1;;;;;21859:19:0;21915:10;21901:24;;;:71;;-1:-1:-1;21936:22:0;;;;:12;:22;;;;;;-1:-1:-1;;;;;21936:22:0;21962:10;21936:36;21901:71;:122;;;-1:-1:-1;;;;;;21983:28:0;;;;;;:16;:28;;;;;;;;22012:10;21983:40;;;;;;;;;;21901:122;22032:30;;;;;;;;;;;;;-1:-1:-1;;;22032:30:0;;;21885:184;;;;;-1:-1:-1;;;21885:184:0;;;;;;;;:::i;:::-;-1:-1:-1;22305:1:0::1;22274:19:::0;;;:9:::1;:19;::::0;;;;;;;;;22309:13;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;22309:13:0;;::::1;::::0;;;;32185:8;;22309:13;-1:-1:-1;;;;;22274:19:0::1;22266:57;;;;-1:-1:-1::0;;;22266:57:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;32205:18:0::2;32226:19:::0;;;:9:::2;:19;::::0;;;;;;;;;32281:9;;;;::::2;::::0;;;::::2;::::0;;-1:-1:-1;;;32281:9:0;;::::2;::::0;;;;-1:-1:-1;;;;;32226:19:0;;::::2;::::0;32281:9;32260:19;::::2;::::0;::::2;32252:39;;;;-1:-1:-1::0;;;32252:39:0::2;;;;;;;;:::i;:::-;-1:-1:-1::0;32325:12:0::2;::::0;;;;::::2;::::0;;;::::2;::::0;;-1:-1:-1;;;32325:12:0::2;::::0;::::2;::::0;-1:-1:-1;;;;;32306:17:0;::::2;32298:40;;;;-1:-1:-1::0;;;32298:40:0::2;;;;;;;;:::i;:::-;;32347:24;32357:3;32362:8;32347:9;:24::i;:::-;32384:16;:3;-1:-1:-1::0;;;;;32384:14:0::2;;:16::i;:::-;32380:214;;;32432:77;::::0;-1:-1:-1;;;32432:77:0;;32416:13:::2;::::0;-1:-1:-1;;;;;32432:41:0;::::2;::::0;::::2;::::0;:77:::2;::::0;32474:10:::2;::::0;32486:5;;32493:8;;32503:5;;32432:77:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32562:23;::::0;;;;::::2;::::0;;;::::2;::::0;;-1:-1:-1;;;32562:23:0::2;::::0;::::2;::::0;32416:93;;-1:-1:-1;;;;;;;32526:34:0;::::2;-1:-1:-1::0;;;32526:34:0::2;32518:68;;;;-1:-1:-1::0;;;32518:68:0::2;;;;;;;;:::i;:::-;;32380:214;;22330:1;22076::::1;32009:590:::0;;;;;;:::o;38749:707::-;38843:21;38855:8;38843:11;:21::i;:::-;38887:17;;;;:7;:17;;;;;38881:31;;-1:-1:-1;;38881:31:0;;;;;;;;;;;:36;38877:88;;38940:17;;;;:7;:17;;;;;38933:24;;;:::i;:::-;38987:21;;;;:11;:21;;;;;38981:35;;-1:-1:-1;;38981:35:0;;;;;;;;;;;:40;38977:96;;39044:21;;;;:11;:21;;;;;39037:28;;;:::i;:::-;39085:18;39106:19;;;:9;:19;;;;;;39157:6;:13;;39106:19;;-1:-1:-1;;39157:17:0;;;39085:18;;39157:6;:17;;39201:22;;;;;;;;;;;;;;39181:42;;39253:9;39232:6;39239:10;39232:18;;;;;;;;;;;;;;;;;:30;39271:6;:12;;;;;;;;;;;;;;;;;-1:-1:-1;;39271:12:0;;;;;;;;;;;;39387:20;;;:9;:20;;;;;;;:33;;;;39427:19;;;-1:-1:-1;39427:19:0;;:23;38749:707::o;41220:175::-;-1:-1:-1;;;;;41364:18:0;41338:7;41364:18;;;:10;:18;;;;;:25;;41220:175::o;32732:173::-;32845:1;32811:22;;;:12;:22;;;;;;-1:-1:-1;;;;;32811:22:0;:36;32807:93;;32870:22;;;;:12;:22;;;;;32863:29;;-1:-1:-1;;;;;;32863:29:0;;;32807:93;32732:173;:::o;39735:602::-;39866:19;;;;:9;:19;;;;;;;;;;39896:9;;;;;;;;;;;-1:-1:-1;;;39896:9:0;;;;;;;-1:-1:-1;;;;;39866:28:0;;;:19;;:28;39858:48;;;;-1:-1:-1;;;39858:48:0;;;;;;;;:::i;:::-;-1:-1:-1;39920:19:0;;;;:9;:19;;;;;;;;39913:26;;-1:-1:-1;;;;;;39913:26:0;;;39977:14;:24;;;;;;-1:-1:-1;;;;;40033:17:0;;;;:10;:17;;;;;;:24;-1:-1:-1;;40033:28:0;40074:36;;;40070:230;;-1:-1:-1;;;;;40146:17:0;;40126;40146;;;:10;:17;;;;;:33;;40164:14;;40146:33;;;;;;;;;;;;;;40126:53;;40228:9;40188:10;:17;40199:5;-1:-1:-1;;;;;40188:17:0;-1:-1:-1;;;;;40188:17:0;;;;;;;;;;;;40206:18;40188:37;;;;;;;;;;;;;;;;;;;:49;;;;40246:25;;;:14;:25;;;;;:46;;;40070:230;-1:-1:-1;;;;;40308:17:0;;;;;;:10;:17;;;;;:23;;;;;;;;;;;;;;;;;;;;;;;;39735:602;;;;:::o;40609:317::-;40766:1;40735:19;;;:9;:19;;;;;;;;;;40770:18;;;;;;;;;;;-1:-1:-1;;;40770:18:0;;;;;;;-1:-1:-1;;;;;40735:19:0;:33;40727:62;;;;-1:-1:-1;;;40727:62:0;;;;;;;;:::i;:::-;-1:-1:-1;40796:19:0;;;;:9;:19;;;;;;;;:25;;-1:-1:-1;;;;;;40796:25:0;-1:-1:-1;;;;;40796:25:0;;;;;;;;;40830:15;;;:10;:15;;;;;:30;;;;;;;;;;;;;;;;;;;40894:22;;40867:24;;;:14;:24;;;;;;-1:-1:-1;;40894:26:0;;;40867:53;;40609:317::o;29216:297::-;29341:12;;;;;;;;;;;;-1:-1:-1;;;29341:12:0;;;;-1:-1:-1;;;;;29322:17:0;;29314:40;;;;-1:-1:-1;;;29314:40:0;;;;;;;;:::i;:::-;-1:-1:-1;29400:1:0;29369:19;;;:9;:19;;;;;;;;;;29404:18;;;;;;;;;;;-1:-1:-1;;;29404:18:0;;;;;;;-1:-1:-1;;;;;29369:19:0;:33;29361:62;;;;-1:-1:-1;;;29361:62:0;;;;;;;;:::i;:::-;;29432:26;29444:3;29449:8;29432:11;:26::i;:::-;29472:35;;29498:8;;-1:-1:-1;;;;;29472:35:0;;;29489:1;;29472:35;;29489:1;;29472:35;29216:297;;:::o;4864:780::-;4947:17;5529:18;;5433:66;5595:15;;;;;:42;;;5626:11;5614:8;:23;;5595:42;5579:59;4864:780;-1:-1:-1;;;;4864:780:0:o;29916:282::-;22305:1;22274:19;;;:9;:19;;;;;;;;;;22309:13;;;;;;;;;;;-1:-1:-1;;;22309:13:0;;;;;;;30004:8;;22309:13;-1:-1:-1;;;;;22274:19:0;22266:57;;;;-1:-1:-1;;;22266:57:0;;;;;;;;:::i;:::-;-1:-1:-1;30024:18:0::1;30045:19:::0;;;:9:::1;:19;::::0;;;;;-1:-1:-1;;;;;30045:19:0::1;30071:24;30055:8:::0;30071:14:::1;:24::i;:::-;30102:36;30117:10;30129:8;30102:14;:36::i;:::-;30150:42;::::0;30183:8;;30179:1:::1;::::0;-1:-1:-1;;;;;30150:42:0;::::1;::::0;::::1;::::0;30179:1;;30150:42:::1;22330:1;29916:282:::0;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:130;72:20;;-1:-1;;;;;13541:54;;14660:35;;14650:2;;14709:1;;14699:12;561:336;;;675:3;668:4;660:6;656:17;652:27;642:2;;-1:-1;;683:12;642:2;-1:-1;713:20;;753:18;742:30;;739:2;;;-1:-1;;775:12;739:2;819:4;811:6;807:17;795:29;;870:3;819:4;850:17;811:6;836:32;;833:41;830:2;;;887:1;;877:12;830:2;635:262;;;;;:::o;1266:442::-;;1368:3;1361:4;1353:6;1349:17;1345:27;1335:2;;-1:-1;;1376:12;1335:2;1423:6;1410:20;12188:18;;12180:6;12177:30;12174:2;;;-1:-1;;12210:12;12174:2;11843;11837:9;12283;12264:17;;-1:-1;;12260:33;11869:17;;12351:4;11869:17;11929:34;;;11965:22;;;11926:62;11923:2;;;-1:-1;;11991:12;11923:2;11843;12010:22;1516:21;;;1436:74;-1:-1;1436:74;1616:16;;;12351:4;1616:16;1613:25;-1:-1;1610:2;;;1651:1;;1641:12;1610:2;14147:6;12351:4;1558:6;1554:17;12351:4;1592:5;1588:16;14124:30;14203:1;12351:4;14194:6;1592:5;14185:16;;14178:27;;;;1328:380;;;;:::o;1853:241::-;;1957:2;1945:9;1936:7;1932:23;1928:32;1925:2;;;-1:-1;;1963:12;1925:2;2025:53;2070:7;2046:22;2025:53;:::i;:::-;2015:63;1919:175;-1:-1;;;1919:175::o;2101:366::-;;;2222:2;2210:9;2201:7;2197:23;2193:32;2190:2;;;-1:-1;;2228:12;2190:2;2290:53;2335:7;2311:22;2290:53;:::i;:::-;2280:63;;2398:53;2443:7;2380:2;2423:9;2419:22;2398:53;:::i;:::-;2388:63;;2184:283;;;;;:::o;2474:491::-;;;;2612:2;2600:9;2591:7;2587:23;2583:32;2580:2;;;-1:-1;;2618:12;2580:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;2670:63;-1:-1;2770:2;2809:22;;72:20;97:33;72:20;97:33;:::i;:::-;2574:391;;2778:63;;-1:-1;;;2878:2;2917:22;;;;1783:20;;2574:391::o;2972:741::-;;;;;;3146:3;3134:9;3125:7;3121:23;3117:33;3114:2;;;-1:-1;;3153:12;3114:2;3215:53;3260:7;3236:22;3215:53;:::i;:::-;3205:63;;3323:53;3368:7;3305:2;3348:9;3344:22;3323:53;:::i;:::-;3313:63;;3413:2;3456:9;3452:22;1783:20;3421:63;;3549:2;3538:9;3534:18;3521:32;3573:18;3565:6;3562:30;3559:2;;;-1:-1;;3595:12;3559:2;3633:64;3689:7;3680:6;3669:9;3665:22;3633:64;:::i;:::-;3108:605;;;;-1:-1;3108:605;;-1:-1;3615:82;;;3108:605;-1:-1;;;3108:605::o;3720:360::-;;;3838:2;3826:9;3817:7;3813:23;3809:32;3806:2;;;-1:-1;;3844:12;3806:2;3906:53;3951:7;3927:22;3906:53;:::i;:::-;3896:63;;3996:2;4036:9;4032:22;206:20;14806:5;13302:13;13295:21;14784:5;14781:32;14771:2;;-1:-1;;14817:12;14771:2;4004:60;;;;3800:280;;;;;:::o;4087:366::-;;;4208:2;4196:9;4187:7;4183:23;4179:32;4176:2;;;-1:-1;;4214:12;4176:2;4276:53;4321:7;4297:22;4276:53;:::i;:::-;4266:63;4366:2;4405:22;;;;1783:20;;-1:-1;;;4170:283::o;4460:869::-;;;;;;;4655:3;4643:9;4634:7;4630:23;4626:33;4623:2;;;-1:-1;;4662:12;4623:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;4714:63;-1:-1;4814:2;4853:22;;1783:20;;-1:-1;4950:2;4935:18;;4922:32;4974:18;4963:30;;;4960:2;;;-1:-1;;4996:12;4960:2;5034:65;5091:7;5082:6;5071:9;5067:22;5034:65;:::i;:::-;5016:83;;-1:-1;5016:83;-1:-1;5164:2;5149:18;;5136:32;;-1:-1;5177:30;;;5174:2;;;-1:-1;;5210:12;5174:2;;5248:65;5305:7;5296:6;5285:9;5281:22;5248:65;:::i;:::-;4617:712;;;;-1:-1;4617:712;;-1:-1;4617:712;;5230:83;;4617:712;-1:-1;;;4617:712::o;5336:239::-;;5439:2;5427:9;5418:7;5414:23;5410:32;5407:2;;;-1:-1;;5445:12;5407:2;352:6;339:20;364:32;390:5;364:32;:::i;5582:261::-;;5696:2;5684:9;5675:7;5671:23;5667:32;5664:2;;;-1:-1;;5702:12;5664:2;491:6;485:13;503:32;529:5;503:32;:::i;5850:618::-;;;;;6011:2;5999:9;5990:7;5986:23;5982:32;5979:2;;;-1:-1;;6017:12;5979:2;6075:17;6062:31;6113:18;;6105:6;6102:30;6099:2;;;-1:-1;;6135:12;6099:2;6173:65;6230:7;6221:6;6210:9;6206:22;6173:65;:::i;:::-;6155:83;;-1:-1;6155:83;-1:-1;6303:2;6288:18;;6275:32;;-1:-1;6316:30;;;6313:2;;;-1:-1;;6349:12;6313:2;;6387:65;6444:7;6435:6;6424:9;6420:22;6387:65;:::i;:::-;5973:495;;;;-1:-1;6369:83;-1:-1;;;;5973:495::o;6475:347::-;;6589:2;6577:9;6568:7;6564:23;6560:32;6557:2;;;-1:-1;;6595:12;6557:2;6653:17;6640:31;6691:18;6683:6;6680:30;6677:2;;;-1:-1;;6713:12;6677:2;6743:63;6798:7;6789:6;6778:9;6774:22;6743:63;:::i;6829:241::-;;6933:2;6921:9;6912:7;6908:23;6904:32;6901:2;;;-1:-1;;6939:12;6901:2;-1:-1;1783:20;;6895:175;-1:-1;6895:175::o;7077:472::-;;;7208:2;7196:9;7187:7;7183:23;7179:32;7176:2;;;-1:-1;;7214:12;7176:2;1796:6;1783:20;7266:63;;7394:2;7383:9;7379:18;7366:32;7418:18;7410:6;7407:30;7404:2;;;-1:-1;;7440:12;7404:2;7470:63;7525:7;7516:6;7505:9;7501:22;7470:63;:::i;:::-;7460:73;;;7170:379;;;;;:::o;7936:343::-;;8078:5;12625:12;12910:6;12905:3;12898:19;-1:-1;14292:101;14306:6;14303:1;14300:13;14292:101;;;12947:4;14373:11;;;;;14367:18;14354:11;;;;;14347:39;14321:10;14292:101;;;14408:6;14405:1;14402:13;14399:2;;;-1:-1;12947:4;14464:6;12942:3;14455:16;;14448:27;14399:2;-1:-1;12283:9;14564:14;-1:-1;;14560:28;8235:39;;;;12947:4;8235:39;;8026:253;-1:-1;;8026:253::o;9616:222::-;-1:-1;;;;;13541:54;;;;7776:37;;9743:2;9728:18;;9714:124::o;9845:656::-;-1:-1;;;;;13541:54;;;7635:58;;13541:54;;10255:2;10240:18;;7776:37;10338:2;10323:18;;9567:37;;;10082:3;10375:2;10360:18;;10353:48;;;9845:656;;10415:76;;10067:19;;10477:6;10415:76;:::i;:::-;10407:84;10053:448;-1:-1;;;;;;10053:448::o;10508:210::-;13302:13;;13295:21;7890:34;;10629:2;10614:18;;10600:118::o;10725:310::-;;10872:2;10893:17;10886:47;10947:78;10872:2;10861:9;10857:18;11011:6;10947:78;:::i;11042:503::-;;11234:2;11223:9;11219:18;11234:2;11255:17;11248:47;-1:-1;8784:5;8778:12;8818:1;;8807:9;8803:17;8831:1;8826:248;;;;9085:1;9080:402;;;;8796:686;;8826:248;8900:1;8885:17;;8904:4;8881:28;12898:19;;-1:-1;;9013:25;;12938:14;;;9001:38;9053:14;;;;-1:-1;8826:248;;9080:402;9149:1;9138:9;9134:17;12910:6;12905:3;12898:19;9258:38;9290:5;9258:38;:::i;:::-;-1:-1;9320:130;9334:6;9331:1;9328:13;9320:130;;;9393:14;;9380:11;;;12938:14;9380:11;9373:35;9427:15;;;;12947:4;9349:12;9320:130;;;9464:11;;12938:14;9464:11;;-1:-1;;;8796:686;;;;11432:9;11426:4;11422:20;11417:2;11406:9;11402:18;11395:48;11457:78;11530:4;11521:6;11457:78;:::i;11552:222::-;9567:37;;;11679:2;11664:18;;11650:124::o;12373:158::-;;12468:14;;;12510:4;12497:18;;;12427:104::o;14601:117::-;-1:-1;;;;;13541:54;;14660:35;;14650:2;;14709:1;;14699:12;14843:115;-1:-1;;;;;;13389:78;;14901:34;;14891:2;;14949:1;;14939:12

Swarm Source

ipfs://b3396645be33dd480d22b1a0c49deddfbfa083719e31cc0db8908c72c416aff1
Loading