ETH Price: $3,482.72 (+2.54%)

Contract

0x5465A6F97B6C8B9016611dE75508404fb5704ab6
 

Overview

ETH Balance

0.049 ETH

Eth Value

$170.65 (@ $3,482.72/ETH)

More Info

Private Name Tags

TokenTracker

Multichain Info

1 address found via
Transaction Hash
Method
Block
From
To
Set Approval For...214255712024-12-17 23:34:117 days ago1734478451IN
0x5465A6F9...fb5704ab6
0 ETH0.0003498714.15626635
Set Approval For...196601032024-04-15 9:45:11253 days ago1713174311IN
0x5465A6F9...fb5704ab6
0 ETH0.0006925514.85305099
Set Approval For...196236882024-04-10 7:17:35259 days ago1712733455IN
0x5465A6F9...fb5704ab6
0 ETH0.0006916614.83398176
Set Approval For...195211282024-03-26 21:00:23273 days ago1711486823IN
0x5465A6F9...fb5704ab6
0 ETH0.0016729135.88784814
Set Approval For...194196962024-03-12 14:48:23287 days ago1710254903IN
0x5465A6F9...fb5704ab6
0 ETH0.0038595782.92483649
Set Approval For...192694402024-02-20 14:15:23308 days ago1708438523IN
0x5465A6F9...fb5704ab6
0 ETH0.0029935464.20192737
Set Approval For...192457842024-02-17 6:25:11312 days ago1708151111IN
0x5465A6F9...fb5704ab6
0 ETH0.0007393115.88461679
Set Approval For...189103782024-01-01 5:01:11359 days ago1704085271IN
0x5465A6F9...fb5704ab6
0 ETH0.0002902210.85887034
Set Approval For...189103772024-01-01 5:00:59359 days ago1704085259IN
0x5465A6F9...fb5704ab6
0 ETH0.0004959510.63669439
Set Approval For...188027282023-12-17 2:17:59374 days ago1702779479IN
0x5465A6F9...fb5704ab6
0 ETH0.0009138836.97709247
Set Approval For...181940632023-09-22 21:30:11459 days ago1695418211IN
0x5465A6F9...fb5704ab6
0 ETH0.000177987.22595951
Set Approval For...173830242023-06-01 2:34:11573 days ago1685586851IN
0x5465A6F9...fb5704ab6
0 ETH0.0022767848.91789741
Set Approval For...172887692023-05-18 20:20:23586 days ago1684441223IN
0x5465A6F9...fb5704ab6
0 ETH0.002391351.37833447
Set Approval For...171024062023-04-22 14:14:11612 days ago1682172851IN
0x5465A6F9...fb5704ab6
0 ETH0.0016014934.40890661
Set Approval For...169923632023-04-06 22:00:47628 days ago1680818447IN
0x5465A6F9...fb5704ab6
0 ETH0.0012311926.45281612
Set Approval For...167513552023-03-03 23:53:35662 days ago1677887615IN
0x5465A6F9...fb5704ab6
0 ETH0.0016050434.42312296
Set Approval For...163992812023-01-13 17:11:47711 days ago1673629907IN
0x5465A6F9...fb5704ab6
0 ETH0.0017929938.52339192
Set Approval For...163839602023-01-11 13:46:59713 days ago1673444819IN
0x5465A6F9...fb5704ab6
0 ETH0.0008888719.09786727
Set Approval For...163066842022-12-31 18:57:59724 days ago1672513079IN
0x5465A6F9...fb5704ab6
0 ETH0.000797417.10627749
Set Approval For...162959742022-12-30 7:03:59726 days ago1672383839IN
0x5465A6F9...fb5704ab6
0 ETH0.0007521816.13611004
Set Approval For...162928942022-12-29 20:46:59726 days ago1672346819IN
0x5465A6F9...fb5704ab6
0 ETH0.0009693320.79439529
Set Approval For...162591062022-12-25 3:34:11731 days ago1671939251IN
0x5465A6F9...fb5704ab6
0 ETH0.000631113.55957373
Set Approval For...161654792022-12-12 1:54:59744 days ago1670810099IN
0x5465A6F9...fb5704ab6
0 ETH0.000662814.21495683
Set Approval For...161305432022-12-07 4:37:59749 days ago1670387879IN
0x5465A6F9...fb5704ab6
0 ETH0.0006698714.39264736
Set Approval For...160771862022-11-29 17:37:59756 days ago1669743479IN
0x5465A6F9...fb5704ab6
0 ETH0.0005679312.18354138
View all transactions

Latest 8 internal transactions

Advanced mode:
Parent Transaction Hash Block
From
To
143838782022-03-14 9:25:121016 days ago1647249912
0x5465A6F9...fb5704ab6
6.272 ETH
143799432022-03-13 18:40:061017 days ago1647196806
0x5465A6F9...fb5704ab6
6.272 ETH
143798282022-03-13 18:11:581017 days ago1647195118
0x5465A6F9...fb5704ab6
6.272 ETH
143797822022-03-13 18:02:431017 days ago1647194563
0x5465A6F9...fb5704ab6
6.272 ETH
143794222022-03-13 16:47:141017 days ago1647190034
0x5465A6F9...fb5704ab6
6.272 ETH
143685302022-03-11 23:53:001019 days ago1647042780
0x5465A6F9...fb5704ab6
6.272 ETH
143684802022-03-11 23:40:421019 days ago1647042042
0x5465A6F9...fb5704ab6
6.272 ETH
143684752022-03-11 23:39:411019 days ago1647041981
0x5465A6F9...fb5704ab6
6.272 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Maxigoons

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 8 : Maxigoons.sol
//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.0;

import "./NFT.sol";

contract Maxigoons is NFT {
  constructor(address vrfCoordinator, address linkToken)
    ERC721a("Maxigoons", "GOON")
    NFT(
      7007, // Max supply
      707, // Reserve amount
      100, // Max per wallet
      "bafybeicxiym4ou5ephvt4j66if3axll3s3uq7axspgcdjr5tvrtrfboqsa", // Content ID (CID)
      "bab93ab37b236a32545c4bb2239ac9da276bc18324bcdcf0d86e0d225299db7b", // Provenance Hash
      0x9d14CAea98d6Ef30Ae169c361D2540dd680Bc280, // Vault address
      vrfCoordinator,
      linkToken
    )
  {}

  function claim(bytes32[] memory proof) public {
    _sell(0, 1, 0, proof);
  }

  function presale(uint256 amount, bytes32[] memory proof) public payable {
    _sell(1, amount, msg.value, proof);
  }

  function buy(uint256 amount) public payable {
    _sell(2, amount, msg.value, new bytes32[](0));
  }

  function mint(
    uint256 index,
    uint256 amount,
    bytes32[] memory proof
  ) public payable {
    _sell(index, amount, msg.value, proof);
  }
}

File 2 of 8 : NFT.sol
//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol";
import "@chainlink/contracts/src/v0.8/VRFConsumerBase.sol";
import "./ERC721a.sol";

abstract contract NFT is ERC721a, VRFConsumerBase {
  struct Sale {
    uint256 unitPrice;
    uint256 maxAmount;
    bytes32 treeRoot;
  }

  event OwnerUpdated(address indexed user, address indexed newOwner);

  event Revealed(uint256 seed, bytes32 requestId);

  bool public enabled;

  address public owner;

  address public vault;

  string public contentId;

  string public provenance;

  uint256 public maxSupply;

  uint256 public maxPerWallet;

  uint256 public reserveAmount;

  uint256 public seed;

  uint256 public level;

  uint256 public vrfFee = 2 * 10**18;

  bytes32 public vrfHash =
    0xAA77729D3466CA35AE8D28B3BBAC7CC36A5031EFDC430821C02BC31A238AF445;

  Sale[] public sales;

  mapping(uint256 => mapping(address => uint256)) public balanceOfSale;

  constructor(
    uint256 _maxSupply,
    uint256 _reserveAmount,
    uint256 _maxPerWallet,
    string memory _contentId,
    string memory _provenance,
    address _vault,
    address vrfCoordinator,
    address linkToken
  ) VRFConsumerBase(vrfCoordinator, linkToken) {
    maxSupply = _maxSupply;
    reserveAmount = _reserveAmount;
    maxPerWallet = _maxPerWallet;
    contentId = _contentId;
    provenance = _provenance;
    vault = _vault;

    owner = msg.sender;
  }

  modifier onlyOwner() {
    require(msg.sender == owner, "401");
    _;
  }

  function updateOwner(address newOwner) external onlyOwner {
    owner = newOwner;

    emit OwnerUpdated(msg.sender, newOwner);
  }

  function setVRF(uint256 fee, bytes32 _hash) external onlyOwner {
    vrfFee = fee;
    vrfHash = _hash;
  }

  function setSale(
    uint256 index,
    uint256 unitPrice,
    uint256 maxAmount,
    bytes32 treeRoot
  ) external onlyOwner {
    require(index <= sales.length, "422");

    if (index == sales.length) {
      // Create
      sales.push(Sale(unitPrice, maxAmount, treeRoot));
    } else {
      // Update
      Sale storage sale = sales[index];

      sale.unitPrice = unitPrice;
      sale.maxAmount = maxAmount;
      sale.treeRoot = treeRoot;
    }
  }

  function setLevel(uint256 index) external onlyOwner {
    require(sales.length > 0 && index < sales.length, "422");

    level = index;
  }

  function enable() external onlyOwner {
    enabled = true;
  }

  function disable() external onlyOwner {
    enabled = false;
  }

  function reveal() public onlyOwner returns (bytes32) {
    require(seed == 0, "403");
    require(LINK.balanceOf(address(this)) >= vrfFee, "402");

    return requestRandomness(vrfHash, vrfFee);
  }

  function fulfillRandomness(bytes32 requestId, uint256 randomness)
    internal
    override
  {
    require(seed == 0, "403");

    seed = randomness;

    emit Revealed(randomness, requestId);
  }

  function hasLevel(
    uint256 index,
    address candidate,
    bytes32[] memory proof
  ) public view returns (bool) {
    require(index < sales.length, "404");

    Sale memory sale = sales[index];

    return
      MerkleProof.verify(
        proof,
        sale.treeRoot,
        keccak256(abi.encodePacked(candidate))
      );
  }

  function withdraw() external onlyOwner {
    payable(vault).transfer(address(this).balance);
  }

  function baseURI() public view virtual returns (string memory) {
    return string(abi.encodePacked("ipfs://", contentId, "/metadata/"));
  }

  function tokenURI(uint256 id) public view override returns (string memory) {
    require(_ownerOf(id) != address(0), "404");

    uint256 metaId;

    if (seed == 0) {
      // Conceal
      metaId = 0;
    } else {
      // Reveal
      metaId = _metadataOf(id);
    }

    return string(abi.encodePacked(baseURI(), toString(metaId), ".json"));
  }

  function contractURI() public view virtual returns (string memory) {
    return string(abi.encodePacked(baseURI(), "contract.json"));
  }

  function reserve(uint256 amount) public virtual onlyOwner {
    require(seed == 0, "403");
    require(totalSupply + amount <= maxSupply, "403");
    require(balanceOf[vault] + amount <= reserveAmount, "403");

    _safeMintBatch(vault, amount);
  }

  function _metadataOf(uint256 id) internal view returns (uint256) {
    uint256 seed_ = seed;

    uint256 max = maxSupply;

    uint256[] memory idToMeta = new uint256[](max);

    for (uint256 i = 0; i < max; i++) {
      idToMeta[i] = i;
    }

    for (uint256 i = 0; i < max - 1; i++) {
      uint256 j = i + (uint256(keccak256(abi.encode(seed_, i))) % (max - i));

      (idToMeta[i], idToMeta[j]) = (idToMeta[j], idToMeta[i]);
    }

    // Token ID starts at #1
    return idToMeta[id - 1] + 1;
  }

  function _sell(
    uint256 index,
    uint256 amount,
    uint256 value,
    bytes32[] memory proof
  ) internal {
    Sale memory sale = sales[index];

    bool isProtected = sale.treeRoot != 0;

    // Unauthorized
    require(enabled && sales.length > 0, "401");

    if (isProtected) {
      require(hasLevel(index, msg.sender, proof), "401");
    }

    // Payment required
    require(amount * sale.unitPrice == value, "402");

    // Forbidden
    require(index <= level, "403");
    require(balanceOf[msg.sender] + amount <= maxPerWallet, "403");
    require(totalSupply + amount <= maxSupply, "403");

    if (isProtected) {
      balanceOfSale[index][msg.sender] += amount;

      require(balanceOfSale[index][msg.sender] <= sale.maxAmount, "403");
    } else {
      // Open sale
      // Trick `sale.maxAmount` becomes `maxPerTx`
      require(amount <= sale.maxAmount, "403");
    }

    _safeMintBatch(msg.sender, amount);
  }
}

