{
  "address": "0x186953EEAa009247EAf45FEeB5D037Af874C74De",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_eventManagerDeployed",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_userRegistryDeployed",
          "type": "address"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "eventId",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "user",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "uint8",
          "name": "checkInId",
          "type": "uint8"
        }
      ],
      "name": "CheckInConfirmed",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "eventId",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "user",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "uint8",
          "name": "checkInId",
          "type": "uint8"
        }
      ],
      "name": "CheckInRejected",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "eventId",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "user",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "uint8",
          "name": "checkInId",
          "type": "uint8"
        },
        {
          "indexed": false,
          "internalType": "string",
          "name": "knownFaceHash",
          "type": "string"
        },
        {
          "indexed": false,
          "internalType": "string",
          "name": "unknownFaceHash",
          "type": "string"
        },
        {
          "indexed": false,
          "internalType": "string",
          "name": "userLocation",
          "type": "string"
        },
        {
          "indexed": false,
          "internalType": "string",
          "name": "eventLocation",
          "type": "string"
        }
      ],
      "name": "CheckInRequested",
      "type": "event"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_eventId",
          "type": "uint256"
        }
      ],
      "name": "getMyCheckIns",
      "outputs": [
        {
          "components": [
            {
              "internalType": "uint8",
              "name": "id",
              "type": "uint8"
            },
            {
              "internalType": "address",
              "name": "user",
              "type": "address"
            },
            {
              "internalType": "string",
              "name": "faceHash",
              "type": "string"
            },
            {
              "internalType": "string",
              "name": "location",
              "type": "string"
            },
            {
              "internalType": "uint256",
              "name": "timestamp",
              "type": "uint256"
            },
            {
              "internalType": "address",
              "name": "emailProtectedAddress",
              "type": "address"
            },
            {
              "internalType": "enum CheckInManager.CheckInStatus",
              "name": "status",
              "type": "uint8"
            }
          ],
          "internalType": "struct CheckInManager.CheckIn[]",
          "name": "",
          "type": "tuple[]"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_eventId",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "_user",
          "type": "address"
        }
      ],
      "name": "getUserCheckIns",
      "outputs": [
        {
          "components": [
            {
              "internalType": "uint8",
              "name": "id",
              "type": "uint8"
            },
            {
              "internalType": "address",
              "name": "user",
              "type": "address"
            },
            {
              "internalType": "string",
              "name": "faceHash",
              "type": "string"
            },
            {
              "internalType": "string",
              "name": "location",
              "type": "string"
            },
            {
              "internalType": "uint256",
              "name": "timestamp",
              "type": "uint256"
            },
            {
              "internalType": "address",
              "name": "emailProtectedAddress",
              "type": "address"
            },
            {
              "internalType": "enum CheckInManager.CheckInStatus",
              "name": "status",
              "type": "uint8"
            }
          ],
          "internalType": "struct CheckInManager.CheckIn[]",
          "name": "",
          "type": "tuple[]"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_eventId",
          "type": "uint256"
        }
      ],
      "name": "getUsersCheckInsFromEvent",
      "outputs": [
        {
          "internalType": "address[]",
          "name": "",
          "type": "address[]"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "offchainValidator",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_eventId",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "_user",
          "type": "address"
        },
        {
          "internalType": "uint8",
          "name": "_checkInId",
          "type": "uint8"
        },
        {
          "internalType": "bool",
          "name": "_approved",
          "type": "bool"
        }
      ],
      "name": "replyCheckIn",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_eventId",
          "type": "uint256"
        },
        {
          "internalType": "string",
          "name": "unknownFaceHash",
          "type": "string"
        },
        {
          "internalType": "string",
          "name": "userLocation",
          "type": "string"
        },
        {
          "internalType": "address",
          "name": "emailProtectedAddress",
          "type": "address"
        }
      ],
      "name": "requestCheckIn",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_offchainValidator",
          "type": "address"
        }
      ],
      "name": "setOffchainValidator",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "transactionHash": "0xadc991b29468329fff3464f63dd83becea3c663be1b12806c78246b9b402ade3",
  "receipt": {
    "to": null,
    "from": "0x72ac37F2B8685300a6B3781669a487eBb94a5CCd",
    "contractAddress": "0x186953EEAa009247EAf45FEeB5D037Af874C74De",
    "transactionIndex": 1,
    "gasUsed": "1149872",
    "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
    "blockHash": "0x3a63d2b4baccaf2b8a02505292f35d1b228e29dde724d5eaf23b718902500ece",
    "transactionHash": "0xadc991b29468329fff3464f63dd83becea3c663be1b12806c78246b9b402ade3",
    "logs": [],
    "blockNumber": 27913144,
    "cumulativeGasUsed": "1815091",
    "status": 1,
    "byzantium": true
  },
  "args": [
    "0xf0d25784782ce6229fCbe5eE4366A7Bb4103C70F",
    "0xa89a5609A98a9fe1A29823Eb9cCDD6d7A694001B"
  ],
  "numDeployments": 1,
  "solcInputHash": "ad61601d16bee984c0a38353d68fb497",
  "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_eventManagerDeployed\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_userRegistryDeployed\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"eventId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint8\",\"name\":\"checkInId\",\"type\":\"uint8\"}],\"name\":\"CheckInConfirmed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"eventId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint8\",\"name\":\"checkInId\",\"type\":\"uint8\"}],\"name\":\"CheckInRejected\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"eventId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint8\",\"name\":\"checkInId\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"knownFaceHash\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"unknownFaceHash\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"userLocation\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"eventLocation\",\"type\":\"string\"}],\"name\":\"CheckInRequested\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_eventId\",\"type\":\"uint256\"}],\"name\":\"getMyCheckIns\",\"outputs\":[{\"components\":[{\"internalType\":\"uint8\",\"name\":\"id\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"faceHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"location\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"emailProtectedAddress\",\"type\":\"address\"},{\"internalType\":\"enum CheckInManager.CheckInStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"internalType\":\"struct CheckInManager.CheckIn[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_eventId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_user\",\"type\":\"address\"}],\"name\":\"getUserCheckIns\",\"outputs\":[{\"components\":[{\"internalType\":\"uint8\",\"name\":\"id\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"faceHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"location\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"emailProtectedAddress\",\"type\":\"address\"},{\"internalType\":\"enum CheckInManager.CheckInStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"internalType\":\"struct CheckInManager.CheckIn[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_eventId\",\"type\":\"uint256\"}],\"name\":\"getUsersCheckInsFromEvent\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"offchainValidator\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_eventId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_user\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"_checkInId\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"_approved\",\"type\":\"bool\"}],\"name\":\"replyCheckIn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_eventId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"unknownFaceHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"userLocation\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"emailProtectedAddress\",\"type\":\"address\"}],\"name\":\"requestCheckIn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_offchainValidator\",\"type\":\"address\"}],\"name\":\"setOffchainValidator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/CheckInManager.sol\":\"CheckInManager\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/CheckInManager.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\npragma solidity >=0.8.0 <0.9.0;\\n\\nimport \\\"./EventManager.sol\\\";\\nimport \\\"./UserRegistry.sol\\\";\\n\\n/*\\n * @title CheckInManager\\n * @dev Manages check-in requests and validations.\\n */\\ncontract CheckInManager {\\n\\tenum CheckInStatus {\\n\\t\\tPending,\\n\\t\\tConfirmed,\\n\\t\\tRejected\\n\\t}\\n\\n\\tstruct CheckIn {\\n\\t\\tuint8 id;\\n\\t\\taddress user;\\n\\t\\tstring faceHash; // IPFS hash of the user's face image\\n\\t\\tstring location; // Latitude and longitude: \\\"lat, long\\\"\\n\\t\\tuint256 timestamp; // Timestamp of the check-in request\\n\\t\\taddress emailProtectedAddress; // Email protected address\\n\\t\\tCheckInStatus status;\\n\\t}\\n\\n\\tmapping(uint256 => mapping(address => CheckIn[])) private checkIns; // Check-ins for each event\\n\\tmapping(uint256 => address[]) private checkInEventUser; // Users who have checked in for an event\\n\\n\\tEventManager private eventManager; // EventManager contract reference\\n\\tUserRegistry private userRegistry; // UserRegistry contract reference\\n\\n\\taddress public offchainValidator; // Address of the off-chain validator\\n\\n\\tevent CheckInRequested(\\n\\t\\tuint256 indexed eventId,\\n\\t\\taddress indexed user,\\n\\t\\tuint8 indexed checkInId,\\n\\t\\tstring knownFaceHash,\\n\\t\\tstring unknownFaceHash,\\n\\t\\tstring userLocation,\\n\\t\\tstring eventLocation\\n\\t); // Event for check-in requests\\n\\tevent CheckInConfirmed(\\n\\t\\tuint256 indexed eventId,\\n\\t\\taddress indexed user,\\n\\t\\tuint8 indexed checkInId\\n\\t); // Event for confirmed check-ins\\n\\tevent CheckInRejected(\\n\\t\\tuint256 indexed eventId,\\n\\t\\taddress indexed user,\\n\\t\\tuint8 indexed checkInId\\n\\t); // Event for rejected check-ins\\n\\n\\t// Check if the event exists\\n\\tmodifier eventExists(uint256 _eventId) {\\n\\t\\trequire(eventManager.getEvent(_eventId).active, \\\"Event does not exist\\\");\\n\\t\\t_;\\n\\t}\\n\\n\\t// Check if the event is ongoing\\n\\tmodifier eventIsOngoing(uint256 _eventId) {\\n\\t\\trequire(\\n\\t\\t\\tblock.timestamp > eventManager.getEvent(_eventId).startTime,\\n\\t\\t\\t\\\"Event has not started\\\"\\n\\t\\t);\\n\\t\\trequire(\\n\\t\\t\\tblock.timestamp < eventManager.getEvent(_eventId).endTime,\\n\\t\\t\\t\\\"Event has ended\\\"\\n\\t\\t);\\n\\t\\t_;\\n\\t}\\n\\n\\t// Check if the user has not reached the maximum check-ins\\n\\tmodifier checkMaxCheckIns(uint256 _eventId, address _user) {\\n\\t\\trequire(\\n\\t\\t\\tcheckIns[_eventId][_user].length < 999,\\n\\t\\t\\t\\\"Maximum check-ins tries reached\\\"\\n\\t\\t);\\n\\t\\t_;\\n\\t}\\n\\n\\t// Only the off-chain validator can perform this action\\n\\tmodifier onlyOffchainValidator() {\\n\\t\\trequire(\\n\\t\\t\\tmsg.sender == offchainValidator,\\n\\t\\t\\t\\\"Only the off-chain validator can perform this action\\\"\\n\\t\\t);\\n\\t\\t_;\\n\\t}\\n\\n\\t// Check if already has checkin approved in the event\\n\\tmodifier checkAlreadyCheckInApproved(uint256 _eventId, address _user) {\\n\\t\\tbool alreadyCheckIn = false;\\n\\n\\t\\tfor (uint256 i = 0; i < checkInEventUser[_eventId].length; i++) {\\n\\t\\t\\tif (checkInEventUser[_eventId][i] == _user) {\\n\\t\\t\\t\\talreadyCheckIn = true;\\n\\t\\t\\t\\tbreak;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\trequire(alreadyCheckIn, \\\"User already checked in\\\");\\n\\t\\t_;\\n\\t}\\n\\n\\t/*\\n\\t * @dev Constructor to set the EventManager contract address and the off-chain validator address.\\n\\t * @param _eventManagerDeployed Address of the deployed EventManager contract.\\n\\t * @param _offchainValidator Address of the off-chain validator.\\n\\t */\\n\\tconstructor(address _eventManagerDeployed, address _userRegistryDeployed) {\\n\\t\\trequire(\\n\\t\\t\\t_eventManagerDeployed != address(0),\\n\\t\\t\\t\\\"Invalid EventManager address\\\"\\n\\t\\t);\\n\\n\\t\\teventManager = EventManager(_eventManagerDeployed);\\n\\t\\tuserRegistry = UserRegistry(_userRegistryDeployed);\\n\\n\\t\\toffchainValidator = msg.sender;\\n\\t}\\n\\n\\t/*\\n\\t * @dev Set the off-chain validator address.\\n\\t * @param _offchainValidator Address of the off-chain validator.\\n\\t */\\n\\tfunction setOffchainValidator(\\n\\t\\taddress _offchainValidator\\n\\t) external onlyOffchainValidator {\\n\\t\\toffchainValidator = _offchainValidator;\\n\\t}\\n\\n\\t/*\\n\\t * @dev Request check-in for an event.\\n\\t * @param _eventId ID of the event to check into.\\n\\t * @param faceHash IPFS hash of the user's face image.\\n\\t * @param location Location of the user at the time of check-in.\\n\\t */\\n\\tfunction requestCheckIn(\\n\\t\\tuint256 _eventId,\\n\\t\\tstring calldata unknownFaceHash,\\n\\t\\tstring calldata userLocation,\\n\\t\\taddress emailProtectedAddress\\n\\t)\\n\\t\\texternal\\n\\t\\teventExists(_eventId)\\n\\t\\teventIsOngoing(_eventId)\\n\\t\\tcheckMaxCheckIns(_eventId, msg.sender)\\n\\t{\\n\\t\\tuint8 checkInId = uint8(checkIns[_eventId][msg.sender].length);\\n\\t\\tcheckIns[_eventId][msg.sender].push(\\n\\t\\t\\tCheckIn({\\n\\t\\t\\t\\tid: checkInId,\\n\\t\\t\\t\\tuser: msg.sender,\\n\\t\\t\\t\\tfaceHash: unknownFaceHash,\\n\\t\\t\\t\\tlocation: userLocation,\\n\\t\\t\\t\\ttimestamp: block.timestamp,\\n\\t\\t\\t\\temailProtectedAddress: emailProtectedAddress,\\n\\t\\t\\t\\tstatus: CheckInStatus.Pending\\n\\t\\t\\t})\\n\\t\\t);\\n\\n\\t\\tstring memory knownFaceHash = userRegistry\\n\\t\\t\\t.getUserInfo(msg.sender)\\n\\t\\t\\t.faceHash;\\n\\n\\t\\tstring memory eventLocation = eventManager.getEvent(_eventId).location;\\n\\n\\t\\temit CheckInRequested(\\n\\t\\t\\t_eventId,\\n\\t\\t\\tmsg.sender,\\n\\t\\t\\tcheckInId,\\n\\t\\t\\tunknownFaceHash,\\n\\t\\t\\tknownFaceHash,\\n\\t\\t\\tuserLocation,\\n\\t\\t\\teventLocation\\n\\t\\t);\\n\\t}\\n\\n\\t/*\\n\\t * @dev Confirm check-in after off-chain validation.\\n\\t * This would be called by the backend after successful validation.\\n\\t * @param _eventId ID of the event.\\n\\t * @param _user Address of the user.\\n\\t * @param _checkInId ID of the check-in request.\\n\\t * @param _status Status of the check-in request.\\n\\t */\\n\\tfunction replyCheckIn(\\n\\t\\tuint256 _eventId,\\n\\t\\taddress _user,\\n\\t\\tuint8 _checkInId,\\n\\t\\tbool _approved\\n\\t) external eventExists(_eventId) onlyOffchainValidator {\\n\\t\\tcheckIns[_eventId][_user][_checkInId].status = _approved\\n\\t\\t\\t? CheckInStatus.Confirmed\\n\\t\\t\\t: CheckInStatus.Rejected;\\n\\n\\t\\tif (_approved) {\\n\\t\\t\\tcheckInEventUser[_eventId].push(_user);\\n\\t\\t}\\n\\n\\t\\tif (_approved) {\\n\\t\\t\\temit CheckInConfirmed(_eventId, _user, _checkInId);\\n\\t\\t} else {\\n\\t\\t\\temit CheckInRejected(_eventId, _user, _checkInId);\\n\\t\\t}\\n\\t}\\n\\n\\t/*\\n\\t * @dev Retrieves check-in requests for an event by the caller.\\n\\t * @param _eventId ID of the event.\\n\\t * @return Check-in requests.\\n\\t */\\n\\tfunction getMyCheckIns(\\n\\t\\tuint256 _eventId\\n\\t) external view returns (CheckIn[] memory) {\\n\\t\\treturn checkIns[_eventId][msg.sender];\\n\\t}\\n\\n\\t/*\\n\\t * @dev Retrieves check-in requests for an event by the user.\\n\\t * @param _eventId ID of the event.\\n\\t * @param _user Address of the user.\\n\\t * @return Check-in requests.\\n\\t */\\n\\tfunction getUserCheckIns(\\n\\t\\tuint256 _eventId,\\n\\t\\taddress _user\\n\\t) external view returns (CheckIn[] memory) {\\n\\t\\treturn checkIns[_eventId][_user];\\n\\t}\\n\\n\\t/*\\n\\t * @dev Retrieves users checkins for an event.\\n\\t * @param _eventId ID of the event.\\n\\t * @return Users who have checked in.\\n\\t */\\n\\tfunction getUsersCheckInsFromEvent(\\n\\t\\tuint256 _eventId\\n\\t) external view returns (address[] memory) {\\n\\t\\treturn checkInEventUser[_eventId];\\n\\t}\\n}\\n\",\"keccak256\":\"0xfaca9ac3e9b7febed40dd7262924874127a3cd89951ad6bb593e77b05cac8445\",\"license\":\"MIT\"},\"contracts/EventManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.0 <0.9.0;\\n\\n/*\\n * @title EventManager\\n * @dev Manages event creation and details.\\n */\\ncontract EventManager {\\n\\tstruct Event {\\n\\t\\tstring name;\\n\\t\\tstring description;\\n\\t\\tstring imageHash; // IPFS hash of the event's image\\n\\t\\tstring location; // Latitude and longitude: \\\"lat, long\\\"\\n\\t\\taddress owner;\\n\\t\\tuint256 startTime; // Unix timestamp\\n\\t\\tuint256 endTime; // Unix timestamp\\n\\t\\tbool active;\\n\\t}\\n\\n\\tstruct EventData {\\n\\t\\tstring name;\\n\\t\\tstring description;\\n\\t\\tstring imageHash;\\n\\t\\tstring location;\\n\\t\\tuint256 startTime;\\n\\t\\tuint256 endTime;\\n\\t\\tbool active;\\n\\t}\\n\\n\\tEvent[] public events;\\n\\n\\tevent EventCreated(uint256 indexed eventId, string name, address owner);\\n\\n\\t// Modifier to ensure only the owner can perform an action\\n\\tmodifier onlyOwner(uint256 _eventId) {\\n\\t\\trequire(\\n\\t\\t\\tmsg.sender == events[_eventId].owner,\\n\\t\\t\\t\\\"Only the owner can perform this action\\\"\\n\\t\\t);\\n\\t\\t_;\\n\\t}\\n\\n\\t// Modifier to ensure event exists\\n\\tmodifier eventExists(uint256 _eventId) {\\n\\t\\trequire(_eventId < events.length, \\\"Event does not exist\\\");\\n\\t\\t_;\\n\\t}\\n\\n\\t// Modifier for validating event data\\n\\tmodifier validEventData(EventData memory data) {\\n\\t\\trequire(\\n\\t\\t\\tbytes(data.name).length > 0 && bytes(data.name).length <= 128,\\n\\t\\t\\t\\\"Invalid name\\\"\\n\\t\\t);\\n\\t\\trequire(\\n\\t\\t\\tbytes(data.description).length > 0 &&\\n\\t\\t\\t\\tbytes(data.description).length <= 1024,\\n\\t\\t\\t\\\"Invalid description\\\"\\n\\t\\t);\\n\\t\\trequire(bytes(data.imageHash).length == 46, \\\"Invalid IPFS hash\\\");\\n\\t\\trequire(bytes(data.location).length > 0, \\\"Invalid location\\\");\\n\\t\\trequire(data.startTime < data.endTime, \\\"Invalid time range\\\");\\n\\t\\t_;\\n\\t}\\n\\n\\tfunction _setEvent(\\n\\t\\tuint256 _eventId,\\n\\t\\tEventData memory data,\\n\\t\\tbool _isNewEvent\\n\\t) private validEventData(data) {\\n\\t\\tEvent memory newEvent = Event({\\n\\t\\t\\tname: data.name,\\n\\t\\t\\tdescription: data.description,\\n\\t\\t\\timageHash: data.imageHash,\\n\\t\\t\\tlocation: data.location,\\n\\t\\t\\towner: msg.sender,\\n\\t\\t\\tstartTime: data.startTime,\\n\\t\\t\\tendTime: data.endTime,\\n\\t\\t\\tactive: data.active\\n\\t\\t});\\n\\n\\t\\tif (_isNewEvent) {\\n\\t\\t\\tevents.push(newEvent);\\n\\t\\t\\temit EventCreated(events.length - 1, data.name, msg.sender);\\n\\t\\t} else {\\n\\t\\t\\tevents[_eventId] = newEvent;\\n\\t\\t}\\n\\t}\\n\\n\\tfunction createEvent(\\n\\t\\tstring calldata _name,\\n\\t\\tstring calldata _description,\\n\\t\\tstring calldata _imageHash,\\n\\t\\tstring calldata _location,\\n\\t\\tuint256 _startTime,\\n\\t\\tuint256 _endTime\\n\\t) external {\\n\\t\\tEventData memory data = EventData({\\n\\t\\t\\tname: _name,\\n\\t\\t\\tdescription: _description,\\n\\t\\t\\timageHash: _imageHash,\\n\\t\\t\\tlocation: _location,\\n\\t\\t\\tstartTime: _startTime,\\n\\t\\t\\tendTime: _endTime,\\n\\t\\t\\tactive: true\\n\\t\\t});\\n\\n\\t\\t_setEvent(0, data, true);\\n\\t}\\n\\n\\tfunction updateEvent(\\n\\t\\tuint256 _eventId,\\n\\t\\tstring calldata _name,\\n\\t\\tstring calldata _description,\\n\\t\\tstring calldata _imageHash,\\n\\t\\tstring calldata _location,\\n\\t\\tuint256 _startTime,\\n\\t\\tuint256 _endTime,\\n\\t\\tbool _active\\n\\t) external eventExists(_eventId) onlyOwner(_eventId) {\\n\\t\\tEventData memory data = EventData({\\n\\t\\t\\tname: _name,\\n\\t\\t\\tdescription: _description,\\n\\t\\t\\timageHash: _imageHash,\\n\\t\\t\\tlocation: _location,\\n\\t\\t\\tstartTime: _startTime,\\n\\t\\t\\tendTime: _endTime,\\n\\t\\t\\tactive: _active\\n\\t\\t});\\n\\n\\t\\t_setEvent(_eventId, data, false);\\n\\t}\\n\\n\\tfunction getEvent(uint256 _eventId) external view returns (Event memory) {\\n\\t\\treturn events[_eventId];\\n\\t}\\n\\n\\tfunction getAllEvents() external view returns (Event[] memory) {\\n\\t\\treturn events;\\n\\t}\\n}\\n\",\"keccak256\":\"0x5cd0ae08c566acc226292b06999452d99c4257f1830b2963bbcc77da889764b6\",\"license\":\"MIT\"},\"contracts/UserRegistry.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\npragma solidity >=0.8.0 <0.9.0;\\n\\n/*\\n * @title UserRegistry\\n * @dev Manages user registrations and facial identifiers, with added security features.\\n */\\ncontract UserRegistry {\\n\\tstruct User {\\n\\t\\tstring name;\\n\\t\\tstring faceHash; // IPFS hash of the user's face image\\n\\t}\\n\\n\\tmapping(address => User) private users; // Private for better encapsulation\\n\\n\\tevent UserRegistered(\\n\\t\\taddress indexed userAddress,\\n\\t\\tstring name,\\n\\t\\tstring faceHash\\n\\t); // Event for new user registrations\\n\\tevent UserUpdated(\\n\\t\\taddress indexed userAddress,\\n\\t\\tstring name,\\n\\t\\tstring faceHash\\n\\t); // Event for user information updates\\n\\n\\t// Modifier to ensure user exists\\n\\tmodifier userExists(address userAddress) {\\n\\t\\trequire(\\n\\t\\t\\tbytes(users[userAddress].name).length != 0,\\n\\t\\t\\t\\\"User does not exist\\\"\\n\\t\\t);\\n\\t\\t_;\\n\\t}\\n\\n\\t// Modifier to ensure user does not exist\\n\\tmodifier userDoesNotExist(address userAddress) {\\n\\t\\trequire(\\n\\t\\t\\tbytes(users[userAddress].name).length == 0,\\n\\t\\t\\t\\\"User already exists\\\"\\n\\t\\t);\\n\\t\\t_;\\n\\t}\\n\\n\\t// Modifier for validating IPFS hashes\\n\\tmodifier validIPFSHash(string memory _faceHash) {\\n\\t\\trequire(bytes(_faceHash).length == 46, \\\"Invalid IPFS hash\\\"); // Basic check for IPFS hash length\\n\\t\\t_;\\n\\t}\\n\\n\\t// Modifier for validating user's name\\n\\tmodifier validName(string memory _name) {\\n\\t\\trequire(bytes(_name).length > 0, \\\"Invalid name\\\");\\n\\t\\trequire(bytes(_name).length <= 64, \\\"Name too long\\\");\\n\\t\\t_;\\n\\t}\\n\\n\\t/*\\n\\t * @dev Registers a new user or updates an existing user's information.\\n\\t * @param _name User's name.\\n\\t * @param _faceHash IPFS hash of the user's face image.\\n\\t */\\n\\tfunction registerUser(\\n\\t\\tstring calldata _name,\\n\\t\\tstring calldata _faceHash\\n\\t)\\n\\t\\tpublic\\n\\t\\tuserDoesNotExist(msg.sender)\\n\\t\\tvalidIPFSHash(_faceHash)\\n\\t\\tvalidName(_name)\\n\\t{\\n\\t\\tusers[msg.sender] = User(_name, _faceHash);\\n\\n\\t\\temit UserRegistered(msg.sender, _name, _faceHash);\\n\\t}\\n\\n\\t/*\\n\\t * @dev Retrieves user information.\\n\\t * @param _userAddress Address of the user.\\n\\t * @return User information.\\n\\t */\\n\\tfunction getUserInfo(\\n\\t\\taddress _userAddress\\n\\t) external view userExists(_userAddress) returns (User memory) {\\n\\t\\treturn users[_userAddress];\\n\\t}\\n\\n\\t/*\\n\\t * @dev Retrieves user information for the caller.\\n\\t * @return User information.\\n\\t */\\n\\tfunction getMyInfo()\\n\\t\\texternal\\n\\t\\tview\\n\\t\\tuserExists(msg.sender)\\n\\t\\treturns (User memory)\\n\\t{\\n\\t\\treturn users[msg.sender];\\n\\t}\\n\\n\\t/*\\n\\t * @dev Updates the user's information.\\n\\t * @param _name User's name.\\n\\t * @param _faceHash IPFS hash of the user's face image.\\n\\t */\\n\\tfunction updateUserInfo(\\n\\t\\tstring calldata _name,\\n\\t\\tstring calldata _faceHash\\n\\t)\\n\\t\\texternal\\n\\t\\tuserExists(msg.sender)\\n\\t\\tvalidIPFSHash(_faceHash)\\n\\t\\tvalidName(_name)\\n\\t{\\n\\t\\tusers[msg.sender] = User(_name, _faceHash);\\n\\n\\t\\temit UserUpdated(msg.sender, _name, _faceHash);\\n\\t}\\n}\\n\",\"keccak256\":\"0x0c4e896876a4259bf99b32c8629815e5398413c5c1c4f15419837acb74948418\",\"license\":\"MIT\"}},\"version\":1}",
  "bytecode": "0x6080346100df57601f61139e38819003918201601f19168301916001600160401b038311848410176100e45780849260409485528339810103126100df57610052602061004b836100fa565b92016100fa565b6001600160a01b039182169190821561009a5760018060a01b031992836002541617600255168160035416176003553390600454161760045560405161128f908161010f8239f35b60405162461bcd60e51b815260206004820152601c60248201527f496e76616c6964204576656e744d616e616765722061646472657373000000006044820152606490fd5b600080fd5b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b03821682036100df5756fe608080604052600436101561001357600080fd5b60003560e01c90816310c96f4714610c82575080635835162f14610c3b578063663d0391146104775780638396e56b14610374578063b9029e1a14610278578063d6c3ee961461009a5763f7975e2d1461006c57600080fd5b34610095576000366003190112610095576004546040516001600160a01b039091168152602090f35b600080fd5b34610095576080366003190112610095576004356100b6610d2f565b6044359160ff8316928381036100955760643590811515820361009557600254604051630368c42760e51b81526004810185905291906001600160a01b03906000908490602490829085165afa801561026c5761016661016d9361012c60e06004948998600091610249575b5001511515611092565b61013a848454163314610e9c565b8515610241576001935b8860005260006020526040600020991698896000526020526040600020611118565b500161116e565b6101c5575b1561019e577f466f70c15b5e417087a194a9084f1420ada8048da7218be6492e2a59680db9a4600080a4005b7f4297803d3d82640da42c2ec7f6fa2446d410512943c482eb96f84b211948a5ad600080a4005b8160005260016020526040600020805490600160401b82101561022b576001820180825582101561021557600052602060002001836bffffffffffffffffffffffff60a01b825416179055610172565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600293610144565b61026691503d806000833e61025e8183610f20565b810190610fa1565b8d610122565b6040513d6000823e3d90fd5b3461009557602080600319360112610095576004356000526000815260406000203360005281526040600020908154906001600160401b03821161022b57604051926005916102cb8185851b0186610f20565b83855260009182528082208186015b8584106102f357604051806102ef8982610dba565b0390f35b848360019260405161030481610f05565b610366865460ff908181168452878060a01b03809160081c168685015261032c888a016111b3565b604085015261033d60028a016111b3565b60608501526003890154608085015260048901549060a0908216818601521c1660c0830161110c565b8152019201930192906102da565b346100955760403660031901126100955761038d610d2f565b6004356000908152602081815260408083206001600160a01b0394851684528252909120805491926001600160401b03831161022b5790604051936005926103d98286861b0187610f20565b8486526000928352818320908287015b8685106103fe57604051806102ef8a82610dba565b858460019260405161040f81610f05565b61046987548760ff91828116855260081c1685840152610430878a016111b3565b604084015261044160028a016111b3565b606084015260038901546080840152600489015460a0898216818601521c1660c0830161110c565b8152019301940193916103e9565b34610095576080366003190112610095576024356001600160401b038111610095576104a7903690600401610d45565b6044356001600160401b038111610095576104c6903690600401610d45565b9092906064356001600160a01b0381169081900361009557600254604051630368c42760e51b815260048035908201526001600160a01b0390911690600081602481855afa90811561026c5761052a9160e091600091610c20575001511515611092565b604051630368c42760e51b81526004803590820152600081602481855afa801561026c5760a091600091610c05575b500151421115610bc857600060249160405192838092630368c42760e51b825260043560048301525afa801561026c5760c091600091610bad575b500151421015610b765760043560005260006020526040600020336000526020526103e76040600020541015610b3157600435600052600060205260406000203360005260205260ff6040600020541694600435600052600060205260406000203360005260205260406000206040519261060e84610f05565b87845260208401913383526106243689896110d5565b91604086019283526106373688876110d5565b606087015242608087015260a0860152600060c08601528054600160401b81101561022b5761066b91600182018155611118565b929092610b1b578451835491516001600160a81b031990921660ff919091161760089190911b610100600160a81b0316178255518051906001600160401b03821161022b5781906106bf6001850154611134565b601f8111610ac8575b50602090601f8311600114610a5657600092610a4b575b50508160011b916000199060031b1c19161760018201555b60608301518051906001600160401b03821161022b5761071a6002840154611134565b601f8111610a04575b50602090601f831160011461098f57918060c09492600494600092610984575b50508160011b916000199060031b1c19161760028201555b60808501516003820155019260018060a01b0360a0820151166bffffffffffffffffffffffff60a01b855416178455015191600383101561096e576024926107a29161116e565b600354604051636386c1c760e01b81523360048201529260009184919082906001600160a01b03165afa91821561026c576000926108b4575b506020602492015192600060018060a01b036002541660405194858092630368c42760e51b825260043560048301525afa92831561026c577fee432e7e3bf6c8b451619602bd793b7da6aeb929c939116da1c309bbcf68c36c94610860606061087c9661086e94600091610899575b500151976040519960808b5260808b0191611192565b9088820360208a0152610d95565b918683036040880152611192565b92808403606082015280610894339560043595610d95565b0390a4005b6108ae91503d806000833e61025e8183610f20565b8c61084a565b91503d806000843e6108c68184610f20565b6020838281010312610095578251906001600160401b038211610095576040828501828601031261009557604051908160408101106001600160401b0360408401111761022b5760408201604052828501516001600160401b03811161009557610937908287019085880101610f5c565b825260208386010151946001600160401b03861161009557602495602094610963938301920101610f5c565b8282015292506107db565b634e487b7160e01b600052602160045260246000fd5b015190508b80610743565b906002840160005260206000209160005b601f19851681106109ec57509260c0949260019260049583601f198116106109d3575b505050811b01600282015561075b565b015160001960f88460031b161c191690558b80806109c3565b919260206001819286850151815501940192016109a0565b600284016000526020600020601f840160051c810160208510610a44575b601f830160051c82018110610a38575050610723565b60008155600101610a22565b5080610a22565b0151905089806106df565b9250600184016000526020600020906000935b601f1984168510610aad576001945083601f19811610610a94575b505050811b0160018201556106f7565b015160001960f88460031b161c19169055898080610a84565b81810151835560209485019460019093019290910190610a69565b909150600184016000526020600020601f840160051c810160208510610b14575b90849392915b601f830160051c82018110610b055750506106c8565b60008155859450600101610aef565b5080610ae9565b634e487b7160e01b600052600060045260246000fd5b60405162461bcd60e51b815260206004820152601f60248201527f4d6178696d756d20636865636b2d696e732074726965732072656163686564006044820152606490fd5b60405162461bcd60e51b815260206004820152600f60248201526e115d995b9d081a185cc8195b991959608a1b6044820152606490fd5b610bc291503d806000833e61025e8183610f20565b87610594565b60405162461bcd60e51b8152602060048201526015602482015274115d995b9d081a185cc81b9bdd081cdd185c9d1959605a1b6044820152606490fd5b610c1a91503d806000833e61025e8183610f20565b88610559565b610c3591503d806000833e61025e8183610f20565b89610122565b34610095576020366003190112610095576004356001600160a01b038181169182900361009557610c726004549182163314610e9c565b6001600160a01b03191617600455005b3461009557602080600319360112610095579060043560005260018083526040600020928354808452818401908195600052826000209060005b818110610d135750505083610cd2910384610f20565b60405192818401908285525180915260408401949160005b828110610cf75785870386f35b83516001600160a01b0316875295810195928101928401610cea565b82546001600160a01b0316845292840192918501918501610cbc565b602435906001600160a01b038216820361009557565b9181601f84011215610095578235916001600160401b038311610095576020838186019501011161009557565b60005b838110610d855750506000910152565b8181015183820152602001610d75565b90602091610dae81518092818552858086019101610d72565b601f01601f1916010190565b60209081810182825283518091526040928383019281858460051b830101960194600080925b858410610df257505050505050505090565b9091929394959697603f1982820301885288519060ff825116815260018060a01b039182888201511688830152610e4b610e388783015160e0808a870152850190610d95565b6060808401519085830390860152610d95565b926080808301519084015260a09081830151169083015260c080910151916003831015610e88570152978501968501959493600101929190610de0565b634e487b7160e01b86526021600452602486fd5b15610ea357565b60405162461bcd60e51b815260206004820152603460248201527f4f6e6c7920746865206f66662d636861696e2076616c696461746f722063616e604482015273103832b93337b936903a3434b99030b1ba34b7b760611b6064820152608490fd5b60e081019081106001600160401b0382111761022b57604052565b90601f801991011681019081106001600160401b0382111761022b57604052565b6001600160401b03811161022b57601f01601f191660200190565b81601f82011215610095578051610f7281610f41565b92610f806040519485610f20565b8184526020828401011161009557610f9e9160208085019101610d72565b90565b6020818303126100955780516001600160401b0391828211610095570190610100928383820312610095576040519384018481108382111761022b5760405282518281116100955781610ff5918501610f5c565b84526020830151828111610095578161100f918501610f5c565b60208501526040830151828111610095578161102c918501610f5c565b6040850152606083015191821161009557611048918301610f5c565b60608301526080810151906001600160a01b03821682036100955760e091608084015260a081015160a084015260c081015160c0840152015180151581036100955760e082015290565b1561109957565b60405162461bcd60e51b8152602060048201526014602482015273115d995b9d08191bd95cc81b9bdd08195e1a5cdd60621b6044820152606490fd5b9291926110e182610f41565b916110ef6040519384610f20565b829481845281830111610095578281602093846000960137010152565b600382101561096e5752565b8054821015610215576000526005602060002091020190600090565b90600182811c92168015611164575b602083101461114e57565b634e487b7160e01b600052602260045260246000fd5b91607f1691611143565b90600381101561096e57815460ff60a01b191660a09190911b60ff60a01b16179055565b908060209392818452848401376000828201840152601f01601f1916010190565b90604051918260008254926111c784611134565b90818452600194858116908160001461123657506001146111f3575b50506111f192500383610f20565b565b9093915060005260209081600020936000915b81831061121e5750506111f1935082010138806111e3565b85548884018501529485019487945091830191611206565b9150506111f194506020925060ff191682840152151560051b82010138806111e356fea264697066735822122084f4b96889bd1cde2ea26dfd3c430f2b2f31da16ed36c6d92613406a07fc445764736f6c63430008110033",
  "deployedBytecode": "0x608080604052600436101561001357600080fd5b60003560e01c90816310c96f4714610c82575080635835162f14610c3b578063663d0391146104775780638396e56b14610374578063b9029e1a14610278578063d6c3ee961461009a5763f7975e2d1461006c57600080fd5b34610095576000366003190112610095576004546040516001600160a01b039091168152602090f35b600080fd5b34610095576080366003190112610095576004356100b6610d2f565b6044359160ff8316928381036100955760643590811515820361009557600254604051630368c42760e51b81526004810185905291906001600160a01b03906000908490602490829085165afa801561026c5761016661016d9361012c60e06004948998600091610249575b5001511515611092565b61013a848454163314610e9c565b8515610241576001935b8860005260006020526040600020991698896000526020526040600020611118565b500161116e565b6101c5575b1561019e577f466f70c15b5e417087a194a9084f1420ada8048da7218be6492e2a59680db9a4600080a4005b7f4297803d3d82640da42c2ec7f6fa2446d410512943c482eb96f84b211948a5ad600080a4005b8160005260016020526040600020805490600160401b82101561022b576001820180825582101561021557600052602060002001836bffffffffffffffffffffffff60a01b825416179055610172565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600293610144565b61026691503d806000833e61025e8183610f20565b810190610fa1565b8d610122565b6040513d6000823e3d90fd5b3461009557602080600319360112610095576004356000526000815260406000203360005281526040600020908154906001600160401b03821161022b57604051926005916102cb8185851b0186610f20565b83855260009182528082208186015b8584106102f357604051806102ef8982610dba565b0390f35b848360019260405161030481610f05565b610366865460ff908181168452878060a01b03809160081c168685015261032c888a016111b3565b604085015261033d60028a016111b3565b60608501526003890154608085015260048901549060a0908216818601521c1660c0830161110c565b8152019201930192906102da565b346100955760403660031901126100955761038d610d2f565b6004356000908152602081815260408083206001600160a01b0394851684528252909120805491926001600160401b03831161022b5790604051936005926103d98286861b0187610f20565b8486526000928352818320908287015b8685106103fe57604051806102ef8a82610dba565b858460019260405161040f81610f05565b61046987548760ff91828116855260081c1685840152610430878a016111b3565b604084015261044160028a016111b3565b606084015260038901546080840152600489015460a0898216818601521c1660c0830161110c565b8152019301940193916103e9565b34610095576080366003190112610095576024356001600160401b038111610095576104a7903690600401610d45565b6044356001600160401b038111610095576104c6903690600401610d45565b9092906064356001600160a01b0381169081900361009557600254604051630368c42760e51b815260048035908201526001600160a01b0390911690600081602481855afa90811561026c5761052a9160e091600091610c20575001511515611092565b604051630368c42760e51b81526004803590820152600081602481855afa801561026c5760a091600091610c05575b500151421115610bc857600060249160405192838092630368c42760e51b825260043560048301525afa801561026c5760c091600091610bad575b500151421015610b765760043560005260006020526040600020336000526020526103e76040600020541015610b3157600435600052600060205260406000203360005260205260ff6040600020541694600435600052600060205260406000203360005260205260406000206040519261060e84610f05565b87845260208401913383526106243689896110d5565b91604086019283526106373688876110d5565b606087015242608087015260a0860152600060c08601528054600160401b81101561022b5761066b91600182018155611118565b929092610b1b578451835491516001600160a81b031990921660ff919091161760089190911b610100600160a81b0316178255518051906001600160401b03821161022b5781906106bf6001850154611134565b601f8111610ac8575b50602090601f8311600114610a5657600092610a4b575b50508160011b916000199060031b1c19161760018201555b60608301518051906001600160401b03821161022b5761071a6002840154611134565b601f8111610a04575b50602090601f831160011461098f57918060c09492600494600092610984575b50508160011b916000199060031b1c19161760028201555b60808501516003820155019260018060a01b0360a0820151166bffffffffffffffffffffffff60a01b855416178455015191600383101561096e576024926107a29161116e565b600354604051636386c1c760e01b81523360048201529260009184919082906001600160a01b03165afa91821561026c576000926108b4575b506020602492015192600060018060a01b036002541660405194858092630368c42760e51b825260043560048301525afa92831561026c577fee432e7e3bf6c8b451619602bd793b7da6aeb929c939116da1c309bbcf68c36c94610860606061087c9661086e94600091610899575b500151976040519960808b5260808b0191611192565b9088820360208a0152610d95565b918683036040880152611192565b92808403606082015280610894339560043595610d95565b0390a4005b6108ae91503d806000833e61025e8183610f20565b8c61084a565b91503d806000843e6108c68184610f20565b6020838281010312610095578251906001600160401b038211610095576040828501828601031261009557604051908160408101106001600160401b0360408401111761022b5760408201604052828501516001600160401b03811161009557610937908287019085880101610f5c565b825260208386010151946001600160401b03861161009557602495602094610963938301920101610f5c565b8282015292506107db565b634e487b7160e01b600052602160045260246000fd5b015190508b80610743565b906002840160005260206000209160005b601f19851681106109ec57509260c0949260019260049583601f198116106109d3575b505050811b01600282015561075b565b015160001960f88460031b161c191690558b80806109c3565b919260206001819286850151815501940192016109a0565b600284016000526020600020601f840160051c810160208510610a44575b601f830160051c82018110610a38575050610723565b60008155600101610a22565b5080610a22565b0151905089806106df565b9250600184016000526020600020906000935b601f1984168510610aad576001945083601f19811610610a94575b505050811b0160018201556106f7565b015160001960f88460031b161c19169055898080610a84565b81810151835560209485019460019093019290910190610a69565b909150600184016000526020600020601f840160051c810160208510610b14575b90849392915b601f830160051c82018110610b055750506106c8565b60008155859450600101610aef565b5080610ae9565b634e487b7160e01b600052600060045260246000fd5b60405162461bcd60e51b815260206004820152601f60248201527f4d6178696d756d20636865636b2d696e732074726965732072656163686564006044820152606490fd5b60405162461bcd60e51b815260206004820152600f60248201526e115d995b9d081a185cc8195b991959608a1b6044820152606490fd5b610bc291503d806000833e61025e8183610f20565b87610594565b60405162461bcd60e51b8152602060048201526015602482015274115d995b9d081a185cc81b9bdd081cdd185c9d1959605a1b6044820152606490fd5b610c1a91503d806000833e61025e8183610f20565b88610559565b610c3591503d806000833e61025e8183610f20565b89610122565b34610095576020366003190112610095576004356001600160a01b038181169182900361009557610c726004549182163314610e9c565b6001600160a01b03191617600455005b3461009557602080600319360112610095579060043560005260018083526040600020928354808452818401908195600052826000209060005b818110610d135750505083610cd2910384610f20565b60405192818401908285525180915260408401949160005b828110610cf75785870386f35b83516001600160a01b0316875295810195928101928401610cea565b82546001600160a01b0316845292840192918501918501610cbc565b602435906001600160a01b038216820361009557565b9181601f84011215610095578235916001600160401b038311610095576020838186019501011161009557565b60005b838110610d855750506000910152565b8181015183820152602001610d75565b90602091610dae81518092818552858086019101610d72565b601f01601f1916010190565b60209081810182825283518091526040928383019281858460051b830101960194600080925b858410610df257505050505050505090565b9091929394959697603f1982820301885288519060ff825116815260018060a01b039182888201511688830152610e4b610e388783015160e0808a870152850190610d95565b6060808401519085830390860152610d95565b926080808301519084015260a09081830151169083015260c080910151916003831015610e88570152978501968501959493600101929190610de0565b634e487b7160e01b86526021600452602486fd5b15610ea357565b60405162461bcd60e51b815260206004820152603460248201527f4f6e6c7920746865206f66662d636861696e2076616c696461746f722063616e604482015273103832b93337b936903a3434b99030b1ba34b7b760611b6064820152608490fd5b60e081019081106001600160401b0382111761022b57604052565b90601f801991011681019081106001600160401b0382111761022b57604052565b6001600160401b03811161022b57601f01601f191660200190565b81601f82011215610095578051610f7281610f41565b92610f806040519485610f20565b8184526020828401011161009557610f9e9160208085019101610d72565b90565b6020818303126100955780516001600160401b0391828211610095570190610100928383820312610095576040519384018481108382111761022b5760405282518281116100955781610ff5918501610f5c565b84526020830151828111610095578161100f918501610f5c565b60208501526040830151828111610095578161102c918501610f5c565b6040850152606083015191821161009557611048918301610f5c565b60608301526080810151906001600160a01b03821682036100955760e091608084015260a081015160a084015260c081015160c0840152015180151581036100955760e082015290565b1561109957565b60405162461bcd60e51b8152602060048201526014602482015273115d995b9d08191bd95cc81b9bdd08195e1a5cdd60621b6044820152606490fd5b9291926110e182610f41565b916110ef6040519384610f20565b829481845281830111610095578281602093846000960137010152565b600382101561096e5752565b8054821015610215576000526005602060002091020190600090565b90600182811c92168015611164575b602083101461114e57565b634e487b7160e01b600052602260045260246000fd5b91607f1691611143565b90600381101561096e57815460ff60a01b191660a09190911b60ff60a01b16179055565b908060209392818452848401376000828201840152601f01601f1916010190565b90604051918260008254926111c784611134565b90818452600194858116908160001461123657506001146111f3575b50506111f192500383610f20565b565b9093915060005260209081600020936000915b81831061121e5750506111f1935082010138806111e3565b85548884018501529485019487945091830191611206565b9150506111f194506020925060ff191682840152151560051b82010138806111e356fea264697066735822122084f4b96889bd1cde2ea26dfd3c430f2b2f31da16ed36c6d92613406a07fc445764736f6c63430008110033",
  "devdoc": {
    "kind": "dev",
    "methods": {},
    "version": 1
  },
  "userdoc": {
    "kind": "user",
    "methods": {},
    "version": 1
  },
  "storageLayout": {
    "storage": [
      {
        "astId": 31,
        "contract": "contracts/CheckInManager.sol:CheckInManager",
        "label": "checkIns",
        "offset": 0,
        "slot": "0",
        "type": "t_mapping(t_uint256,t_mapping(t_address,t_array(t_struct(CheckIn)23_storage)dyn_storage))"
      },
      {
        "astId": 36,
        "contract": "contracts/CheckInManager.sol:CheckInManager",
        "label": "checkInEventUser",
        "offset": 0,
        "slot": "1",
        "type": "t_mapping(t_uint256,t_array(t_address)dyn_storage)"
      },
      {
        "astId": 39,
        "contract": "contracts/CheckInManager.sol:CheckInManager",
        "label": "eventManager",
        "offset": 0,
        "slot": "2",
        "type": "t_contract(EventManager)765"
      },
      {
        "astId": 42,
        "contract": "contracts/CheckInManager.sol:CheckInManager",
        "label": "userRegistry",
        "offset": 0,
        "slot": "3",
        "type": "t_contract(UserRegistry)981"
      },
      {
        "astId": 44,
        "contract": "contracts/CheckInManager.sol:CheckInManager",
        "label": "offchainValidator",
        "offset": 0,
        "slot": "4",
        "type": "t_address"
      }
    ],
    "types": {
      "t_address": {
        "encoding": "inplace",
        "label": "address",
        "numberOfBytes": "20"
      },
      "t_array(t_address)dyn_storage": {
        "base": "t_address",
        "encoding": "dynamic_array",
        "label": "address[]",
        "numberOfBytes": "32"
      },
      "t_array(t_struct(CheckIn)23_storage)dyn_storage": {
        "base": "t_struct(CheckIn)23_storage",
        "encoding": "dynamic_array",
        "label": "struct CheckInManager.CheckIn[]",
        "numberOfBytes": "32"
      },
      "t_contract(EventManager)765": {
        "encoding": "inplace",
        "label": "contract EventManager",
        "numberOfBytes": "20"
      },
      "t_contract(UserRegistry)981": {
        "encoding": "inplace",
        "label": "contract UserRegistry",
        "numberOfBytes": "20"
      },
      "t_enum(CheckInStatus)7": {
        "encoding": "inplace",
        "label": "enum CheckInManager.CheckInStatus",
        "numberOfBytes": "1"
      },
      "t_mapping(t_address,t_array(t_struct(CheckIn)23_storage)dyn_storage)": {
        "encoding": "mapping",
        "key": "t_address",
        "label": "mapping(address => struct CheckInManager.CheckIn[])",
        "numberOfBytes": "32",
        "value": "t_array(t_struct(CheckIn)23_storage)dyn_storage"
      },
      "t_mapping(t_uint256,t_array(t_address)dyn_storage)": {
        "encoding": "mapping",
        "key": "t_uint256",
        "label": "mapping(uint256 => address[])",
        "numberOfBytes": "32",
        "value": "t_array(t_address)dyn_storage"
      },
      "t_mapping(t_uint256,t_mapping(t_address,t_array(t_struct(CheckIn)23_storage)dyn_storage))": {
        "encoding": "mapping",
        "key": "t_uint256",
        "label": "mapping(uint256 => mapping(address => struct CheckInManager.CheckIn[]))",
        "numberOfBytes": "32",
        "value": "t_mapping(t_address,t_array(t_struct(CheckIn)23_storage)dyn_storage)"
      },
      "t_string_storage": {
        "encoding": "bytes",
        "label": "string",
        "numberOfBytes": "32"
      },
      "t_struct(CheckIn)23_storage": {
        "encoding": "inplace",
        "label": "struct CheckInManager.CheckIn",
        "members": [
          {
            "astId": 9,
            "contract": "contracts/CheckInManager.sol:CheckInManager",
            "label": "id",
            "offset": 0,
            "slot": "0",
            "type": "t_uint8"
          },
          {
            "astId": 11,
            "contract": "contracts/CheckInManager.sol:CheckInManager",
            "label": "user",
            "offset": 1,
            "slot": "0",
            "type": "t_address"
          },
          {
            "astId": 13,
            "contract": "contracts/CheckInManager.sol:CheckInManager",
            "label": "faceHash",
            "offset": 0,
            "slot": "1",
            "type": "t_string_storage"
          },
          {
            "astId": 15,
            "contract": "contracts/CheckInManager.sol:CheckInManager",
            "label": "location",
            "offset": 0,
            "slot": "2",
            "type": "t_string_storage"
          },
          {
            "astId": 17,
            "contract": "contracts/CheckInManager.sol:CheckInManager",
            "label": "timestamp",
            "offset": 0,
            "slot": "3",
            "type": "t_uint256"
          },
          {
            "astId": 19,
            "contract": "contracts/CheckInManager.sol:CheckInManager",
            "label": "emailProtectedAddress",
            "offset": 0,
            "slot": "4",
            "type": "t_address"
          },
          {
            "astId": 22,
            "contract": "contracts/CheckInManager.sol:CheckInManager",
            "label": "status",
            "offset": 20,
            "slot": "4",
            "type": "t_enum(CheckInStatus)7"
          }
        ],
        "numberOfBytes": "160"
      },
      "t_uint256": {
        "encoding": "inplace",
        "label": "uint256",
        "numberOfBytes": "32"
      },
      "t_uint8": {
        "encoding": "inplace",
        "label": "uint8",
        "numberOfBytes": "1"
      }
    }
  }
}