POL Price: $0.475395 (-0.84%)
 

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Create Event532191852024-02-07 4:45:42344 days ago1707281142IN
0x4B25e2F0...1E41c77db
0.01 POL0.0379880231.07943665
Add Member330090402022-09-12 10:57:08857 days ago1662980228IN
0x4B25e2F0...1E41c77db
0 POL0.0485495730.00000001
Create Event330090202022-09-12 10:56:24857 days ago1662980184IN
0x4B25e2F0...1E41c77db
0.01 POL0.0367277630.10879999
Add Member308839232022-07-19 3:56:26912 days ago1658202986IN
0x4B25e2F0...1E41c77db
0 POL0.0514160231.7714886
Create Event308838982022-07-19 3:55:22912 days ago1658202922IN
0x4B25e2F0...1E41c77db
0.01 POL0.0482891139.58815639
Add Member307865432022-07-16 12:18:16915 days ago1657973896IN
0x4B25e2F0...1E41c77db
0 POL0.0501678931.00000281
Create Event307865322022-07-16 12:17:32915 days ago1657973852IN
0x4B25e2F0...1E41c77db
0.01 POL0.0431336934.79065474
Add Member306806252022-07-13 13:10:22918 days ago1657717822IN
0x4B25e2F0...1E41c77db
0 POL0.44683119509.86649949
Add Member306806162022-07-13 13:10:04918 days ago1657717804IN
0x4B25e2F0...1E41c77db
0 POL0.55356386618.18317149
Add Member306805162022-07-13 13:04:42918 days ago1657717482IN
0x4B25e2F0...1E41c77db
0 POL0.83895768518.41305067
Create Event306804992022-07-13 13:03:54918 days ago1657717434IN
0x4B25e2F0...1E41c77db
0.01 POL0.5377974430.24894152
Create Event306804182022-07-13 13:00:10918 days ago1657717210IN
0x4B25e2F0...1E41c77db
0.01 POL0.66701439546.8344071
Create Event306746722022-07-13 9:19:47918 days ago1657703987IN
0x4B25e2F0...1E41c77db
0.01 POL0.0382661131.37083791
Add Member306694452022-07-13 6:00:43918 days ago1657692043IN
0x4B25e2F0...1E41c77db
0 POL0.0268640730.00000164
Add Member306060062022-07-11 14:30:53920 days ago1657549853IN
0x4B25e2F0...1E41c77db
0 POL0.0485523630.00195061
Create Event306057712022-07-11 14:22:51920 days ago1657549371IN
0x4B25e2F0...1E41c77db
0.01 POL0.0452310837.0822276
Add Member305843642022-07-11 1:29:01920 days ago1657502941IN
0x4B25e2F0...1E41c77db
0 POL0.0501679331.00002644
Create Event305843492022-07-11 1:27:31920 days ago1657502851IN
0x4B25e2F0...1E41c77db
0.01 POL0.0501019441.07030111
Add Member305581812022-07-10 9:36:04921 days ago1657445764IN
0x4B25e2F0...1E41c77db
0 POL0.0269895830.1401648
Add Member305494172022-07-10 4:26:15921 days ago1657427175IN
0x4B25e2F0...1E41c77db
0 POL0.0485495730.00000001
Create Event305493742022-07-10 4:24:45921 days ago1657427085IN
0x4B25e2F0...1E41c77db
0.01 POL0.0422370434.62725475
Add Member305460952022-07-10 2:29:55921 days ago1657420195IN
0x4B25e2F0...1E41c77db
0 POL0.0278293231.07792704
Add Member305448272022-07-10 1:45:45921 days ago1657417545IN
0x4B25e2F0...1E41c77db
0 POL0.0485495730.0000009
Create Event305430542022-07-10 0:42:51921 days ago1657413771IN
0x4B25e2F0...1E41c77db
0.01 POL0.0488379240.03610302

Parent Transaction Hash Block From To
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ZKTokenProof

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 15 : ZKTokenProof.sol
//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.9;

import "hardhat/console.sol";
import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@semaphore-protocol/contracts/base/SemaphoreCore.sol";
import "@semaphore-protocol/contracts/base/SemaphoreGroups.sol";
import "@semaphore-protocol/contracts/interfaces/IVerifier.sol";

import "./interfaces/IZKTokenProof.sol";

error NotRelayer(address relayerAddress);
error InvalidTreeDepth(uint8 depth);
error EventNotFound(uint256 eventId);
error InsufficientFee(uint256 requiredFee, uint256 actual);
error InsufficientEventFee(uint256 requiredFee, uint256 actual);
error InvalidContractAddress(address contractAddress);
error AlreadyRelayer(address relayerAddress);

contract ZKTokenProof is
    IZKTokenProof,
    SemaphoreCore,
    SemaphoreGroups,
    Ownable
{
    /// @dev fee for each event creation
    uint256 public fee;

    /// @dev Gets a tree depth and returns its verifier address.
    mapping(uint8 => IVerifier) public verifiers;
    /// @dev Mapping of relayers.
    mapping(address => bool) public relayers;
    /// @dev Mappng of events.
    mapping(uint256 => Event) public events;

    /// @dev Checks if there is a verifier for the given tree depth.
    /// @param depth: Depth of the tree.
    modifier onlySupportedDepth(uint8 depth) {
        if (address(verifiers[depth]) == address(0)) {
            revert InvalidTreeDepth(depth);
        }
        _;
    }

    /// @dev Checks if the msg.sender is one of the relayers.
    modifier onlyRelayer() {
        if (!relayers[_msgSender()]) {
            revert NotRelayer(_msgSender());
        }
        _;
    }

    /// @dev Initializes the Semaphore verifiers, relayers used to verify the user's ZK proofs, to add members to group.
    /// @param _verifiers: List of Semaphore verifiers (address and related Merkle tree depth).
    /// @param _relayers: List of relayers' addresses.
    /// @param _fee: fee of each event creation.
    constructor(
        Verifier[] memory _verifiers,
        address[] memory _relayers,
        uint256 _fee
    ) {
        uint8 i = 0;
        for (; i < _verifiers.length; i++) {
            verifiers[_verifiers[i].merkleTreeDepth] = IVerifier(
                _verifiers[i].contractAddress
            );
        }
        for (i = 0; i < _relayers.length; i++) {
            relayers[_relayers[i]] = true;
        }
        fee = _fee;
    }

    /**
     * Receive function
     */
    receive() external payable {}

    /**
     * Fallback function
     */
    fallback() external payable {}

    ///@dev see {IZKTokenProof-isEligible}
    function isEligible(uint256 _eventId, address _target)
        public
        view
        returns (bool)
    {
        return
            events[_eventId].contractAddress != address(0) &&
            IERC721(events[_eventId].contractAddress).balanceOf(_target) != 0;
    }

    ///@dev see {IZKTokenProof-verifyMembership}
    function verifyMembership(
        uint256 _eventId,
        bytes32 _signal,
        uint256 _nullifierHash,
        uint256 _externalNullifier,
        uint256[8] calldata _proof
    ) public view returns (bool) {
        uint256 root = getRoot(_eventId);
        uint8 depth = getDepth(_eventId);

        if (depth == 0) {
            revert EventNotFound(_eventId);
        }

        // we do not need to save nullfierHash because
        // we only need to make sure the merkle tree inclusion proof.
        // _saveNullifierHash

        IVerifier verifier = verifiers[depth];

        _verifyProof(
            _signal,
            root,
            _nullifierHash,
            _externalNullifier,
            _proof,
            verifier
        );
        return true;
    }

    function verifyMembershipWithFee(
        uint256 _eventId,
        bytes32 _signal,
        uint256 _nullifierHash,
        uint256 _externalNullifier,
        uint256[8] calldata _proof
    ) public payable {
        verifyMembership(
            _eventId,
            _signal,
            _nullifierHash,
            _externalNullifier,
            _proof
        );

        Event memory targetEvent = events[_eventId];
        if (msg.value < targetEvent.fee) {
            revert InsufficientEventFee(targetEvent.fee, msg.value);
        }

        // verifyMembership with payment can be called only once.
        _saveNullifierHash(_nullifierHash);

        (bool success, ) = events[_eventId].adminAddress.call{value: msg.value}(
            ""
        );
        require(success, "Transfer Failed");
    }

    ///@dev see {IZKTokenProof-createEvent}.
    function createEvent(
        uint256 _eventId,
        uint8 _depth,
        uint256 _zeroValue,
        address _contractAddress,
        string calldata _title,
        uint256 _fee
    ) external payable onlySupportedDepth(_depth) {
        // check event creation fee
        if (msg.value < fee) {
            revert InsufficientFee(fee, msg.value);
        }

        // check if the contract address has the ERC721 interface
        bytes4 ERC721InterfaceId = type(IERC721).interfaceId;
        if (!IERC721(_contractAddress).supportsInterface(ERC721InterfaceId)) {
            revert InvalidContractAddress(_contractAddress);
        }

        // create group
        _createGroup(_eventId, _depth, _zeroValue);

        // create event
        events[_eventId] = Event({
            adminAddress: msg.sender,
            contractAddress: _contractAddress,
            title: _title,
            fee: _fee,
            createdAt: block.timestamp
        });
        // emit event
        emit EventCreated(
            _eventId,
            _depth,
            _zeroValue,
            _contractAddress,
            msg.sender,
            _title,
            _fee
        );
    }

    ///@dev see {IZKTokenProof-addVerifier}
    function addVerifier(Verifier memory _verifier) public onlyOwner {
        verifiers[_verifier.merkleTreeDepth] = IVerifier(
            _verifier.contractAddress
        );
        emit VerifierAdded(_verifier);
    }

    ///@dev see {IZKTokenProof-removeVerifier}
    function removeVerifier(Verifier memory _verifier) public onlyOwner {
        delete verifiers[_verifier.merkleTreeDepth];
        emit VerifierRemoved(_verifier);
    }

    ///@dev see {IZKTokenProof-addRelayer}
    function addRelayer(address _relayer) public onlyOwner {
        if (relayers[_relayer]) {
            revert AlreadyRelayer(_relayer);
        }
        relayers[_relayer] = true;
        emit RelayerAdded(_relayer);
    }

    ///@dev see {IZKTokenProof-removeRelayer}
    function removeRelayer(address _relayer) public onlyOwner {
        if (!relayers[_relayer]) {
            revert NotRelayer(_relayer);
        }
        relayers[_relayer] = false;
        emit RelayerRemoved(_relayer);
    }

    ///@dev see {IZKTokenProof-addMember}
    function addMember(uint256 _eventId, uint256 _identityCommitment)
        public
        onlyRelayer
    {
        _addMember(_eventId, _identityCommitment);
    }

    ///@dev see {IZKTokenProof-removeMember}
    function removeMember(
        uint256 _eventId,
        uint256 _identityCommitment,
        uint256[] calldata _proofSiblings,
        uint8[] calldata _proofPathIndices
    ) public onlyRelayer {
        _removeMember(
            _eventId,
            _identityCommitment,
            _proofSiblings,
            _proofPathIndices
        );
    }

    ///@dev see {IZKTokenProof-withdraw}
    function withdraw() external onlyOwner {
        require(address(this).balance > 0, "Not Enough Balance Of Contract");
        (bool success, ) = owner().call{value: address(this).balance}("");
        require(success, "Transfer Failed");
        emit Withdraw(msg.sender);
    }
}