File 3 of 8 : MerkleProof.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

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

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

File 4 of 8 : VRFConsumerBase.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "./interfaces/LinkTokenInterface.sol";

import "./VRFRequestIDBase.sol";

/** ****************************************************************************
 * @notice Interface for contracts using VRF randomness
 * *****************************************************************************
 * @dev PURPOSE
 *
 * @dev Reggie the Random Oracle (not his real job) wants to provide randomness
 * @dev to Vera the verifier in such a way that Vera can be sure he's not
 * @dev making his output up to suit himself. Reggie provides Vera a public key
 * @dev to which he knows the secret key. Each time Vera provides a seed to
 * @dev Reggie, he gives back a value which is computed completely
 * @dev deterministically from the seed and the secret key.
 *
 * @dev Reggie provides a proof by which Vera can verify that the output was
 * @dev correctly computed once Reggie tells it to her, but without that proof,
 * @dev the output is indistinguishable to her from a uniform random sample
 * @dev from the output space.
 *
 * @dev The purpose of this contract is to make it easy for unrelated contracts
 * @dev to talk to Vera the verifier about the work Reggie is doing, to provide
 * @dev simple access to a verifiable source of randomness.
 * *****************************************************************************
 * @dev USAGE
 *
 * @dev Calling contracts must inherit from VRFConsumerBase, and can
 * @dev initialize VRFConsumerBase's attributes in their constructor as
 * @dev shown:
 *
 * @dev   contract VRFConsumer {
 * @dev     constructor(<other arguments>, address _vrfCoordinator, address _link)
 * @dev       VRFConsumerBase(_vrfCoordinator, _link) public {
 * @dev         <initialization with other arguments goes here>
 * @dev       }
 * @dev   }
 *
 * @dev The oracle will have given you an ID for the VRF keypair they have
 * @dev committed to (let's call it keyHash), and have told you the minimum LINK
 * @dev price for VRF service. Make sure your contract has sufficient LINK, and
 * @dev call requestRandomness(keyHash, fee, seed), where seed is the input you
 * @dev want to generate randomness from.
 *
 * @dev Once the VRFCoordinator has received and validated the oracle's response
 * @dev to your request, it will call your contract's fulfillRandomness method.
 *
 * @dev The randomness argument to fulfillRandomness is the actual random value
 * @dev generated from your seed.
 *
 * @dev The requestId argument is generated from the keyHash and the seed by
 * @dev makeRequestId(keyHash, seed). If your contract could have concurrent
 * @dev requests open, you can use the requestId to track which seed is
 * @dev associated with which randomness. See VRFRequestIDBase.sol for more
 * @dev details. (See "SECURITY CONSIDERATIONS" for principles to keep in mind,
 * @dev if your contract could have multiple requests in flight simultaneously.)
 *
 * @dev Colliding `requestId`s are cryptographically impossible as long as seeds
 * @dev differ. (Which is critical to making unpredictable randomness! See the
 * @dev next section.)
 *
 * *****************************************************************************
 * @dev SECURITY CONSIDERATIONS
 *
 * @dev A method with the ability to call your fulfillRandomness method directly
 * @dev could spoof a VRF response with any random value, so it's critical that
 * @dev it cannot be directly called by anything other than this base contract
 * @dev (specifically, by the VRFConsumerBase.rawFulfillRandomness method).
 *
 * @dev For your users to trust that your contract's random behavior is free
 * @dev from malicious interference, it's best if you can write it so that all
 * @dev behaviors implied by a VRF response are executed *during* your
 * @dev fulfillRandomness method. If your contract must store the response (or
 * @dev anything derived from it) and use it later, you must ensure that any
 * @dev user-significant behavior which depends on that stored value cannot be
 * @dev manipulated by a subsequent VRF request.
 *
 * @dev Similarly, both miners and the VRF oracle itself have some influence
 * @dev over the order in which VRF responses appear on the blockchain, so if
 * @dev your contract could have multiple VRF requests in flight simultaneously,
 * @dev you must ensure that the order in which the VRF responses arrive cannot
 * @dev be used to manipulate your contract's user-significant behavior.
 *
 * @dev Since the ultimate input to the VRF is mixed with the block hash of the
 * @dev block in which the request is made, user-provided seeds have no impact
 * @dev on its economic security properties. They are only included for API
 * @dev compatability with previous versions of this contract.
 *
 * @dev Since the block hash of the block which contains the requestRandomness
 * @dev call is mixed into the input to the VRF *last*, a sufficiently powerful
 * @dev miner could, in principle, fork the blockchain to evict the block
 * @dev containing the request, forcing the request to be included in a
 * @dev different block with a different hash, and therefore a different input
 * @dev to the VRF. However, such an attack would incur a substantial economic
 * @dev cost. This cost scales with the number of blocks the VRF oracle waits
 * @dev until it calls responds to a request.
 */
abstract contract VRFConsumerBase is VRFRequestIDBase {
  /**
   * @notice fulfillRandomness handles the VRF response. Your contract must
   * @notice implement it. See "SECURITY CONSIDERATIONS" above for important
   * @notice principles to keep in mind when implementing your fulfillRandomness
   * @notice method.
   *
   * @dev VRFConsumerBase expects its subcontracts to have a method with this
   * @dev signature, and will call it once it has verified the proof
   * @dev associated with the randomness. (It is triggered via a call to
   * @dev rawFulfillRandomness, below.)
   *
   * @param requestId The Id initially returned by requestRandomness
   * @param randomness the VRF output
   */
  function fulfillRandomness(bytes32 requestId, uint256 randomness) internal virtual;

  /**
   * @dev In order to keep backwards compatibility we have kept the user
   * seed field around. We remove the use of it because given that the blockhash
   * enters later, it overrides whatever randomness the used seed provides.
   * Given that it adds no security, and can easily lead to misunderstandings,
   * we have removed it from usage and can now provide a simpler API.
   */
  uint256 private constant USER_SEED_PLACEHOLDER = 0;

  /**
   * @notice requestRandomness initiates a request for VRF output given _seed
   *
   * @dev The fulfillRandomness method receives the output, once it's provided
   * @dev by the Oracle, and verified by the vrfCoordinator.
   *
   * @dev The _keyHash must already be registered with the VRFCoordinator, and
   * @dev the _fee must exceed the fee specified during registration of the
   * @dev _keyHash.
   *
   * @dev The _seed parameter is vestigial, and is kept only for API
   * @dev compatibility with older versions. It can't *hurt* to mix in some of
   * @dev your own randomness, here, but it's not necessary because the VRF
   * @dev oracle will mix the hash of the block containing your request into the
   * @dev VRF seed it ultimately uses.
   *
   * @param _keyHash ID of public key against which randomness is generated
   * @param _fee The amount of LINK to send with the request
   *
   * @return requestId unique ID for this request
   *
   * @dev The returned requestId can be used to distinguish responses to
   * @dev concurrent requests. It is passed as the first argument to
   * @dev fulfillRandomness.
   */
  function requestRandomness(bytes32 _keyHash, uint256 _fee) internal returns (bytes32 requestId) {
    LINK.transferAndCall(vrfCoordinator, _fee, abi.encode(_keyHash, USER_SEED_PLACEHOLDER));
    // This is the seed passed to VRFCoordinator. The oracle will mix this with
    // the hash of the block containing this request to obtain the seed/input
    // which is finally passed to the VRF cryptographic machinery.
    uint256 vRFSeed = makeVRFInputSeed(_keyHash, USER_SEED_PLACEHOLDER, address(this), nonces[_keyHash]);
    // nonces[_keyHash] must stay in sync with
    // VRFCoordinator.nonces[_keyHash][this], which was incremented by the above
    // successful LINK.transferAndCall (in VRFCoordinator.randomnessRequest).
    // This provides protection against the user repeating their input seed,
    // which would result in a predictable/duplicate output, if multiple such
    // requests appeared in the same block.
    nonces[_keyHash] = nonces[_keyHash] + 1;
    return makeRequestId(_keyHash, vRFSeed);
  }

  LinkTokenInterface internal immutable LINK;
  address private immutable vrfCoordinator;

  // Nonces for each VRF key from which randomness has been requested.
  //
  // Must stay in sync with VRFCoordinator[_keyHash][this]
  mapping(bytes32 => uint256) /* keyHash */ /* nonce */
    private nonces;

  /**
   * @param _vrfCoordinator address of VRFCoordinator contract
   * @param _link address of LINK token contract
   *
   * @dev https://docs.chain.link/docs/link-token-contracts
   */
  constructor(address _vrfCoordinator, address _link) {
    vrfCoordinator = _vrfCoordinator;
    LINK = LinkTokenInterface(_link);
  }

  // rawFulfillRandomness is called by VRFCoordinator when it receives a valid VRF
  // proof. rawFulfillRandomness then calls fulfillRandomness, after validating
  // the origin of the call
  function rawFulfillRandomness(bytes32 requestId, uint256 randomness) external {
    require(msg.sender == vrfCoordinator, "Only VRFCoordinator can fulfill");
    fulfillRandomness(requestId, randomness);
  }
}

File 5 of 8 : ERC721a.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

import "./ERC721TokenReceiver.sol";

/// @notice Credits: https://github.com/chiru-labs/ERC721A/blob/main/contracts/ERC721A.sol

/// @dev Note Assumes serials are sequentially minted starting at 1 (e.g. 1, 2, 3, 4...).
/// @dev Note Does not support burning tokens to address(0).

/// @author Modified from solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC721.sol)

abstract contract ERC721a {
  /*///////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

  event Transfer(address indexed from, address indexed to, uint256 indexed id);

  event Approval(
    address indexed owner,
    address indexed spender,
    uint256 indexed id
  );

  event ApprovalForAll(
    address indexed owner,
    address indexed operator,
    bool approved
  );

  /*///////////////////////////////////////////////////////////////
                          METADATA STORAGE/LOGIC
    //////////////////////////////////////////////////////////////*/

  string public name;

  string public symbol;

  function tokenURI(uint256 id) public view virtual returns (string memory);

  /*///////////////////////////////////////////////////////////////
                            ERC721 STORAGE                        
    //////////////////////////////////////////////////////////////*/

  uint256 public totalSupply;

  mapping(address => uint256) public balanceOf;

  mapping(uint256 => address) public getApproved;

  mapping(address => mapping(address => bool)) public isApprovedForAll;

  mapping(uint256 => address) internal owners;

  /*///////////////////////////////////////////////////////////////
                              CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

  constructor(string memory _name, string memory _symbol) {
    name = _name;
    symbol = _symbol;
  }

  /*///////////////////////////////////////////////////////////////
                              ERC721 LOGIC
    //////////////////////////////////////////////////////////////*/

  function setApprovalForAll(address operator, bool approved) public virtual {
    isApprovedForAll[msg.sender][operator] = approved;

    emit ApprovalForAll(msg.sender, operator, approved);
  }

  function safeTransferFrom(
    address from,
    address to,
    uint256 id
  ) public virtual {
    transferFrom(from, to, id);

    require(
      to.code.length == 0 ||
        ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, "") ==
        ERC721TokenReceiver.onERC721Received.selector,
      "UNSAFE_RECIPIENT"
    );
  }

  function safeTransferFrom(
    address from,
    address to,
    uint256 id,
    bytes memory data
  ) public virtual {
    transferFrom(from, to, id);

    require(
      to.code.length == 0 ||
        ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, data) ==
        ERC721TokenReceiver.onERC721Received.selector,
      "UNSAFE_RECIPIENT"
    );
  }

  /*///////////////////////////////////////////////////////////////
                              ERC721a LOGIC
    //////////////////////////////////////////////////////////////*/

  function ownerOf(uint256 id) public view returns (address) {
    return _ownerOf(id);
  }

  function approve(address spender, uint256 id) public {
    address owner = _ownerOf(id);

    require(
      msg.sender == owner || isApprovedForAll[owner][msg.sender],
      "NOT_AUTHORIZED"
    );

    getApproved[id] = spender;

    emit Approval(owner, spender, id);
  }

  function transferFrom(
    address from,
    address to,
    uint256 id
  ) public {
    address owner = _ownerOf(id);

    require(from == owner, "WRONG_FROM");

    require(to != address(0), "INVALID_RECIPIENT");

    require(
      msg.sender == from ||
        msg.sender == getApproved[id] ||
        isApprovedForAll[from][msg.sender],
      "NOT_AUTHORIZED"
    );

    // https://github.com/chiru-labs/ERC721A/blob/main/contracts/ERC721A.sol#L395
    unchecked {
      balanceOf[from]--;

      balanceOf[to]++;
    }

    owners[id] = to;

    // https://github.com/chiru-labs/ERC721A/blob/main/contracts/ERC721A.sol#L405
    if (id + 1 <= totalSupply && owners[id + 1] == address(0)) {
      owners[id + 1] = owner;
    }

    delete getApproved[id];

    emit Transfer(from, to, id);
  }

  function _safeMintBatch(address to, uint256 amount) internal {
    _safeMintBatch(to, amount, "");
  }

  function _safeMintBatch(
    address to,
    uint256 amount,
    bytes memory data
  ) internal {
    _mintBatch(to, amount, data, true);
  }

  function _mintBatch(address to, uint256 amount) internal {
    _mintBatch(to, amount, "", false);
  }

  function _mintBatch(
    address to,
    uint256 amount,
    bytes memory data
  ) internal {
    _mintBatch(to, amount, data, false);
  }

  function _mintBatch(
    address to,
    uint256 amount,
    bytes memory data,
    bool safe
  ) internal {
    require(to != address(0), "INVALID_RECIPIENT");

    unchecked {
      uint256 id = totalSupply + 1;

      totalSupply += amount;
      balanceOf[to] += amount;
      owners[id] = to;

      for (uint256 i = 0; i < amount; i++) {
        emit Transfer(address(0), to, id);

        if (safe) {
          require(
            to.code.length == 0 ||
              ERC721TokenReceiver(to).onERC721Received(
                msg.sender,
                address(0),
                id,
                data
              ) ==
              ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
          );
        }

        id++;
      }
    }
  }

  function _ownerOf(uint256 id) internal view returns (address) {
    if (id > totalSupply) {
      return address(0);
    }

    unchecked {
      while (id > 0) {
        if (owners[id] != address(0)) {
          return owners[id];
        }

        id--;
      }
    }

    // Happens only when `id == 0`
    return address(0);
  }

  /// @notice Credits: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Strings.sol#L15

  function toString(uint256 value) internal pure returns (string memory) {
    // Inspired by OraclizeAPI's implementation - MIT licence
    // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

    if (value == 0) {
      return "0";
    }
    uint256 temp = value;
    uint256 digits;
    while (temp != 0) {
      digits++;
      temp /= 10;
    }
    bytes memory buffer = new bytes(digits);
    while (value != 0) {
      digits -= 1;
      buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
      value /= 10;
    }
    return string(buffer);
  }

  /*///////////////////////////////////////////////////////////////
                              ERC165 LOGIC
    //////////////////////////////////////////////////////////////*/

  function supportsInterface(bytes4 interfaceId)
    public
    pure
    virtual
    returns (bool)
  {
    return
      interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165
      interfaceId == 0x80ac58cd || // ERC165 Interface ID for ERC721
      interfaceId == 0x5b5e139f; // ERC165 Interface ID for ERC721Metadata
  }
}

File 6 of 8 : LinkTokenInterface.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface LinkTokenInterface {
  function allowance(address owner, address spender) external view returns (uint256 remaining);

  function approve(address spender, uint256 value) external returns (bool success);

  function balanceOf(address owner) external view returns (uint256 balance);

  function decimals() external view returns (uint8 decimalPlaces);

  function decreaseApproval(address spender, uint256 addedValue) external returns (bool success);

  function increaseApproval(address spender, uint256 subtractedValue) external;

  function name() external view returns (string memory tokenName);

  function symbol() external view returns (string memory tokenSymbol);

  function totalSupply() external view returns (uint256 totalTokensIssued);

  function transfer(address to, uint256 value) external returns (bool success);

  function transferAndCall(
    address to,
    uint256 value,
    bytes calldata data
  ) external returns (bool success);

  function transferFrom(
    address from,
    address to,
    uint256 value
  ) external returns (bool success);
}

File 7 of 8 : VRFRequestIDBase.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract VRFRequestIDBase {
  /**
   * @notice returns the seed which is actually input to the VRF coordinator
   *
   * @dev To prevent repetition of VRF output due to repetition of the
   * @dev user-supplied seed, that seed is combined in a hash with the
   * @dev user-specific nonce, and the address of the consuming contract. The
   * @dev risk of repetition is mostly mitigated by inclusion of a blockhash in
   * @dev the final seed, but the nonce does protect against repetition in
   * @dev requests which are included in a single block.
   *
   * @param _userSeed VRF seed input provided by user
   * @param _requester Address of the requesting contract
   * @param _nonce User-specific nonce at the time of the request
   */
  function makeVRFInputSeed(
    bytes32 _keyHash,
    uint256 _userSeed,
    address _requester,
    uint256 _nonce
  ) internal pure returns (uint256) {
    return uint256(keccak256(abi.encode(_keyHash, _userSeed, _requester, _nonce)));
  }

  /**
   * @notice Returns the id for this request
   * @param _keyHash The serviceAgreement ID to be used for this request
   * @param _vRFInputSeed The seed to be passed directly to the VRF
   * @return The id for this request
   *
   * @dev Note that _vRFInputSeed is not the seed passed by the consuming
   * @dev contract, but the one generated by makeVRFInputSeed
   */
  function makeRequestId(bytes32 _keyHash, uint256 _vRFInputSeed) internal pure returns (bytes32) {
    return keccak256(abi.encodePacked(_keyHash, _vRFInputSeed));
  }
}

File 8 of 8 : ERC721TokenReceiver.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