File 2 of 15 : console.sol
// SPDX-License-Identifier: MIT
pragma solidity >= 0.4.22 <0.9.0;

library console {
	address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);

	function _sendLogPayload(bytes memory payload) private view {
		uint256 payloadLength = payload.length;
		address consoleAddress = CONSOLE_ADDRESS;
		assembly {
			let payloadStart := add(payload, 32)
			let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)
		}
	}

	function log() internal view {
		_sendLogPayload(abi.encodeWithSignature("log()"));
	}

	function logInt(int p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(int)", p0));
	}

	function logUint(uint p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint)", p0));
	}

	function logString(string memory p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
	}

	function logBool(bool p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
	}

	function logAddress(address p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
	}

	function logBytes(bytes memory p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes)", p0));
	}

	function logBytes1(bytes1 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0));
	}

	function logBytes2(bytes2 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0));
	}

	function logBytes3(bytes3 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0));
	}

	function logBytes4(bytes4 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0));
	}

	function logBytes5(bytes5 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0));
	}

	function logBytes6(bytes6 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0));
	}

	function logBytes7(bytes7 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0));
	}

	function logBytes8(bytes8 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0));
	}

	function logBytes9(bytes9 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0));
	}

	function logBytes10(bytes10 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0));
	}

	function logBytes11(bytes11 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0));
	}

	function logBytes12(bytes12 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0));
	}

	function logBytes13(bytes13 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0));
	}

	function logBytes14(bytes14 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0));
	}

	function logBytes15(bytes15 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0));
	}

	function logBytes16(bytes16 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0));
	}

	function logBytes17(bytes17 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0));
	}

	function logBytes18(bytes18 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0));
	}

	function logBytes19(bytes19 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0));
	}

	function logBytes20(bytes20 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0));
	}

	function logBytes21(bytes21 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0));
	}

	function logBytes22(bytes22 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0));
	}

	function logBytes23(bytes23 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0));
	}

	function logBytes24(bytes24 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0));
	}

	function logBytes25(bytes25 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0));
	}

	function logBytes26(bytes26 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0));
	}

	function logBytes27(bytes27 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0));
	}

	function logBytes28(bytes28 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0));
	}

	function logBytes29(bytes29 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0));
	}

	function logBytes30(bytes30 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0));
	}

	function logBytes31(bytes31 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0));
	}

	function logBytes32(bytes32 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0));
	}

	function log(uint p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint)", p0));
	}

	function log(string memory p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
	}

	function log(bool p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
	}

	function log(address p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
	}

	function log(uint p0, uint p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint)", p0, p1));
	}

	function log(uint p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string)", p0, p1));
	}

	function log(uint p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool)", p0, p1));
	}

	function log(uint p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address)", p0, p1));
	}

	function log(string memory p0, uint p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint)", p0, p1));
	}

	function log(string memory p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1));
	}

	function log(string memory p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1));
	}

	function log(string memory p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1));
	}

	function log(bool p0, uint p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint)", p0, p1));
	}

	function log(bool p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1));
	}

	function log(bool p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1));
	}

	function log(bool p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1));
	}

	function log(address p0, uint p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint)", p0, p1));
	}

	function log(address p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1));
	}

	function log(address p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1));
	}

	function log(address p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1));
	}

	function log(uint p0, uint p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint)", p0, p1, p2));
	}

	function log(uint p0, uint p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string)", p0, p1, p2));
	}

	function log(uint p0, uint p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool)", p0, p1, p2));
	}

	function log(uint p0, uint p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address)", p0, p1, p2));
	}

	function log(uint p0, string memory p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint)", p0, p1, p2));
	}

	function log(uint p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string)", p0, p1, p2));
	}

	function log(uint p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool)", p0, p1, p2));
	}

	function log(uint p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address)", p0, p1, p2));
	}

	function log(uint p0, bool p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint)", p0, p1, p2));
	}

	function log(uint p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string)", p0, p1, p2));
	}

	function log(uint p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool)", p0, p1, p2));
	}

	function log(uint p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address)", p0, p1, p2));
	}

	function log(uint p0, address p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint)", p0, p1, p2));
	}

	function log(uint p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string)", p0, p1, p2));
	}

	function log(uint p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool)", p0, p1, p2));
	}

	function log(uint p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address)", p0, p1, p2));
	}

	function log(string memory p0, uint p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint)", p0, p1, p2));
	}

	function log(string memory p0, uint p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string)", p0, p1, p2));
	}

	function log(string memory p0, uint p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool)", p0, p1, p2));
	}

	function log(string memory p0, uint p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2));
	}

	function log(string memory p0, address p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint)", p0, p1, p2));
	}

	function log(string memory p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2));
	}

	function log(string memory p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2));
	}

	function log(string memory p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2));
	}

	function log(bool p0, uint p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint)", p0, p1, p2));
	}

	function log(bool p0, uint p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string)", p0, p1, p2));
	}

	function log(bool p0, uint p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool)", p0, p1, p2));
	}

	function log(bool p0, uint p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2));
	}

	function log(bool p0, bool p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint)", p0, p1, p2));
	}

	function log(bool p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2));
	}

	function log(bool p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2));
	}

	function log(bool p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2));
	}

	function log(bool p0, address p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint)", p0, p1, p2));
	}

	function log(bool p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2));
	}

	function log(bool p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2));
	}

	function log(bool p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2));
	}

	function log(address p0, uint p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint)", p0, p1, p2));
	}

	function log(address p0, uint p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string)", p0, p1, p2));
	}

	function log(address p0, uint p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool)", p0, p1, p2));
	}

	function log(address p0, uint p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address)", p0, p1, p2));
	}

	function log(address p0, string memory p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint)", p0, p1, p2));
	}

	function log(address p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2));
	}

	function log(address p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2));
	}

	function log(address p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2));
	}

	function log(address p0, bool p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint)", p0, p1, p2));
	}

	function log(address p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2));
	}

	function log(address p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2));
	}

	function log(address p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2));
	}

	function log(address p0, address p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint)", p0, p1, p2));
	}

	function log(address p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2));
	}

	function log(address p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2));
	}

	function log(address p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2));
	}

	function log(uint p0, uint p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,string)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,address)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,string)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,address)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,string)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,address)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,string)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,address)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,string)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,address)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,string)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,address)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,string)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,address)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,string)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,address)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,string)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,address)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,string)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,address)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,string)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,address)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,string)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,address)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,string)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,address)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,string)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,address)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,string)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,uint)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,uint)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,uint)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,uint)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,uint)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,uint)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,uint)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3));
	}

}

File 3 of 15 : IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

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

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);
}

File 4 of 15 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

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

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

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

File 5 of 15 : SemaphoreCore.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

import "../interfaces/ISemaphoreCore.sol";
import "../interfaces/IVerifier.sol";

/// @title Semaphore core contract.
/// @notice Minimal code to allow users to signal their endorsement of an arbitrary string.
/// @dev The following code verifies that the proof is correct and saves the hash of the
/// nullifier to prevent double-signaling. External nullifier and Merkle trees (i.e. groups) must be
/// managed externally.
contract SemaphoreCore is ISemaphoreCore {
    /// @dev Gets a nullifier hash and returns true or false.
    /// It is used to prevent double-signaling.
    mapping(uint256 => bool) internal nullifierHashes;

    /// @dev Asserts that no nullifier already exists and if the zero-knowledge proof is valid.
    /// Otherwise it reverts.
    /// @param signal: Semaphore signal.
    /// @param root: Root of the Merkle tree.
    /// @param nullifierHash: Nullifier hash.
    /// @param externalNullifier: External nullifier.
    /// @param proof: Zero-knowledge proof.
    /// @param verifier: Verifier address.
    function _verifyProof(
        bytes32 signal,
        uint256 root,
        uint256 nullifierHash,
        uint256 externalNullifier,
        uint256[8] calldata proof,
        IVerifier verifier
    ) internal view {
        require(!nullifierHashes[nullifierHash], "SemaphoreCore: you cannot use the same nullifier twice");

        uint256 signalHash = _hashSignal(signal);

        verifier.verifyProof(
            [proof[0], proof[1]],
            [[proof[2], proof[3]], [proof[4], proof[5]]],
            [proof[6], proof[7]],
            [root, nullifierHash, signalHash, externalNullifier]
        );
    }

    /// @dev Stores the nullifier hash to prevent double-signaling.
    /// Attention! Remember to call it when you verify a proof if you
    /// need to prevent double-signaling.
    /// @param nullifierHash: Semaphore nullifier hash.
    function _saveNullifierHash(uint256 nullifierHash) internal {
        nullifierHashes[nullifierHash] = true;
    }

    /// @dev Creates a keccak256 hash of the signal.
    /// @param signal: Semaphore signal.
    /// @return Hash of the signal.
    function _hashSignal(bytes32 signal) private pure returns (uint256) {
        return uint256(keccak256(abi.encodePacked(signal))) >> 8;
    }
}

File 6 of 15 : SemaphoreGroups.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

import {SNARK_SCALAR_FIELD} from "./SemaphoreConstants.sol";
import "../interfaces/ISemaphoreGroups.sol";
import "@zk-kit/incremental-merkle-tree.sol/contracts/IncrementalBinaryTree.sol";
import "@openzeppelin/contracts/utils/Context.sol";

/// @title Semaphore groups contract.
/// @dev The following code allows you to create groups, add and remove members.
/// You can use getters to obtain informations about groups (root, depth, number of leaves).
abstract contract SemaphoreGroups is Context, ISemaphoreGroups {
    using IncrementalBinaryTree for IncrementalTreeData;

    /// @dev Gets a group id and returns the group/tree data.
    mapping(uint256 => IncrementalTreeData) internal groups;

    /// @dev Creates a new group by initializing the associated tree.
    /// @param groupId: Id of the group.
    /// @param depth: Depth of the tree.
    /// @param zeroValue: Zero value of the tree.
    function _createGroup(
        uint256 groupId,
        uint8 depth,
        uint256 zeroValue
    ) internal virtual {
        require(groupId < SNARK_SCALAR_FIELD, "SemaphoreGroups: group id must be < SNARK_SCALAR_FIELD");
        require(getDepth(groupId) == 0, "SemaphoreGroups: group already exists");

        groups[groupId].init(depth, zeroValue);

        emit GroupCreated(groupId, depth, zeroValue);
    }

    /// @dev Adds an identity commitment to an existing group.
    /// @param groupId: Id of the group.
    /// @param identityCommitment: New identity commitment.
    function _addMember(uint256 groupId, uint256 identityCommitment) internal virtual {
        require(getDepth(groupId) != 0, "SemaphoreGroups: group does not exist");

        groups[groupId].insert(identityCommitment);

        uint256 root = getRoot(groupId);

        emit MemberAdded(groupId, identityCommitment, root);
    }

    /// @dev Removes an identity commitment from an existing group. A proof of membership is
    /// needed to check if the node to be deleted is part of the tree.
    /// @param groupId: Id of the group.
    /// @param identityCommitment: Existing identity commitment to be deleted.
    /// @param proofSiblings: Array of the sibling nodes of the proof of membership.
    /// @param proofPathIndices: Path of the proof of membership.
    function _removeMember(
        uint256 groupId,
        uint256 identityCommitment,
        uint256[] calldata proofSiblings,
        uint8[] calldata proofPathIndices
    ) internal virtual {
        require(getDepth(groupId) != 0, "SemaphoreGroups: group does not exist");

        groups[groupId].remove(identityCommitment, proofSiblings, proofPathIndices);

        uint256 root = getRoot(groupId);

        emit MemberRemoved(groupId, identityCommitment, root);
    }

    /// @dev See {ISemaphoreGroups-getRoot}.
    function getRoot(uint256 groupId) public view virtual override returns (uint256) {
        return groups[groupId].root;
    }

    /// @dev See {ISemaphoreGroups-getDepth}.
    function getDepth(uint256 groupId) public view virtual override returns (uint8) {
        return groups[groupId].depth;
    }

    /// @dev See {ISemaphoreGroups-getNumberOfLeaves}.
    function getNumberOfLeaves(uint256 groupId) public view virtual override returns (uint256) {
        return groups[groupId].numberOfLeaves;
    }
}

File 7 of 15 : IVerifier.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

/// @title Verifier interface.
/// @dev Interface of Verifier contract.
interface IVerifier {
    function verifyProof(
        uint256[2] memory a,
        uint256[2][2] memory b,
        uint256[2] memory c,
        uint256[4] memory input
    ) external view;
}

File 8 of 15 : IZKTokenProof.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;

/// @title ZKTokenProof interface.
/// @dev Interface of a ZKTokenProof contract.
interface IZKTokenProof {
    struct Verifier {
        address contractAddress;
        uint8 merkleTreeDepth;
    }

    struct Event {
        address adminAddress;
        address contractAddress;
        string title;
        uint256 fee;
        uint256 createdAt;
    }

    /// @dev Emitted when a new event is created.
    /// @param eventId: Id of the group.
    /// @param depth: Depth of the tree.
    /// @param zeroValue: Zero value of the tree.
    /// @param contractAddress: Target NFT contract address.
    /// @param adminAddress: Admin of the group.
    /// @param title: Event title for the event.
    /// @param fee: Event fee that admin can earn for the event.
    event EventCreated(
        uint256 indexed eventId,
        uint8 depth,
        uint256 zeroValue,
        address indexed contractAddress,
        address indexed adminAddress,
        string title,
        uint256 fee
    );

    /// @dev Emmited when verifier added
    /// @param verifier: Added verifier.
    event VerifierAdded(Verifier verifier);

    /// @dev Emmited when verifier removed
    /// @param verifier: Removed verifier.
    event VerifierRemoved(Verifier verifier);

    /// @dev Emmited when relayer added
    /// @param relayerAddress: Added relayer address.
    event RelayerAdded(address indexed relayerAddress);

    /// @dev Emmited when relayer removed
    /// @param relayerAddress: Removed relayer address.
    event RelayerRemoved(address indexed relayerAddress);

    /// @dev Emitted when withdrawn
    event Withdraw(address indexed operator);

    /// @dev Check if the target address is eligible to join the event
    /// @param _eventId: Id of the event.
    /// @param _target: Address to check the eligibility.
    /// @return bool
    function isEligible(uint256 _eventId, address _target)
        external
        view
        returns (bool);

    /// @dev Prove membership
    /// @param _eventId: Id of the event.
    /// @param _signal: Signal.
    /// @param _nullifierHash: NullifierHash.
    /// @param _externalNullifier: ExternalNullifier.
    /// @param _proof: Proof.
    /// @return bool
    function verifyMembership(
        uint256 _eventId,
        bytes32 _signal,
        uint256 _nullifierHash,
        uint256 _externalNullifier,
        uint256[8] calldata _proof
    ) external view returns (bool);

    /// @dev Prove membership, pay fee and save nullifierHash.
    /// @param _eventId: Id of the event.
    /// @param _signal: Signal.
    /// @param _nullifierHash: NullifierHash.
    /// @param _externalNullifier: ExternalNullifier.
    /// @param _proof: Proof.
    function verifyMembershipWithFee(
        uint256 _eventId,
        bytes32 _signal,
        uint256 _nullifierHash,
        uint256 _externalNullifier,
        uint256[8] calldata _proof
    ) external payable;

    /// @dev Create an event.
    /// @param _eventId: Id of the group.
    /// @param _depth: Depth of the tree.
    /// @param _zeroValue: Zero value of the tree.
    /// @param _contractAddress: Target NFT contract address.
    /// @param _title: Event title.
    /// @param _fee: Fee for event participation.
    function createEvent(
        uint256 _eventId,
        uint8 _depth,
        uint256 _zeroValue,
        address _contractAddress,
        string calldata _title,
        uint256 _fee
    ) external payable;

    /// @dev Add member to the event by relayers.
    /// @param _eventId: Id of the event.
    /// @param _identityCommitment: Identity Commitment of participant.
    function addMember(uint256 _eventId, uint256 _identityCommitment) external;

    /// @dev Remove member to the event by relayers.
    /// @param _eventId: Id of the event.
    /// @param _identityCommitment: Identity Commitment of participant.
    /// @param _proofSiblings: Array of the sibling nodes of the proof of membership.
    /// @param _proofPathIndices: Path of the proof of membership.
    function removeMember(
        uint256 _eventId,
        uint256 _identityCommitment,
        uint256[] calldata _proofSiblings,
        uint8[] calldata _proofPathIndices
    ) external;

    /// @dev Add a relayer
    /// @param _relayer: Relayer address to be added.
    function addRelayer(address _relayer) external;

    /// @dev Remove a relayer
    /// @param _relayer: Relayer address to be removed.
    function removeRelayer(address _relayer) external;

    /// @dev Withdraw values in this contract.
    function withdraw() external;
}

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

pragma solidity ^0.8.0;

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

File 10 of 15 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

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

/// @title SemaphoreCore interface.
/// @dev Interface of SemaphoreCore contract.
interface ISemaphoreCore {
    /// @notice Emitted when a proof is verified correctly and a new nullifier hash is added.
    /// @param nullifierHash: Hash of external and identity nullifiers.
    event NullifierHashAdded(uint256 nullifierHash);
}

File 12 of 15 : SemaphoreConstants.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

uint256 constant SNARK_SCALAR_FIELD = 21888242871839275222246405745257275088548364400416034343698204186575808495617;

File 13 of 15 : ISemaphoreGroups.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

/// @title SemaphoreGroups interface.
/// @dev Interface of a SemaphoreGroups contract.
interface ISemaphoreGroups {
    /// @dev Emitted when a new group is created.
    /// @param groupId: Id of the group.
    /// @param depth: Depth of the tree.
    /// @param zeroValue: Zero value of the tree.
    event GroupCreated(uint256 indexed groupId, uint8 depth, uint256 zeroValue);

    /// @dev Emitted when a new identity commitment is added.
    /// @param groupId: Group id of the group.
    /// @param identityCommitment: New identity commitment.
    /// @param root: New root hash of the tree.
    event MemberAdded(uint256 indexed groupId, uint256 identityCommitment, uint256 root);

    /// @dev Emitted when a new identity commitment is removed.
    /// @param groupId: Group id of the group.
    /// @param identityCommitment: New identity commitment.
    /// @param root: New root hash of the tree.
    event MemberRemoved(uint256 indexed groupId, uint256 identityCommitment, uint256 root);

    /// @dev Returns the last root hash of a group.
    /// @param groupId: Id of the group.
    /// @return Root hash of the group.
    function getRoot(uint256 groupId) external view returns (uint256);

    /// @dev Returns the depth of the tree of a group.
    /// @param groupId: Id of the group.
    /// @return Depth of the group tree.
    function getDepth(uint256 groupId) external view returns (uint8);

    /// @dev Returns the number of tree leaves of a group.
    /// @param groupId: Id of the group.
    /// @return Number of tree leaves.
    function getNumberOfLeaves(uint256 groupId) external view returns (uint256);
}

File 14 of 15 : IncrementalBinaryTree.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

import {PoseidonT3} from "./Hashes.sol";

// Each incremental tree has certain properties and data that will
// be used to add new leaves.
struct IncrementalTreeData {
  uint8 depth; // Depth of the tree (levels - 1).
  uint256 root; // Root hash of the tree.
  uint256 numberOfLeaves; // Number of leaves of the tree.
  mapping(uint256 => uint256) zeroes; // Zero hashes used for empty nodes (level -> zero hash).
  // The nodes of the subtrees used in the last addition of a leaf (level -> [left node, right node]).
  mapping(uint256 => uint256[2]) lastSubtrees; // Caching these values is essential to efficient appends.
}

/// @title Incremental binary Merkle tree.
/// @dev The incremental tree allows to calculate the root hash each time a leaf is added, ensuring
/// the integrity of the tree.
library IncrementalBinaryTree {
  uint8 internal constant MAX_DEPTH = 32;
  uint256 internal constant SNARK_SCALAR_FIELD =
    21888242871839275222246405745257275088548364400416034343698204186575808495617;

  /// @dev Initializes a tree.
  /// @param self: Tree data.
  /// @param depth: Depth of the tree.
  /// @param zero: Zero value to be used.
  function init(
    IncrementalTreeData storage self,
    uint8 depth,
    uint256 zero
  ) public {
    require(zero < SNARK_SCALAR_FIELD, "IncrementalBinaryTree: leaf must be < SNARK_SCALAR_FIELD");
    require(depth > 0 && depth <= MAX_DEPTH, "IncrementalBinaryTree: tree depth must be between 1 and 32");

    self.depth = depth;

    for (uint8 i = 0; i < depth; i++) {
      self.zeroes[i] = zero;
      zero = PoseidonT3.poseidon([zero, zero]);
    }

    self.root = zero;
  }

  /// @dev Inserts a leaf in the tree.
  /// @param self: Tree data.
  /// @param leaf: Leaf to be inserted.
  function insert(IncrementalTreeData storage self, uint256 leaf) public {
    require(leaf < SNARK_SCALAR_FIELD, "IncrementalBinaryTree: leaf must be < SNARK_SCALAR_FIELD");
    require(self.numberOfLeaves < 2**self.depth, "IncrementalBinaryTree: tree is full");

    uint256 index = self.numberOfLeaves;
    uint256 hash = leaf;

    for (uint8 i = 0; i < self.depth; i++) {
      if (index % 2 == 0) {
        self.lastSubtrees[i] = [hash, self.zeroes[i]];
      } else {
        self.lastSubtrees[i][1] = hash;
      }

      hash = PoseidonT3.poseidon(self.lastSubtrees[i]);
      index /= 2;
    }

    self.root = hash;
    self.numberOfLeaves += 1;
  }

  /// @dev Removes a leaf from the tree.
  /// @param self: Tree data.
  /// @param leaf: Leaf to be removed.
  /// @param proofSiblings: Array of the sibling nodes of the proof of membership.
  /// @param proofPathIndices: Path of the proof of membership.
  function remove(
    IncrementalTreeData storage self,
    uint256 leaf,
    uint256[] calldata proofSiblings,
    uint8[] calldata proofPathIndices
  ) public {
    require(verify(self, leaf, proofSiblings, proofPathIndices), "IncrementalBinaryTree: leaf is not part of the tree");

    uint256 hash = self.zeroes[0];

    for (uint8 i = 0; i < self.depth; i++) {
      if (proofPathIndices[i] == 0) {
        if (proofSiblings[i] == self.lastSubtrees[i][1]) {
          self.lastSubtrees[i][0] = hash;
        }

        hash = PoseidonT3.poseidon([hash, proofSiblings[i]]);
      } else {
        if (proofSiblings[i] == self.lastSubtrees[i][0]) {
          self.lastSubtrees[i][1] = hash;
        }

        hash = PoseidonT3.poseidon([proofSiblings[i], hash]);
      }
    }

    self.root = hash;
  }

  /// @dev Verify if the path is correct and the leaf is part of the tree.
  /// @param self: Tree data.
  /// @param leaf: Leaf to be removed.
  /// @param proofSiblings: Array of the sibling nodes of the proof of membership.
  /// @param proofPathIndices: Path of the proof of membership.
  /// @return True or false.
  function verify(
    IncrementalTreeData storage self,
    uint256 leaf,
    uint256[] calldata proofSiblings,
    uint8[] calldata proofPathIndices
  ) private view returns (bool) {
    require(leaf < SNARK_SCALAR_FIELD, "IncrementalBinaryTree: leaf must be < SNARK_SCALAR_FIELD");
    require(
      proofPathIndices.length == self.depth && proofSiblings.length == self.depth,
      "IncrementalBinaryTree: length of path is not correct"
    );

    uint256 hash = leaf;

    for (uint8 i = 0; i < self.depth; i++) {
      require(
        proofSiblings[i] < SNARK_SCALAR_FIELD,
        "IncrementalBinaryTree: sibling node must be < SNARK_SCALAR_FIELD"
      );

      if (proofPathIndices[i] == 0) {
        hash = PoseidonT3.poseidon([hash, proofSiblings[i]]);
      } else {
        hash = PoseidonT3.poseidon([proofSiblings[i], hash]);
      }
    }

    return hash == self.root;
  }
}

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