/// @notice A generic interface for a contract which properly accepts ERC721 tokens.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC721.sol)
interface ERC721TokenReceiver {
  function onERC721Received(
    address operator,
    address from,
    uint256 id,
    bytes calldata data
  ) external returns (bytes4);
}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"vrfCoordinator","type":"address"},{"internalType":"address","name":"linkToken","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","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":"user","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"seed","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"requestId","type":"bytes32"}],"name":"Revealed","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":"id","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"balanceOfSale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"buy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contentId","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"address","name":"candidate","type":"address"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"hasLevel","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"level","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"presale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"provenance","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"},{"internalType":"uint256","name":"randomness","type":"uint256"}],"name":"rawFulfillRandomness","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"reserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reveal","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","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":"id","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"sales","outputs":[{"internalType":"uint256","name":"unitPrice","type":"uint256"},{"internalType":"uint256","name":"maxAmount","type":"uint256"},{"internalType":"bytes32","name":"treeRoot","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"seed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"setLevel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"unitPrice","type":"uint256"},{"internalType":"uint256","name":"maxAmount","type":"uint256"},{"internalType":"bytes32","name":"treeRoot","type":"bytes32"}],"name":"setSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"bytes32","name":"_hash","type":"bytes32"}],"name":"setVRF","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","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":"id","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"updateOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vrfFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vrfHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c0604052671bc16d674ec800006011557faa77729d3466ca35ae8d28b3bbac7cc36a5031efdc430821c02bc31a238af44560001b6012553480156200004457600080fd5b50604051620051963803806200519683398181016040528101906200006a91906200036f565b611b5f6102c360646040518060600160405280603b81526020016200511b603b91396040518060600160405280604081526020016200515660409139739d14caea98d6ef30ae169c361d2540dd680bc280878781816040518060400160405280600981526020017f4d617869676f6f6e7300000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f474f4f4e00000000000000000000000000000000000000000000000000000000815250816000908051906020019062000143929190620002a8565b5080600190805190602001906200015c929190620002a8565b5050508173ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b81525050505087600c8190555086600e8190555085600d8190555084600a9080519060200190620001fc929190620002a8565b5083600b908051906020019062000215929190620002a8565b5082600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600860016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505050505062000463565b828054620002b690620003e4565b90600052602060002090601f016020900481019282620002da576000855562000326565b82601f10620002f557805160ff191683800117855562000326565b8280016001018555821562000326579182015b828111156200032557825182559160200191906001019062000308565b5b50905062000335919062000339565b5090565b5b80821115620003545760008160009055506001016200033a565b5090565b600081519050620003698162000449565b92915050565b600080604083850312156200038357600080fd5b6000620003938582860162000358565b9250506020620003a68582860162000358565b9150509250929050565b6000620003bd82620003c4565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006002820490506001821680620003fd57607f821691505b602082108114156200041457620004136200041a565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6200045481620003b0565b81146200046057600080fd5b50565b60805160601c60a05160601c614c7e6200049d60003960008181611de0015261288201526000818161218e01526128460152614c7e6000f3fe6080604052600436106102725760003560e01c80637d94792a1161014f578063b391c508116100c1578063d96a094a1161007a578063d96a094a14610933578063d97aa9771461094f578063e6d37b881461097a578063e8a3d48514610996578063e985e9c5146109c1578063fbfa77cf146109fe57610272565b8063b391c5081461081e578063b5f522f714610847578063b88d4fde14610886578063c13bd95c146108af578063c87b56dd146108cb578063d5abeb011461090857610272565b8063907316d011610113578063907316d01461073457806394985ddd1461075f57806395d89b4114610788578063a22cb465146107b3578063a3907d71146107dc578063a475b5dd146107f357610272565b80637d94792a1461064f578063819b25ba1461067a57806381e3e88a146106a3578063880cdc31146106e05780638da5cb5b1461070957610272565b80632f2770db116101e85780634b09b72a116101ac5780634b09b72a146105175780635feb1446146105425780636352211e1461057f5780636c0360eb146105bc5780636fd5ae15146105e757806370a082311461061257610272565b80632f2770db1461046c5780633ccfd60b1461048357806342842e0e1461049a578063453c2310146104c357806349f2f929146104ee57610272565b80631017507d1161023a5780631017507d1461037057806318160ddd1461039b57806319f428fa146103c6578063238dafe0146103ef57806323b872dd1461041a57806327a5428b1461044357610272565b806301ffc9a71461027757806306fdde03146102b4578063081812fc146102df578063095ea7b31461031c5780630f7309e814610345575b600080fd5b34801561028357600080fd5b5061029e60048036038101906102999190613a47565b610a29565b6040516102ab919061424c565b60405180910390f35b3480156102c057600080fd5b506102c9610abb565b6040516102d691906142f0565b60405180910390f35b3480156102eb57600080fd5b5061030660048036038101906103019190613a99565b610b49565b604051610313919061415d565b60405180910390f35b34801561032857600080fd5b50610343600480360381019061033e9190613965565b610b7c565b005b34801561035157600080fd5b5061035a610d3a565b60405161036791906142f0565b60405180910390f35b34801561037c57600080fd5b50610385610dc8565b6040516103929190614452565b60405180910390f35b3480156103a757600080fd5b506103b0610dce565b6040516103bd9190614452565b60405180910390f35b3480156103d257600080fd5b506103ed60048036038101906103e89190613be2565b610dd4565b005b3480156103fb57600080fd5b50610404610e76565b604051610411919061424c565b60405180910390f35b34801561042657600080fd5b50610441600480360381019061043c919061385f565b610e89565b005b34801561044f57600080fd5b5061046a60048036038101906104659190613a99565b611351565b005b34801561047857600080fd5b50610481611443565b005b34801561048f57600080fd5b506104986114f0565b005b3480156104a657600080fd5b506104c160048036038101906104bc919061385f565b6115eb565b005b3480156104cf57600080fd5b506104d8611732565b6040516104e59190614452565b60405180910390f35b3480156104fa57600080fd5b5061051560048036038101906105109190613c85565b611738565b005b34801561052357600080fd5b5061052c6118f7565b6040516105399190614452565b60405180910390f35b34801561054e57600080fd5b5061056960048036038101906105649190613aeb565b6118fd565b6040516105769190614452565b60405180910390f35b34801561058b57600080fd5b506105a660048036038101906105a19190613a99565b611922565b6040516105b3919061415d565b60405180910390f35b3480156105c857600080fd5b506105d1611934565b6040516105de91906142f0565b60405180910390f35b3480156105f357600080fd5b506105fc61195c565b6040516106099190614452565b60405180910390f35b34801561061e57600080fd5b50610639600480360381019061063491906137fa565b611962565b6040516106469190614452565b60405180910390f35b34801561065b57600080fd5b5061066461197a565b6040516106719190614452565b60405180910390f35b34801561068657600080fd5b506106a1600480360381019061069c9190613a99565b611980565b005b3480156106af57600080fd5b506106ca60048036038101906106c59190613b27565b611b87565b6040516106d7919061424c565b60405180910390f35b3480156106ec57600080fd5b50610707600480360381019061070291906137fa565b611c84565b005b34801561071557600080fd5b5061071e611db2565b60405161072b919061415d565b60405180910390f35b34801561074057600080fd5b50610749611dd8565b6040516107569190614267565b60405180910390f35b34801561076b57600080fd5b5061078660048036038101906107819190613a0b565b611dde565b005b34801561079457600080fd5b5061079d611e7a565b6040516107aa91906142f0565b60405180910390f35b3480156107bf57600080fd5b506107da60048036038101906107d59190613929565b611f08565b005b3480156107e857600080fd5b506107f1612005565b005b3480156107ff57600080fd5b506108086120b2565b6040516108159190614267565b60405180910390f35b34801561082a57600080fd5b50610845600480360381019061084091906139a1565b612289565b005b34801561085357600080fd5b5061086e60048036038101906108699190613a99565b61229b565b60405161087d939291906144bf565b60405180910390f35b34801561089257600080fd5b506108ad60048036038101906108a891906138ae565b6122d5565b005b6108c960048036038101906108c49190613b8e565b61241f565b005b3480156108d757600080fd5b506108f260048036038101906108ed9190613a99565b612430565b6040516108ff91906142f0565b60405180910390f35b34801561091457600080fd5b5061091d612504565b60405161092a9190614452565b60405180910390f35b61094d60048036038101906109489190613a99565b61250a565b005b34801561095b57600080fd5b50610964612589565b60405161097191906142f0565b60405180910390f35b610994600480360381019061098f9190613c1e565b612617565b005b3480156109a257600080fd5b506109ab612628565b6040516109b891906142f0565b60405180910390f35b3480156109cd57600080fd5b506109e860048036038101906109e39190613823565b612656565b6040516109f5919061424c565b60405180910390f35b348015610a0a57600080fd5b50610a13612685565b604051610a20919061415d565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a8457506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ab45750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60008054610ac8906147a5565b80601f0160208091040260200160405190810160405280929190818152602001828054610af4906147a5565b8015610b415780601f10610b1657610100808354040283529160200191610b41565b820191906000526020600020905b815481529060010190602001808311610b2457829003601f168201915b505050505081565b60046020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000610b87826126ab565b90508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610c495750600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b610c88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7f90614412565b60405180910390fd5b826004600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600b8054610d47906147a5565b80601f0160208091040260200160405190810160405280929190818152602001828054610d73906147a5565b8015610dc05780601f10610d9557610100808354040283529160200191610dc0565b820191906000526020600020905b815481529060010190602001808311610da357829003601f168201915b505050505081565b60115481565b60025481565b600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5b90614332565b60405180910390fd5b81601181905550806012819055505050565b600860009054906101000a900460ff1681565b6000610e94826126ab565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614610f04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efb90614432565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6b90614372565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061100c57506004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061109d5750600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6110dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d390614412565b60405180910390fd5b600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600190039190505550600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506002546001836111dd91906145d0565b111580156112565750600073ffffffffffffffffffffffffffffffffffffffff166006600060018561120f91906145d0565b815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b156112ba57806006600060018561126d91906145d0565b815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b6004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a450505050565b600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146113e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d890614332565b60405180910390fd5b60006013805490501180156113fa575060138054905081105b611439576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143090614352565b60405180910390fd5b8060108190555050565b600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ca90614332565b60405180910390fd5b6000600860006101000a81548160ff021916908315150217905550565b600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611580576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157790614332565b60405180910390fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156115e8573d6000803e3d6000fd5b50565b6115f6838383610e89565b60008273ffffffffffffffffffffffffffffffffffffffff163b14806116ee575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168273ffffffffffffffffffffffffffffffffffffffff1663150b7a023386856040518463ffffffff1660e01b815260040161167b939291906141c4565b602060405180830381600087803b15801561169557600080fd5b505af11580156116a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116cd9190613a70565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b61172d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611724906143b2565b60405180910390fd5b505050565b600d5481565b600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117bf90614332565b60405180910390fd5b601380549050841115611810576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180790614352565b60405180910390fd5b601380549050841415611888576013604051806060016040528085815260200184815260200183815250908060018154018082558091505060019003906000526020600020906003020160009091909190915060008201518160000155602082015181600101556040820151816002015550506118f1565b6000601385815481106118c4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600302019050838160000181905550828160010181905550818160020181905550505b50505050565b600e5481565b6014602052816000526040600020602052806000526040600020600091509150505481565b600061192d826126ab565b9050919050565b6060600a6040516020016119489190614130565b604051602081830303815290604052905090565b60105481565b60036020528060005260406000206000915090505481565b600f5481565b600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0790614332565b60405180910390fd5b6000600f5414611a55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4c90614312565b60405180910390fd5b600c5481600254611a6691906145d0565b1115611aa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9e90614312565b60405180910390fd5b600e548160036000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611b1791906145d0565b1115611b58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4f90614312565b60405180910390fd5b611b84600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682612784565b50565b60006013805490508410611bd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc7906143f2565b60405180910390fd5b600060138581548110611c0c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906003020160405180606001604052908160008201548152602001600182015481526020016002820154815250509050611c7a83826040015186604051602001611c5f9190614098565b604051602081830303815290604052805190602001206127a2565b9150509392505050565b600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0b90614332565b60405180910390fd5b80600860016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d7660405160405180910390a350565b600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60125481565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611e6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e63906143d2565b60405180910390fd5b611e7682826127b9565b5050565b60018054611e87906147a5565b80601f0160208091040260200160405190810160405280929190818152602001828054611eb3906147a5565b8015611f005780601f10611ed557610100808354040283529160200191611f00565b820191906000526020600020905b815481529060010190602001808311611ee357829003601f168201915b505050505081565b80600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ff9919061424c565b60405180910390a35050565b600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612095576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208c90614332565b60405180910390fd5b6001600860006101000a81548160ff021916908315150217905550565b6000600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612144576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213b90614332565b60405180910390fd5b6000600f5414612189576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218090614312565b60405180910390fd5b6011547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016121e5919061415d565b60206040518083038186803b1580156121fd57600080fd5b505afa158015612211573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122359190613ac2565b1015612276576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226d90614392565b60405180910390fd5b612284601254601154612842565b905090565b612298600060016000846129a4565b50565b601381815481106122ab57600080fd5b90600052602060002090600302016000915090508060000154908060010154908060020154905083565b6122e0848484610e89565b60008373ffffffffffffffffffffffffffffffffffffffff163b14806123da575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168373ffffffffffffffffffffffffffffffffffffffff1663150b7a02338786866040518563ffffffff1660e01b81526004016123679493929190614178565b602060405180830381600087803b15801561238157600080fd5b505af1158015612395573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123b99190613a70565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b612419576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612410906143b2565b60405180910390fd5b50505050565b61242c60018334846129a4565b5050565b6060600073ffffffffffffffffffffffffffffffffffffffff16612453836126ab565b73ffffffffffffffffffffffffffffffffffffffff1614156124aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a1906143f2565b60405180910390fd5b600080600f5414156124bf57600090506124cb565b6124c883612db3565b90505b6124d3611934565b6124dc82613086565b6040516020016124ed9291906140df565b604051602081830303815290604052915050919050565b600c5481565b61258660028234600067ffffffffffffffff811115612552577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156125805781602001602082028036833780820191505090505b506129a4565b50565b600a8054612596906147a5565b80601f01602080910402602001604051908101604052809291908181526020018280546125c2906147a5565b801561260f5780601f106125e45761010080835404028352916020019161260f565b820191906000526020600020905b8154815290600101906020018083116125f257829003601f168201915b505050505081565b612623838334846129a4565b505050565b6060612632611934565b604051602001612642919061410e565b604051602081830303815290604052905090565b60056020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006002548211156126c0576000905061277f565b5b600082111561277a57600073ffffffffffffffffffffffffffffffffffffffff166006600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461276c576006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905061277f565b8180600190039250506126c1565b600090505b919050565b61279e828260405180602001604052806000815250613233565b5050565b6000826127af8584613245565b1490509392505050565b6000600f54146127fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f590614312565b60405180910390fd5b80600f819055507f7d69e344e8948ee2d0ae2411f140ed9d811e9281db0368d2f77a802d9d8346f5818360405161283692919061446d565b60405180910390a15050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16634000aea07f0000000000000000000000000000000000000000000000000000000000000000848660006040516020016128b6929190614282565b6040516020818303038152906040526040518463ffffffff1660e01b81526004016128e39392919061420e565b602060405180830381600087803b1580156128fd57600080fd5b505af1158015612911573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061293591906139e2565b5060006129588460003060076000898152602001908152602001600020546132e0565b90506001600760008681526020019081526020016000205461297a91906145d0565b600760008681526020019081526020016000208190555061299b848261331c565b91505092915050565b6000601385815481106129e0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050905060008060001b826040015114159050600860009054906101000a900460ff168015612a4957506000601380549050115b612a88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7f90614332565b60405180910390fd5b8015612ad957612a99863385611b87565b612ad8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612acf90614332565b60405180910390fd5b5b83826000015186612aea9190614657565b14612b2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b2190614392565b60405180910390fd5b601054861115612b6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6690614312565b60405180910390fd5b600d5485600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612bbd91906145d0565b1115612bfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf590614312565b60405180910390fd5b600c5485600254612c0f91906145d0565b1115612c50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c4790614312565b60405180910390fd5b8015612d5957846014600088815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612cb691906145d0565b9250508190555081602001516014600088815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115612d54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4b90614312565b60405180910390fd5b612da1565b8160200151851115612da0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9790614312565b60405180910390fd5b5b612dab3386612784565b505050505050565b600080600f5490506000600c54905060008167ffffffffffffffff811115612e04577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015612e325781602001602082028036833780820191505090505b50905060005b82811015612e995780828281518110612e7a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080612e9190614808565b915050612e38565b5060005b600183612eaa91906146b1565b8110156130225760008184612ebf91906146b1565b8583604051602001612ed2929190614496565b6040516020818303038152906040528051906020012060001c612ef59190614889565b82612f0091906145d0565b9050828181518110612f3b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151838381518110612f7c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151848481518110612fbd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101858481518110612ffd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018281525082815250505050808061301a90614808565b915050612e9d565b5060018160018761303391906146b1565b8151811061306a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015161307c91906145d0565b9350505050919050565b606060008214156130ce576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061322e565b600082905060005b600082146131005780806130e990614808565b915050600a826130f99190614626565b91506130d6565b60008167ffffffffffffffff811115613142577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156131745781602001600182028036833780820191505090505b5090505b600085146132275760018261318d91906146b1565b9150600a8561319c9190614889565b60306131a891906145d0565b60f81b8183815181106131e4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856132209190614626565b9450613178565b8093505050505b919050565b613240838383600161334f565b505050565b60008082905060005b84518110156132d5576000858281518110613292577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190508083116132b4576132ad838261363d565b92506132c1565b6132be818461363d565b92505b5080806132cd90614808565b91505061324e565b508091505092915050565b6000848484846040516020016132f994939291906142ab565b6040516020818303038152906040528051906020012060001c9050949350505050565b600082826040516020016133319291906140b3565b60405160208183030381529060405280519060200120905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156133bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133b690614372565b60405180910390fd5b600060016002540190508360026000828254019250508190555083600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550846006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060005b8481101561363557818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a482156136205760008673ffffffffffffffffffffffffffffffffffffffff163b14806135e0575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168673ffffffffffffffffffffffffffffffffffffffff1663150b7a0233600086896040518563ffffffff1660e01b815260040161356d9493929190614178565b602060405180830381600087803b15801561358757600080fd5b505af115801561359b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135bf9190613a70565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b61361f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613616906143b2565b60405180910390fd5b5b8180600101925050808060010191505061347b565b505050505050565b600082600052816020526040600020905092915050565b60006136676136628461451b565b6144f6565b9050808382526020820190508285602086028201111561368657600080fd5b60005b858110156136b6578161369c8882613767565b845260208401935060208301925050600181019050613689565b5050509392505050565b60006136d36136ce84614547565b6144f6565b9050828152602081018484840111156136eb57600080fd5b6136f6848285614763565b509392505050565b60008135905061370d81614bd5565b92915050565b600082601f83011261372457600080fd5b8135613734848260208601613654565b91505092915050565b60008135905061374c81614bec565b92915050565b60008151905061376181614bec565b92915050565b60008135905061377681614c03565b92915050565b60008135905061378b81614c1a565b92915050565b6000815190506137a081614c1a565b92915050565b600082601f8301126137b757600080fd5b81356137c78482602086016136c0565b91505092915050565b6000813590506137df81614c31565b92915050565b6000815190506137f481614c31565b92915050565b60006020828403121561380c57600080fd5b600061381a848285016136fe565b91505092915050565b6000806040838503121561383657600080fd5b6000613844858286016136fe565b9250506020613855858286016136fe565b9150509250929050565b60008060006060848603121561387457600080fd5b6000613882868287016136fe565b9350506020613893868287016136fe565b92505060406138a4868287016137d0565b9150509250925092565b600080600080608085870312156138c457600080fd5b60006138d2878288016136fe565b94505060206138e3878288016136fe565b93505060406138f4878288016137d0565b925050606085013567ffffffffffffffff81111561391157600080fd5b61391d878288016137a6565b91505092959194509250565b6000806040838503121561393c57600080fd5b600061394a858286016136fe565b925050602061395b8582860161373d565b9150509250929050565b6000806040838503121561397857600080fd5b6000613986858286016136fe565b9250506020613997858286016137d0565b9150509250929050565b6000602082840312156139b357600080fd5b600082013567ffffffffffffffff8111156139cd57600080fd5b6139d984828501613713565b91505092915050565b6000602082840312156139f457600080fd5b6000613a0284828501613752565b91505092915050565b60008060408385031215613a1e57600080fd5b6000613a2c85828601613767565b9250506020613a3d858286016137d0565b9150509250929050565b600060208284031215613a5957600080fd5b6000613a678482850161377c565b91505092915050565b600060208284031215613a8257600080fd5b6000613a9084828501613791565b91505092915050565b600060208284031215613aab57600080fd5b6000613ab9848285016137d0565b91505092915050565b600060208284031215613ad457600080fd5b6000613ae2848285016137e5565b91505092915050565b60008060408385031215613afe57600080fd5b6000613b0c858286016137d0565b9250506020613b1d858286016136fe565b9150509250929050565b600080600060608486031215613b3c57600080fd5b6000613b4a868287016137d0565b9350506020613b5b868287016136fe565b925050604084013567ffffffffffffffff811115613b7857600080fd5b613b8486828701613713565b9150509250925092565b60008060408385031215613ba157600080fd5b6000613baf858286016137d0565b925050602083013567ffffffffffffffff811115613bcc57600080fd5b613bd885828601613713565b9150509250929050565b60008060408385031215613bf557600080fd5b6000613c03858286016137d0565b9250506020613c1485828601613767565b9150509250929050565b600080600060608486031215613c3357600080fd5b6000613c41868287016137d0565b9350506020613c52868287016137d0565b925050604084013567ffffffffffffffff811115613c6f57600080fd5b613c7b86828701613713565b9150509250925092565b60008060008060808587031215613c9b57600080fd5b6000613ca9878288016137d0565b9450506020613cba878288016137d0565b9350506040613ccb878288016137d0565b9250506060613cdc87828801613767565b91505092959194509250565b613cf1816146e5565b82525050565b613d08613d03826146e5565b614851565b82525050565b613d17816146f7565b82525050565b613d2681614703565b82525050565b613d3d613d3882614703565b614863565b82525050565b6000613d4e8261458d565b613d5881856145a3565b9350613d68818560208601614772565b613d7181614976565b840191505092915050565b6000613d8782614598565b613d9181856145b4565b9350613da1818560208601614772565b613daa81614976565b840191505092915050565b6000613dc082614598565b613dca81856145c5565b9350613dda818560208601614772565b80840191505092915050565b60008154613df3816147a5565b613dfd81866145c5565b94506001821660008114613e185760018114613e2957613e5c565b60ff19831686528186019350613e5c565b613e3285614578565b60005b83811015613e5457815481890152600182019150602081019050613e35565b838801955050505b50505092915050565b6000613e726003836145b4565b9150613e7d82614994565b602082019050919050565b6000613e95600d836145c5565b9150613ea0826149bd565b600d82019050919050565b6000613eb86003836145b4565b9150613ec3826149e6565b602082019050919050565b6000613edb600a836145c5565b9150613ee682614a0f565b600a82019050919050565b6000613efe6003836145b4565b9150613f0982614a38565b602082019050919050565b6000613f216011836145b4565b9150613f2c82614a61565b602082019050919050565b6000613f446007836145c5565b9150613f4f82614a8a565b600782019050919050565b6000613f676003836145b4565b9150613f7282614ab3565b602082019050919050565b6000613f8a6010836145b4565b9150613f9582614adc565b602082019050919050565b6000613fad6005836145c5565b9150613fb882614b05565b600582019050919050565b6000613fd0601f836145b4565b9150613fdb82614b2e565b602082019050919050565b6000613ff36000836145a3565b9150613ffe82614b57565b600082019050919050565b60006140166003836145b4565b915061402182614b5a565b602082019050919050565b6000614039600e836145b4565b915061404482614b83565b602082019050919050565b600061405c600a836145b4565b915061406782614bac565b602082019050919050565b61407b81614759565b82525050565b61409261408d82614759565b61487f565b82525050565b60006140a48284613cf7565b60148201915081905092915050565b60006140bf8285613d2c565b6020820191506140cf8284614081565b6020820191508190509392505050565b60006140eb8285613db5565b91506140f78284613db5565b915061410282613fa0565b91508190509392505050565b600061411a8284613db5565b915061412582613e88565b915081905092915050565b600061413b82613f37565b91506141478284613de6565b915061415282613ece565b915081905092915050565b60006020820190506141726000830184613ce8565b92915050565b600060808201905061418d6000830187613ce8565b61419a6020830186613ce8565b6141a76040830185614072565b81810360608301526141b98184613d43565b905095945050505050565b60006080820190506141d96000830186613ce8565b6141e66020830185613ce8565b6141f36040830184614072565b818103606083015261420481613fe6565b9050949350505050565b60006060820190506142236000830186613ce8565b6142306020830185614072565b81810360408301526142428184613d43565b9050949350505050565b60006020820190506142616000830184613d0e565b92915050565b600060208201905061427c6000830184613d1d565b92915050565b60006040820190506142976000830185613d1d565b6142a46020830184614072565b9392505050565b60006080820190506142c06000830187613d1d565b6142cd6020830186614072565b6142da6040830185613ce8565b6142e76060830184614072565b95945050505050565b6000602082019050818103600083015261430a8184613d7c565b905092915050565b6000602082019050818103600083015261432b81613e65565b9050919050565b6000602082019050818103600083015261434b81613eab565b9050919050565b6000602082019050818103600083015261436b81613ef1565b9050919050565b6000602082019050818103600083015261438b81613f14565b9050919050565b600060208201905081810360008301526143ab81613f5a565b9050919050565b600060208201905081810360008301526143cb81613f7d565b9050919050565b600060208201905081810360008301526143eb81613fc3565b9050919050565b6000602082019050818103600083015261440b81614009565b9050919050565b6000602082019050818103600083015261442b8161402c565b9050919050565b6000602082019050818103600083015261444b8161404f565b9050919050565b60006020820190506144676000830184614072565b92915050565b60006040820190506144826000830185614072565b61448f6020830184613d1d565b9392505050565b60006040820190506144ab6000830185614072565b6144b86020830184614072565b9392505050565b60006060820190506144d46000830186614072565b6144e16020830185614072565b6144ee6040830184613d1d565b949350505050565b6000614500614511565b905061450c82826147d7565b919050565b6000604051905090565b600067ffffffffffffffff82111561453657614535614947565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561456257614561614947565b5b61456b82614976565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006145db82614759565b91506145e683614759565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561461b5761461a6148ba565b5b828201905092915050565b600061463182614759565b915061463c83614759565b92508261464c5761464b6148e9565b5b828204905092915050565b600061466282614759565b915061466d83614759565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156146a6576146a56148ba565b5b828202905092915050565b60006146bc82614759565b91506146c783614759565b9250828210156146da576146d96148ba565b5b828203905092915050565b60006146f082614739565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614790578082015181840152602081019050614775565b8381111561479f576000848401525b50505050565b600060028204905060018216806147bd57607f821691505b602082108114156147d1576147d0614918565b5b50919050565b6147e082614976565b810181811067ffffffffffffffff821117156147ff576147fe614947565b5b80604052505050565b600061481382614759565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614846576148456148ba565b5b600182019050919050565b600061485c8261486d565b9050919050565b6000819050919050565b600061487882614987565b9050919050565b6000819050919050565b600061489482614759565b915061489f83614759565b9250826148af576148ae6148e9565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f3430330000000000000000000000000000000000000000000000000000000000600082015250565b7f636f6e74726163742e6a736f6e00000000000000000000000000000000000000600082015250565b7f3430310000000000000000000000000000000000000000000000000000000000600082015250565b7f2f6d657461646174612f00000000000000000000000000000000000000000000600082015250565b7f3432320000000000000000000000000000000000000000000000000000000000600082015250565b7f494e56414c49445f524543495049454e54000000000000000000000000000000600082015250565b7f697066733a2f2f00000000000000000000000000000000000000000000000000600082015250565b7f3430320000000000000000000000000000000000000000000000000000000000600082015250565b7f554e534146455f524543495049454e5400000000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f6e6c7920565246436f6f7264696e61746f722063616e2066756c66696c6c00600082015250565b50565b7f3430340000000000000000000000000000000000000000000000000000000000600082015250565b7f4e4f545f415554484f52495a4544000000000000000000000000000000000000600082015250565b7f57524f4e475f46524f4d00000000000000000000000000000000000000000000600082015250565b614bde816146e5565b8114614be957600080fd5b50565b614bf5816146f7565b8114614c0057600080fd5b50565b614c0c81614703565b8114614c1757600080fd5b50565b614c238161470d565b8114614c2e57600080fd5b50565b614c3a81614759565b8114614c4557600080fd5b5056fea264697066735822122033f5b2e2c305daab558a54fe73ecc6627545d3b396b6309d3c6ccd37815aaeaf64736f6c6343000804003362616679626569637869796d346f75356570687674346a363669663361786c6c337333757137617873706763646a7235747672747266626f71736162616239336162333762323336613332353435633462623232333961633964613237366263313833323462636463663064383665306432323532393964623762000000000000000000000000f0d54349addcf704f77ae15b96510dea15cb7952000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca

Deployed Bytecode

0x6080604052600436106102725760003560e01c80637d94792a1161014f578063b391c508116100c1578063d96a094a1161007a578063d96a094a14610933578063d97aa9771461094f578063e6d37b881461097a578063e8a3d48514610996578063e985e9c5146109c1578063fbfa77cf146109fe57610272565b8063b391c5081461081e578063b5f522f714610847578063b88d4fde14610886578063c13bd95c146108af578063c87b56dd146108cb578063d5abeb011461090857610272565b8063907316d011610113578063907316d01461073457806394985ddd1461075f57806395d89b4114610788578063a22cb465146107b3578063a3907d71146107dc578063a475b5dd146107f357610272565b80637d94792a1461064f578063819b25ba1461067a57806381e3e88a146106a3578063880cdc31146106e05780638da5cb5b1461070957610272565b80632f2770db116101e85780634b09b72a116101ac5780634b09b72a146105175780635feb1446146105425780636352211e1461057f5780636c0360eb146105bc5780636fd5ae15146105e757806370a082311461061257610272565b80632f2770db1461046c5780633ccfd60b1461048357806342842e0e1461049a578063453c2310146104c357806349f2f929146104ee57610272565b80631017507d1161023a5780631017507d1461037057806318160ddd1461039b57806319f428fa146103c6578063238dafe0146103ef57806323b872dd1461041a57806327a5428b1461044357610272565b806301ffc9a71461027757806306fdde03146102b4578063081812fc146102df578063095ea7b31461031c5780630f7309e814610345575b600080fd5b34801561028357600080fd5b5061029e60048036038101906102999190613a47565b610a29565b6040516102ab919061424c565b60405180910390f35b3480156102c057600080fd5b506102c9610abb565b6040516102d691906142f0565b60405180910390f35b3480156102eb57600080fd5b5061030660048036038101906103019190613a99565b610b49565b604051610313919061415d565b60405180910390f35b34801561032857600080fd5b50610343600480360381019061033e9190613965565b610b7c565b005b34801561035157600080fd5b5061035a610d3a565b60405161036791906142f0565b60405180910390f35b34801561037c57600080fd5b50610385610dc8565b6040516103929190614452565b60405180910390f35b3480156103a757600080fd5b506103b0610dce565b6040516103bd9190614452565b60405180910390f35b3480156103d257600080fd5b506103ed60048036038101906103e89190613be2565b610dd4565b005b3480156103fb57600080fd5b50610404610e76565b604051610411919061424c565b60405180910390f35b34801561042657600080fd5b50610441600480360381019061043c919061385f565b610e89565b005b34801561044f57600080fd5b5061046a60048036038101906104659190613a99565b611351565b005b34801561047857600080fd5b50610481611443565b005b34801561048f57600080fd5b506104986114f0565b005b3480156104a657600080fd5b506104c160048036038101906104bc919061385f565b6115eb565b005b3480156104cf57600080fd5b506104d8611732565b6040516104e59190614452565b60405180910390f35b3480156104fa57600080fd5b5061051560048036038101906105109190613c85565b611738565b005b34801561052357600080fd5b5061052c6118f7565b6040516105399190614452565b60405180910390f35b34801561054e57600080fd5b5061056960048036038101906105649190613aeb565b6118fd565b6040516105769190614452565b60405180910390f35b34801561058b57600080fd5b506105a660048036038101906105a19190613a99565b611922565b6040516105b3919061415d565b60405180910390f35b3480156105c857600080fd5b506105d1611934565b6040516105de91906142f0565b60405180910390f35b3480156105f357600080fd5b506105fc61195c565b6040516106099190614452565b60405180910390f35b34801561061e57600080fd5b50610639600480360381019061063491906137fa565b611962565b6040516106469190614452565b60405180910390f35b34801561065b57600080fd5b5061066461197a565b6040516106719190614452565b60405180910390f35b34801561068657600080fd5b506106a1600480360381019061069c9190613a99565b611980565b005b3480156106af57600080fd5b506106ca60048036038101906106c59190613b27565b611b87565b6040516106d7919061424c565b60405180910390f35b3480156106ec57600080fd5b50610707600480360381019061070291906137fa565b611c84565b005b34801561071557600080fd5b5061071e611db2565b60405161072b919061415d565b60405180910390f35b34801561074057600080fd5b50610749611dd8565b6040516107569190614267565b60405180910390f35b34801561076b57600080fd5b5061078660048036038101906107819190613a0b565b611dde565b005b34801561079457600080fd5b5061079d611e7a565b6040516107aa91906142f0565b60405180910390f35b3480156107bf57600080fd5b506107da60048036038101906107d59190613929565b611f08565b005b3480156107e857600080fd5b506107f1612005565b005b3480156107ff57600080fd5b506108086120b2565b6040516108159190614267565b60405180910390f35b34801561082a57600080fd5b50610845600480360381019061084091906139a1565b612289565b005b34801561085357600080fd5b5061086e60048036038101906108699190613a99565b61229b565b60405161087d939291906144bf565b60405180910390f35b34801561089257600080fd5b506108ad60048036038101906108a891906138ae565b6122d5565b005b6108c960048036038101906108c49190613b8e565b61241f565b005b3480156108d757600080fd5b506108f260048036038101906108ed9190613a99565b612430565b6040516108ff91906142f0565b60405180910390f35b34801561091457600080fd5b5061091d612504565b60405161092a9190614452565b60405180910390f35b61094d60048036038101906109489190613a99565b61250a565b005b34801561095b57600080fd5b50610964612589565b60405161097191906142f0565b60405180910390f35b610994600480360381019061098f9190613c1e565b612617565b005b3480156109a257600080fd5b506109ab612628565b6040516109b891906142f0565b60405180910390f35b3480156109cd57600080fd5b506109e860048036038101906109e39190613823565b612656565b6040516109f5919061424c565b60405180910390f35b348015610a0a57600080fd5b50610a13612685565b604051610a20919061415d565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a8457506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ab45750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60008054610ac8906147a5565b80601f0160208091040260200160405190810160405280929190818152602001828054610af4906147a5565b8015610b415780601f10610b1657610100808354040283529160200191610b41565b820191906000526020600020905b815481529060010190602001808311610b2457829003601f168201915b505050505081565b60046020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000610b87826126ab565b90508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610c495750600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b610c88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7f90614412565b60405180910390fd5b826004600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600b8054610d47906147a5565b80601f0160208091040260200160405190810160405280929190818152602001828054610d73906147a5565b8015610dc05780601f10610d9557610100808354040283529160200191610dc0565b820191906000526020600020905b815481529060010190602001808311610da357829003601f168201915b505050505081565b60115481565b60025481565b600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5b90614332565b60405180910390fd5b81601181905550806012819055505050565b600860009054906101000a900460ff1681565b6000610e94826126ab565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614610f04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efb90614432565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6b90614372565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061100c57506004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061109d5750600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6110dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d390614412565b60405180910390fd5b600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600190039190505550600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506002546001836111dd91906145d0565b111580156112565750600073ffffffffffffffffffffffffffffffffffffffff166006600060018561120f91906145d0565b815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b156112ba57806006600060018561126d91906145d0565b815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b6004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a450505050565b600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146113e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d890614332565b60405180910390fd5b60006013805490501180156113fa575060138054905081105b611439576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143090614352565b60405180910390fd5b8060108190555050565b600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ca90614332565b60405180910390fd5b6000600860006101000a81548160ff021916908315150217905550565b600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611580576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157790614332565b60405180910390fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156115e8573d6000803e3d6000fd5b50565b6115f6838383610e89565b60008273ffffffffffffffffffffffffffffffffffffffff163b14806116ee575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168273ffffffffffffffffffffffffffffffffffffffff1663150b7a023386856040518463ffffffff1660e01b815260040161167b939291906141c4565b602060405180830381600087803b15801561169557600080fd5b505af11580156116a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116cd9190613a70565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b61172d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611724906143b2565b60405180910390fd5b505050565b600d5481565b600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117bf90614332565b60405180910390fd5b601380549050841115611810576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180790614352565b60405180910390fd5b601380549050841415611888576013604051806060016040528085815260200184815260200183815250908060018154018082558091505060019003906000526020600020906003020160009091909190915060008201518160000155602082015181600101556040820151816002015550506118f1565b6000601385815481106118c4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600302019050838160000181905550828160010181905550818160020181905550505b50505050565b600e5481565b6014602052816000526040600020602052806000526040600020600091509150505481565b600061192d826126ab565b9050919050565b6060600a6040516020016119489190614130565b604051602081830303815290604052905090565b60105481565b60036020528060005260406000206000915090505481565b600f5481565b600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0790614332565b60405180910390fd5b6000600f5414611a55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4c90614312565b60405180910390fd5b600c5481600254611a6691906145d0565b1115611aa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9e90614312565b60405180910390fd5b600e548160036000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611b1791906145d0565b1115611b58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4f90614312565b60405180910390fd5b611b84600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682612784565b50565b60006013805490508410611bd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc7906143f2565b60405180910390fd5b600060138581548110611c0c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906003020160405180606001604052908160008201548152602001600182015481526020016002820154815250509050611c7a83826040015186604051602001611c5f9190614098565b604051602081830303815290604052805190602001206127a2565b9150509392505050565b600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0b90614332565b60405180910390fd5b80600860016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d7660405160405180910390a350565b600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60125481565b7f000000000000000000000000f0d54349addcf704f77ae15b96510dea15cb795273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611e6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e63906143d2565b60405180910390fd5b611e7682826127b9565b5050565b60018054611e87906147a5565b80601f0160208091040260200160405190810160405280929190818152602001828054611eb3906147a5565b8015611f005780601f10611ed557610100808354040283529160200191611f00565b820191906000526020600020905b815481529060010190602001808311611ee357829003601f168201915b505050505081565b80600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ff9919061424c565b60405180910390a35050565b600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612095576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208c90614332565b60405180910390fd5b6001600860006101000a81548160ff021916908315150217905550565b6000600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612144576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213b90614332565b60405180910390fd5b6000600f5414612189576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218090614312565b60405180910390fd5b6011547f000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016121e5919061415d565b60206040518083038186803b1580156121fd57600080fd5b505afa158015612211573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122359190613ac2565b1015612276576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226d90614392565b60405180910390fd5b612284601254601154612842565b905090565b612298600060016000846129a4565b50565b601381815481106122ab57600080fd5b90600052602060002090600302016000915090508060000154908060010154908060020154905083565b6122e0848484610e89565b60008373ffffffffffffffffffffffffffffffffffffffff163b14806123da575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168373ffffffffffffffffffffffffffffffffffffffff1663150b7a02338786866040518563ffffffff1660e01b81526004016123679493929190614178565b602060405180830381600087803b15801561238157600080fd5b505af1158015612395573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123b99190613a70565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b612419576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612410906143b2565b60405180910390fd5b50505050565b61242c60018334846129a4565b5050565b6060600073ffffffffffffffffffffffffffffffffffffffff16612453836126ab565b73ffffffffffffffffffffffffffffffffffffffff1614156124aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a1906143f2565b60405180910390fd5b600080600f5414156124bf57600090506124cb565b6124c883612db3565b90505b6124d3611934565b6124dc82613086565b6040516020016124ed9291906140df565b604051602081830303815290604052915050919050565b600c5481565b61258660028234600067ffffffffffffffff811115612552577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156125805781602001602082028036833780820191505090505b506129a4565b50565b600a8054612596906147a5565b80601f01602080910402602001604051908101604052809291908181526020018280546125c2906147a5565b801561260f5780601f106125e45761010080835404028352916020019161260f565b820191906000526020600020905b8154815290600101906020018083116125f257829003601f168201915b505050505081565b612623838334846129a4565b505050565b6060612632611934565b604051602001612642919061410e565b604051602081830303815290604052905090565b60056020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006002548211156126c0576000905061277f565b5b600082111561277a57600073ffffffffffffffffffffffffffffffffffffffff166006600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461276c576006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905061277f565b8180600190039250506126c1565b600090505b919050565b61279e828260405180602001604052806000815250613233565b5050565b6000826127af8584613245565b1490509392505050565b6000600f54146127fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f590614312565b60405180910390fd5b80600f819055507f7d69e344e8948ee2d0ae2411f140ed9d811e9281db0368d2f77a802d9d8346f5818360405161283692919061446d565b60405180910390a15050565b60007f000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca73ffffffffffffffffffffffffffffffffffffffff16634000aea07f000000000000000000000000f0d54349addcf704f77ae15b96510dea15cb7952848660006040516020016128b6929190614282565b6040516020818303038152906040526040518463ffffffff1660e01b81526004016128e39392919061420e565b602060405180830381600087803b1580156128fd57600080fd5b505af1158015612911573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061293591906139e2565b5060006129588460003060076000898152602001908152602001600020546132e0565b90506001600760008681526020019081526020016000205461297a91906145d0565b600760008681526020019081526020016000208190555061299b848261331c565b91505092915050565b6000601385815481106129e0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050905060008060001b826040015114159050600860009054906101000a900460ff168015612a4957506000601380549050115b612a88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7f90614332565b60405180910390fd5b8015612ad957612a99863385611b87565b612ad8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612acf90614332565b60405180910390fd5b5b83826000015186612aea9190614657565b14612b2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b2190614392565b60405180910390fd5b601054861115612b6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6690614312565b60405180910390fd5b600d5485600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612bbd91906145d0565b1115612bfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf590614312565b60405180910390fd5b600c5485600254612c0f91906145d0565b1115612c50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c4790614312565b60405180910390fd5b8015612d5957846014600088815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612cb691906145d0565b9250508190555081602001516014600088815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115612d54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4b90614312565b60405180910390fd5b612da1565b8160200151851115612da0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9790614312565b60405180910390fd5b5b612dab3386612784565b505050505050565b600080600f5490506000600c54905060008167ffffffffffffffff811115612e04577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015612e325781602001602082028036833780820191505090505b50905060005b82811015612e995780828281518110612e7a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080612e9190614808565b915050612e38565b5060005b600183612eaa91906146b1565b8110156130225760008184612ebf91906146b1565b8583604051602001612ed2929190614496565b6040516020818303038152906040528051906020012060001c612ef59190614889565b82612f0091906145d0565b9050828181518110612f3b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151838381518110612f7c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151848481518110612fbd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101858481518110612ffd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018281525082815250505050808061301a90614808565b915050612e9d565b5060018160018761303391906146b1565b8151811061306a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015161307c91906145d0565b9350505050919050565b606060008214156130ce576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061322e565b600082905060005b600082146131005780806130e990614808565b915050600a826130f99190614626565b91506130d6565b60008167ffffffffffffffff811115613142577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156131745781602001600182028036833780820191505090505b5090505b600085146132275760018261318d91906146b1565b9150600a8561319c9190614889565b60306131a891906145d0565b60f81b8183815181106131e4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856132209190614626565b9450613178565b8093505050505b919050565b613240838383600161334f565b505050565b60008082905060005b84518110156132d5576000858281518110613292577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190508083116132b4576132ad838261363d565b92506132c1565b6132be818461363d565b92505b5080806132cd90614808565b91505061324e565b508091505092915050565b6000848484846040516020016132f994939291906142ab565b6040516020818303038152906040528051906020012060001c9050949350505050565b600082826040516020016133319291906140b3565b60405160208183030381529060405280519060200120905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156133bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133b690614372565b60405180910390fd5b600060016002540190508360026000828254019250508190555083600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550846006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060005b8481101561363557818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a482156136205760008673ffffffffffffffffffffffffffffffffffffffff163b14806135e0575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168673ffffffffffffffffffffffffffffffffffffffff1663150b7a0233600086896040518563ffffffff1660e01b815260040161356d9493929190614178565b602060405180830381600087803b15801561358757600080fd5b505af115801561359b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135bf9190613a70565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b61361f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613616906143b2565b60405180910390fd5b5b8180600101925050808060010191505061347b565b505050505050565b600082600052816020526040600020905092915050565b60006136676136628461451b565b6144f6565b9050808382526020820190508285602086028201111561368657600080fd5b60005b858110156136b6578161369c8882613767565b845260208401935060208301925050600181019050613689565b5050509392505050565b60006136d36136ce84614547565b6144f6565b9050828152602081018484840111156136eb57600080fd5b6136f6848285614763565b509392505050565b60008135905061370d81614bd5565b92915050565b600082601f83011261372457600080fd5b8135613734848260208601613654565b91505092915050565b60008135905061374c81614bec565b92915050565b60008151905061376181614bec565b92915050565b60008135905061377681614c03565b92915050565b60008135905061378b81614c1a565b92915050565b6000815190506137a081614c1a565b92915050565b600082601f8301126137b757600080fd5b81356137c78482602086016136c0565b91505092915050565b6000813590506137df81614c31565b92915050565b6000815190506137f481614c31565b92915050565b60006020828403121561380c57600080fd5b600061381a848285016136fe565b91505092915050565b6000806040838503121561383657600080fd5b6000613844858286016136fe565b9250506020613855858286016136fe565b9150509250929050565b60008060006060848603121561387457600080fd5b6000613882868287016136fe565b9350506020613893868287016136fe565b92505060406138a4868287016137d0565b9150509250925092565b600080600080608085870312156138c457600080fd5b60006138d2878288016136fe565b94505060206138e3878288016136fe565b93505060406138f4878288016137d0565b925050606085013567ffffffffffffffff81111561391157600080fd5b61391d878288016137a6565b91505092959194509250565b6000806040838503121561393c57600080fd5b600061394a858286016136fe565b925050602061395b8582860161373d565b9150509250929050565b6000806040838503121561397857600080fd5b6000613986858286016136fe565b9250506020613997858286016137d0565b9150509250929050565b6000602082840312156139b357600080fd5b600082013567ffffffffffffffff8111156139cd57600080fd5b6139d984828501613713565b91505092915050565b6000602082840312156139f457600080fd5b6000613a0284828501613752565b91505092915050565b60008060408385031215613a1e57600080fd5b6000613a2c85828601613767565b9250506020613a3d858286016137d0565b9150509250929050565b600060208284031215613a5957600080fd5b6000613a678482850161377c565b91505092915050565b600060208284031215613a8257600080fd5b6000613a9084828501613791565b91505092915050565b600060208284031215613aab57600080fd5b6000613ab9848285016137d0565b91505092915050565b600060208284031215613ad457600080fd5b6000613ae2848285016137e5565b91505092915050565b60008060408385031215613afe57600080fd5b6000613b0c858286016137d0565b9250506020613b1d858286016136fe565b9150509250929050565b600080600060608486031215613b3c57600080fd5b6000613b4a868287016137d0565b9350506020613b5b868287016136fe565b925050604084013567ffffffffffffffff811115613b7857600080fd5b613b8486828701613713565b9150509250925092565b60008060408385031215613ba157600080fd5b6000613baf858286016137d0565b925050602083013567ffffffffffffffff811115613bcc57600080fd5b613bd885828601613713565b9150509250929050565b60008060408385031215613bf557600080fd5b6000613c03858286016137d0565b9250506020613c1485828601613767565b9150509250929050565b600080600060608486031215613c3357600080fd5b6000613c41868287016137d0565b9350506020613c52868287016137d0565b925050604084013567ffffffffffffffff811115613c6f57600080fd5b613c7b86828701613713565b9150509250925092565b60008060008060808587031215613c9b57600080fd5b6000613ca9878288016137d0565b9450506020613cba878288016137d0565b9350506040613ccb878288016137d0565b9250506060613cdc87828801613767565b91505092959194509250565b613cf1816146e5565b82525050565b613d08613d03826146e5565b614851565b82525050565b613d17816146f7565b82525050565b613d2681614703565b82525050565b613d3d613d3882614703565b614863565b82525050565b6000613d4e8261458d565b613d5881856145a3565b9350613d68818560208601614772565b613d7181614976565b840191505092915050565b6000613d8782614598565b613d9181856145b4565b9350613da1818560208601614772565b613daa81614976565b840191505092915050565b6000613dc082614598565b613dca81856145c5565b9350613dda818560208601614772565b80840191505092915050565b60008154613df3816147a5565b613dfd81866145c5565b94506001821660008114613e185760018114613e2957613e5c565b60ff19831686528186019350613e5c565b613e3285614578565b60005b83811015613e5457815481890152600182019150602081019050613e35565b838801955050505b50505092915050565b6000613e726003836145b4565b9150613e7d82614994565b602082019050919050565b6000613e95600d836145c5565b9150613ea0826149bd565b600d82019050919050565b6000613eb86003836145b4565b9150613ec3826149e6565b602082019050919050565b6000613edb600a836145c5565b9150613ee682614a0f565b600a82019050919050565b6000613efe6003836145b4565b9150613f0982614a38565b602082019050919050565b6000613f216011836145b4565b9150613f2c82614a61565b602082019050919050565b6000613f446007836145c5565b9150613f4f82614a8a565b600782019050919050565b6000613f676003836145b4565b9150613f7282614ab3565b602082019050919050565b6000613f8a6010836145b4565b9150613f9582614adc565b602082019050919050565b6000613fad6005836145c5565b9150613fb882614b05565b600582019050919050565b6000613fd0601f836145b4565b9150613fdb82614b2e565b602082019050919050565b6000613ff36000836145a3565b9150613ffe82614b57565b600082019050919050565b60006140166003836145b4565b915061402182614b5a565b602082019050919050565b6000614039600e836145b4565b915061404482614b83565b602082019050919050565b600061405c600a836145b4565b915061406782614bac565b602082019050919050565b61407b81614759565b82525050565b61409261408d82614759565b61487f565b82525050565b60006140a48284613cf7565b60148201915081905092915050565b60006140bf8285613d2c565b6020820191506140cf8284614081565b6020820191508190509392505050565b60006140eb8285613db5565b91506140f78284613db5565b915061410282613fa0565b91508190509392505050565b600061411a8284613db5565b915061412582613e88565b915081905092915050565b600061413b82613f37565b91506141478284613de6565b915061415282613ece565b915081905092915050565b60006020820190506141726000830184613ce8565b92915050565b600060808201905061418d6000830187613ce8565b61419a6020830186613ce8565b6141a76040830185614072565b81810360608301526141b98184613d43565b905095945050505050565b60006080820190506141d96000830186613ce8565b6141e66020830185613ce8565b6141f36040830184614072565b818103606083015261420481613fe6565b9050949350505050565b60006060820190506142236000830186613ce8565b6142306020830185614072565b81810360408301526142428184613d43565b9050949350505050565b60006020820190506142616000830184613d0e565b92915050565b600060208201905061427c6000830184613d1d565b92915050565b60006040820190506142976000830185613d1d565b6142a46020830184614072565b9392505050565b60006080820190506142c06000830187613d1d565b6142cd6020830186614072565b6142da6040830185613ce8565b6142e76060830184614072565b95945050505050565b6000602082019050818103600083015261430a8184613d7c565b905092915050565b6000602082019050818103600083015261432b81613e65565b9050919050565b6000602082019050818103600083015261434b81613eab565b9050919050565b6000602082019050818103600083015261436b81613ef1565b9050919050565b6000602082019050818103600083015261438b81613f14565b9050919050565b600060208201905081810360008301526143ab81613f5a565b9050919050565b600060208201905081810360008301526143cb81613f7d565b9050919050565b600060208201905081810360008301526143eb81613fc3565b9050919050565b6000602082019050818103600083015261440b81614009565b9050919050565b6000602082019050818103600083015261442b8161402c565b9050919050565b6000602082019050818103600083015261444b8161404f565b9050919050565b60006020820190506144676000830184614072565b92915050565b60006040820190506144826000830185614072565b61448f6020830184613d1d565b9392505050565b60006040820190506144ab6000830185614072565b6144b86020830184614072565b9392505050565b60006060820190506144d46000830186614072565b6144e16020830185614072565b6144ee6040830184613d1d565b949350505050565b6000614500614511565b905061450c82826147d7565b919050565b6000604051905090565b600067ffffffffffffffff82111561453657614535614947565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561456257614561614947565b5b61456b82614976565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006145db82614759565b91506145e683614759565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561461b5761461a6148ba565b5b828201905092915050565b600061463182614759565b915061463c83614759565b92508261464c5761464b6148e9565b5b828204905092915050565b600061466282614759565b915061466d83614759565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156146a6576146a56148ba565b5b828202905092915050565b60006146bc82614759565b91506146c783614759565b9250828210156146da576146d96148ba565b5b828203905092915050565b60006146f082614739565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614790578082015181840152602081019050614775565b8381111561479f576000848401525b50505050565b600060028204905060018216806147bd57607f821691505b602082108114156147d1576147d0614918565b5b50919050565b6147e082614976565b810181811067ffffffffffffffff821117156147ff576147fe614947565b5b80604052505050565b600061481382614759565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614846576148456148ba565b5b600182019050919050565b600061485c8261486d565b9050919050565b6000819050919050565b600061487882614987565b9050919050565b6000819050919050565b600061489482614759565b915061489f83614759565b9250826148af576148ae6148e9565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f3430330000000000000000000000000000000000000000000000000000000000600082015250565b7f636f6e74726163742e6a736f6e00000000000000000000000000000000000000600082015250565b7f3430310000000000000000000000000000000000000000000000000000000000600082015250565b7f2f6d657461646174612f00000000000000000000000000000000000000000000600082015250565b7f3432320000000000000000000000000000000000000000000000000000000000600082015250565b7f494e56414c49445f524543495049454e54000000000000000000000000000000600082015250565b7f697066733a2f2f00000000000000000000000000000000000000000000000000600082015250565b7f3430320000000000000000000000000000000000000000000000000000000000600082015250565b7f554e534146455f524543495049454e5400000000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f6e6c7920565246436f6f7264696e61746f722063616e2066756c66696c6c00600082015250565b50565b7f3430340000000000000000000000000000000000000000000000000000000000600082015250565b7f4e4f545f415554484f52495a4544000000000000000000000000000000000000600082015250565b7f57524f4e475f46524f4d00000000000000000000000000000000000000000000600082015250565b614bde816146e5565b8114614be957600080fd5b50565b614bf5816146f7565b8114614c0057600080fd5b50565b614c0c81614703565b8114614c1757600080fd5b50565b614c238161470d565b8114614c2e57600080fd5b50565b614c3a81614759565b8114614c4557600080fd5b5056fea264697066735822122033f5b2e2c305daab558a54fe73ecc6627545d3b396b6309d3c6ccd37815aaeaf64736f6c63430008040033

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

000000000000000000000000f0d54349addcf704f77ae15b96510dea15cb7952000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca

-----Decoded View---------------
Arg [0] : vrfCoordinator (address): 0xf0d54349aDdcf704F77AE15b96510dEA15cb7952
Arg [1] : linkToken (address): 0x514910771AF9Ca656af840dff83E8264EcF986CA

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000f0d54349addcf704f77ae15b96510dea15cb7952
Arg [1] : 000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca


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.