library PoseidonT3 {
  function poseidon(uint256[2] memory) public pure returns (uint256) {}
}

library PoseidonT6 {
  function poseidon(uint256[5] memory) public pure returns (uint256) {}
}

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {
    "@zk-kit/incremental-merkle-tree.sol/contracts/IncrementalBinaryTree.sol": {
      "IncrementalBinaryTree": "0x325cc80c4b5fffd1be186adbd2ba43ab2cfab460"
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"components":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint8","name":"merkleTreeDepth","type":"uint8"}],"internalType":"struct IZKTokenProof.Verifier[]","name":"_verifiers","type":"tuple[]"},{"internalType":"address[]","name":"_relayers","type":"address[]"},{"internalType":"uint256","name":"_fee","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"relayerAddress","type":"address"}],"name":"AlreadyRelayer","type":"error"},{"inputs":[{"internalType":"uint256","name":"eventId","type":"uint256"}],"name":"EventNotFound","type":"error"},{"inputs":[{"internalType":"uint256","name":"requiredFee","type":"uint256"},{"internalType":"uint256","name":"actual","type":"uint256"}],"name":"InsufficientEventFee","type":"error"},{"inputs":[{"internalType":"uint256","name":"requiredFee","type":"uint256"},{"internalType":"uint256","name":"actual","type":"uint256"}],"name":"InsufficientFee","type":"error"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"InvalidContractAddress","type":"error"},{"inputs":[{"internalType":"uint8","name":"depth","type":"uint8"}],"name":"InvalidTreeDepth","type":"error"},{"inputs":[{"internalType":"address","name":"relayerAddress","type":"address"}],"name":"NotRelayer","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"eventId","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"depth","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"zeroValue","type":"uint256"},{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":true,"internalType":"address","name":"adminAddress","type":"address"},{"indexed":false,"internalType":"string","name":"title","type":"string"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"EventCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"groupId","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"depth","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"zeroValue","type":"uint256"}],"name":"GroupCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"groupId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"identityCommitment","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"root","type":"uint256"}],"name":"MemberAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"groupId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"identityCommitment","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"root","type":"uint256"}],"name":"MemberRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"nullifierHash","type":"uint256"}],"name":"NullifierHashAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"relayerAddress","type":"address"}],"name":"RelayerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"relayerAddress","type":"address"}],"name":"RelayerRemoved","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint8","name":"merkleTreeDepth","type":"uint8"}],"indexed":false,"internalType":"struct IZKTokenProof.Verifier","name":"verifier","type":"tuple"}],"name":"VerifierAdded","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint8","name":"merkleTreeDepth","type":"uint8"}],"indexed":false,"internalType":"struct IZKTokenProof.Verifier","name":"verifier","type":"tuple"}],"name":"VerifierRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"}],"name":"Withdraw","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"uint256","name":"_eventId","type":"uint256"},{"internalType":"uint256","name":"_identityCommitment","type":"uint256"}],"name":"addMember","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_relayer","type":"address"}],"name":"addRelayer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint8","name":"merkleTreeDepth","type":"uint8"}],"internalType":"struct IZKTokenProof.Verifier","name":"_verifier","type":"tuple"}],"name":"addVerifier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_eventId","type":"uint256"},{"internalType":"uint8","name":"_depth","type":"uint8"},{"internalType":"uint256","name":"_zeroValue","type":"uint256"},{"internalType":"address","name":"_contractAddress","type":"address"},{"internalType":"string","name":"_title","type":"string"},{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"createEvent","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"events","outputs":[{"internalType":"address","name":"adminAddress","type":"address"},{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"string","name":"title","type":"string"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"uint256","name":"createdAt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"groupId","type":"uint256"}],"name":"getDepth","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"groupId","type":"uint256"}],"name":"getNumberOfLeaves","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"groupId","type":"uint256"}],"name":"getRoot","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_eventId","type":"uint256"},{"internalType":"address","name":"_target","type":"address"}],"name":"isEligible","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"relayers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_eventId","type":"uint256"},{"internalType":"uint256","name":"_identityCommitment","type":"uint256"},{"internalType":"uint256[]","name":"_proofSiblings","type":"uint256[]"},{"internalType":"uint8[]","name":"_proofPathIndices","type":"uint8[]"}],"name":"removeMember","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_relayer","type":"address"}],"name":"removeRelayer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint8","name":"merkleTreeDepth","type":"uint8"}],"internalType":"struct IZKTokenProof.Verifier","name":"_verifier","type":"tuple"}],"name":"removeVerifier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"verifiers","outputs":[{"internalType":"contract IVerifier","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_eventId","type":"uint256"},{"internalType":"bytes32","name":"_signal","type":"bytes32"},{"internalType":"uint256","name":"_nullifierHash","type":"uint256"},{"internalType":"uint256","name":"_externalNullifier","type":"uint256"},{"internalType":"uint256[8]","name":"_proof","type":"uint256[8]"}],"name":"verifyMembership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_eventId","type":"uint256"},{"internalType":"bytes32","name":"_signal","type":"bytes32"},{"internalType":"uint256","name":"_nullifierHash","type":"uint256"},{"internalType":"uint256","name":"_externalNullifier","type":"uint256"},{"internalType":"uint256[8]","name":"_proof","type":"uint256[8]"}],"name":"verifyMembershipWithFee","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040523480156200001157600080fd5b5060405162003ceb38038062003ceb833981810160405281019062000037919062000637565b620000576200004b620001ce60201b60201c565b620001d660201b60201c565b60005b83518160ff1610156200011d57838160ff168151811062000080576200007f620006d1565b5b60200260200101516000015160046000868460ff1681518110620000a957620000a8620006d1565b5b60200260200101516020015160ff1660ff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808062000114906200072f565b9150506200005a565b600090505b82518160ff161015620001bd57600160056000858460ff16815181106200014e576200014d620006d1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080620001b4906200072f565b91505062000122565b81600381905550505050506200075e565b600033905090565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000604051905090565b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200030082620002b5565b810181811067ffffffffffffffff82111715620003225762000321620002c6565b5b80604052505050565b6000620003376200029c565b9050620003458282620002f5565b919050565b600067ffffffffffffffff821115620003685762000367620002c6565b5b602082029050602081019050919050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620003b08262000383565b9050919050565b620003c281620003a3565b8114620003ce57600080fd5b50565b600081519050620003e281620003b7565b92915050565b600060ff82169050919050565b6200040081620003e8565b81146200040c57600080fd5b50565b6000815190506200042081620003f5565b92915050565b6000604082840312156200043f576200043e6200037e565b5b6200044b60406200032b565b905060006200045d84828501620003d1565b600083015250602062000473848285016200040f565b60208301525092915050565b60006200049662000490846200034a565b6200032b565b90508083825260208201905060408402830185811115620004bc57620004bb62000379565b5b835b81811015620004e95780620004d4888262000426565b845260208401935050604081019050620004be565b5050509392505050565b600082601f8301126200050b576200050a620002b0565b5b81516200051d8482602086016200047f565b91505092915050565b600067ffffffffffffffff821115620005445762000543620002c6565b5b602082029050602081019050919050565b60006200056c620005668462000526565b6200032b565b9050808382526020820190506020840283018581111562000592576200059162000379565b5b835b81811015620005bf5780620005aa8882620003d1565b84526020840193505060208101905062000594565b5050509392505050565b600082601f830112620005e157620005e0620002b0565b5b8151620005f384826020860162000555565b91505092915050565b6000819050919050565b6200061181620005fc565b81146200061d57600080fd5b50565b600081519050620006318162000606565b92915050565b600080600060608486031215620006535762000652620002a6565b5b600084015167ffffffffffffffff811115620006745762000673620002ab565b5b6200068286828701620004f3565b935050602084015167ffffffffffffffff811115620006a657620006a5620002ab565b5b620006b486828701620005c9565b9250506040620006c78682870162000620565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200073c82620003e8565b915060ff82141562000753576200075262000700565b5b600182019050919050565b61357d806200076e6000396000f3fe60806040526004361061012e5760003560e01c806360f0a5ac116100ab578063b9c78c2b1161006f578063b9c78c2b146103de578063ba0422161461041b578063d1b2dd2814610458578063dd39f00d14610481578063ddca3f43146104aa578063f2fde38b146104d557610135565b806360f0a5ac146102f9578063715018a61461032257806375e618c9146103395780638da5cb5b146103765780639b24b3b0146103a157610135565b80633ccfd60b116100f25780633ccfd60b1461022357806343989f851461023a5780634b426eae146102635780635300f8411461027f578063592e0e00146102bc57610135565b8063057241b8146101375780630b791430146101535780631783efc3146101945780631c1370b2146101bd5780632d69be98146101e657610135565b3661013557005b005b610151600480360381019061014c91906121c3565b6104fe565b005b34801561015f57600080fd5b5061017a6004803603810190610175919061223f565b6107c3565b60405161018b959493929190612355565b60405180910390f35b3480156101a057600080fd5b506101bb60048036038101906101b691906123af565b6108c1565b005b3480156101c957600080fd5b506101e460048036038101906101df9190612524565b61096b565b005b3480156101f257600080fd5b5061020d60048036038101906102089190612551565b610a81565b60405161021a91906125dd565b60405180910390f35b34801561022f57600080fd5b50610238610ab4565b005b34801561024657600080fd5b50610261600480360381019061025c91906126ae565b610c6c565b005b61027d600480360381019061027891906127ab565b610d1e565b005b34801561028b57600080fd5b506102a660048036038101906102a1919061285a565b6110f4565b6040516102b391906128a2565b60405180910390f35b3480156102c857600080fd5b506102e360048036038101906102de91906128bd565b611114565b6040516102f091906128a2565b60405180910390f35b34801561030557600080fd5b50610320600480360381019061031b919061285a565b61124f565b005b34801561032e57600080fd5b506103376113f7565b005b34801561034557600080fd5b50610360600480360381019061035b919061223f565b61147f565b60405161036d919061290c565b60405180910390f35b34801561038257600080fd5b5061038b6114ac565b6040516103989190612927565b60405180910390f35b3480156103ad57600080fd5b506103c860048036038101906103c3919061223f565b6114d6565b6040516103d59190612942565b60405180910390f35b3480156103ea57600080fd5b506104056004803603810190610400919061223f565b6114f6565b6040516104129190612942565b60405180910390f35b34801561042757600080fd5b50610442600480360381019061043d91906121c3565b611516565b60405161044f91906128a2565b60405180910390f35b34801561046457600080fd5b5061047f600480360381019061047a9190612524565b6115d6565b005b34801561048d57600080fd5b506104a860048036038101906104a3919061285a565b6116cc565b005b3480156104b657600080fd5b506104bf611875565b6040516104cc9190612942565b60405180910390f35b3480156104e157600080fd5b506104fc60048036038101906104f7919061285a565b61187b565b005b61050b8585858585611516565b506000600660008781526020019081526020016000206040518060a00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820180546105e89061298c565b80601f01602080910402602001604051908101604052809291908181526020018280546106149061298c565b80156106615780601f1061063657610100808354040283529160200191610661565b820191906000526020600020905b81548152906001019060200180831161064457829003601f168201915b5050505050815260200160038201548152602001600482015481525050905080606001513410156106cf578060600151346040517f127ce50b0000000000000000000000000000000000000000000000000000000081526004016106c69291906129be565b60405180910390fd5b6106d884611973565b60006006600088815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163460405161073490612a18565b60006040518083038185875af1925050503d8060008114610771576040519150601f19603f3d011682016040523d82523d6000602084013e610776565b606091505b50509050806107ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b190612a79565b60405180910390fd5b50505050505050565b60066020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020180546108329061298c565b80601f016020809104026020016040519081016040528092919081815260200182805461085e9061298c565b80156108ab5780601f10610880576101008083540402835291602001916108ab565b820191906000526020600020905b81548152906001019060200180831161088e57829003601f168201915b5050505050908060030154908060040154905085565b600560006108cd6119a1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661095d576109216119a1565b6040517f366b2e5a0000000000000000000000000000000000000000000000000000000081526004016109549190612927565b60405180910390fd5b61096782826119a9565b5050565b6109736119a1565b73ffffffffffffffffffffffffffffffffffffffff166109916114ac565b73ffffffffffffffffffffffffffffffffffffffff16146109e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109de90612ae5565b60405180910390fd5b806000015160046000836020015160ff1660ff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f564645df973dfb1e7efcea0a3fd8b1a17885b551004060cebd294079a39f12fd81604051610a769190612b52565b60405180910390a150565b60046020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610abc6119a1565b73ffffffffffffffffffffffffffffffffffffffff16610ada6114ac565b73ffffffffffffffffffffffffffffffffffffffff1614610b30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2790612ae5565b60405180910390fd5b60004711610b73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6a90612bb9565b60405180910390fd5b6000610b7d6114ac565b73ffffffffffffffffffffffffffffffffffffffff1647604051610ba090612a18565b60006040518083038185875af1925050503d8060008114610bdd576040519150601f19603f3d011682016040523d82523d6000602084013e610be2565b606091505b5050905080610c26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1d90612a79565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167ff67611512e0a2d90c96fd3f08dca4971bc45fba9dc679eabe839a32abbe58a8e60405160405180910390a250565b60056000610c786119a1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610d0857610ccc6119a1565b6040517f366b2e5a000000000000000000000000000000000000000000000000000000008152600401610cff9190612927565b60405180910390fd5b610d16868686868686611ac1565b505050505050565b85600073ffffffffffffffffffffffffffffffffffffffff16600460008360ff1660ff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610dca57806040517f2ad8ef12000000000000000000000000000000000000000000000000000000008152600401610dc1919061290c565b60405180910390fd5b600354341015610e1557600354346040517fa458261b000000000000000000000000000000000000000000000000000000008152600401610e0c9291906129be565b60405180910390fd5b60007f80ac58cd0000000000000000000000000000000000000000000000000000000090508573ffffffffffffffffffffffffffffffffffffffff166301ffc9a7826040518263ffffffff1660e01b8152600401610e739190612c14565b60206040518083038186803b158015610e8b57600080fd5b505afa158015610e9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec39190612c5b565b610f0457856040517f19bb4029000000000000000000000000000000000000000000000000000000008152600401610efb9190612927565b60405180910390fd5b610f0f898989611be5565b6040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff16815260200186868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050815260200184815260200142815250600660008b815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816002019080519060200190611063929190612079565b5060608201518160030155608082015181600401559050503373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168a7f06b6f3cfea971e7089a9c4ba417844e2d06a78289f15569a834703424c52c7858b8b8a8a8a6040516110e1959493929190612cc4565b60405180910390a4505050505050505050565b60056020528060005260406000206000915054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff166006600085815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614158015611247575060006006600085815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b81526004016111f49190612927565b60206040518083038186803b15801561120c57600080fd5b505afa158015611220573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112449190612d27565b14155b905092915050565b6112576119a1565b73ffffffffffffffffffffffffffffffffffffffff166112756114ac565b73ffffffffffffffffffffffffffffffffffffffff16146112cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c290612ae5565b60405180910390fd5b600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661135957806040517f366b2e5a0000000000000000000000000000000000000000000000000000000081526004016113509190612927565b60405180910390fd5b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f10e1f7ce9fd7d1b90a66d13a2ab3cb8dd7f29f3f8d520b143b063ccfbab6906b60405160405180910390a250565b6113ff6119a1565b73ffffffffffffffffffffffffffffffffffffffff1661141d6114ac565b73ffffffffffffffffffffffffffffffffffffffff1614611473576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146a90612ae5565b60405180910390fd5b61147d6000611d53565b565b60006001600083815260200190815260200160002060000160009054906101000a900460ff169050919050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600060016000838152602001908152602001600020600101549050919050565b600060016000838152602001908152602001600020600201549050919050565b600080611522876114d6565b9050600061152f8861147f565b905060008160ff16141561157a57876040517f90e0fe530000000000000000000000000000000000000000000000000000000081526004016115719190612942565b60405180910390fd5b6000600460008360ff1660ff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506115c6888489898986611e19565b6001935050505095945050505050565b6115de6119a1565b73ffffffffffffffffffffffffffffffffffffffff166115fc6114ac565b73ffffffffffffffffffffffffffffffffffffffff1614611652576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164990612ae5565b60405180910390fd5b60046000826020015160ff1660ff16815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690557f351f5582b9b7e9da0e37173efe18b53007e0eeb1af62fdefc3dcc57f4ccb9b2d816040516116c19190612b52565b60405180910390a150565b6116d46119a1565b73ffffffffffffffffffffffffffffffffffffffff166116f26114ac565b73ffffffffffffffffffffffffffffffffffffffff1614611748576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173f90612ae5565b60405180910390fd5b600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156117d757806040517f8e0a7e7c0000000000000000000000000000000000000000000000000000000081526004016117ce9190612927565b60405180910390fd5b6001600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f03580ee9f53a62b7cb409a2cb56f9be87747dd15017afc5cef6eef321e4fb2c560405160405180910390a250565b60035481565b6118836119a1565b73ffffffffffffffffffffffffffffffffffffffff166118a16114ac565b73ffffffffffffffffffffffffffffffffffffffff16146118f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ee90612ae5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611967576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195e90612dc6565b60405180910390fd5b61197081611d53565b50565b600160008083815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600033905090565b60006119b48361147f565b60ff1614156119f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ef90612e58565b60405180910390fd5b6001600083815260200190815260200160002073325cc80c4b5fffd1be186adbd2ba43ab2cfab46063168703fa9091836040518363ffffffff1660e01b8152600401611a45929190612e8e565b60006040518083038186803b158015611a5d57600080fd5b505af4158015611a71573d6000803e3d6000fd5b505050506000611a80836114d6565b9050827f03fd27265b7dd1f55558bedc22a58fa3b10afb1be776e614bd5a7ba7b94994068383604051611ab49291906129be565b60405180910390a2505050565b6000611acc8761147f565b60ff161415611b10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0790612e58565b60405180910390fd5b6001600087815260200190815260200160002073325cc80c4b5fffd1be186adbd2ba43ab2cfab460630629596f909187878787876040518763ffffffff1660e01b8152600401611b6596959493929190612fec565b60006040518083038186803b158015611b7d57600080fd5b505af4158015611b91573d6000803e3d6000fd5b505050506000611ba0876114d6565b9050867fe270325ded177064d7bda473e6519ef40a291058c41286f71a6e4872f1e9ab5c8783604051611bd49291906129be565b60405180910390a250505050505050565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018310611c47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3e906130b5565b60405180910390fd5b6000611c528461147f565b60ff1614611c95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8c90613147565b60405180910390fd5b6001600084815260200190815260200160002073325cc80c4b5fffd1be186adbd2ba43ab2cfab46063b4bdd117909184846040518463ffffffff1660e01b8152600401611ce493929190613176565b60006040518083038186803b158015611cfc57600080fd5b505af4158015611d10573d6000803e3d6000fd5b50505050827fc3082aa494e9088c2c9f0fb62a0b6bd46e6699acb94cfba35be29b95a93f68c88383604051611d469291906131ad565b60405180910390a2505050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008085815260200190815260200160002060009054906101000a900460ff1615611e79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7090613248565b60405180910390fd5b6000611e8487612042565b90508173ffffffffffffffffffffffffffffffffffffffff16635fe8c13b604051806040016040528086600060088110611ec157611ec0613268565b5b6020020135815260200186600160088110611edf57611ede613268565b5b60200201358152506040518060400160405280604051806040016040528089600260088110611f1157611f10613268565b5b6020020135815260200189600360088110611f2f57611f2e613268565b5b60200201358152508152602001604051806040016040528089600460088110611f5b57611f5a613268565b5b6020020135815260200189600560088110611f7957611f78613268565b5b6020020135815250815250604051806040016040528088600660088110611fa357611fa2613268565b5b6020020135815260200188600760088110611fc157611fc0613268565b5b602002013581525060405180608001604052808c81526020018b81526020018781526020018a8152506040518563ffffffff1660e01b815260040161200994939291906134c4565b60006040518083038186803b15801561202157600080fd5b505afa158015612035573d6000803e3d6000fd5b5050505050505050505050565b6000600882604051602001612057919061352c565b6040516020818303038152906040528051906020012060001c901c9050919050565b8280546120859061298c565b90600052602060002090601f0160209004810192826120a757600085556120ee565b82601f106120c057805160ff19168380011785556120ee565b828001600101855582156120ee579182015b828111156120ed5782518255916020019190600101906120d2565b5b5090506120fb91906120ff565b5090565b5b80821115612118576000816000905550600101612100565b5090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b61214381612130565b811461214e57600080fd5b50565b6000813590506121608161213a565b92915050565b6000819050919050565b61217981612166565b811461218457600080fd5b50565b60008135905061219681612170565b92915050565b600080fd5b6000819050826020600802820111156121bd576121bc61219c565b5b92915050565b600080600080600061018086880312156121e0576121df612126565b5b60006121ee88828901612151565b95505060206121ff88828901612187565b945050604061221088828901612151565b935050606061222188828901612151565b9250506080612232888289016121a1565b9150509295509295909350565b60006020828403121561225557612254612126565b5b600061226384828501612151565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006122978261226c565b9050919050565b6122a78161228c565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b838110156122e75780820151818401526020810190506122cc565b838111156122f6576000848401525b50505050565b6000601f19601f8301169050919050565b6000612318826122ad565b61232281856122b8565b93506123328185602086016122c9565b61233b816122fc565b840191505092915050565b61234f81612130565b82525050565b600060a08201905061236a600083018861229e565b612377602083018761229e565b8181036040830152612389818661230d565b90506123986060830185612346565b6123a56080830184612346565b9695505050505050565b600080604083850312156123c6576123c5612126565b5b60006123d485828601612151565b92505060206123e585828601612151565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61242c826122fc565b810181811067ffffffffffffffff8211171561244b5761244a6123f4565b5b80604052505050565b600061245e61211c565b905061246a8282612423565b919050565b6124788161228c565b811461248357600080fd5b50565b6000813590506124958161246f565b92915050565b600060ff82169050919050565b6124b18161249b565b81146124bc57600080fd5b50565b6000813590506124ce816124a8565b92915050565b6000604082840312156124ea576124e96123ef565b5b6124f46040612454565b9050600061250484828501612486565b6000830152506020612518848285016124bf565b60208301525092915050565b60006040828403121561253a57612539612126565b5b6000612548848285016124d4565b91505092915050565b60006020828403121561256757612566612126565b5b6000612575848285016124bf565b91505092915050565b6000819050919050565b60006125a361259e6125998461226c565b61257e565b61226c565b9050919050565b60006125b582612588565b9050919050565b60006125c7826125aa565b9050919050565b6125d7816125bc565b82525050565b60006020820190506125f260008301846125ce565b92915050565b600080fd5b600080fd5b60008083601f840112612618576126176125f8565b5b8235905067ffffffffffffffff811115612635576126346125fd565b5b6020830191508360208202830111156126515761265061219c565b5b9250929050565b60008083601f84011261266e5761266d6125f8565b5b8235905067ffffffffffffffff81111561268b5761268a6125fd565b5b6020830191508360208202830111156126a7576126a661219c565b5b9250929050565b600080600080600080608087890312156126cb576126ca612126565b5b60006126d989828a01612151565b96505060206126ea89828a01612151565b955050604087013567ffffffffffffffff81111561270b5761270a61212b565b5b61271789828a01612602565b9450945050606087013567ffffffffffffffff81111561273a5761273961212b565b5b61274689828a01612658565b92509250509295509295509295565b60008083601f84011261276b5761276a6125f8565b5b8235905067ffffffffffffffff811115612788576127876125fd565b5b6020830191508360018202830111156127a4576127a361219c565b5b9250929050565b600080600080600080600060c0888a0312156127ca576127c9612126565b5b60006127d88a828b01612151565b97505060206127e98a828b016124bf565b96505060406127fa8a828b01612151565b955050606061280b8a828b01612486565b945050608088013567ffffffffffffffff81111561282c5761282b61212b565b5b6128388a828b01612755565b935093505060a061284b8a828b01612151565b91505092959891949750929550565b6000602082840312156128705761286f612126565b5b600061287e84828501612486565b91505092915050565b60008115159050919050565b61289c81612887565b82525050565b60006020820190506128b76000830184612893565b92915050565b600080604083850312156128d4576128d3612126565b5b60006128e285828601612151565b92505060206128f385828601612486565b9150509250929050565b6129068161249b565b82525050565b600060208201905061292160008301846128fd565b92915050565b600060208201905061293c600083018461229e565b92915050565b60006020820190506129576000830184612346565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806129a457607f821691505b602082108114156129b8576129b761295d565b5b50919050565b60006040820190506129d36000830185612346565b6129e06020830184612346565b9392505050565b600081905092915050565b50565b6000612a026000836129e7565b9150612a0d826129f2565b600082019050919050565b6000612a23826129f5565b9150819050919050565b7f5472616e73666572204661696c65640000000000000000000000000000000000600082015250565b6000612a63600f836122b8565b9150612a6e82612a2d565b602082019050919050565b60006020820190508181036000830152612a9281612a56565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612acf6020836122b8565b9150612ada82612a99565b602082019050919050565b60006020820190508181036000830152612afe81612ac2565b9050919050565b612b0e8161228c565b82525050565b612b1d8161249b565b82525050565b604082016000820151612b396000850182612b05565b506020820151612b4c6020850182612b14565b50505050565b6000604082019050612b676000830184612b23565b92915050565b7f4e6f7420456e6f7567682042616c616e6365204f6620436f6e74726163740000600082015250565b6000612ba3601e836122b8565b9150612bae82612b6d565b602082019050919050565b60006020820190508181036000830152612bd281612b96565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612c0e81612bd9565b82525050565b6000602082019050612c296000830184612c05565b92915050565b612c3881612887565b8114612c4357600080fd5b50565b600081519050612c5581612c2f565b92915050565b600060208284031215612c7157612c70612126565b5b6000612c7f84828501612c46565b91505092915050565b82818337600083830152505050565b6000612ca383856122b8565b9350612cb0838584612c88565b612cb9836122fc565b840190509392505050565b6000608082019050612cd960008301886128fd565b612ce66020830187612346565b8181036040830152612cf9818587612c97565b9050612d086060830184612346565b9695505050505050565b600081519050612d218161213a565b92915050565b600060208284031215612d3d57612d3c612126565b5b6000612d4b84828501612d12565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612db06026836122b8565b9150612dbb82612d54565b604082019050919050565b60006020820190508181036000830152612ddf81612da3565b9050919050565b7f53656d6170686f726547726f7570733a2067726f757020646f6573206e6f742060008201527f6578697374000000000000000000000000000000000000000000000000000000602082015250565b6000612e426025836122b8565b9150612e4d82612de6565b604082019050919050565b60006020820190508181036000830152612e7181612e35565b9050919050565b8082525050565b612e8881612130565b82525050565b6000604082019050612ea36000830185612e78565b612eb06020830184612e7f565b9392505050565b600082825260208201905092915050565b600080fd5b6000612ed98385612eb7565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115612f0c57612f0b612ec8565b5b602083029250612f1d838584612c88565b82840190509392505050565b600082825260208201905092915050565b6000819050919050565b612f4d8161249b565b82525050565b6000612f5f8383612f44565b60208301905092915050565b6000612f7a60208401846124bf565b905092915050565b6000602082019050919050565b6000612f9b8385612f29565b9350612fa682612f3a565b8060005b85811015612fdf57612fbc8284612f6b565b612fc68882612f53565b9750612fd183612f82565b925050600181019050612faa565b5085925050509392505050565b60006080820190506130016000830189612e78565b61300e6020830188612e7f565b8181036040830152613021818688612ecd565b90508181036060830152613036818486612f8f565b9050979650505050505050565b7f53656d6170686f726547726f7570733a2067726f7570206964206d757374206260008201527f65203c20534e41524b5f5343414c41525f4649454c4400000000000000000000602082015250565b600061309f6036836122b8565b91506130aa82613043565b604082019050919050565b600060208201905081810360008301526130ce81613092565b9050919050565b7f53656d6170686f726547726f7570733a2067726f757020616c7265616479206560008201527f7869737473000000000000000000000000000000000000000000000000000000602082015250565b60006131316025836122b8565b915061313c826130d5565b604082019050919050565b6000602082019050818103600083015261316081613124565b9050919050565b6131708161249b565b82525050565b600060608201905061318b6000830186612e78565b6131986020830185613167565b6131a56040830184612e7f565b949350505050565b60006040820190506131c260008301856128fd565b6131cf6020830184612346565b9392505050565b7f53656d6170686f7265436f72653a20796f752063616e6e6f742075736520746860008201527f652073616d65206e756c6c696669657220747769636500000000000000000000602082015250565b60006132326036836122b8565b915061323d826131d6565b604082019050919050565b6000602082019050818103600083015261326181613225565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060029050919050565b600081905092915050565b6000819050919050565b6132c081612130565b82525050565b60006132d283836132b7565b60208301905092915050565b6000602082019050919050565b6132f481613297565b6132fe81846132a2565b9250613309826132ad565b8060005b8381101561333a57815161332187826132c6565b965061332c836132de565b92505060018101905061330d565b505050505050565b600060029050919050565b600081905092915050565b6000819050919050565b600081905092915050565b61337681613297565b6133808184613362565b925061338b826132ad565b8060005b838110156133bc5781516133a387826132c6565b96506133ae836132de565b92505060018101905061338f565b505050505050565b60006133d0838361336d565b60408301905092915050565b6000602082019050919050565b6133f281613342565b6133fc818461334d565b925061340782613358565b8060005b8381101561343857815161341f87826133c4565b965061342a836133dc565b92505060018101905061340b565b505050505050565b600060049050919050565b600081905092915050565b6000819050919050565b6000602082019050919050565b61347681613440565b613480818461344b565b925061348b82613456565b8060005b838110156134bc5781516134a387826132c6565b96506134ae83613460565b92505060018101905061348f565b505050505050565b6000610180820190506134da60008301876132eb565b6134e760408301866133e9565b6134f460c08301856132eb565b61350261010083018461346d565b95945050505050565b6000819050919050565b61352661352182612166565b61350b565b82525050565b60006135388284613515565b6020820191508190509291505056fea264697066735822122062ff13459aec14b4b46ecb125dbbb78f3e7145e1856f1e600fdd3845cd4cfb2964736f6c63430008090033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000002386f26fc10000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000037dc1cb7ab684a2af97862ce42244fc9293f1a0e000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000c7f08080d325dae4072b45cde3a73717e3a7223000000000000000000000000199012076ea09f92d8c30c494e94738cff449f57

Deployed Bytecode

0x60806040526004361061012e5760003560e01c806360f0a5ac116100ab578063b9c78c2b1161006f578063b9c78c2b146103de578063ba0422161461041b578063d1b2dd2814610458578063dd39f00d14610481578063ddca3f43146104aa578063f2fde38b146104d557610135565b806360f0a5ac146102f9578063715018a61461032257806375e618c9146103395780638da5cb5b146103765780639b24b3b0146103a157610135565b80633ccfd60b116100f25780633ccfd60b1461022357806343989f851461023a5780634b426eae146102635780635300f8411461027f578063592e0e00146102bc57610135565b8063057241b8146101375780630b791430146101535780631783efc3146101945780631c1370b2146101bd5780632d69be98146101e657610135565b3661013557005b005b610151600480360381019061014c91906121c3565b6104fe565b005b34801561015f57600080fd5b5061017a6004803603810190610175919061223f565b6107c3565b60405161018b959493929190612355565b60405180910390f35b3480156101a057600080fd5b506101bb60048036038101906101b691906123af565b6108c1565b005b3480156101c957600080fd5b506101e460048036038101906101df9190612524565b61096b565b005b3480156101f257600080fd5b5061020d60048036038101906102089190612551565b610a81565b60405161021a91906125dd565b60405180910390f35b34801561022f57600080fd5b50610238610ab4565b005b34801561024657600080fd5b50610261600480360381019061025c91906126ae565b610c6c565b005b61027d600480360381019061027891906127ab565b610d1e565b005b34801561028b57600080fd5b506102a660048036038101906102a1919061285a565b6110f4565b6040516102b391906128a2565b60405180910390f35b3480156102c857600080fd5b506102e360048036038101906102de91906128bd565b611114565b6040516102f091906128a2565b60405180910390f35b34801561030557600080fd5b50610320600480360381019061031b919061285a565b61124f565b005b34801561032e57600080fd5b506103376113f7565b005b34801561034557600080fd5b50610360600480360381019061035b919061223f565b61147f565b60405161036d919061290c565b60405180910390f35b34801561038257600080fd5b5061038b6114ac565b6040516103989190612927565b60405180910390f35b3480156103ad57600080fd5b506103c860048036038101906103c3919061223f565b6114d6565b6040516103d59190612942565b60405180910390f35b3480156103ea57600080fd5b506104056004803603810190610400919061223f565b6114f6565b6040516104129190612942565b60405180910390f35b34801561042757600080fd5b50610442600480360381019061043d91906121c3565b611516565b60405161044f91906128a2565b60405180910390f35b34801561046457600080fd5b5061047f600480360381019061047a9190612524565b6115d6565b005b34801561048d57600080fd5b506104a860048036038101906104a3919061285a565b6116cc565b005b3480156104b657600080fd5b506104bf611875565b6040516104cc9190612942565b60405180910390f35b3480156104e157600080fd5b506104fc60048036038101906104f7919061285a565b61187b565b005b61050b8585858585611516565b506000600660008781526020019081526020016000206040518060a00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820180546105e89061298c565b80601f01602080910402602001604051908101604052809291908181526020018280546106149061298c565b80156106615780601f1061063657610100808354040283529160200191610661565b820191906000526020600020905b81548152906001019060200180831161064457829003601f168201915b5050505050815260200160038201548152602001600482015481525050905080606001513410156106cf578060600151346040517f127ce50b0000000000000000000000000000000000000000000000000000000081526004016106c69291906129be565b60405180910390fd5b6106d884611973565b60006006600088815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163460405161073490612a18565b60006040518083038185875af1925050503d8060008114610771576040519150601f19603f3d011682016040523d82523d6000602084013e610776565b606091505b50509050806107ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b190612a79565b60405180910390fd5b50505050505050565b60066020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020180546108329061298c565b80601f016020809104026020016040519081016040528092919081815260200182805461085e9061298c565b80156108ab5780601f10610880576101008083540402835291602001916108ab565b820191906000526020600020905b81548152906001019060200180831161088e57829003601f168201915b5050505050908060030154908060040154905085565b600560006108cd6119a1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661095d576109216119a1565b6040517f366b2e5a0000000000000000000000000000000000000000000000000000000081526004016109549190612927565b60405180910390fd5b61096782826119a9565b5050565b6109736119a1565b73ffffffffffffffffffffffffffffffffffffffff166109916114ac565b73ffffffffffffffffffffffffffffffffffffffff16146109e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109de90612ae5565b60405180910390fd5b806000015160046000836020015160ff1660ff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f564645df973dfb1e7efcea0a3fd8b1a17885b551004060cebd294079a39f12fd81604051610a769190612b52565b60405180910390a150565b60046020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610abc6119a1565b73ffffffffffffffffffffffffffffffffffffffff16610ada6114ac565b73ffffffffffffffffffffffffffffffffffffffff1614610b30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2790612ae5565b60405180910390fd5b60004711610b73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6a90612bb9565b60405180910390fd5b6000610b7d6114ac565b73ffffffffffffffffffffffffffffffffffffffff1647604051610ba090612a18565b60006040518083038185875af1925050503d8060008114610bdd576040519150601f19603f3d011682016040523d82523d6000602084013e610be2565b606091505b5050905080610c26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1d90612a79565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167ff67611512e0a2d90c96fd3f08dca4971bc45fba9dc679eabe839a32abbe58a8e60405160405180910390a250565b60056000610c786119a1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610d0857610ccc6119a1565b6040517f366b2e5a000000000000000000000000000000000000000000000000000000008152600401610cff9190612927565b60405180910390fd5b610d16868686868686611ac1565b505050505050565b85600073ffffffffffffffffffffffffffffffffffffffff16600460008360ff1660ff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610dca57806040517f2ad8ef12000000000000000000000000000000000000000000000000000000008152600401610dc1919061290c565b60405180910390fd5b600354341015610e1557600354346040517fa458261b000000000000000000000000000000000000000000000000000000008152600401610e0c9291906129be565b60405180910390fd5b60007f80ac58cd0000000000000000000000000000000000000000000000000000000090508573ffffffffffffffffffffffffffffffffffffffff166301ffc9a7826040518263ffffffff1660e01b8152600401610e739190612c14565b60206040518083038186803b158015610e8b57600080fd5b505afa158015610e9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec39190612c5b565b610f0457856040517f19bb4029000000000000000000000000000000000000000000000000000000008152600401610efb9190612927565b60405180910390fd5b610f0f898989611be5565b6040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff16815260200186868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050815260200184815260200142815250600660008b815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816002019080519060200190611063929190612079565b5060608201518160030155608082015181600401559050503373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168a7f06b6f3cfea971e7089a9c4ba417844e2d06a78289f15569a834703424c52c7858b8b8a8a8a6040516110e1959493929190612cc4565b60405180910390a4505050505050505050565b60056020528060005260406000206000915054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff166006600085815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614158015611247575060006006600085815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b81526004016111f49190612927565b60206040518083038186803b15801561120c57600080fd5b505afa158015611220573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112449190612d27565b14155b905092915050565b6112576119a1565b73ffffffffffffffffffffffffffffffffffffffff166112756114ac565b73ffffffffffffffffffffffffffffffffffffffff16146112cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c290612ae5565b60405180910390fd5b600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661135957806040517f366b2e5a0000000000000000000000000000000000000000000000000000000081526004016113509190612927565b60405180910390fd5b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f10e1f7ce9fd7d1b90a66d13a2ab3cb8dd7f29f3f8d520b143b063ccfbab6906b60405160405180910390a250565b6113ff6119a1565b73ffffffffffffffffffffffffffffffffffffffff1661141d6114ac565b73ffffffffffffffffffffffffffffffffffffffff1614611473576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146a90612ae5565b60405180910390fd5b61147d6000611d53565b565b60006001600083815260200190815260200160002060000160009054906101000a900460ff169050919050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600060016000838152602001908152602001600020600101549050919050565b600060016000838152602001908152602001600020600201549050919050565b600080611522876114d6565b9050600061152f8861147f565b905060008160ff16141561157a57876040517f90e0fe530000000000000000000000000000000000000000000000000000000081526004016115719190612942565b60405180910390fd5b6000600460008360ff1660ff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506115c6888489898986611e19565b6001935050505095945050505050565b6115de6119a1565b73ffffffffffffffffffffffffffffffffffffffff166115fc6114ac565b73ffffffffffffffffffffffffffffffffffffffff1614611652576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164990612ae5565b60405180910390fd5b60046000826020015160ff1660ff16815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690557f351f5582b9b7e9da0e37173efe18b53007e0eeb1af62fdefc3dcc57f4ccb9b2d816040516116c19190612b52565b60405180910390a150565b6116d46119a1565b73ffffffffffffffffffffffffffffffffffffffff166116f26114ac565b73ffffffffffffffffffffffffffffffffffffffff1614611748576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173f90612ae5565b60405180910390fd5b600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156117d757806040517f8e0a7e7c0000000000000000000000000000000000000000000000000000000081526004016117ce9190612927565b60405180910390fd5b6001600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f03580ee9f53a62b7cb409a2cb56f9be87747dd15017afc5cef6eef321e4fb2c560405160405180910390a250565b60035481565b6118836119a1565b73ffffffffffffffffffffffffffffffffffffffff166118a16114ac565b73ffffffffffffffffffffffffffffffffffffffff16146118f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ee90612ae5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611967576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195e90612dc6565b60405180910390fd5b61197081611d53565b50565b600160008083815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600033905090565b60006119b48361147f565b60ff1614156119f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ef90612e58565b60405180910390fd5b6001600083815260200190815260200160002073325cc80c4b5fffd1be186adbd2ba43ab2cfab46063168703fa9091836040518363ffffffff1660e01b8152600401611a45929190612e8e565b60006040518083038186803b158015611a5d57600080fd5b505af4158015611a71573d6000803e3d6000fd5b505050506000611a80836114d6565b9050827f03fd27265b7dd1f55558bedc22a58fa3b10afb1be776e614bd5a7ba7b94994068383604051611ab49291906129be565b60405180910390a2505050565b6000611acc8761147f565b60ff161415611b10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0790612e58565b60405180910390fd5b6001600087815260200190815260200160002073325cc80c4b5fffd1be186adbd2ba43ab2cfab460630629596f909187878787876040518763ffffffff1660e01b8152600401611b6596959493929190612fec565b60006040518083038186803b158015611b7d57600080fd5b505af4158015611b91573d6000803e3d6000fd5b505050506000611ba0876114d6565b9050867fe270325ded177064d7bda473e6519ef40a291058c41286f71a6e4872f1e9ab5c8783604051611bd49291906129be565b60405180910390a250505050505050565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018310611c47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3e906130b5565b60405180910390fd5b6000611c528461147f565b60ff1614611c95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8c90613147565b60405180910390fd5b6001600084815260200190815260200160002073325cc80c4b5fffd1be186adbd2ba43ab2cfab46063b4bdd117909184846040518463ffffffff1660e01b8152600401611ce493929190613176565b60006040518083038186803b158015611cfc57600080fd5b505af4158015611d10573d6000803e3d6000fd5b50505050827fc3082aa494e9088c2c9f0fb62a0b6bd46e6699acb94cfba35be29b95a93f68c88383604051611d469291906131ad565b60405180910390a2505050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008085815260200190815260200160002060009054906101000a900460ff1615611e79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7090613248565b60405180910390fd5b6000611e8487612042565b90508173ffffffffffffffffffffffffffffffffffffffff16635fe8c13b604051806040016040528086600060088110611ec157611ec0613268565b5b6020020135815260200186600160088110611edf57611ede613268565b5b60200201358152506040518060400160405280604051806040016040528089600260088110611f1157611f10613268565b5b6020020135815260200189600360088110611f2f57611f2e613268565b5b60200201358152508152602001604051806040016040528089600460088110611f5b57611f5a613268565b5b6020020135815260200189600560088110611f7957611f78613268565b5b6020020135815250815250604051806040016040528088600660088110611fa357611fa2613268565b5b6020020135815260200188600760088110611fc157611fc0613268565b5b602002013581525060405180608001604052808c81526020018b81526020018781526020018a8152506040518563ffffffff1660e01b815260040161200994939291906134c4565b60006040518083038186803b15801561202157600080fd5b505afa158015612035573d6000803e3d6000fd5b5050505050505050505050565b6000600882604051602001612057919061352c565b6040516020818303038152906040528051906020012060001c901c9050919050565b8280546120859061298c565b90600052602060002090601f0160209004810192826120a757600085556120ee565b82601f106120c057805160ff19168380011785556120ee565b828001600101855582156120ee579182015b828111156120ed5782518255916020019190600101906120d2565b5b5090506120fb91906120ff565b5090565b5b80821115612118576000816000905550600101612100565b5090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b61214381612130565b811461214e57600080fd5b50565b6000813590506121608161213a565b92915050565b6000819050919050565b61217981612166565b811461218457600080fd5b50565b60008135905061219681612170565b92915050565b600080fd5b6000819050826020600802820111156121bd576121bc61219c565b5b92915050565b600080600080600061018086880312156121e0576121df612126565b5b60006121ee88828901612151565b95505060206121ff88828901612187565b945050604061221088828901612151565b935050606061222188828901612151565b9250506080612232888289016121a1565b9150509295509295909350565b60006020828403121561225557612254612126565b5b600061226384828501612151565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006122978261226c565b9050919050565b6122a78161228c565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b838110156122e75780820151818401526020810190506122cc565b838111156122f6576000848401525b50505050565b6000601f19601f8301169050919050565b6000612318826122ad565b61232281856122b8565b93506123328185602086016122c9565b61233b816122fc565b840191505092915050565b61234f81612130565b82525050565b600060a08201905061236a600083018861229e565b612377602083018761229e565b8181036040830152612389818661230d565b90506123986060830185612346565b6123a56080830184612346565b9695505050505050565b600080604083850312156123c6576123c5612126565b5b60006123d485828601612151565b92505060206123e585828601612151565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61242c826122fc565b810181811067ffffffffffffffff8211171561244b5761244a6123f4565b5b80604052505050565b600061245e61211c565b905061246a8282612423565b919050565b6124788161228c565b811461248357600080fd5b50565b6000813590506124958161246f565b92915050565b600060ff82169050919050565b6124b18161249b565b81146124bc57600080fd5b50565b6000813590506124ce816124a8565b92915050565b6000604082840312156124ea576124e96123ef565b5b6124f46040612454565b9050600061250484828501612486565b6000830152506020612518848285016124bf565b60208301525092915050565b60006040828403121561253a57612539612126565b5b6000612548848285016124d4565b91505092915050565b60006020828403121561256757612566612126565b5b6000612575848285016124bf565b91505092915050565b6000819050919050565b60006125a361259e6125998461226c565b61257e565b61226c565b9050919050565b60006125b582612588565b9050919050565b60006125c7826125aa565b9050919050565b6125d7816125bc565b82525050565b60006020820190506125f260008301846125ce565b92915050565b600080fd5b600080fd5b60008083601f840112612618576126176125f8565b5b8235905067ffffffffffffffff811115612635576126346125fd565b5b6020830191508360208202830111156126515761265061219c565b5b9250929050565b60008083601f84011261266e5761266d6125f8565b5b8235905067ffffffffffffffff81111561268b5761268a6125fd565b5b6020830191508360208202830111156126a7576126a661219c565b5b9250929050565b600080600080600080608087890312156126cb576126ca612126565b5b60006126d989828a01612151565b96505060206126ea89828a01612151565b955050604087013567ffffffffffffffff81111561270b5761270a61212b565b5b61271789828a01612602565b9450945050606087013567ffffffffffffffff81111561273a5761273961212b565b5b61274689828a01612658565b92509250509295509295509295565b60008083601f84011261276b5761276a6125f8565b5b8235905067ffffffffffffffff811115612788576127876125fd565b5b6020830191508360018202830111156127a4576127a361219c565b5b9250929050565b600080600080600080600060c0888a0312156127ca576127c9612126565b5b60006127d88a828b01612151565b97505060206127e98a828b016124bf565b96505060406127fa8a828b01612151565b955050606061280b8a828b01612486565b945050608088013567ffffffffffffffff81111561282c5761282b61212b565b5b6128388a828b01612755565b935093505060a061284b8a828b01612151565b91505092959891949750929550565b6000602082840312156128705761286f612126565b5b600061287e84828501612486565b91505092915050565b60008115159050919050565b61289c81612887565b82525050565b60006020820190506128b76000830184612893565b92915050565b600080604083850312156128d4576128d3612126565b5b60006128e285828601612151565b92505060206128f385828601612486565b9150509250929050565b6129068161249b565b82525050565b600060208201905061292160008301846128fd565b92915050565b600060208201905061293c600083018461229e565b92915050565b60006020820190506129576000830184612346565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806129a457607f821691505b602082108114156129b8576129b761295d565b5b50919050565b60006040820190506129d36000830185612346565b6129e06020830184612346565b9392505050565b600081905092915050565b50565b6000612a026000836129e7565b9150612a0d826129f2565b600082019050919050565b6000612a23826129f5565b9150819050919050565b7f5472616e73666572204661696c65640000000000000000000000000000000000600082015250565b6000612a63600f836122b8565b9150612a6e82612a2d565b602082019050919050565b60006020820190508181036000830152612a9281612a56565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612acf6020836122b8565b9150612ada82612a99565b602082019050919050565b60006020820190508181036000830152612afe81612ac2565b9050919050565b612b0e8161228c565b82525050565b612b1d8161249b565b82525050565b604082016000820151612b396000850182612b05565b506020820151612b4c6020850182612b14565b50505050565b6000604082019050612b676000830184612b23565b92915050565b7f4e6f7420456e6f7567682042616c616e6365204f6620436f6e74726163740000600082015250565b6000612ba3601e836122b8565b9150612bae82612b6d565b602082019050919050565b60006020820190508181036000830152612bd281612b96565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612c0e81612bd9565b82525050565b6000602082019050612c296000830184612c05565b92915050565b612c3881612887565b8114612c4357600080fd5b50565b600081519050612c5581612c2f565b92915050565b600060208284031215612c7157612c70612126565b5b6000612c7f84828501612c46565b91505092915050565b82818337600083830152505050565b6000612ca383856122b8565b9350612cb0838584612c88565b612cb9836122fc565b840190509392505050565b6000608082019050612cd960008301886128fd565b612ce66020830187612346565b8181036040830152612cf9818587612c97565b9050612d086060830184612346565b9695505050505050565b600081519050612d218161213a565b92915050565b600060208284031215612d3d57612d3c612126565b5b6000612d4b84828501612d12565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612db06026836122b8565b9150612dbb82612d54565b604082019050919050565b60006020820190508181036000830152612ddf81612da3565b9050919050565b7f53656d6170686f726547726f7570733a2067726f757020646f6573206e6f742060008201527f6578697374000000000000000000000000000000000000000000000000000000602082015250565b6000612e426025836122b8565b9150612e4d82612de6565b604082019050919050565b60006020820190508181036000830152612e7181612e35565b9050919050565b8082525050565b612e8881612130565b82525050565b6000604082019050612ea36000830185612e78565b612eb06020830184612e7f565b9392505050565b600082825260208201905092915050565b600080fd5b6000612ed98385612eb7565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115612f0c57612f0b612ec8565b5b602083029250612f1d838584612c88565b82840190509392505050565b600082825260208201905092915050565b6000819050919050565b612f4d8161249b565b82525050565b6000612f5f8383612f44565b60208301905092915050565b6000612f7a60208401846124bf565b905092915050565b6000602082019050919050565b6000612f9b8385612f29565b9350612fa682612f3a565b8060005b85811015612fdf57612fbc8284612f6b565b612fc68882612f53565b9750612fd183612f82565b925050600181019050612faa565b5085925050509392505050565b60006080820190506130016000830189612e78565b61300e6020830188612e7f565b8181036040830152613021818688612ecd565b90508181036060830152613036818486612f8f565b9050979650505050505050565b7f53656d6170686f726547726f7570733a2067726f7570206964206d757374206260008201527f65203c20534e41524b5f5343414c41525f4649454c4400000000000000000000602082015250565b600061309f6036836122b8565b91506130aa82613043565b604082019050919050565b600060208201905081810360008301526130ce81613092565b9050919050565b7f53656d6170686f726547726f7570733a2067726f757020616c7265616479206560008201527f7869737473000000000000000000000000000000000000000000000000000000602082015250565b60006131316025836122b8565b915061313c826130d5565b604082019050919050565b6000602082019050818103600083015261316081613124565b9050919050565b6131708161249b565b82525050565b600060608201905061318b6000830186612e78565b6131986020830185613167565b6131a56040830184612e7f565b949350505050565b60006040820190506131c260008301856128fd565b6131cf6020830184612346565b9392505050565b7f53656d6170686f7265436f72653a20796f752063616e6e6f742075736520746860008201527f652073616d65206e756c6c696669657220747769636500000000000000000000602082015250565b60006132326036836122b8565b915061323d826131d6565b604082019050919050565b6000602082019050818103600083015261326181613225565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060029050919050565b600081905092915050565b6000819050919050565b6132c081612130565b82525050565b60006132d283836132b7565b60208301905092915050565b6000602082019050919050565b6132f481613297565b6132fe81846132a2565b9250613309826132ad565b8060005b8381101561333a57815161332187826132c6565b965061332c836132de565b92505060018101905061330d565b505050505050565b600060029050919050565b600081905092915050565b6000819050919050565b600081905092915050565b61337681613297565b6133808184613362565b925061338b826132ad565b8060005b838110156133bc5781516133a387826132c6565b96506133ae836132de565b92505060018101905061338f565b505050505050565b60006133d0838361336d565b60408301905092915050565b6000602082019050919050565b6133f281613342565b6133fc818461334d565b925061340782613358565b8060005b8381101561343857815161341f87826133c4565b965061342a836133dc565b92505060018101905061340b565b505050505050565b600060049050919050565b600081905092915050565b6000819050919050565b6000602082019050919050565b61347681613440565b613480818461344b565b925061348b82613456565b8060005b838110156134bc5781516134a387826132c6565b96506134ae83613460565b92505060018101905061348f565b505050505050565b6000610180820190506134da60008301876132eb565b6134e760408301866133e9565b6134f460c08301856132eb565b61350261010083018461346d565b95945050505050565b6000819050919050565b61352661352182612166565b61350b565b82525050565b60006135388284613515565b6020820191508190509291505056fea264697066735822122062ff13459aec14b4b46ecb125dbbb78f3e7145e1856f1e600fdd3845cd4cfb2964736f6c63430008090033

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000002386f26fc10000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000037dc1cb7ab684a2af97862ce42244fc9293f1a0e000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000c7f08080d325dae4072b45cde3a73717e3a7223000000000000000000000000199012076ea09f92d8c30c494e94738cff449f57

-----Decoded View---------------
Arg [0] : _verifiers (tuple[]): System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput]
Arg [1] : _relayers (address[]): 0x0C7f08080d325dae4072B45CdE3a73717E3a7223,0x199012076Ea09f92D8C30C494E94738CFF449f57
Arg [2] : _fee (uint256): 10000000000000000

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 000000000000000000000000000000000000000000000000002386f26fc10000
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [4] : 00000000000000000000000037dc1cb7ab684a2af97862ce42244fc9293f1a0e
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000014
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [7] : 0000000000000000000000000c7f08080d325dae4072b45cde3a73717e3a7223
Arg [8] : 000000000000000000000000199012076ea09f92d8c30c494e94738cff449f57


Block Transaction 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
[ 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.