{
  "address": "0xD289C92Ce8cc91804f419f7D0cFf609e7309617e",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_paymentManager",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_certificateVerifier",
          "type": "address"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "inputs": [],
      "name": "AccessControlBadConfirmation",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "internalType": "bytes32",
          "name": "neededRole",
          "type": "bytes32"
        }
      ],
      "name": "AccessControlUnauthorizedAccount",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "reason",
          "type": "string"
        }
      ],
      "name": "CerificateOwnerMismatch",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "reason",
          "type": "string"
        }
      ],
      "name": "DomainNameAlreadyRegistered",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "reason",
          "type": "string"
        }
      ],
      "name": "EmptyCountryCode",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "reason",
          "type": "string"
        }
      ],
      "name": "EmptyDomainName",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "reason",
          "type": "string"
        }
      ],
      "name": "EmptyOperator",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "reason",
          "type": "string"
        }
      ],
      "name": "EmptyPartyId",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "verifier",
          "type": "address"
        },
        {
          "internalType": "string",
          "name": "reason",
          "type": "string"
        }
      ],
      "name": "InvalidCertificate",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "reason",
          "type": "string"
        }
      ],
      "name": "NoRolesProvided",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "reason",
          "type": "string"
        }
      ],
      "name": "PartyAlreadyRegistered",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "reason",
          "type": "string"
        }
      ],
      "name": "PartyNotRegistered",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "enum OcnRegistry.Role",
          "name": "role",
          "type": "uint8"
        },
        {
          "internalType": "string",
          "name": "reason",
          "type": "string"
        }
      ],
      "name": "ProviderNotFound",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "reason",
          "type": "string"
        }
      ],
      "name": "SignerMismatch",
      "type": "error"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "operator",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "string",
          "name": "domain",
          "type": "string"
        }
      ],
      "name": "OperatorUpdate",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "oldAdmin",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "newAdmin",
          "type": "address"
        }
      ],
      "name": "OwnershipTransferred",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "bytes2",
          "name": "countryCode",
          "type": "bytes2"
        },
        {
          "indexed": false,
          "internalType": "bytes3",
          "name": "partyId",
          "type": "bytes3"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "partyAddress",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "enum OcnRegistry.Role[]",
          "name": "roles",
          "type": "uint8[]"
        },
        {
          "indexed": false,
          "internalType": "string",
          "name": "name",
          "type": "string"
        },
        {
          "indexed": false,
          "internalType": "string",
          "name": "url",
          "type": "string"
        },
        {
          "indexed": false,
          "internalType": "enum IOcnPaymentManager.PaymentStatus",
          "name": "paymentStatus",
          "type": "uint8"
        },
        {
          "indexed": false,
          "internalType": "enum IOcnCvManager.CvStatus",
          "name": "cvStatus",
          "type": "uint8"
        },
        {
          "indexed": false,
          "internalType": "bool",
          "name": "active",
          "type": "bool"
        }
      ],
      "name": "PartyDelete",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "bytes2",
          "name": "countryCode",
          "type": "bytes2"
        },
        {
          "indexed": false,
          "internalType": "bytes3",
          "name": "partyId",
          "type": "bytes3"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "partyAddress",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "enum OcnRegistry.Role[]",
          "name": "roles",
          "type": "uint8[]"
        },
        {
          "indexed": false,
          "internalType": "string",
          "name": "name",
          "type": "string"
        },
        {
          "indexed": false,
          "internalType": "string",
          "name": "url",
          "type": "string"
        },
        {
          "indexed": false,
          "internalType": "enum IOcnPaymentManager.PaymentStatus",
          "name": "paymentStatus",
          "type": "uint8"
        },
        {
          "indexed": false,
          "internalType": "enum IOcnCvManager.CvStatus",
          "name": "cvStatus",
          "type": "uint8"
        },
        {
          "indexed": false,
          "internalType": "bool",
          "name": "active",
          "type": "bool"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "operatorAddress",
          "type": "address"
        }
      ],
      "name": "PartyUpdate",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "previousAdminRole",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "newAdminRole",
          "type": "bytes32"
        }
      ],
      "name": "RoleAdminChanged",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        }
      ],
      "name": "RoleGranted",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        }
      ],
      "name": "RoleRevoked",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "DEFAULT_ADMIN_ROLE",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "operator",
          "type": "address"
        }
      ],
      "name": "adminDeleteOperator",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes2",
          "name": "countryCode",
          "type": "bytes2"
        },
        {
          "internalType": "bytes3",
          "name": "partyId",
          "type": "bytes3"
        }
      ],
      "name": "adminDeleteParty",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "certificateVerifier",
      "outputs": [
        {
          "internalType": "contract ICertificateVerifier",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "deleteNode",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "operator",
          "type": "address"
        },
        {
          "internalType": "uint8",
          "name": "v",
          "type": "uint8"
        },
        {
          "internalType": "bytes32",
          "name": "r",
          "type": "bytes32"
        },
        {
          "internalType": "bytes32",
          "name": "s",
          "type": "bytes32"
        }
      ],
      "name": "deleteNodeRaw",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "deleteParty",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "party",
          "type": "address"
        },
        {
          "internalType": "uint8",
          "name": "v",
          "type": "uint8"
        },
        {
          "internalType": "bytes32",
          "name": "r",
          "type": "bytes32"
        },
        {
          "internalType": "bytes32",
          "name": "s",
          "type": "bytes32"
        }
      ],
      "name": "deletePartyRaw",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "operator",
          "type": "address"
        }
      ],
      "name": "getNode",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getNodeOperators",
      "outputs": [
        {
          "internalType": "address[]",
          "name": "",
          "type": "address[]"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "party",
          "type": "address"
        }
      ],
      "name": "getOperatorByAddress",
      "outputs": [
        {
          "internalType": "address",
          "name": "operator",
          "type": "address"
        },
        {
          "internalType": "string",
          "name": "domain",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes2",
          "name": "countryCode",
          "type": "bytes2"
        },
        {
          "internalType": "bytes3",
          "name": "partyId",
          "type": "bytes3"
        }
      ],
      "name": "getOperatorByOcpi",
      "outputs": [
        {
          "internalType": "address",
          "name": "operator",
          "type": "address"
        },
        {
          "internalType": "string",
          "name": "domain",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getParties",
      "outputs": [
        {
          "internalType": "address[]",
          "name": "",
          "type": "address[]"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "operator",
          "type": "address"
        }
      ],
      "name": "getPartiesByOperator",
      "outputs": [
        {
          "internalType": "address[]",
          "name": "",
          "type": "address[]"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "enum OcnRegistry.Role",
          "name": "role",
          "type": "uint8"
        }
      ],
      "name": "getPartiesByRole",
      "outputs": [
        {
          "internalType": "address[]",
          "name": "",
          "type": "address[]"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getPartiesCount",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_partyAddress",
          "type": "address"
        }
      ],
      "name": "getPartyDetailsByAddress",
      "outputs": [
        {
          "internalType": "address",
          "name": "partyAddress",
          "type": "address"
        },
        {
          "internalType": "bytes2",
          "name": "countryCode",
          "type": "bytes2"
        },
        {
          "internalType": "bytes3",
          "name": "partyId",
          "type": "bytes3"
        },
        {
          "internalType": "enum OcnRegistry.Role[]",
          "name": "roles",
          "type": "uint8[]"
        },
        {
          "internalType": "enum IOcnPaymentManager.PaymentStatus",
          "name": "paymentStatus",
          "type": "uint8"
        },
        {
          "internalType": "address",
          "name": "operatorAddress",
          "type": "address"
        },
        {
          "internalType": "string",
          "name": "name",
          "type": "string"
        },
        {
          "internalType": "string",
          "name": "url",
          "type": "string"
        },
        {
          "internalType": "bool",
          "name": "active",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes2",
          "name": "_countryCode",
          "type": "bytes2"
        },
        {
          "internalType": "bytes3",
          "name": "_partyId",
          "type": "bytes3"
        }
      ],
      "name": "getPartyDetailsByOcpi",
      "outputs": [
        {
          "internalType": "address",
          "name": "partyAddress",
          "type": "address"
        },
        {
          "internalType": "bytes2",
          "name": "countryCode",
          "type": "bytes2"
        },
        {
          "internalType": "bytes3",
          "name": "partyId",
          "type": "bytes3"
        },
        {
          "internalType": "enum OcnRegistry.Role[]",
          "name": "roles",
          "type": "uint8[]"
        },
        {
          "internalType": "enum IOcnPaymentManager.PaymentStatus",
          "name": "paymentStatus",
          "type": "uint8"
        },
        {
          "internalType": "address",
          "name": "operatorAddress",
          "type": "address"
        },
        {
          "internalType": "string",
          "name": "name",
          "type": "string"
        },
        {
          "internalType": "string",
          "name": "url",
          "type": "string"
        },
        {
          "internalType": "bool",
          "name": "active",
          "type": "bool"
        },
        {
          "internalType": "uint256",
          "name": "stakingBlock",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        }
      ],
      "name": "getRoleAdmin",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "grantRole",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "hasRole",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "verifier",
          "type": "address"
        }
      ],
      "name": "isAllowedVerifier",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "paymentManager",
      "outputs": [
        {
          "internalType": "contract IOcnPaymentManager",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "verifier",
          "type": "address"
        }
      ],
      "name": "removeVerifier",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "callerConfirmation",
          "type": "address"
        }
      ],
      "name": "renounceRole",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "revokeRole",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "domain",
          "type": "string"
        }
      ],
      "name": "setNode",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "operator",
          "type": "address"
        },
        {
          "internalType": "string",
          "name": "domain",
          "type": "string"
        },
        {
          "internalType": "uint8",
          "name": "v",
          "type": "uint8"
        },
        {
          "internalType": "bytes32",
          "name": "r",
          "type": "bytes32"
        },
        {
          "internalType": "bytes32",
          "name": "s",
          "type": "bytes32"
        }
      ],
      "name": "setNodeRaw",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes2",
          "name": "countryCode",
          "type": "bytes2"
        },
        {
          "internalType": "bytes3",
          "name": "partyId",
          "type": "bytes3"
        },
        {
          "components": [
            {
              "internalType": "bytes",
              "name": "certificateData",
              "type": "bytes"
            },
            {
              "internalType": "bytes",
              "name": "signature",
              "type": "bytes"
            },
            {
              "internalType": "enum OcnRegistry.Role",
              "name": "role",
              "type": "uint8"
            }
          ],
          "internalType": "struct OcnRegistry.RoleDetails[]",
          "name": "roles",
          "type": "tuple[]"
        },
        {
          "internalType": "address",
          "name": "operator",
          "type": "address"
        },
        {
          "internalType": "string",
          "name": "name",
          "type": "string"
        },
        {
          "internalType": "string",
          "name": "url",
          "type": "string"
        }
      ],
      "name": "setParty",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "party",
          "type": "address"
        },
        {
          "internalType": "bytes2",
          "name": "countryCode",
          "type": "bytes2"
        },
        {
          "internalType": "bytes3",
          "name": "partyId",
          "type": "bytes3"
        },
        {
          "components": [
            {
              "internalType": "bytes",
              "name": "certificateData",
              "type": "bytes"
            },
            {
              "internalType": "bytes",
              "name": "signature",
              "type": "bytes"
            },
            {
              "internalType": "enum OcnRegistry.Role",
              "name": "role",
              "type": "uint8"
            }
          ],
          "internalType": "struct OcnRegistry.RoleDetails[]",
          "name": "roles",
          "type": "tuple[]"
        },
        {
          "internalType": "address",
          "name": "operator",
          "type": "address"
        },
        {
          "internalType": "string",
          "name": "name",
          "type": "string"
        },
        {
          "internalType": "string",
          "name": "url",
          "type": "string"
        },
        {
          "internalType": "uint8",
          "name": "v",
          "type": "uint8"
        },
        {
          "internalType": "bytes32",
          "name": "r",
          "type": "bytes32"
        },
        {
          "internalType": "bytes32",
          "name": "s",
          "type": "bytes32"
        }
      ],
      "name": "setPartyRaw",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "enum OcnRegistry.Role",
          "name": "role",
          "type": "uint8"
        },
        {
          "internalType": "address",
          "name": "oracleAddress",
          "type": "address"
        }
      ],
      "name": "setProviderOracle",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "verifier",
          "type": "address"
        }
      ],
      "name": "setVerifier",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes4",
          "name": "interfaceId",
          "type": "bytes4"
        }
      ],
      "name": "supportsInterface",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "transferOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "transactionHash": "0x87427f5226bda6cbdd9417d825c2b96c238c575e15db69903602f5abe6183b9c",
  "receipt": {
    "to": null,
    "from": "0xdD3D370a673cfdCfB0c4cA2a3fE313e1559d1fdc",
    "contractAddress": "0xD289C92Ce8cc91804f419f7D0cFf609e7309617e",
    "transactionIndex": 0,
    "gasUsed": "4128824",
    "logsBloom": "0x00000004000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000001000000000000000000000000000000020100000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000001000000000000000000000000000000000000000000000000000000000000100000000000020000000000000000000000000000000000000200000000000000000000000000000",
    "blockHash": "0xb8a13a9d362c36252a5bc36478e79c2e2456677db3f9a56b78739dbb7016279f",
    "transactionHash": "0x87427f5226bda6cbdd9417d825c2b96c238c575e15db69903602f5abe6183b9c",
    "logs": [
      {
        "transactionIndex": 0,
        "blockNumber": 16121188,
        "transactionHash": "0x87427f5226bda6cbdd9417d825c2b96c238c575e15db69903602f5abe6183b9c",
        "address": "0xD289C92Ce8cc91804f419f7D0cFf609e7309617e",
        "topics": [
          "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d",
          "0x0000000000000000000000000000000000000000000000000000000000000000",
          "0x000000000000000000000000dd3d370a673cfdcfb0c4ca2a3fe313e1559d1fdc",
          "0x000000000000000000000000dd3d370a673cfdcfb0c4ca2a3fe313e1559d1fdc"
        ],
        "data": "0x",
        "logIndex": 0,
        "blockHash": "0xb8a13a9d362c36252a5bc36478e79c2e2456677db3f9a56b78739dbb7016279f"
      }
    ],
    "blockNumber": 16121188,
    "cumulativeGasUsed": "4128824",
    "status": 1,
    "byzantium": true
  },
  "args": [
    "0x0b84E7Fbb45A4C1a3d2cB4340c962d2ED4226Bb9",
    "0xb1313002Fb2e6c21f4478cB180ecFeF10F477877"
  ],
  "numDeployments": 1,
  "solcInputHash": "265eda62625db2ae123fa047d34e10cc",
  "metadata": "{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_paymentManager\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_certificateVerifier\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AccessControlBadConfirmation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"neededRole\",\"type\":\"bytes32\"}],\"name\":\"AccessControlUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"CerificateOwnerMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"DomainNameAlreadyRegistered\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"EmptyCountryCode\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"EmptyDomainName\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"EmptyOperator\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"EmptyPartyId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"InvalidCertificate\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"NoRolesProvided\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"PartyAlreadyRegistered\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"PartyNotRegistered\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"enum OcnRegistry.Role\",\"name\":\"role\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"ProviderNotFound\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"SignerMismatch\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"domain\",\"type\":\"string\"}],\"name\":\"OperatorUpdate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldAdmin\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes2\",\"name\":\"countryCode\",\"type\":\"bytes2\"},{\"indexed\":false,\"internalType\":\"bytes3\",\"name\":\"partyId\",\"type\":\"bytes3\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"partyAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"enum OcnRegistry.Role[]\",\"name\":\"roles\",\"type\":\"uint8[]\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"url\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"enum IOcnPaymentManager.PaymentStatus\",\"name\":\"paymentStatus\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"enum IOcnCvManager.CvStatus\",\"name\":\"cvStatus\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"active\",\"type\":\"bool\"}],\"name\":\"PartyDelete\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes2\",\"name\":\"countryCode\",\"type\":\"bytes2\"},{\"indexed\":false,\"internalType\":\"bytes3\",\"name\":\"partyId\",\"type\":\"bytes3\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"partyAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"enum OcnRegistry.Role[]\",\"name\":\"roles\",\"type\":\"uint8[]\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"url\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"enum IOcnPaymentManager.PaymentStatus\",\"name\":\"paymentStatus\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"enum IOcnCvManager.CvStatus\",\"name\":\"cvStatus\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"active\",\"type\":\"bool\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operatorAddress\",\"type\":\"address\"}],\"name\":\"PartyUpdate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"adminDeleteOperator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes2\",\"name\":\"countryCode\",\"type\":\"bytes2\"},{\"internalType\":\"bytes3\",\"name\":\"partyId\",\"type\":\"bytes3\"}],\"name\":\"adminDeleteParty\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"certificateVerifier\",\"outputs\":[{\"internalType\":\"contract ICertificateVerifier\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"deleteNode\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"deleteNodeRaw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"deleteParty\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"party\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"deletePartyRaw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"getNode\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNodeOperators\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"party\",\"type\":\"address\"}],\"name\":\"getOperatorByAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"domain\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes2\",\"name\":\"countryCode\",\"type\":\"bytes2\"},{\"internalType\":\"bytes3\",\"name\":\"partyId\",\"type\":\"bytes3\"}],\"name\":\"getOperatorByOcpi\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"domain\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getParties\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"getPartiesByOperator\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum OcnRegistry.Role\",\"name\":\"role\",\"type\":\"uint8\"}],\"name\":\"getPartiesByRole\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getPartiesCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_partyAddress\",\"type\":\"address\"}],\"name\":\"getPartyDetailsByAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"partyAddress\",\"type\":\"address\"},{\"internalType\":\"bytes2\",\"name\":\"countryCode\",\"type\":\"bytes2\"},{\"internalType\":\"bytes3\",\"name\":\"partyId\",\"type\":\"bytes3\"},{\"internalType\":\"enum OcnRegistry.Role[]\",\"name\":\"roles\",\"type\":\"uint8[]\"},{\"internalType\":\"enum IOcnPaymentManager.PaymentStatus\",\"name\":\"paymentStatus\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"operatorAddress\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"url\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"active\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes2\",\"name\":\"_countryCode\",\"type\":\"bytes2\"},{\"internalType\":\"bytes3\",\"name\":\"_partyId\",\"type\":\"bytes3\"}],\"name\":\"getPartyDetailsByOcpi\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"partyAddress\",\"type\":\"address\"},{\"internalType\":\"bytes2\",\"name\":\"countryCode\",\"type\":\"bytes2\"},{\"internalType\":\"bytes3\",\"name\":\"partyId\",\"type\":\"bytes3\"},{\"internalType\":\"enum OcnRegistry.Role[]\",\"name\":\"roles\",\"type\":\"uint8[]\"},{\"internalType\":\"enum IOcnPaymentManager.PaymentStatus\",\"name\":\"paymentStatus\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"operatorAddress\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"url\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"active\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"stakingBlock\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"}],\"name\":\"isAllowedVerifier\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paymentManager\",\"outputs\":[{\"internalType\":\"contract IOcnPaymentManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"}],\"name\":\"removeVerifier\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"callerConfirmation\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"domain\",\"type\":\"string\"}],\"name\":\"setNode\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"domain\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"setNodeRaw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes2\",\"name\":\"countryCode\",\"type\":\"bytes2\"},{\"internalType\":\"bytes3\",\"name\":\"partyId\",\"type\":\"bytes3\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"certificateData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"},{\"internalType\":\"enum OcnRegistry.Role\",\"name\":\"role\",\"type\":\"uint8\"}],\"internalType\":\"struct OcnRegistry.RoleDetails[]\",\"name\":\"roles\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"url\",\"type\":\"string\"}],\"name\":\"setParty\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"party\",\"type\":\"address\"},{\"internalType\":\"bytes2\",\"name\":\"countryCode\",\"type\":\"bytes2\"},{\"internalType\":\"bytes3\",\"name\":\"partyId\",\"type\":\"bytes3\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"certificateData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"},{\"internalType\":\"enum OcnRegistry.Role\",\"name\":\"role\",\"type\":\"uint8\"}],\"internalType\":\"struct OcnRegistry.RoleDetails[]\",\"name\":\"roles\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"url\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"setPartyRaw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum OcnRegistry.Role\",\"name\":\"role\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"oracleAddress\",\"type\":\"address\"}],\"name\":\"setProviderOracle\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"}],\"name\":\"setVerifier\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"AccessControlBadConfirmation()\":[{\"details\":\"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.\"}],\"AccessControlUnauthorizedAccount(address,bytes32)\":[{\"details\":\"The `account` is missing a role.\"}]},\"events\":{\"RoleAdminChanged(bytes32,bytes32,bytes32)\":{\"details\":\"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this.\"},\"RoleGranted(bytes32,address,address)\":{\"details\":\"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}.\"},\"RoleRevoked(bytes32,address,address)\":{\"details\":\"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call:   - if using `revokeRole`, it is the admin role bearer   - if using `renounceRole`, it is the role bearer (i.e. `account`)\"}},\"kind\":\"dev\",\"methods\":{\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event.\"},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/OcnRegistry.sol\":\"OcnRegistry\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (access/AccessControl.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IAccessControl} from \\\"./IAccessControl.sol\\\";\\nimport {Context} from \\\"../utils/Context.sol\\\";\\nimport {ERC165} from \\\"../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Contract module that allows children to implement role-based access\\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\\n * members except through off-chain means by accessing the contract event logs. Some\\n * applications may benefit from on-chain enumerability, for those cases see\\n * {AccessControlEnumerable}.\\n *\\n * Roles are referred to by their `bytes32` identifier. These should be exposed\\n * in the external API and be unique. The best way to achieve this is by\\n * using `public constant` hash digests:\\n *\\n * ```solidity\\n * bytes32 public constant MY_ROLE = keccak256(\\\"MY_ROLE\\\");\\n * ```\\n *\\n * Roles can be used to represent a set of permissions. To restrict access to a\\n * function call, use {hasRole}:\\n *\\n * ```solidity\\n * function foo() public {\\n *     require(hasRole(MY_ROLE, msg.sender));\\n *     ...\\n * }\\n * ```\\n *\\n * Roles can be granted and revoked dynamically via the {grantRole} and\\n * {revokeRole} functions. Each role has an associated admin role, and only\\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\\n *\\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\\n * that only accounts with this role will be able to grant or revoke other\\n * roles. More complex role relationships can be created by using\\n * {_setRoleAdmin}.\\n *\\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\\n * grant and revoke this role. Extra precautions should be taken to secure\\n * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules}\\n * to enforce additional security measures for this role.\\n */\\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\\n    struct RoleData {\\n        mapping(address account => bool) hasRole;\\n        bytes32 adminRole;\\n    }\\n\\n    mapping(bytes32 role => RoleData) private _roles;\\n\\n    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\\n\\n    /**\\n     * @dev Modifier that checks that an account has a specific role. Reverts\\n     * with an {AccessControlUnauthorizedAccount} error including the required role.\\n     */\\n    modifier onlyRole(bytes32 role) {\\n        _checkRole(role);\\n        _;\\n    }\\n\\n    /**\\n     * @dev See {IERC165-supportsInterface}.\\n     */\\n    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n        return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\\n    }\\n\\n    /**\\n     * @dev Returns `true` if `account` has been granted `role`.\\n     */\\n    function hasRole(bytes32 role, address account) public view virtual returns (bool) {\\n        return _roles[role].hasRole[account];\\n    }\\n\\n    /**\\n     * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()`\\n     * is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier.\\n     */\\n    function _checkRole(bytes32 role) internal view virtual {\\n        _checkRole(role, _msgSender());\\n    }\\n\\n    /**\\n     * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account`\\n     * is missing `role`.\\n     */\\n    function _checkRole(bytes32 role, address account) internal view virtual {\\n        if (!hasRole(role, account)) {\\n            revert AccessControlUnauthorizedAccount(account, role);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the admin role that controls `role`. See {grantRole} and\\n     * {revokeRole}.\\n     *\\n     * To change a role's admin, use {_setRoleAdmin}.\\n     */\\n    function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) {\\n        return _roles[role].adminRole;\\n    }\\n\\n    /**\\n     * @dev Grants `role` to `account`.\\n     *\\n     * If `account` had not been already granted `role`, emits a {RoleGranted}\\n     * event.\\n     *\\n     * Requirements:\\n     *\\n     * - the caller must have ``role``'s admin role.\\n     *\\n     * May emit a {RoleGranted} event.\\n     */\\n    function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {\\n        _grantRole(role, account);\\n    }\\n\\n    /**\\n     * @dev Revokes `role` from `account`.\\n     *\\n     * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n     *\\n     * Requirements:\\n     *\\n     * - the caller must have ``role``'s admin role.\\n     *\\n     * May emit a {RoleRevoked} event.\\n     */\\n    function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {\\n        _revokeRole(role, account);\\n    }\\n\\n    /**\\n     * @dev Revokes `role` from the calling account.\\n     *\\n     * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n     * purpose is to provide a mechanism for accounts to lose their privileges\\n     * if they are compromised (such as when a trusted device is misplaced).\\n     *\\n     * If the calling account had been revoked `role`, emits a {RoleRevoked}\\n     * event.\\n     *\\n     * Requirements:\\n     *\\n     * - the caller must be `callerConfirmation`.\\n     *\\n     * May emit a {RoleRevoked} event.\\n     */\\n    function renounceRole(bytes32 role, address callerConfirmation) public virtual {\\n        if (callerConfirmation != _msgSender()) {\\n            revert AccessControlBadConfirmation();\\n        }\\n\\n        _revokeRole(role, callerConfirmation);\\n    }\\n\\n    /**\\n     * @dev Sets `adminRole` as ``role``'s admin role.\\n     *\\n     * Emits a {RoleAdminChanged} event.\\n     */\\n    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\\n        bytes32 previousAdminRole = getRoleAdmin(role);\\n        _roles[role].adminRole = adminRole;\\n        emit RoleAdminChanged(role, previousAdminRole, adminRole);\\n    }\\n\\n    /**\\n     * @dev Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted.\\n     *\\n     * Internal function without access restriction.\\n     *\\n     * May emit a {RoleGranted} event.\\n     */\\n    function _grantRole(bytes32 role, address account) internal virtual returns (bool) {\\n        if (!hasRole(role, account)) {\\n            _roles[role].hasRole[account] = true;\\n            emit RoleGranted(role, account, _msgSender());\\n            return true;\\n        } else {\\n            return false;\\n        }\\n    }\\n\\n    /**\\n     * @dev Attempts to revoke `role` to `account` and returns a boolean indicating if `role` was revoked.\\n     *\\n     * Internal function without access restriction.\\n     *\\n     * May emit a {RoleRevoked} event.\\n     */\\n    function _revokeRole(bytes32 role, address account) internal virtual returns (bool) {\\n        if (hasRole(role, account)) {\\n            _roles[role].hasRole[account] = false;\\n            emit RoleRevoked(role, account, _msgSender());\\n            return true;\\n        } else {\\n            return false;\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (access/IAccessControl.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev External interface of AccessControl declared to support ERC165 detection.\\n */\\ninterface IAccessControl {\\n    /**\\n     * @dev The `account` is missing a role.\\n     */\\n    error AccessControlUnauthorizedAccount(address account, bytes32 neededRole);\\n\\n    /**\\n     * @dev The caller of a function is not the expected one.\\n     *\\n     * NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.\\n     */\\n    error AccessControlBadConfirmation();\\n\\n    /**\\n     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\\n     *\\n     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\\n     * {RoleAdminChanged} not being emitted signaling this.\\n     */\\n    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\\n\\n    /**\\n     * @dev Emitted when `account` is granted `role`.\\n     *\\n     * `sender` is the account that originated the contract call, an admin role\\n     * bearer except when using {AccessControl-_setupRole}.\\n     */\\n    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n    /**\\n     * @dev Emitted when `account` is revoked `role`.\\n     *\\n     * `sender` is the account that originated the contract call:\\n     *   - if using `revokeRole`, it is the admin role bearer\\n     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)\\n     */\\n    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n    /**\\n     * @dev Returns `true` if `account` has been granted `role`.\\n     */\\n    function hasRole(bytes32 role, address account) external view returns (bool);\\n\\n    /**\\n     * @dev Returns the admin role that controls `role`. See {grantRole} and\\n     * {revokeRole}.\\n     *\\n     * To change a role's admin, use {AccessControl-_setRoleAdmin}.\\n     */\\n    function getRoleAdmin(bytes32 role) external view returns (bytes32);\\n\\n    /**\\n     * @dev Grants `role` to `account`.\\n     *\\n     * If `account` had not been already granted `role`, emits a {RoleGranted}\\n     * event.\\n     *\\n     * Requirements:\\n     *\\n     * - the caller must have ``role``'s admin role.\\n     */\\n    function grantRole(bytes32 role, address account) external;\\n\\n    /**\\n     * @dev Revokes `role` from `account`.\\n     *\\n     * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n     *\\n     * Requirements:\\n     *\\n     * - the caller must have ``role``'s admin role.\\n     */\\n    function revokeRole(bytes32 role, address account) external;\\n\\n    /**\\n     * @dev Revokes `role` from the calling account.\\n     *\\n     * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n     * purpose is to provide a mechanism for accounts to lose their privileges\\n     * if they are compromised (such as when a trusted device is misplaced).\\n     *\\n     * If the calling account had been granted `role`, emits a {RoleRevoked}\\n     * event.\\n     *\\n     * Requirements:\\n     *\\n     * - the caller must be `callerConfirmation`.\\n     */\\n    function renounceRole(bytes32 role, address callerConfirmation) external;\\n}\\n\",\"keccak256\":\"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /**\\n     * @dev Returns the value of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the value of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n     * allowance mechanism. `value` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n    function _msgSender() internal view virtual returns (address) {\\n        return msg.sender;\\n    }\\n\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        return msg.data;\\n    }\\n\\n    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC165} from \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n */\\nabstract contract ERC165 is IERC165 {\\n    /**\\n     * @dev See {IERC165-supportsInterface}.\\n     */\\n    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {\\n        return interfaceId == type(IERC165).interfaceId;\\n    }\\n}\\n\",\"keccak256\":\"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n    /**\\n     * @dev Returns true if this contract implements the interface defined by\\n     * `interfaceId`. See the corresponding\\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n     * to learn more about how these ids are created.\\n     *\\n     * This function call must use less than 30 000 gas.\\n     */\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"license\":\"MIT\"},\"contracts/IOcnCvManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity 0.8.24;\\n\\ninterface IOcnCvManager {\\n    /* ********************************** */\\n    /*               ENUMS                */\\n    /* ********************************** */\\n\\n    enum CvStatus { NOT_VERIFIED, APPROVED, FAILED }\\n\\n}\\n\",\"keccak256\":\"0x8b6cd5f155c9df3ad3f60f6d6c7ee3ea1a9f4cf4260bd4b534546fcae5fff71d\",\"license\":\"GPL-3.0\"},\"contracts/IOcnPaymentManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity 0.8.24;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\";\\n\\ninterface IOcnPaymentManager {\\n    /* ********************************** */\\n    /*               ENUMS                */\\n    /* ********************************** */\\n\\n    enum PaymentStatus { PENDING, PAYMENT_UP_TO_DATE, INSUFFICIENT_FUNDS, INACTIVE }\\n\\n    /* ********************************** */\\n    /*               EVENTS               */\\n    /* ********************************** */\\n\\n    event OwnershipTransferred(address indexed oldAdmin, address indexed  newAdmin);\\n    event PartyStaked(address stakedBy, address party, uint256 amount);\\n    event StakeWithdrawn(address indexed party, uint256 amount);\\n\\n    /* ********************************** */\\n    /*            FUNCTIONS               */\\n    /* ********************************** */\\n\\n    function initialize(address _euroStablecoin, uint256 _fundingYearlyAmount, address _operator) external;\\n    function pay(address party) external;\\n    function withdrawToRegistryOperator(address party) external;\\n    function getPaymentStatus(address party) external view returns (PaymentStatus);\\n    function getPaymentBlock(address party) external view returns (uint256, uint256);\\n\\n    /* ********************************** */\\n    /*       STORAGE VARIABLES            */\\n    /* ********************************** */\\n\\n    function euroStablecoin() external view returns (IERC20);\\n    function stakedFunds(address party) external view returns (uint256);\\n    function stakingBlock(address party) external view returns (uint256);\\n\\n    /* ********************************** */\\n    /*  ERRORS                            */\\n    /* ********************************** */\\n\\n    error StakeAlreadyDeposited();\\n    error InsufficientAllowance();\\n    error TransferFailed();\\n    error NoFundsStaked();\\n    error WithdrawalNotAllowed();\\n}\\n\",\"keccak256\":\"0xc6c8145e1680d8bd7a1a9ea3b9531f3b5bd5a873bda2f2f73d4f77b44abbe686\",\"license\":\"GPL-3.0\"},\"contracts/OcnRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity 0.8.24;\\n\\nimport {IOcnPaymentManager} from \\\"./IOcnPaymentManager.sol\\\";\\nimport {IOcnCvManager} from \\\"./IOcnCvManager.sol\\\";\\nimport \\\"./interfaces/ICertificateVerifier.sol\\\";\\nimport \\\"./interfaces/IProviderOracle.sol\\\";\\n\\nimport {AccessControl} from \\\"@openzeppelin/contracts/access/AccessControl.sol\\\";\\n\\ncontract OcnRegistry is AccessControl {\\n    /* ********************************** */\\n    /*       STORAGE VARIABLES            */\\n    /* ********************************** */\\n\\n    string private prefix;\\n\\n    // OCN Node Operator Listings\\n    mapping(address => string) private nodeOf;\\n    mapping(string => bool) private uniqueDomains;\\n    mapping(address => bool) private uniqueOperators;\\n    address[] private operators;\\n\\n    // OCPI Party Listings\\n    enum Role {\\n        CPO,\\n        EMSP,\\n        NAP,\\n        NSP,\\n        OTHER,\\n        SCSP\\n    }\\n\\n    struct RoleDetails {\\n        bytes certificateData;\\n        bytes signature;\\n        Role role;\\n    }\\n\\n    struct PartyDetails {\\n        bytes2 countryCode;\\n        bytes3 partyId;\\n        Role[] roles;\\n        string name;\\n        string url;\\n        IOcnPaymentManager.PaymentStatus paymentStatus;\\n        IOcnCvManager.CvStatus cvStatus;\\n        bool active;\\n        uint256 partyIndex;\\n    }\\n\\n    mapping(bytes2 => mapping(bytes3 => address)) private uniqueParties;\\n    mapping(address => bool) private uniquePartyAddresses;\\n    mapping(address => PartyDetails) private partyOf;\\n    mapping(address => address) private operatorOf;\\n    mapping(address => bool) private allowedCertificateVerifiers;\\n    address[] private parties;\\n\\n    IOcnPaymentManager public paymentManager;\\n    ICertificateVerifier public certificateVerifier;\\n\\n    // Providers Oracle\\n    mapping(Role => IProviderOracle) private roleOracle;\\n\\n    /* ********************************** */\\n    /*          CUSTOM ERRORS             */\\n    /* ********************************** */\\n    error EmptyDomainName(string reason);\\n    error DomainNameAlreadyRegistered(string reason);\\n    error EmptyCountryCode(string reason);\\n    error EmptyPartyId(string reason);\\n    error NoRolesProvided(string reason);\\n    error EmptyOperator(string reason);\\n    error PartyAlreadyRegistered(string reason);\\n    error PartyNotRegistered(string reason);\\n    error SignerMismatch(string reason);\\n    error InvalidCertificate(address verifier, string reason);\\n    error ProviderNotFound(Role role, string reason);\\n    error CerificateOwnerMismatch(string reason);\\n\\n    /* ********************************** */\\n    /*               EVENTS               */\\n    /* ********************************** */\\n\\n    event OwnershipTransferred(address indexed oldAdmin, address indexed newAdmin);\\n    event OperatorUpdate(address indexed operator, string domain);\\n    event PartyUpdate(bytes2 countryCode, bytes3 partyId, address indexed partyAddress, Role[] roles, string name, string url, IOcnPaymentManager.PaymentStatus paymentStatus, IOcnCvManager.CvStatus cvStatus, bool active, address indexed operatorAddress);\\n\\n    event PartyDelete(bytes2 countryCode, bytes3 partyId, address indexed partyAddress, Role[] roles, string name, string url, IOcnPaymentManager.PaymentStatus paymentStatus, IOcnCvManager.CvStatus cvStatus, bool active);\\n\\n    /* ********************************** */\\n    /*          INITIALIZER               */\\n    /* ********************************** */\\n\\n    constructor(address _paymentManager, address _certificateVerifier) {\\n        prefix = \\\"\\\\u0019Ethereum Signed Message:\\\\n32\\\";\\n        paymentManager = IOcnPaymentManager(_paymentManager);\\n        certificateVerifier = ICertificateVerifier(_certificateVerifier);\\n        _grantRole(DEFAULT_ADMIN_ROLE, msg.sender);\\n    }\\n\\n    function transferOwnership(address newOwner) public onlyRole(DEFAULT_ADMIN_ROLE) {\\n        grantRole(DEFAULT_ADMIN_ROLE, newOwner);\\n        revokeRole(DEFAULT_ADMIN_ROLE, msg.sender);\\n\\n        emit OwnershipTransferred(msg.sender, newOwner);\\n    }\\n\\n    function adminDeleteOperator(address operator) public onlyRole(DEFAULT_ADMIN_ROLE) {\\n        deleteNode(operator);\\n    }\\n\\n    function adminDeleteParty(bytes2 countryCode, bytes3 partyId) public onlyRole(DEFAULT_ADMIN_ROLE) {\\n        address party = uniqueParties[countryCode][partyId];\\n        deleteParty(party);\\n    }\\n\\n    function setNode(address operator, string memory domain) private {\\n        if (bytes(domain).length == 0) {\\n            revert EmptyDomainName(\\\"Cannot set empty domain name. Use deleteNode method instead.\\\");\\n        }\\n        if (uniqueDomains[domain]) {\\n            revert DomainNameAlreadyRegistered(\\\"Domain name already registered.\\\");\\n        }\\n        uniqueDomains[domain] = true;\\n\\n        if (!uniqueOperators[operator]) {\\n            operators.push(operator);\\n        }\\n\\n        uniqueOperators[operator] = true;\\n        nodeOf[operator] = domain;\\n        emit OperatorUpdate(operator, domain);\\n    }\\n\\n    function setNode(string memory domain) public {\\n        setNode(msg.sender, domain);\\n    }\\n\\n    function setNodeRaw(address operator, string memory domain, uint8 v, bytes32 r, bytes32 s) public {\\n        bytes32 paramHash = keccak256(abi.encodePacked(operator, domain));\\n        address signer = ecrecover(keccak256(abi.encodePacked(prefix, paramHash)), v, r, s);\\n        setNode(signer, domain);\\n    }\\n\\n    function deleteNode(address operator) private {\\n        string memory domain = nodeOf[operator];\\n        if (bytes(domain).length == 0) {\\n            revert EmptyDomainName(\\\"Cannot delete node that does not exist.\\\");\\n        }\\n        uniqueDomains[domain] = false;\\n        delete nodeOf[operator];\\n        emit OperatorUpdate(operator, \\\"\\\");\\n    }\\n\\n    function deleteNode() public {\\n        deleteNode(msg.sender);\\n    }\\n\\n    function deleteNodeRaw(address operator, uint8 v, bytes32 r, bytes32 s) public {\\n        bytes32 paramHash = keccak256(abi.encodePacked(operator));\\n        address signer = ecrecover(keccak256(abi.encodePacked(prefix, paramHash)), v, r, s);\\n        deleteNode(signer);\\n    }\\n\\n    function getNode(address operator) public view returns (string memory) {\\n        return nodeOf[operator];\\n    }\\n\\n    function getNodeOperators() public view returns (address[] memory) {\\n        return operators;\\n    }\\n\\n    function setParty(bytes2 countryCode, bytes3 partyId, RoleDetails[] memory roles, address operator, string memory name, string memory url) public {\\n        if (countryCode == bytes2(0)) {\\n            revert EmptyCountryCode(\\\"Cannot set empty country_code. Use deleteParty method instead.\\\");\\n        }\\n        if (partyId == bytes3(0)) {\\n            revert EmptyPartyId(\\\"Cannot set empty party_id. Use deleteParty method instead.\\\");\\n        }\\n        if (roles.length == 0) {\\n            revert NoRolesProvided(\\\"No roles provided.\\\");\\n        }\\n        if (operator == address(0)) {\\n            revert EmptyOperator(\\\"Cannot set empty operator. Use deleteParty method instead.\\\");\\n        }\\n\\n        Role[] memory verifiedRoles = new Role[](roles.length);\\n        address credentialOwner = address(0);\\n\\n        // VC verification (All roles must be verified)\\n        for (uint8 i = 0; i < roles.length; i++) {\\n            RoleDetails memory roleDetails = roles[i];\\n            (string memory certificateIdentifier, address owner) = verifyCertificate(roleDetails);\\n\\n            if (credentialOwner == address(0)) {\\n                credentialOwner = owner;\\n            }\\n\\n            if (credentialOwner != owner) {\\n                revert CerificateOwnerMismatch(\\\"Certificates have different owners\\\");\\n            }\\n\\n            IProviderOracle oracle = roleOracle[roleDetails.role];\\n            if (address(oracle) != address(0)) {\\n                IProviderOracle.Provider memory provider = oracle.getProvider(certificateIdentifier);\\n                if (!compareIdentifiers(certificateIdentifier, provider.identifier)) {\\n                    revert ProviderNotFound(roleDetails.role, \\\"Not active in oracle\\\");\\n                }\\n            }\\n\\n            verifiedRoles[i] = roleDetails.role;\\n        }\\n\\n        address registeredParty = uniqueParties[countryCode][partyId];\\n        if (registeredParty != address(0) && registeredParty != credentialOwner) {\\n            revert PartyAlreadyRegistered(\\\"Party with country_code/party_id already registered under different address.\\\");\\n        }\\n        uniqueParties[countryCode][partyId] = credentialOwner;\\n        if (bytes(nodeOf[operator]).length == 0) {\\n            revert PartyNotRegistered(\\\"Provided operator not registered.\\\");\\n        }\\n\\n        uint256 partyIndex = partyOf[credentialOwner].partyIndex;\\n        if (!uniquePartyAddresses[credentialOwner]) {\\n            parties.push(credentialOwner);\\n            // get last index of the array\\n            partyIndex = parties.length - 1;\\n        }\\n\\n        uniquePartyAddresses[credentialOwner] = true;\\n\\n        IOcnPaymentManager.PaymentStatus paymentStatus = paymentManager.getPaymentStatus(credentialOwner);\\n        partyOf[credentialOwner] = PartyDetails(countryCode, partyId, verifiedRoles, name, url, paymentStatus, IOcnCvManager.CvStatus.NOT_VERIFIED, true, partyIndex);\\n        operatorOf[credentialOwner] = operator;\\n\\n        PartyDetails memory details = partyOf[credentialOwner];\\n        emit PartyUpdate(details.countryCode, details.partyId, credentialOwner, details.roles, details.name, details.url, details.paymentStatus, details.cvStatus, details.active, operator);\\n    }\\n\\n    function setPartyRaw(address party, bytes2 countryCode, bytes3 partyId, RoleDetails[] memory roles, address operator, string memory name, string memory url, uint8 v, bytes32 r, bytes32 s) public {\\n        bytes memory rolesBytes = \\\"\\\";\\n        for (uint8 i = 0; i < roles.length; i++) {\\n            RoleDetails memory roleDetails = roles[i];\\n            rolesBytes = abi.encodePacked(rolesBytes, roleDetails.certificateData, roleDetails.signature, roleDetails.role);\\n        }\\n        bytes32 rolesHash = keccak256(rolesBytes);\\n        bytes32 paramHash = keccak256(abi.encodePacked(party, countryCode, partyId, rolesHash, operator, name, url));\\n        address signer = ecrecover(keccak256(abi.encodePacked(prefix, paramHash)), v, r, s);\\n        if (signer != party) {\\n            revert SignerMismatch(\\\"Signer and provided party address different.\\\");\\n        }\\n        setParty(countryCode, partyId, roles, operator, name, url);\\n    }\\n\\n    function deleteParty(address party) private {\\n        if (operatorOf[party] == address(0)) {\\n            revert PartyNotRegistered(\\\"Cannot delete party that does not exist. No operator found for given party.\\\");\\n        }\\n        delete operatorOf[party];\\n        PartyDetails memory details = partyOf[party];\\n        delete uniqueParties[details.countryCode][details.partyId];\\n        delete partyOf[party];\\n        delete parties[details.partyIndex];\\n        uniquePartyAddresses[party] = false;\\n\\n        emit PartyDelete(details.countryCode, details.partyId, party, details.roles, details.name, details.url, details.paymentStatus, details.cvStatus, details.active);\\n    }\\n\\n    function deleteParty() public {\\n        deleteParty(msg.sender);\\n    }\\n\\n    function deletePartyRaw(address party, uint8 v, bytes32 r, bytes32 s) public {\\n        bytes32 paramHash = keccak256(abi.encodePacked(party));\\n        address signer = ecrecover(keccak256(abi.encodePacked(prefix, paramHash)), v, r, s);\\n        if (signer != party) {\\n            revert SignerMismatch(\\\"Signer and provided party address different.\\\");\\n        }\\n        deleteParty(signer);\\n    }\\n\\n    function getOperatorByAddress(address party) public view returns (address operator, string memory domain) {\\n        operator = operatorOf[party];\\n        domain = nodeOf[operator];\\n    }\\n\\n    function getOperatorByOcpi(bytes2 countryCode, bytes3 partyId) public view returns (address operator, string memory domain) {\\n        address party = uniqueParties[countryCode][partyId];\\n        operator = operatorOf[party];\\n        domain = nodeOf[operator];\\n    }\\n\\n    function getPartyDetailsByAddress(address _partyAddress) public view returns (address partyAddress, bytes2 countryCode, bytes3 partyId, Role[] memory roles, IOcnPaymentManager.PaymentStatus paymentStatus, address operatorAddress, string memory name, string memory url, bool active) {\\n        PartyDetails storage details = partyOf[_partyAddress];\\n        partyAddress = _partyAddress;\\n        countryCode = details.countryCode;\\n        partyId = details.partyId;\\n        roles = details.roles;\\n        paymentStatus = details.paymentStatus;\\n        operatorAddress = operatorOf[_partyAddress];\\n        name = details.name;\\n        url = details.url;\\n        active = details.active;\\n    }\\n\\n    function getPartyDetailsByOcpi(bytes2 _countryCode, bytes3 _partyId) public view returns (address partyAddress, bytes2 countryCode, bytes3 partyId, Role[] memory roles, IOcnPaymentManager.PaymentStatus paymentStatus, address operatorAddress, string memory name, string memory url, bool active, uint256 stakingBlock) {\\n        partyAddress = uniqueParties[_countryCode][_partyId];\\n        (stakingBlock, ) = paymentManager.getPaymentBlock(partyAddress);\\n        PartyDetails storage details = partyOf[partyAddress];\\n        countryCode = details.countryCode;\\n        partyId = details.partyId;\\n        roles = details.roles;\\n        paymentStatus = paymentManager.getPaymentStatus(partyAddress);\\n        operatorAddress = operatorOf[partyAddress];\\n        name = details.name;\\n        url = details.url;\\n        active = details.active;\\n    }\\n\\n    function getPartiesCount() public view returns (uint256) {\\n        return parties.length;\\n    }\\n\\n    function getParties() public view returns (address[] memory) {\\n        return parties;\\n    }\\n\\n    function getPartiesByOperator(address operator) public view returns (address[] memory) {\\n        address[] memory filteredParties = new address[](parties.length);\\n        uint32 count = 0;\\n        for (uint32 i = 0; i < parties.length; i++) {\\n            if (operatorOf[parties[i]] == operator) {\\n                filteredParties[count] = parties[i];\\n                count++;\\n            }\\n        }\\n        address[] memory result = new address[](count);\\n        for (uint32 i = 0; i < count; i++) {\\n            result[i] = filteredParties[i];\\n        }\\n        return result;\\n    }\\n\\n    function getPartiesByRole(Role role) public view returns (address[] memory) {\\n        address[] memory filteredParties = new address[](parties.length);\\n        uint32 count = 0;\\n        for (uint32 i = 0; i < parties.length; i++) {\\n            PartyDetails memory details = partyOf[parties[i]];\\n            for (uint32 j = 0; j < details.roles.length; j++) {\\n                if (details.roles[j] == role) {\\n                    filteredParties[count] = parties[i];\\n                    count++;\\n                    break;\\n                }\\n            }\\n        }\\n        address[] memory result = new address[](count);\\n        for (uint32 i = 0; i < count; i++) {\\n            result[i] = filteredParties[i];\\n        }\\n        return result;\\n    }\\n\\n    function setVerifier(address verifier) public onlyRole(DEFAULT_ADMIN_ROLE) {\\n        require(verifier != address(0), \\\"Invalid verifier address\\\");\\n        require(!allowedCertificateVerifiers[verifier], \\\"Verifier already allowed\\\");\\n\\n        allowedCertificateVerifiers[verifier] = true;\\n    }\\n\\n    function removeVerifier(address verifier) public onlyRole(DEFAULT_ADMIN_ROLE) {\\n        require(verifier != address(0), \\\"Invalid verifier address\\\");\\n        require(allowedCertificateVerifiers[verifier], \\\"Verifier not currently allowed\\\");\\n\\n        allowedCertificateVerifiers[verifier] = false;\\n    }\\n\\n    function isAllowedVerifier(address verifier) public view returns (bool) {\\n        return allowedCertificateVerifiers[verifier];\\n    }\\n\\n    function setProviderOracle(Role role, address oracleAddress) public onlyRole(DEFAULT_ADMIN_ROLE) {\\n        roleOracle[role] = IProviderOracle(oracleAddress);\\n    }\\n\\n    function verifyCertificate(RoleDetails memory roleDetails) private returns (string memory, address) {\\n        if (roleDetails.role == Role.EMSP) {\\n            (address verifier, ICertificateVerifier.EMPCertificate memory certificate, ) = certificateVerifier.verifyEMP(roleDetails.certificateData, roleDetails.signature);\\n            if (!isAllowedVerifier(verifier)) {\\n                revert InvalidCertificate(verifier, \\\"Invalid EMP certificate\\\");\\n            }\\n            return (certificate.identifier, certificate.owner);\\n        } else if (roleDetails.role == Role.CPO) {\\n            (address verifier, ICertificateVerifier.CPOCertificate memory certificate, ) = certificateVerifier.verifyCPO(roleDetails.certificateData, roleDetails.signature);\\n            if (!isAllowedVerifier(verifier)) {\\n                revert InvalidCertificate(verifier, \\\"Invalid CPO certificate\\\");\\n            }\\n            return (certificate.identifier, certificate.owner);\\n        } else {\\n            (address verifier, ICertificateVerifier.OtherCertificate memory certificate, ) = certificateVerifier.verifyOther(roleDetails.certificateData, roleDetails.signature);\\n            if (!isAllowedVerifier(verifier)) {\\n                revert InvalidCertificate(verifier, \\\"Invalid Other certificate\\\");\\n            }\\n            return (certificate.identifier, certificate.owner);\\n        }\\n    }\\n\\n    function compareIdentifiers(string memory a, string memory b) private pure returns (bool) {\\n        return keccak256(abi.encodePacked(a)) == keccak256(abi.encodePacked(b));\\n    }\\n}\\n\",\"keccak256\":\"0xe7fb539388cbc7448f90cb794ef3511a05b2c7b8bb865978a6732544d2427f37\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/ICertificateVerifier.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.24;\\n\\ninterface ICertificateVerifier {\\n    struct Signature {\\n        bytes32 r;\\n        bytes32 s;\\n        uint8 v;\\n    }\\n\\n    struct EMPCertificate {\\n        string identifier;\\n        string name;\\n        string marktfunktion;\\n        string lieferant;\\n        string bilanzkreis;\\n        address owner;\\n        string vatid;\\n    }\\n\\n    struct CPOCertificate {\\n        string identifier;\\n        string name;\\n        address owner;\\n    }\\n\\n    struct OtherCertificate {\\n        string identifier;\\n        string name;\\n        address owner;\\n    }\\n\\n    function verifyEMP(\\n        bytes memory certificateData,\\n        bytes memory signature\\n    ) external returns (address, EMPCertificate memory, Signature memory);\\n\\n    function verifyCPO(\\n        bytes memory certificateData,\\n        bytes memory signature\\n    ) external returns (address, CPOCertificate memory, Signature memory);\\n\\n    function verifyOther(\\n        bytes memory certificateData,\\n        bytes memory signature\\n    ) external returns (address, OtherCertificate memory, Signature memory);\\n}\\n\",\"keccak256\":\"0x29e502bb82828750231d1ceb0a5860d579ecdbdb54f415a5c7d0f63a8f88446e\",\"license\":\"MIT\"},\"contracts/interfaces/IProviderOracle.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.24;\\n\\ninterface IProviderOracle {\\n    struct Provider {\\n        string name;\\n        string identifier;\\n    }\\n\\n    function getProvider(\\n        string memory identifier\\n    ) external view returns (Provider memory);\\n\\n    function addProvider(Provider memory provider) external;\\n}\\n\",\"keccak256\":\"0x8ed559df15b641e541236e0e4558bd8dec99c2efc31218f4939b67a4114b5723\",\"license\":\"MIT\"}},\"version\":1}",
  "bytecode": "0x60806040523480156200001157600080fd5b5060405162004b1638038062004b1683398101604081905262000034916200018a565b60408051808201909152601c81527f19457468657265756d205369676e6564204d6573736167653a0a333200000000602082015260019062000077908262000269565b50600c80546001600160a01b038085166001600160a01b031992831617909255600d805492841692909116919091179055620000b5600033620000be565b50505062000335565b6000828152602081815260408083206001600160a01b038516845290915281205460ff1662000163576000838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556200011a3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a450600162000167565b5060005b92915050565b80516001600160a01b03811681146200018557600080fd5b919050565b600080604083850312156200019e57600080fd5b620001a9836200016d565b9150620001b9602084016200016d565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620001ed57607f821691505b6020821081036200020e57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000264576000816000526020600020601f850160051c810160208610156200023f5750805b601f850160051c820191505b8181101562000260578281556001016200024b565b5050505b505050565b81516001600160401b03811115620002855762000285620001c2565b6200029d81620002968454620001d8565b8462000214565b602080601f831160018114620002d55760008415620002bc5750858301515b600019600386901b1c1916600185901b17855562000260565b600085815260208120601f198616915b828110156200030657888601518255948401946001909101908401620002e5565b5085821015620003255787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6147d180620003456000396000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c806391d148541161011a578063aee1fe49116100ad578063d63a84d41161007c578063d63a84d414610490578063df516128146104a3578063dfd93d3b146104cb578063e1e64995146104de578063f2fde38b146104f157600080fd5b8063aee1fe4914610437578063bdb8107814610462578063ca2dfd0a1461046a578063d547741f1461047d57600080fd5b8063a33db09f116100e9578063a33db09f146103eb578063a5b5ffbb146103fe578063a8311aa814610427578063acaef0e01461042f57600080fd5b806391d148541461039d57806399bd6901146103b05780639d209048146103c3578063a217fddf146103e357600080fd5b80635437988d1161019d5780636c265bbc1161016c5780636c265bbc146103305780637a091aa51461034357806381939d661461036457806385cb86021461037757806388cf72a01461038a57600080fd5b80635437988d146102d65780635cf0685f146102e957806366acaa331461031557806366e706fb1461031d57600080fd5b80632d8fe452116101d95780632d8fe4521461027d5780632f2ff15d1461029057806336568abe146102a357806339581c21146102b657600080fd5b806301ffc9a71461020b578063031d2bd5146102335780630799363d14610245578063248a9ca31461025a575b600080fd5b61021e610219366004613665565b610504565b60405190151581526020015b60405180910390f35b600b545b60405190815260200161022a565b610258610253366004613911565b61053b565b005b6102376102683660046139cd565b60009081526020819052604090206001015490565b61025861028b3660046139e6565b6110ac565b61025861029e366004613a03565b6110c4565b6102586102b1366004613a03565b6110ef565b6102c96102c4366004613a33565b611127565b60405161022a9190613a4e565b6102586102e43660046139e6565b6115fc565b61021e6102f73660046139e6565b6001600160a01b03166000908152600a602052604090205460ff1690565b6102c96116e6565b61025861032b366004613ab5565b611748565b61025861033e366004613ab5565b611841565b610356610351366004613afb565b611900565b60405161022a929190613b7e565b610258610372366004613baa565b6119ed565b610258610385366004613bd6565b611a57565b6103566103983660046139e6565b611a64565b61021e6103ab366004613a03565b611b23565b6102586103be366004613c0a565b611b4c565b6103d66103d13660046139e6565b611c0d565b60405161022a9190613c7d565b610237600081565b6102c96103f93660046139e6565b611cb9565b61041161040c366004613afb565b611eb3565b60405161022a9a99989796959493929190613d0d565b6102c96121f9565b610258612259565b600c5461044a906001600160a01b031681565b6040516001600160a01b03909116815260200161022a565b610258612264565b6102586104783660046139e6565b61226d565b61025861048b366004613a03565b612353565b61025861049e366004613afb565b612378565b6104b66104b13660046139e6565b6123c4565b60405161022a99989796959493929190613dab565b600d5461044a906001600160a01b031681565b6102586104ec366004613e47565b612611565b6102586104ff3660046139e6565b6127ac565b60006001600160e01b03198216637965db0b60e01b148061053557506301ffc9a760e01b6001600160e01b03198316145b92915050565b6001600160f01b031986166105be57604051633a50519760e21b815260206004820152603e60248201527f43616e6e6f742073657420656d70747920636f756e7472795f636f64652e205560448201527f73652064656c6574655061727479206d6574686f6420696e73746561642e000060648201526084015b60405180910390fd5b6001600160e81b0319851661063c5760405163373a953760e11b815260206004820152603a60248201527f43616e6e6f742073657420656d7074792070617274795f69642e20557365206460448201527f656c6574655061727479206d6574686f6420696e73746561642e00000000000060648201526084016105b5565b83516000036106835760405163cab73b6560e01b81526020600482015260126024820152712737903937b632b990383937bb34b232b21760711b60448201526064016105b5565b6001600160a01b0383166107005760405163fac855f560e01b815260206004820152603a60248201527f43616e6e6f742073657420656d707479206f70657261746f722e20557365206460448201527f656c6574655061727479206d6574686f6420696e73746561642e00000000000060648201526084016105b5565b600084516001600160401b0381111561071b5761071b6136cb565b604051908082528060200260200182016040528015610744578160200160208202803683370190505b5090506000805b86518160ff161015610961576000878260ff168151811061076e5761076e613f37565b6020026020010151905060008061078483612807565b90925090506001600160a01b03851661079b578094505b806001600160a01b0316856001600160a01b031614610808576040516316c7354f60e01b815260206004820152602260248201527f436572746966696361746573206861766520646966666572656e74206f776e65604482015261727360f01b60648201526084016105b5565b6000600e60008560400151600581111561082457610824613c90565b600581111561083557610835613c90565b81526020810191909152604001600020546001600160a01b031690508015610900576040516350cadc8560e01b81526000906001600160a01b038316906350cadc8590610886908790600401613c7d565b600060405180830381865afa1580156108a3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108cb9190810190613f92565b90506108db848260200151612b83565b6108fe5784604001516040516303458c0d60e21b81526004016105b59190614038565b505b8360400151878660ff168151811061091a5761091a613f37565b6020026020010190600581111561093357610933613c90565b9081600581111561094657610946613c90565b815250505050505080806109599061408c565b91505061074b565b506001600160f01b0319881660009081526006602090815260408083206001600160e81b03198b1684529091529020546001600160a01b031680158015906109bb5750816001600160a01b0316816001600160a01b031614155b15610a445760405163618270d960e01b815260206004820152604c60248201527f5061727479207769746820636f756e7472795f636f64652f70617274795f696460448201527f20616c7265616479207265676973746572656420756e6465722064696666657260648201526b32b73a1030b2323932b9b99760a11b608482015260a4016105b5565b6001600160f01b0319891660009081526006602090815260408083206001600160e81b03198c168452825280832080546001600160a01b0319166001600160a01b038781169190911790915589168352600290915290208054610aa6906140ab565b9050600003610b0257604051634523c97f60e01b815260206004820152602160248201527f50726f7669646564206f70657261746f72206e6f7420726567697374657265646044820152601760f91b60648201526084016105b5565b6001600160a01b03821660009081526008602090815260408083206005015460079092529091205460ff16610b8d57600b80546001808201835560008390527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db990910180546001600160a01b0319166001600160a01b0387161790559054610b8a91906140e5565b90505b6001600160a01b03838116600081815260076020526040808220805460ff19166001179055600c549051632222c8a160e21b815260048101939093529092169063888b228490602401602060405180830381865afa158015610bf3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1791906140f8565b90506040518061012001604052808c6001600160f01b03191681526020018b6001600160e81b0319168152602001868152602001888152602001878152602001826003811115610c6957610c69613c90565b8152602001600081526001602080830182905260409283018690526001600160a01b038816600090815260088252839020845181548684015160e81c620100000264ffffffffff1990911660f09290921c91909117178155928401518051610cd8938501929190910190613541565b5060608201516002820190610ced9082614161565b5060808201516003820190610d029082614161565b5060a082015160048201805460ff19166001836003811115610d2657610d26613c90565b021790555060c082015160048201805461ff001916610100836002811115610d5057610d50613c90565b021790555060e082015160048201805462ff00001916620100009215158302179055610100909201516005909101556001600160a01b03858116600090815260096020908152604080832080546001600160a01b031916948e169490941790935560088152828220835161012081018552815460f081901b6001600160f01b03191682529590950460e81b6001600160e81b031916858301526001810180548551818502810185018752818152949695929492860193830182828015610e6557602002820191906000526020600020906000905b82829054906101000a900460ff166005811115610e4357610e43613c90565b815260206001928301818104948501949093039092029101808411610e245790505b50505050508152602001600282018054610e7e906140ab565b80601f0160208091040260200160405190810160405280929190818152602001828054610eaa906140ab565b8015610ef75780601f10610ecc57610100808354040283529160200191610ef7565b820191906000526020600020905b815481529060010190602001808311610eda57829003601f168201915b50505050508152602001600382018054610f10906140ab565b80601f0160208091040260200160405190810160405280929190818152602001828054610f3c906140ab565b8015610f895780601f10610f5e57610100808354040283529160200191610f89565b820191906000526020600020905b815481529060010190602001808311610f6c57829003601f168201915b5050509183525050600482015460209091019060ff166003811115610fb057610fb0613c90565b6003811115610fc157610fc1613c90565b81526020016004820160019054906101000a900460ff166002811115610fe957610fe9613c90565b6002811115610ffa57610ffa613c90565b81526020016004820160029054906101000a900460ff161515151581526020016005820154815250509050886001600160a01b0316856001600160a01b03167fc16bf12458bfb0cf1345674275c1e82f2c14cf06a3996e1bb297f2015ff66f78836000015184602001518560400151866060015187608001518860a001518960c001518a60e00151604051611096989796959493929190614220565b60405180910390a3505050505050505050505050565b60006110b781612bdc565b6110c082612be6565b5050565b6000828152602081905260409020600101546110df81612bdc565b6110e98383612d8d565b50505050565b6001600160a01b03811633146111185760405163334bd91960e11b815260040160405180910390fd5b6111228282612e1f565b505050565b600b546060906000906001600160401b03811115611147576111476136cb565b604051908082528060200260200182016040528015611170578160200160208202803683370190505b5090506000805b600b5463ffffffff8216101561153757600060086000600b8463ffffffff16815481106111a6576111a6613f37565b60009182526020808320909101546001600160a01b03168352828101939093526040918201902081516101208101835281546001600160f01b031960f082901b1682526001600160e81b03196201000090910460e81b168185015260018201805484518187028101870186528181529295939486019383018282801561127b57602002820191906000526020600020906000905b82829054906101000a900460ff16600581111561125957611259613c90565b81526020600192830181810494850194909303909202910180841161123a5790505b50505050508152602001600282018054611294906140ab565b80601f01602080910402602001604051908101604052809291908181526020018280546112c0906140ab565b801561130d5780601f106112e25761010080835404028352916020019161130d565b820191906000526020600020905b8154815290600101906020018083116112f057829003601f168201915b50505050508152602001600382018054611326906140ab565b80601f0160208091040260200160405190810160405280929190818152602001828054611352906140ab565b801561139f5780601f106113745761010080835404028352916020019161139f565b820191906000526020600020905b81548152906001019060200180831161138257829003601f168201915b5050509183525050600482015460209091019060ff1660038111156113c6576113c6613c90565b60038111156113d7576113d7613c90565b81526020016004820160019054906101000a900460ff1660028111156113ff576113ff613c90565b600281111561141057611410613c90565b8152600482015462010000900460ff1615156020820152600590910154604090910152905060005b8160400151518163ffffffff1610156115225786600581111561145d5761145d613c90565b82604001518263ffffffff168151811061147957611479613f37565b6020026020010151600581111561149257611492613c90565b0361151057600b8363ffffffff16815481106114b0576114b0613f37565b9060005260206000200160009054906101000a90046001600160a01b0316858563ffffffff16815181106114e6576114e6613f37565b6001600160a01b039092166020928302919091019091015283611508816142b9565b945050611522565b8061151a816142b9565b915050611438565b5050808061152f906142b9565b915050611177565b5060008163ffffffff166001600160401b03811115611558576115586136cb565b604051908082528060200260200182016040528015611581578160200160208202803683370190505b50905060005b8263ffffffff168163ffffffff1610156115f357838163ffffffff16815181106115b3576115b3613f37565b6020026020010151828263ffffffff16815181106115d3576115d3613f37565b6001600160a01b0390921660209283029190910190910152600101611587565b50949350505050565b600061160781612bdc565b6001600160a01b0382166116585760405162461bcd60e51b8152602060048201526018602482015277496e76616c6964207665726966696572206164647265737360401b60448201526064016105b5565b6001600160a01b0382166000908152600a602052604090205460ff16156116c15760405162461bcd60e51b815260206004820152601860248201527f566572696669657220616c726561647920616c6c6f776564000000000000000060448201526064016105b5565b506001600160a01b03166000908152600a60205260409020805460ff19166001179055565b6060600580548060200260200160405190810160405280929190818152602001828054801561173e57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611720575b5050505050905090565b6040516001600160601b0319606086901b1660208201526000906034016040516020818303038152906040528051906020012090506000600180836040516020016117949291906142dc565b60408051601f198184030181528282528051602091820120600084529083018083525260ff881690820152606081018690526080810185905260a0016020604051602081039080840390855afa1580156117f2573d6000803e3d6000fd5b505050602060405103519050856001600160a01b0316816001600160a01b0316146118305760405163331e1b8160e21b81526004016105b590614357565b61183981612e8a565b505050505050565b6040516001600160601b0319606086901b16602082015260009060340160405160208183030381529060405280519060200120905060006001808360405160200161188d9291906142dc565b60408051601f198184030181528282528051602091820120600084529083018083525260ff881690820152606081018690526080810185905260a0016020604051602081039080840390855afa1580156118eb573d6000803e3d6000fd5b50505060206040510351905061183981612be6565b6001600160f01b0319821660009081526006602090815260408083206001600160e81b0319851684528252808320546001600160a01b0390811680855260098452828520549091168085526002909352922080549192606092909190611965906140ab565b80601f0160208091040260200160405190810160405280929190818152602001828054611991906140ab565b80156119de5780601f106119b3576101008083540402835291602001916119de565b820191906000526020600020905b8154815290600101906020018083116119c157829003601f168201915b50505050509150509250929050565b60006119f881612bdc565b81600e6000856005811115611a0f57611a0f613c90565b6005811115611a2057611a20613c90565b815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550505050565b611a613382613312565b50565b6001600160a01b038082166000908152600960209081526040808320549093168083526002909152919020805460609190611a9e906140ab565b80601f0160208091040260200160405190810160405280929190818152602001828054611aca906140ab565b8015611b175780601f10611aec57610100808354040283529160200191611b17565b820191906000526020600020905b815481529060010190602001808311611afa57829003601f168201915b50505050509050915091565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b60008585604051602001611b619291906143a3565b604051602081830303815290604052805190602001209050600060018083604051602001611b909291906142dc565b60408051601f198184030181528282528051602091820120600084529083018083525260ff881690820152606081018690526080810185905260a0016020604051602081039080840390855afa158015611bee573d6000803e3d6000fd5b505050602060405103519050611c048187613312565b50505050505050565b6001600160a01b0381166000908152600260205260409020805460609190611c34906140ab565b80601f0160208091040260200160405190810160405280929190818152602001828054611c60906140ab565b8015611cad5780601f10611c8257610100808354040283529160200191611cad565b820191906000526020600020905b815481529060010190602001808311611c9057829003601f168201915b50505050509050919050565b600b546060906000906001600160401b03811115611cd957611cd96136cb565b604051908082528060200260200182016040528015611d02578160200160208202803683370190505b5090506000805b600b5463ffffffff82161015611df757846001600160a01b031660096000600b8463ffffffff1681548110611d4057611d40613f37565b60009182526020808320909101546001600160a01b0390811684529083019390935260409091019020541603611de557600b8163ffffffff1681548110611d8957611d89613f37565b9060005260206000200160009054906101000a90046001600160a01b0316838363ffffffff1681518110611dbf57611dbf613f37565b6001600160a01b039092166020928302919091019091015281611de1816142b9565b9250505b80611def816142b9565b915050611d09565b5060008163ffffffff166001600160401b03811115611e1857611e186136cb565b604051908082528060200260200182016040528015611e41578160200160208202803683370190505b50905060005b8263ffffffff168163ffffffff1610156115f357838163ffffffff1681518110611e7357611e73613f37565b6020026020010151828263ffffffff1681518110611e9357611e93613f37565b6001600160a01b0390921660209283029190910190910152600101611e47565b6001600160f01b0319821660009081526006602090815260408083206001600160e81b03198516845290915280822054600c549151631234d3bd60e01b81526001600160a01b039182166004820181905293928392606092849283928592839285928392911690631234d3bd906024016040805180830381865afa158015611f3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f6391906143db565b506001600160a01b038b16600090815260086020908152604091829020805460018201805485518186028101860190965280865260f083901b9f506201000090920460e81b9d5094955090939183018282801561200f57602002820191906000526020600020906000905b82829054906101000a900460ff166005811115611fed57611fed613c90565b815260206001928301818104948501949093039092029101808411611fce5790505b5050600c54604051632222c8a160e21b8152949c506001600160a01b03169363888b2284935061205492508f91506004016001600160a01b0391909116815260200190565b602060405180830381865afa158015612071573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061209591906140f8565b6001600160a01b03808d16600090815260096020526040902054600284018054939a5091169750906120c6906140ab565b80601f01602080910402602001604051908101604052809291908181526020018280546120f2906140ab565b801561213f5780601f106121145761010080835404028352916020019161213f565b820191906000526020600020905b81548152906001019060200180831161212257829003601f168201915b50505050509450806003018054612155906140ab565b80601f0160208091040260200160405190810160405280929190818152602001828054612181906140ab565b80156121ce5780601f106121a3576101008083540402835291602001916121ce565b820191906000526020600020905b8154815290600101906020018083116121b157829003601f168201915b505050505093508060040160029054906101000a900460ff169250509295989b9194979a5092959850565b6060600b80548060200260200160405190810160405280929190818152602001828054801561173e576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311611720575050505050905090565b61226233612be6565b565b61226233612e8a565b600061227881612bdc565b6001600160a01b0382166122c95760405162461bcd60e51b8152602060048201526018602482015277496e76616c6964207665726966696572206164647265737360401b60448201526064016105b5565b6001600160a01b0382166000908152600a602052604090205460ff166123315760405162461bcd60e51b815260206004820152601e60248201527f5665726966696572206e6f742063757272656e746c7920616c6c6f776564000060448201526064016105b5565b506001600160a01b03166000908152600a60205260409020805460ff19169055565b60008281526020819052604090206001015461236e81612bdc565b6110e98383612e1f565b600061238381612bdc565b6001600160f01b0319831660009081526006602090815260408083206001600160e81b0319861684529091529020546001600160a01b03166110e981612e8a565b6001600160a01b03811660009081526008602090815260408083208054600182018054845181870281018701909552808552879660f084901b966201000090940460e81b956060959194859487948594879490939092919083018282801561247b57602002820191906000526020600020906000905b82829054906101000a900460ff16600581111561245957612459613c90565b81526020600192830181810494850194909303909202910180841161243a5790505b505050505096508060040160009054906101000a900460ff169550600960008c6001600160a01b03166001600160a01b0316815260200190815260200160002060009054906101000a90046001600160a01b031694508060020180546124e0906140ab565b80601f016020809104026020016040519081016040528092919081815260200182805461250c906140ab565b80156125595780601f1061252e57610100808354040283529160200191612559565b820191906000526020600020905b81548152906001019060200180831161253c57829003601f168201915b5050505050935080600301805461256f906140ab565b80601f016020809104026020016040519081016040528092919081815260200182805461259b906140ab565b80156125e85780601f106125bd576101008083540402835291602001916125e8565b820191906000526020600020905b8154815290600101906020018083116125cb57829003601f168201915b505050505092508060040160029054906101000a900460ff169150509193959799909294969850565b604080516020810190915260008082525b88518160ff161015612697576000898260ff168151811061264557612645613f37565b602002602001015190508281600001518260200151836040015160405160200161267294939291906143ff565b604051602081830303815290604052925050808061268f9061408c565b915050612622565b5060008180519060200120905060008c8c8c848c8c8c6040516020016126c3979695949392919061445d565b6040516020818303038152906040528051906020012090506000600180836040516020016126f29291906142dc565b60408051601f198184030181528282528051602091820120600084529083018083525260ff8a1690820152606081018890526080810187905260a0016020604051602081039080840390855afa158015612750573d6000803e3d6000fd5b5050506020604051035190508d6001600160a01b0316816001600160a01b03161461278e5760405163331e1b8160e21b81526004016105b590614357565b61279c8d8d8d8d8d8d61053b565b5050505050505050505050505050565b60006127b781612bdc565b6127c26000836110c4565b6127cd600033612353565b6040516001600160a01b0383169033907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6060600060018360400151600581111561282357612823613c90565b0361294357600d548351602085015160405163fbb87f9760e01b815260009384936001600160a01b039091169263fbb87f97926128649291906004016144dd565b6000604051808303816000875af1158015612883573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526128ab9190810190614559565b50915091506128d2826001600160a01b03166000908152600a602052604090205460ff1690565b6129305760408051637a0c0ca960e01b81526001600160a01b03841660048201526024810191909152601760448201527f496e76616c696420454d5020636572746966696361746500000000000000000060648201526084016105b5565b805160a090910151909590945092505050565b60008360400151600581111561295b5761295b613c90565b03612a7b57600d548351602085015160405163055b37fb60e51b815260009384936001600160a01b039091169263ab66ff609261299c9291906004016144dd565b6000604051808303816000875af11580156129bb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526129e39190810190614727565b5091509150612a0a826001600160a01b03166000908152600a602052604090205460ff1690565b612a685760408051637a0c0ca960e01b81526001600160a01b03841660048201526024810191909152601760448201527f496e76616c69642043504f20636572746966696361746500000000000000000060648201526084016105b5565b8051604090910151909590945092505050565b600d548351602085015160405163fab285c960e01b815260009384936001600160a01b039091169263fab285c992612ab79291906004016144dd565b6000604051808303816000875af1158015612ad6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612afe9190810190614727565b5091509150612b25826001600160a01b03166000908152600a602052604090205460ff1690565b612a685760408051637a0c0ca960e01b81526001600160a01b03841660048201526024810191909152601960448201527f496e76616c6964204f746865722063657274696669636174650000000000000060648201526084016105b5565b600081604051602001612b96919061477f565b6040516020818303038152906040528051906020012083604051602001612bbd919061477f565b6040516020818303038152906040528051906020012014905092915050565b611a618133613508565b6001600160a01b03811660009081526002602052604081208054612c09906140ab565b80601f0160208091040260200160405190810160405280929190818152602001828054612c35906140ab565b8015612c825780601f10612c5757610100808354040283529160200191612c82565b820191906000526020600020905b815481529060010190602001808311612c6557829003601f168201915b505050505090508051600003612ceb57604051639d8b847760e01b815260206004820152602760248201527f43616e6e6f742064656c657465206e6f6465207468617420646f6573206e6f746044820152661032bc34b9ba1760c91b60648201526084016105b5565b6000600382604051612cfd919061477f565b9081526040805160209281900383019020805460ff1916931515939093179092556001600160a01b03841660009081526002909152908120612d3e916135f5565b816001600160a01b03167fb1f254c0ae74a753185ba13a1b17818bc803e32d05ef56851955c0ebf230f0d6604051612d8190602080825260009082015260400190565b60405180910390a25050565b6000612d998383611b23565b612e17576000838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055612dcf3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610535565b506000610535565b6000612e2b8383611b23565b15612e17576000838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610535565b6001600160a01b0381811660009081526009602052604090205416612f2c57604051634523c97f60e01b815260206004820152604b60248201527f43616e6e6f742064656c657465207061727479207468617420646f6573206e6f60448201527f742065786973742e204e6f206f70657261746f7220666f756e6420666f72206760648201526a34bb32b7103830b93a3c9760a91b608482015260a4016105b5565b6001600160a01b038116600090815260096020908152604080832080546001600160a01b031916905560088252808320815161012081018352815460f081901b6001600160f01b031916825262010000900460e81b6001600160e81b0319168185015260018201805484518187028101870186528181529295939486019383018282801561300957602002820191906000526020600020906000905b82829054906101000a900460ff166005811115612fe757612fe7613c90565b815260206001928301818104948501949093039092029101808411612fc85790505b50505050508152602001600282018054613022906140ab565b80601f016020809104026020016040519081016040528092919081815260200182805461304e906140ab565b801561309b5780601f106130705761010080835404028352916020019161309b565b820191906000526020600020905b81548152906001019060200180831161307e57829003601f168201915b505050505081526020016003820180546130b4906140ab565b80601f01602080910402602001604051908101604052809291908181526020018280546130e0906140ab565b801561312d5780601f106131025761010080835404028352916020019161312d565b820191906000526020600020905b81548152906001019060200180831161311057829003601f168201915b5050509183525050600482015460209091019060ff16600381111561315457613154613c90565b600381111561316557613165613c90565b81526020016004820160019054906101000a900460ff16600281111561318d5761318d613c90565b600281111561319e5761319e613c90565b8152600482015462010000900460ff16151560208083019190915260059092015460409182015282516001600160f01b031916600090815260068352818120848401516001600160e81b0319168252835281812080546001600160a01b03191690556001600160a01b038616815260089092528120805464ffffffffff1916815591925061322f600183018261362f565b61323d6002830160006135f5565b61324b6003830160006135f5565b5060048101805462ffffff191690556000600590910155610100810151600b8054909190811061327d5761327d613f37565b6000918252602080832090910180546001600160a01b03191690556001600160a01b03841680835260078252604092839020805460ff19169055835191840151848401516060860151608087015160a088015160c089015160e08a0151985196987ff1cf4c42833aa61e1c774181a5389a7b164a71351b75cf37a76762f31b17073998612d8198909796959493929190614220565b805160000361338a57604051639d8b847760e01b815260206004820152603c60248201527f43616e6e6f742073657420656d70747920646f6d61696e206e616d652e20557360448201527f652064656c6574654e6f6465206d6574686f6420696e73746561642e0000000060648201526084016105b5565b60038160405161339a919061477f565b9081526040519081900360200190205460ff16156133fb5760405163f1f1b1c760e01b815260206004820152601f60248201527f446f6d61696e206e616d6520616c726561647920726567697374657265642e0060448201526064016105b5565b600160038260405161340d919061477f565b9081526040805160209281900383019020805460ff1916931515939093179092556001600160a01b03841660009081526004909152205460ff1661349757600580546001810182556000919091527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b0319166001600160a01b0384161790555b6001600160a01b0382166000908152600460209081526040808320805460ff19166001179055600290915290206134ce8282614161565b50816001600160a01b03167fb1f254c0ae74a753185ba13a1b17818bc803e32d05ef56851955c0ebf230f0d682604051612d819190613c7d565b6135128282611b23565b6110c05760405163e2517d3f60e01b81526001600160a01b0382166004820152602481018390526044016105b5565b82805482825590600052602060002090601f016020900481019282156135e55791602002820160005b838211156135b657835183826101000a81548160ff0219169083600581111561359557613595613c90565b0217905550926020019260010160208160000104928301926001030261356a565b80156135e35782816101000a81549060ff02191690556001016020816000010492830192600103026135b6565b505b506135f1929150613650565b5090565b508054613601906140ab565b6000825580601f10613611575050565b601f016020900490600052602060002090810190611a619190613650565b50805460008255601f016020900490600052602060002090810190611a6191905b5b808211156135f15760008155600101613651565b60006020828403121561367757600080fd5b81356001600160e01b03198116811461368f57600080fd5b9392505050565b80356001600160f01b0319811681146136ae57600080fd5b919050565b80356001600160e81b0319811681146136ae57600080fd5b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b0381118282101715613703576137036136cb565b60405290565b60405160e081016001600160401b0381118282101715613703576137036136cb565b604051601f8201601f191681016001600160401b0381118282101715613753576137536136cb565b604052919050565b60006001600160401b03821115613774576137746136cb565b50601f01601f191660200190565b600082601f83011261379357600080fd5b81356137a66137a18261375b565b61372b565b8181528460208386010111156137bb57600080fd5b816020850160208301376000918101602001919091529392505050565b8035600681106136ae57600080fd5b600082601f8301126137f857600080fd5b813560206001600160401b0380831115613814576138146136cb565b8260051b61382383820161372b565b938452858101830193838101908886111561383d57600080fd5b84880192505b858310156138e55782358481111561385b5760008081fd5b88016060818b03601f19018113156138735760008081fd5b61387b6136e1565b878301358781111561388d5760008081fd5b61389b8d8a83870101613782565b825250604080840135888111156138b25760008081fd5b6138c08e8b83880101613782565b8a840152506138d08385016137d8565b90820152845250509184019190840190613843565b98975050505050505050565b6001600160a01b0381168114611a6157600080fd5b80356136ae816138f1565b60008060008060008060c0878903121561392a57600080fd5b61393387613696565b9550613941602088016136b3565b945060408701356001600160401b038082111561395d57600080fd5b6139698a838b016137e7565b95506060890135915061397b826138f1565b9093506080880135908082111561399157600080fd5b61399d8a838b01613782565b935060a08901359150808211156139b357600080fd5b506139c089828a01613782565b9150509295509295509295565b6000602082840312156139df57600080fd5b5035919050565b6000602082840312156139f857600080fd5b813561368f816138f1565b60008060408385031215613a1657600080fd5b823591506020830135613a28816138f1565b809150509250929050565b600060208284031215613a4557600080fd5b61368f826137d8565b6020808252825182820181905260009190848201906040850190845b81811015613a8f5783516001600160a01b031683529284019291840191600101613a6a565b50909695505050505050565b60ff81168114611a6157600080fd5b80356136ae81613a9b565b60008060008060808587031215613acb57600080fd5b8435613ad6816138f1565b93506020850135613ae681613a9b565b93969395505050506040820135916060013590565b60008060408385031215613b0e57600080fd5b613b1783613696565b9150613b25602084016136b3565b90509250929050565b60005b83811015613b49578181015183820152602001613b31565b50506000910152565b60008151808452613b6a816020860160208601613b2e565b601f01601f19169290920160200192915050565b6001600160a01b0383168152604060208201819052600090613ba290830184613b52565b949350505050565b60008060408385031215613bbd57600080fd5b613bc6836137d8565b91506020830135613a28816138f1565b600060208284031215613be857600080fd5b81356001600160401b03811115613bfe57600080fd5b613ba284828501613782565b600080600080600060a08688031215613c2257600080fd5b8535613c2d816138f1565b945060208601356001600160401b03811115613c4857600080fd5b613c5488828901613782565b9450506040860135613c6581613a9b565b94979396509394606081013594506080013592915050565b60208152600061368f6020830184613b52565b634e487b7160e01b600052602160045260246000fd5b60068110613cb657613cb6613c90565b9052565b60008151808452602080850194506020840160005b83811015613cf257613ce2878351613ca6565b9582019590820190600101613ccf565b509495945050505050565b60048110613cb657613cb6613c90565b6001600160a01b038b811682526001600160f01b03198b1660208301526001600160e81b03198a16604083015261014060608301819052600091613d538483018c613cba565b9150613d62608085018b613cfd565b881660a084015282810360c0840152613d7b8188613b52565b905082810360e0840152613d8f8187613b52565b9415156101008401525050610120015298975050505050505050565b6001600160a01b038a811682526001600160f01b03198a1660208301526001600160e81b03198916604083015261012060608301819052600091613df18483018b613cba565b9150613e00608085018a613cfd565b871660a084015282810360c0840152613e198187613b52565b905082810360e0840152613e2d8186613b52565b9150508215156101008301529a9950505050505050505050565b6000806000806000806000806000806101408b8d031215613e6757600080fd5b613e708b613906565b9950613e7e60208c01613696565b9850613e8c60408c016136b3565b975060608b01356001600160401b0380821115613ea857600080fd5b613eb48e838f016137e7565b9850613ec260808e01613906565b975060a08d0135915080821115613ed857600080fd5b613ee48e838f01613782565b965060c08d0135915080821115613efa57600080fd5b50613f078d828e01613782565b945050613f1660e08c01613aaa565b92506101008b013591506101208b013590509295989b9194979a5092959850565b634e487b7160e01b600052603260045260246000fd5b600082601f830112613f5e57600080fd5b8151613f6c6137a18261375b565b818152846020838601011115613f8157600080fd5b613ba2826020830160208701613b2e565b600060208284031215613fa457600080fd5b81516001600160401b0380821115613fbb57600080fd5b9083019060408286031215613fcf57600080fd5b604051604081018181108382111715613fea57613fea6136cb565b604052825182811115613ffc57600080fd5b61400887828601613f4d565b82525060208301518281111561401d57600080fd5b61402987828601613f4d565b60208301525095945050505050565b6140428183613ca6565b604060208201819052601490820152734e6f742061637469766520696e206f7261636c6560601b6060820152608001919050565b634e487b7160e01b600052601160045260246000fd5b600060ff821660ff81036140a2576140a2614076565b60010192915050565b600181811c908216806140bf57607f821691505b6020821081036140df57634e487b7160e01b600052602260045260246000fd5b50919050565b8181038181111561053557610535614076565b60006020828403121561410a57600080fd5b81516004811061368f57600080fd5b601f821115611122576000816000526020600020601f850160051c810160208610156141425750805b601f850160051c820191505b818110156118395782815560010161414e565b81516001600160401b0381111561417a5761417a6136cb565b61418e8161418884546140ab565b84614119565b602080601f8311600181146141c357600084156141ab5750858301515b600019600386901b1c1916600185901b178555611839565b600085815260208120601f198616915b828110156141f2578886015182559484019460019091019084016141d3565b50858210156142105787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6001600160f01b0319891681526001600160e81b031988166020820152610100604082018190526000906142568382018a613cba565b9050828103606084015261426a8189613b52565b9050828103608084015261427e8188613b52565b91505061428e60a0830186613cfd565b6003841061429e5761429e613c90565b8360c083015282151560e08301529998505050505050505050565b600063ffffffff8083168181036142d2576142d2614076565b6001019392505050565b60008084546142ea816140ab565b60018281168015614302576001811461431757614346565b60ff1984168752821515830287019450614346565b8860005260208060002060005b8581101561433d5781548a820152908401908201614324565b50505082870194505b505050938152602001949350505050565b6020808252602c908201527f5369676e657220616e642070726f76696465642070617274792061646472657360408201526b39903234b33332b932b73a1760a11b606082015260800190565b6bffffffffffffffffffffffff198360601b168152600082516143cd816014850160208701613b2e565b919091016014019392505050565b600080604083850312156143ee57600080fd5b505080516020909101519092909150565b60008551614411818460208a01613b2e565b855190830190614425818360208a01613b2e565b8551910190614438818360208901613b2e565b016006841061444957614449613c90565b60f89390931b835250506001019392505050565b6001600160601b0319606089811b821683526001600160f01b0319891660148401526001600160e81b0319881660168401526019830187905285901b16603982015282516000906144b581604d850160208801613b2e565b8351908301906144cc81604d840160208801613b2e565b01604d019998505050505050505050565b6040815260006144f06040830185613b52565b82810360208401526145028185613b52565b95945050505050565b80516136ae816138f1565b60006060828403121561452857600080fd5b6145306136e1565b90508151815260208201516020820152604082015161454e81613a9b565b604082015292915050565b600080600060a0848603121561456e57600080fd5b8351614579816138f1565b60208501519093506001600160401b038082111561459657600080fd5b9085019060e082880312156145aa57600080fd5b6145b2613709565b8251828111156145c157600080fd5b6145cd89828601613f4d565b8252506020830151828111156145e257600080fd5b6145ee89828601613f4d565b60208301525060408301518281111561460657600080fd5b61461289828601613f4d565b60408301525060608301518281111561462a57600080fd5b61463689828601613f4d565b60608301525060808301518281111561464e57600080fd5b61465a89828601613f4d565b60808301525061466c60a0840161450b565b60a082015260c08301518281111561468357600080fd5b61468f89828601613f4d565b60c0830152508094505050506146a88560408601614516565b90509250925092565b6000606082840312156146c357600080fd5b6146cb6136e1565b905081516001600160401b03808211156146e457600080fd5b6146f085838601613f4d565b8352602084015191508082111561470657600080fd5b5061471384828501613f4d565b602083015250604082015161454e816138f1565b600080600060a0848603121561473c57600080fd5b8351614747816138f1565b60208501519093506001600160401b0381111561476357600080fd5b61476f868287016146b1565b9250506146a88560408601614516565b60008251614791818460208701613b2e565b919091019291505056fea2646970667358221220793272c4fc26ed544467b9a0e4108636b24c33b1ef6c123736cabd9942cc7a0c64736f6c63430008180033",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102065760003560e01c806391d148541161011a578063aee1fe49116100ad578063d63a84d41161007c578063d63a84d414610490578063df516128146104a3578063dfd93d3b146104cb578063e1e64995146104de578063f2fde38b146104f157600080fd5b8063aee1fe4914610437578063bdb8107814610462578063ca2dfd0a1461046a578063d547741f1461047d57600080fd5b8063a33db09f116100e9578063a33db09f146103eb578063a5b5ffbb146103fe578063a8311aa814610427578063acaef0e01461042f57600080fd5b806391d148541461039d57806399bd6901146103b05780639d209048146103c3578063a217fddf146103e357600080fd5b80635437988d1161019d5780636c265bbc1161016c5780636c265bbc146103305780637a091aa51461034357806381939d661461036457806385cb86021461037757806388cf72a01461038a57600080fd5b80635437988d146102d65780635cf0685f146102e957806366acaa331461031557806366e706fb1461031d57600080fd5b80632d8fe452116101d95780632d8fe4521461027d5780632f2ff15d1461029057806336568abe146102a357806339581c21146102b657600080fd5b806301ffc9a71461020b578063031d2bd5146102335780630799363d14610245578063248a9ca31461025a575b600080fd5b61021e610219366004613665565b610504565b60405190151581526020015b60405180910390f35b600b545b60405190815260200161022a565b610258610253366004613911565b61053b565b005b6102376102683660046139cd565b60009081526020819052604090206001015490565b61025861028b3660046139e6565b6110ac565b61025861029e366004613a03565b6110c4565b6102586102b1366004613a03565b6110ef565b6102c96102c4366004613a33565b611127565b60405161022a9190613a4e565b6102586102e43660046139e6565b6115fc565b61021e6102f73660046139e6565b6001600160a01b03166000908152600a602052604090205460ff1690565b6102c96116e6565b61025861032b366004613ab5565b611748565b61025861033e366004613ab5565b611841565b610356610351366004613afb565b611900565b60405161022a929190613b7e565b610258610372366004613baa565b6119ed565b610258610385366004613bd6565b611a57565b6103566103983660046139e6565b611a64565b61021e6103ab366004613a03565b611b23565b6102586103be366004613c0a565b611b4c565b6103d66103d13660046139e6565b611c0d565b60405161022a9190613c7d565b610237600081565b6102c96103f93660046139e6565b611cb9565b61041161040c366004613afb565b611eb3565b60405161022a9a99989796959493929190613d0d565b6102c96121f9565b610258612259565b600c5461044a906001600160a01b031681565b6040516001600160a01b03909116815260200161022a565b610258612264565b6102586104783660046139e6565b61226d565b61025861048b366004613a03565b612353565b61025861049e366004613afb565b612378565b6104b66104b13660046139e6565b6123c4565b60405161022a99989796959493929190613dab565b600d5461044a906001600160a01b031681565b6102586104ec366004613e47565b612611565b6102586104ff3660046139e6565b6127ac565b60006001600160e01b03198216637965db0b60e01b148061053557506301ffc9a760e01b6001600160e01b03198316145b92915050565b6001600160f01b031986166105be57604051633a50519760e21b815260206004820152603e60248201527f43616e6e6f742073657420656d70747920636f756e7472795f636f64652e205560448201527f73652064656c6574655061727479206d6574686f6420696e73746561642e000060648201526084015b60405180910390fd5b6001600160e81b0319851661063c5760405163373a953760e11b815260206004820152603a60248201527f43616e6e6f742073657420656d7074792070617274795f69642e20557365206460448201527f656c6574655061727479206d6574686f6420696e73746561642e00000000000060648201526084016105b5565b83516000036106835760405163cab73b6560e01b81526020600482015260126024820152712737903937b632b990383937bb34b232b21760711b60448201526064016105b5565b6001600160a01b0383166107005760405163fac855f560e01b815260206004820152603a60248201527f43616e6e6f742073657420656d707479206f70657261746f722e20557365206460448201527f656c6574655061727479206d6574686f6420696e73746561642e00000000000060648201526084016105b5565b600084516001600160401b0381111561071b5761071b6136cb565b604051908082528060200260200182016040528015610744578160200160208202803683370190505b5090506000805b86518160ff161015610961576000878260ff168151811061076e5761076e613f37565b6020026020010151905060008061078483612807565b90925090506001600160a01b03851661079b578094505b806001600160a01b0316856001600160a01b031614610808576040516316c7354f60e01b815260206004820152602260248201527f436572746966696361746573206861766520646966666572656e74206f776e65604482015261727360f01b60648201526084016105b5565b6000600e60008560400151600581111561082457610824613c90565b600581111561083557610835613c90565b81526020810191909152604001600020546001600160a01b031690508015610900576040516350cadc8560e01b81526000906001600160a01b038316906350cadc8590610886908790600401613c7d565b600060405180830381865afa1580156108a3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108cb9190810190613f92565b90506108db848260200151612b83565b6108fe5784604001516040516303458c0d60e21b81526004016105b59190614038565b505b8360400151878660ff168151811061091a5761091a613f37565b6020026020010190600581111561093357610933613c90565b9081600581111561094657610946613c90565b815250505050505080806109599061408c565b91505061074b565b506001600160f01b0319881660009081526006602090815260408083206001600160e81b03198b1684529091529020546001600160a01b031680158015906109bb5750816001600160a01b0316816001600160a01b031614155b15610a445760405163618270d960e01b815260206004820152604c60248201527f5061727479207769746820636f756e7472795f636f64652f70617274795f696460448201527f20616c7265616479207265676973746572656420756e6465722064696666657260648201526b32b73a1030b2323932b9b99760a11b608482015260a4016105b5565b6001600160f01b0319891660009081526006602090815260408083206001600160e81b03198c168452825280832080546001600160a01b0319166001600160a01b038781169190911790915589168352600290915290208054610aa6906140ab565b9050600003610b0257604051634523c97f60e01b815260206004820152602160248201527f50726f7669646564206f70657261746f72206e6f7420726567697374657265646044820152601760f91b60648201526084016105b5565b6001600160a01b03821660009081526008602090815260408083206005015460079092529091205460ff16610b8d57600b80546001808201835560008390527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db990910180546001600160a01b0319166001600160a01b0387161790559054610b8a91906140e5565b90505b6001600160a01b03838116600081815260076020526040808220805460ff19166001179055600c549051632222c8a160e21b815260048101939093529092169063888b228490602401602060405180830381865afa158015610bf3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1791906140f8565b90506040518061012001604052808c6001600160f01b03191681526020018b6001600160e81b0319168152602001868152602001888152602001878152602001826003811115610c6957610c69613c90565b8152602001600081526001602080830182905260409283018690526001600160a01b038816600090815260088252839020845181548684015160e81c620100000264ffffffffff1990911660f09290921c91909117178155928401518051610cd8938501929190910190613541565b5060608201516002820190610ced9082614161565b5060808201516003820190610d029082614161565b5060a082015160048201805460ff19166001836003811115610d2657610d26613c90565b021790555060c082015160048201805461ff001916610100836002811115610d5057610d50613c90565b021790555060e082015160048201805462ff00001916620100009215158302179055610100909201516005909101556001600160a01b03858116600090815260096020908152604080832080546001600160a01b031916948e169490941790935560088152828220835161012081018552815460f081901b6001600160f01b03191682529590950460e81b6001600160e81b031916858301526001810180548551818502810185018752818152949695929492860193830182828015610e6557602002820191906000526020600020906000905b82829054906101000a900460ff166005811115610e4357610e43613c90565b815260206001928301818104948501949093039092029101808411610e245790505b50505050508152602001600282018054610e7e906140ab565b80601f0160208091040260200160405190810160405280929190818152602001828054610eaa906140ab565b8015610ef75780601f10610ecc57610100808354040283529160200191610ef7565b820191906000526020600020905b815481529060010190602001808311610eda57829003601f168201915b50505050508152602001600382018054610f10906140ab565b80601f0160208091040260200160405190810160405280929190818152602001828054610f3c906140ab565b8015610f895780601f10610f5e57610100808354040283529160200191610f89565b820191906000526020600020905b815481529060010190602001808311610f6c57829003601f168201915b5050509183525050600482015460209091019060ff166003811115610fb057610fb0613c90565b6003811115610fc157610fc1613c90565b81526020016004820160019054906101000a900460ff166002811115610fe957610fe9613c90565b6002811115610ffa57610ffa613c90565b81526020016004820160029054906101000a900460ff161515151581526020016005820154815250509050886001600160a01b0316856001600160a01b03167fc16bf12458bfb0cf1345674275c1e82f2c14cf06a3996e1bb297f2015ff66f78836000015184602001518560400151866060015187608001518860a001518960c001518a60e00151604051611096989796959493929190614220565b60405180910390a3505050505050505050505050565b60006110b781612bdc565b6110c082612be6565b5050565b6000828152602081905260409020600101546110df81612bdc565b6110e98383612d8d565b50505050565b6001600160a01b03811633146111185760405163334bd91960e11b815260040160405180910390fd5b6111228282612e1f565b505050565b600b546060906000906001600160401b03811115611147576111476136cb565b604051908082528060200260200182016040528015611170578160200160208202803683370190505b5090506000805b600b5463ffffffff8216101561153757600060086000600b8463ffffffff16815481106111a6576111a6613f37565b60009182526020808320909101546001600160a01b03168352828101939093526040918201902081516101208101835281546001600160f01b031960f082901b1682526001600160e81b03196201000090910460e81b168185015260018201805484518187028101870186528181529295939486019383018282801561127b57602002820191906000526020600020906000905b82829054906101000a900460ff16600581111561125957611259613c90565b81526020600192830181810494850194909303909202910180841161123a5790505b50505050508152602001600282018054611294906140ab565b80601f01602080910402602001604051908101604052809291908181526020018280546112c0906140ab565b801561130d5780601f106112e25761010080835404028352916020019161130d565b820191906000526020600020905b8154815290600101906020018083116112f057829003601f168201915b50505050508152602001600382018054611326906140ab565b80601f0160208091040260200160405190810160405280929190818152602001828054611352906140ab565b801561139f5780601f106113745761010080835404028352916020019161139f565b820191906000526020600020905b81548152906001019060200180831161138257829003601f168201915b5050509183525050600482015460209091019060ff1660038111156113c6576113c6613c90565b60038111156113d7576113d7613c90565b81526020016004820160019054906101000a900460ff1660028111156113ff576113ff613c90565b600281111561141057611410613c90565b8152600482015462010000900460ff1615156020820152600590910154604090910152905060005b8160400151518163ffffffff1610156115225786600581111561145d5761145d613c90565b82604001518263ffffffff168151811061147957611479613f37565b6020026020010151600581111561149257611492613c90565b0361151057600b8363ffffffff16815481106114b0576114b0613f37565b9060005260206000200160009054906101000a90046001600160a01b0316858563ffffffff16815181106114e6576114e6613f37565b6001600160a01b039092166020928302919091019091015283611508816142b9565b945050611522565b8061151a816142b9565b915050611438565b5050808061152f906142b9565b915050611177565b5060008163ffffffff166001600160401b03811115611558576115586136cb565b604051908082528060200260200182016040528015611581578160200160208202803683370190505b50905060005b8263ffffffff168163ffffffff1610156115f357838163ffffffff16815181106115b3576115b3613f37565b6020026020010151828263ffffffff16815181106115d3576115d3613f37565b6001600160a01b0390921660209283029190910190910152600101611587565b50949350505050565b600061160781612bdc565b6001600160a01b0382166116585760405162461bcd60e51b8152602060048201526018602482015277496e76616c6964207665726966696572206164647265737360401b60448201526064016105b5565b6001600160a01b0382166000908152600a602052604090205460ff16156116c15760405162461bcd60e51b815260206004820152601860248201527f566572696669657220616c726561647920616c6c6f776564000000000000000060448201526064016105b5565b506001600160a01b03166000908152600a60205260409020805460ff19166001179055565b6060600580548060200260200160405190810160405280929190818152602001828054801561173e57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611720575b5050505050905090565b6040516001600160601b0319606086901b1660208201526000906034016040516020818303038152906040528051906020012090506000600180836040516020016117949291906142dc565b60408051601f198184030181528282528051602091820120600084529083018083525260ff881690820152606081018690526080810185905260a0016020604051602081039080840390855afa1580156117f2573d6000803e3d6000fd5b505050602060405103519050856001600160a01b0316816001600160a01b0316146118305760405163331e1b8160e21b81526004016105b590614357565b61183981612e8a565b505050505050565b6040516001600160601b0319606086901b16602082015260009060340160405160208183030381529060405280519060200120905060006001808360405160200161188d9291906142dc565b60408051601f198184030181528282528051602091820120600084529083018083525260ff881690820152606081018690526080810185905260a0016020604051602081039080840390855afa1580156118eb573d6000803e3d6000fd5b50505060206040510351905061183981612be6565b6001600160f01b0319821660009081526006602090815260408083206001600160e81b0319851684528252808320546001600160a01b0390811680855260098452828520549091168085526002909352922080549192606092909190611965906140ab565b80601f0160208091040260200160405190810160405280929190818152602001828054611991906140ab565b80156119de5780601f106119b3576101008083540402835291602001916119de565b820191906000526020600020905b8154815290600101906020018083116119c157829003601f168201915b50505050509150509250929050565b60006119f881612bdc565b81600e6000856005811115611a0f57611a0f613c90565b6005811115611a2057611a20613c90565b815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550505050565b611a613382613312565b50565b6001600160a01b038082166000908152600960209081526040808320549093168083526002909152919020805460609190611a9e906140ab565b80601f0160208091040260200160405190810160405280929190818152602001828054611aca906140ab565b8015611b175780601f10611aec57610100808354040283529160200191611b17565b820191906000526020600020905b815481529060010190602001808311611afa57829003601f168201915b50505050509050915091565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b60008585604051602001611b619291906143a3565b604051602081830303815290604052805190602001209050600060018083604051602001611b909291906142dc565b60408051601f198184030181528282528051602091820120600084529083018083525260ff881690820152606081018690526080810185905260a0016020604051602081039080840390855afa158015611bee573d6000803e3d6000fd5b505050602060405103519050611c048187613312565b50505050505050565b6001600160a01b0381166000908152600260205260409020805460609190611c34906140ab565b80601f0160208091040260200160405190810160405280929190818152602001828054611c60906140ab565b8015611cad5780601f10611c8257610100808354040283529160200191611cad565b820191906000526020600020905b815481529060010190602001808311611c9057829003601f168201915b50505050509050919050565b600b546060906000906001600160401b03811115611cd957611cd96136cb565b604051908082528060200260200182016040528015611d02578160200160208202803683370190505b5090506000805b600b5463ffffffff82161015611df757846001600160a01b031660096000600b8463ffffffff1681548110611d4057611d40613f37565b60009182526020808320909101546001600160a01b0390811684529083019390935260409091019020541603611de557600b8163ffffffff1681548110611d8957611d89613f37565b9060005260206000200160009054906101000a90046001600160a01b0316838363ffffffff1681518110611dbf57611dbf613f37565b6001600160a01b039092166020928302919091019091015281611de1816142b9565b9250505b80611def816142b9565b915050611d09565b5060008163ffffffff166001600160401b03811115611e1857611e186136cb565b604051908082528060200260200182016040528015611e41578160200160208202803683370190505b50905060005b8263ffffffff168163ffffffff1610156115f357838163ffffffff1681518110611e7357611e73613f37565b6020026020010151828263ffffffff1681518110611e9357611e93613f37565b6001600160a01b0390921660209283029190910190910152600101611e47565b6001600160f01b0319821660009081526006602090815260408083206001600160e81b03198516845290915280822054600c549151631234d3bd60e01b81526001600160a01b039182166004820181905293928392606092849283928592839285928392911690631234d3bd906024016040805180830381865afa158015611f3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f6391906143db565b506001600160a01b038b16600090815260086020908152604091829020805460018201805485518186028101860190965280865260f083901b9f506201000090920460e81b9d5094955090939183018282801561200f57602002820191906000526020600020906000905b82829054906101000a900460ff166005811115611fed57611fed613c90565b815260206001928301818104948501949093039092029101808411611fce5790505b5050600c54604051632222c8a160e21b8152949c506001600160a01b03169363888b2284935061205492508f91506004016001600160a01b0391909116815260200190565b602060405180830381865afa158015612071573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061209591906140f8565b6001600160a01b03808d16600090815260096020526040902054600284018054939a5091169750906120c6906140ab565b80601f01602080910402602001604051908101604052809291908181526020018280546120f2906140ab565b801561213f5780601f106121145761010080835404028352916020019161213f565b820191906000526020600020905b81548152906001019060200180831161212257829003601f168201915b50505050509450806003018054612155906140ab565b80601f0160208091040260200160405190810160405280929190818152602001828054612181906140ab565b80156121ce5780601f106121a3576101008083540402835291602001916121ce565b820191906000526020600020905b8154815290600101906020018083116121b157829003601f168201915b505050505093508060040160029054906101000a900460ff169250509295989b9194979a5092959850565b6060600b80548060200260200160405190810160405280929190818152602001828054801561173e576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311611720575050505050905090565b61226233612be6565b565b61226233612e8a565b600061227881612bdc565b6001600160a01b0382166122c95760405162461bcd60e51b8152602060048201526018602482015277496e76616c6964207665726966696572206164647265737360401b60448201526064016105b5565b6001600160a01b0382166000908152600a602052604090205460ff166123315760405162461bcd60e51b815260206004820152601e60248201527f5665726966696572206e6f742063757272656e746c7920616c6c6f776564000060448201526064016105b5565b506001600160a01b03166000908152600a60205260409020805460ff19169055565b60008281526020819052604090206001015461236e81612bdc565b6110e98383612e1f565b600061238381612bdc565b6001600160f01b0319831660009081526006602090815260408083206001600160e81b0319861684529091529020546001600160a01b03166110e981612e8a565b6001600160a01b03811660009081526008602090815260408083208054600182018054845181870281018701909552808552879660f084901b966201000090940460e81b956060959194859487948594879490939092919083018282801561247b57602002820191906000526020600020906000905b82829054906101000a900460ff16600581111561245957612459613c90565b81526020600192830181810494850194909303909202910180841161243a5790505b505050505096508060040160009054906101000a900460ff169550600960008c6001600160a01b03166001600160a01b0316815260200190815260200160002060009054906101000a90046001600160a01b031694508060020180546124e0906140ab565b80601f016020809104026020016040519081016040528092919081815260200182805461250c906140ab565b80156125595780601f1061252e57610100808354040283529160200191612559565b820191906000526020600020905b81548152906001019060200180831161253c57829003601f168201915b5050505050935080600301805461256f906140ab565b80601f016020809104026020016040519081016040528092919081815260200182805461259b906140ab565b80156125e85780601f106125bd576101008083540402835291602001916125e8565b820191906000526020600020905b8154815290600101906020018083116125cb57829003601f168201915b505050505092508060040160029054906101000a900460ff169150509193959799909294969850565b604080516020810190915260008082525b88518160ff161015612697576000898260ff168151811061264557612645613f37565b602002602001015190508281600001518260200151836040015160405160200161267294939291906143ff565b604051602081830303815290604052925050808061268f9061408c565b915050612622565b5060008180519060200120905060008c8c8c848c8c8c6040516020016126c3979695949392919061445d565b6040516020818303038152906040528051906020012090506000600180836040516020016126f29291906142dc565b60408051601f198184030181528282528051602091820120600084529083018083525260ff8a1690820152606081018890526080810187905260a0016020604051602081039080840390855afa158015612750573d6000803e3d6000fd5b5050506020604051035190508d6001600160a01b0316816001600160a01b03161461278e5760405163331e1b8160e21b81526004016105b590614357565b61279c8d8d8d8d8d8d61053b565b5050505050505050505050505050565b60006127b781612bdc565b6127c26000836110c4565b6127cd600033612353565b6040516001600160a01b0383169033907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6060600060018360400151600581111561282357612823613c90565b0361294357600d548351602085015160405163fbb87f9760e01b815260009384936001600160a01b039091169263fbb87f97926128649291906004016144dd565b6000604051808303816000875af1158015612883573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526128ab9190810190614559565b50915091506128d2826001600160a01b03166000908152600a602052604090205460ff1690565b6129305760408051637a0c0ca960e01b81526001600160a01b03841660048201526024810191909152601760448201527f496e76616c696420454d5020636572746966696361746500000000000000000060648201526084016105b5565b805160a090910151909590945092505050565b60008360400151600581111561295b5761295b613c90565b03612a7b57600d548351602085015160405163055b37fb60e51b815260009384936001600160a01b039091169263ab66ff609261299c9291906004016144dd565b6000604051808303816000875af11580156129bb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526129e39190810190614727565b5091509150612a0a826001600160a01b03166000908152600a602052604090205460ff1690565b612a685760408051637a0c0ca960e01b81526001600160a01b03841660048201526024810191909152601760448201527f496e76616c69642043504f20636572746966696361746500000000000000000060648201526084016105b5565b8051604090910151909590945092505050565b600d548351602085015160405163fab285c960e01b815260009384936001600160a01b039091169263fab285c992612ab79291906004016144dd565b6000604051808303816000875af1158015612ad6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612afe9190810190614727565b5091509150612b25826001600160a01b03166000908152600a602052604090205460ff1690565b612a685760408051637a0c0ca960e01b81526001600160a01b03841660048201526024810191909152601960448201527f496e76616c6964204f746865722063657274696669636174650000000000000060648201526084016105b5565b600081604051602001612b96919061477f565b6040516020818303038152906040528051906020012083604051602001612bbd919061477f565b6040516020818303038152906040528051906020012014905092915050565b611a618133613508565b6001600160a01b03811660009081526002602052604081208054612c09906140ab565b80601f0160208091040260200160405190810160405280929190818152602001828054612c35906140ab565b8015612c825780601f10612c5757610100808354040283529160200191612c82565b820191906000526020600020905b815481529060010190602001808311612c6557829003601f168201915b505050505090508051600003612ceb57604051639d8b847760e01b815260206004820152602760248201527f43616e6e6f742064656c657465206e6f6465207468617420646f6573206e6f746044820152661032bc34b9ba1760c91b60648201526084016105b5565b6000600382604051612cfd919061477f565b9081526040805160209281900383019020805460ff1916931515939093179092556001600160a01b03841660009081526002909152908120612d3e916135f5565b816001600160a01b03167fb1f254c0ae74a753185ba13a1b17818bc803e32d05ef56851955c0ebf230f0d6604051612d8190602080825260009082015260400190565b60405180910390a25050565b6000612d998383611b23565b612e17576000838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055612dcf3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610535565b506000610535565b6000612e2b8383611b23565b15612e17576000838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610535565b6001600160a01b0381811660009081526009602052604090205416612f2c57604051634523c97f60e01b815260206004820152604b60248201527f43616e6e6f742064656c657465207061727479207468617420646f6573206e6f60448201527f742065786973742e204e6f206f70657261746f7220666f756e6420666f72206760648201526a34bb32b7103830b93a3c9760a91b608482015260a4016105b5565b6001600160a01b038116600090815260096020908152604080832080546001600160a01b031916905560088252808320815161012081018352815460f081901b6001600160f01b031916825262010000900460e81b6001600160e81b0319168185015260018201805484518187028101870186528181529295939486019383018282801561300957602002820191906000526020600020906000905b82829054906101000a900460ff166005811115612fe757612fe7613c90565b815260206001928301818104948501949093039092029101808411612fc85790505b50505050508152602001600282018054613022906140ab565b80601f016020809104026020016040519081016040528092919081815260200182805461304e906140ab565b801561309b5780601f106130705761010080835404028352916020019161309b565b820191906000526020600020905b81548152906001019060200180831161307e57829003601f168201915b505050505081526020016003820180546130b4906140ab565b80601f01602080910402602001604051908101604052809291908181526020018280546130e0906140ab565b801561312d5780601f106131025761010080835404028352916020019161312d565b820191906000526020600020905b81548152906001019060200180831161311057829003601f168201915b5050509183525050600482015460209091019060ff16600381111561315457613154613c90565b600381111561316557613165613c90565b81526020016004820160019054906101000a900460ff16600281111561318d5761318d613c90565b600281111561319e5761319e613c90565b8152600482015462010000900460ff16151560208083019190915260059092015460409182015282516001600160f01b031916600090815260068352818120848401516001600160e81b0319168252835281812080546001600160a01b03191690556001600160a01b038616815260089092528120805464ffffffffff1916815591925061322f600183018261362f565b61323d6002830160006135f5565b61324b6003830160006135f5565b5060048101805462ffffff191690556000600590910155610100810151600b8054909190811061327d5761327d613f37565b6000918252602080832090910180546001600160a01b03191690556001600160a01b03841680835260078252604092839020805460ff19169055835191840151848401516060860151608087015160a088015160c089015160e08a0151985196987ff1cf4c42833aa61e1c774181a5389a7b164a71351b75cf37a76762f31b17073998612d8198909796959493929190614220565b805160000361338a57604051639d8b847760e01b815260206004820152603c60248201527f43616e6e6f742073657420656d70747920646f6d61696e206e616d652e20557360448201527f652064656c6574654e6f6465206d6574686f6420696e73746561642e0000000060648201526084016105b5565b60038160405161339a919061477f565b9081526040519081900360200190205460ff16156133fb5760405163f1f1b1c760e01b815260206004820152601f60248201527f446f6d61696e206e616d6520616c726561647920726567697374657265642e0060448201526064016105b5565b600160038260405161340d919061477f565b9081526040805160209281900383019020805460ff1916931515939093179092556001600160a01b03841660009081526004909152205460ff1661349757600580546001810182556000919091527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b0319166001600160a01b0384161790555b6001600160a01b0382166000908152600460209081526040808320805460ff19166001179055600290915290206134ce8282614161565b50816001600160a01b03167fb1f254c0ae74a753185ba13a1b17818bc803e32d05ef56851955c0ebf230f0d682604051612d819190613c7d565b6135128282611b23565b6110c05760405163e2517d3f60e01b81526001600160a01b0382166004820152602481018390526044016105b5565b82805482825590600052602060002090601f016020900481019282156135e55791602002820160005b838211156135b657835183826101000a81548160ff0219169083600581111561359557613595613c90565b0217905550926020019260010160208160000104928301926001030261356a565b80156135e35782816101000a81549060ff02191690556001016020816000010492830192600103026135b6565b505b506135f1929150613650565b5090565b508054613601906140ab565b6000825580601f10613611575050565b601f016020900490600052602060002090810190611a619190613650565b50805460008255601f016020900490600052602060002090810190611a6191905b5b808211156135f15760008155600101613651565b60006020828403121561367757600080fd5b81356001600160e01b03198116811461368f57600080fd5b9392505050565b80356001600160f01b0319811681146136ae57600080fd5b919050565b80356001600160e81b0319811681146136ae57600080fd5b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b0381118282101715613703576137036136cb565b60405290565b60405160e081016001600160401b0381118282101715613703576137036136cb565b604051601f8201601f191681016001600160401b0381118282101715613753576137536136cb565b604052919050565b60006001600160401b03821115613774576137746136cb565b50601f01601f191660200190565b600082601f83011261379357600080fd5b81356137a66137a18261375b565b61372b565b8181528460208386010111156137bb57600080fd5b816020850160208301376000918101602001919091529392505050565b8035600681106136ae57600080fd5b600082601f8301126137f857600080fd5b813560206001600160401b0380831115613814576138146136cb565b8260051b61382383820161372b565b938452858101830193838101908886111561383d57600080fd5b84880192505b858310156138e55782358481111561385b5760008081fd5b88016060818b03601f19018113156138735760008081fd5b61387b6136e1565b878301358781111561388d5760008081fd5b61389b8d8a83870101613782565b825250604080840135888111156138b25760008081fd5b6138c08e8b83880101613782565b8a840152506138d08385016137d8565b90820152845250509184019190840190613843565b98975050505050505050565b6001600160a01b0381168114611a6157600080fd5b80356136ae816138f1565b60008060008060008060c0878903121561392a57600080fd5b61393387613696565b9550613941602088016136b3565b945060408701356001600160401b038082111561395d57600080fd5b6139698a838b016137e7565b95506060890135915061397b826138f1565b9093506080880135908082111561399157600080fd5b61399d8a838b01613782565b935060a08901359150808211156139b357600080fd5b506139c089828a01613782565b9150509295509295509295565b6000602082840312156139df57600080fd5b5035919050565b6000602082840312156139f857600080fd5b813561368f816138f1565b60008060408385031215613a1657600080fd5b823591506020830135613a28816138f1565b809150509250929050565b600060208284031215613a4557600080fd5b61368f826137d8565b6020808252825182820181905260009190848201906040850190845b81811015613a8f5783516001600160a01b031683529284019291840191600101613a6a565b50909695505050505050565b60ff81168114611a6157600080fd5b80356136ae81613a9b565b60008060008060808587031215613acb57600080fd5b8435613ad6816138f1565b93506020850135613ae681613a9b565b93969395505050506040820135916060013590565b60008060408385031215613b0e57600080fd5b613b1783613696565b9150613b25602084016136b3565b90509250929050565b60005b83811015613b49578181015183820152602001613b31565b50506000910152565b60008151808452613b6a816020860160208601613b2e565b601f01601f19169290920160200192915050565b6001600160a01b0383168152604060208201819052600090613ba290830184613b52565b949350505050565b60008060408385031215613bbd57600080fd5b613bc6836137d8565b91506020830135613a28816138f1565b600060208284031215613be857600080fd5b81356001600160401b03811115613bfe57600080fd5b613ba284828501613782565b600080600080600060a08688031215613c2257600080fd5b8535613c2d816138f1565b945060208601356001600160401b03811115613c4857600080fd5b613c5488828901613782565b9450506040860135613c6581613a9b565b94979396509394606081013594506080013592915050565b60208152600061368f6020830184613b52565b634e487b7160e01b600052602160045260246000fd5b60068110613cb657613cb6613c90565b9052565b60008151808452602080850194506020840160005b83811015613cf257613ce2878351613ca6565b9582019590820190600101613ccf565b509495945050505050565b60048110613cb657613cb6613c90565b6001600160a01b038b811682526001600160f01b03198b1660208301526001600160e81b03198a16604083015261014060608301819052600091613d538483018c613cba565b9150613d62608085018b613cfd565b881660a084015282810360c0840152613d7b8188613b52565b905082810360e0840152613d8f8187613b52565b9415156101008401525050610120015298975050505050505050565b6001600160a01b038a811682526001600160f01b03198a1660208301526001600160e81b03198916604083015261012060608301819052600091613df18483018b613cba565b9150613e00608085018a613cfd565b871660a084015282810360c0840152613e198187613b52565b905082810360e0840152613e2d8186613b52565b9150508215156101008301529a9950505050505050505050565b6000806000806000806000806000806101408b8d031215613e6757600080fd5b613e708b613906565b9950613e7e60208c01613696565b9850613e8c60408c016136b3565b975060608b01356001600160401b0380821115613ea857600080fd5b613eb48e838f016137e7565b9850613ec260808e01613906565b975060a08d0135915080821115613ed857600080fd5b613ee48e838f01613782565b965060c08d0135915080821115613efa57600080fd5b50613f078d828e01613782565b945050613f1660e08c01613aaa565b92506101008b013591506101208b013590509295989b9194979a5092959850565b634e487b7160e01b600052603260045260246000fd5b600082601f830112613f5e57600080fd5b8151613f6c6137a18261375b565b818152846020838601011115613f8157600080fd5b613ba2826020830160208701613b2e565b600060208284031215613fa457600080fd5b81516001600160401b0380821115613fbb57600080fd5b9083019060408286031215613fcf57600080fd5b604051604081018181108382111715613fea57613fea6136cb565b604052825182811115613ffc57600080fd5b61400887828601613f4d565b82525060208301518281111561401d57600080fd5b61402987828601613f4d565b60208301525095945050505050565b6140428183613ca6565b604060208201819052601490820152734e6f742061637469766520696e206f7261636c6560601b6060820152608001919050565b634e487b7160e01b600052601160045260246000fd5b600060ff821660ff81036140a2576140a2614076565b60010192915050565b600181811c908216806140bf57607f821691505b6020821081036140df57634e487b7160e01b600052602260045260246000fd5b50919050565b8181038181111561053557610535614076565b60006020828403121561410a57600080fd5b81516004811061368f57600080fd5b601f821115611122576000816000526020600020601f850160051c810160208610156141425750805b601f850160051c820191505b818110156118395782815560010161414e565b81516001600160401b0381111561417a5761417a6136cb565b61418e8161418884546140ab565b84614119565b602080601f8311600181146141c357600084156141ab5750858301515b600019600386901b1c1916600185901b178555611839565b600085815260208120601f198616915b828110156141f2578886015182559484019460019091019084016141d3565b50858210156142105787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6001600160f01b0319891681526001600160e81b031988166020820152610100604082018190526000906142568382018a613cba565b9050828103606084015261426a8189613b52565b9050828103608084015261427e8188613b52565b91505061428e60a0830186613cfd565b6003841061429e5761429e613c90565b8360c083015282151560e08301529998505050505050505050565b600063ffffffff8083168181036142d2576142d2614076565b6001019392505050565b60008084546142ea816140ab565b60018281168015614302576001811461431757614346565b60ff1984168752821515830287019450614346565b8860005260208060002060005b8581101561433d5781548a820152908401908201614324565b50505082870194505b505050938152602001949350505050565b6020808252602c908201527f5369676e657220616e642070726f76696465642070617274792061646472657360408201526b39903234b33332b932b73a1760a11b606082015260800190565b6bffffffffffffffffffffffff198360601b168152600082516143cd816014850160208701613b2e565b919091016014019392505050565b600080604083850312156143ee57600080fd5b505080516020909101519092909150565b60008551614411818460208a01613b2e565b855190830190614425818360208a01613b2e565b8551910190614438818360208901613b2e565b016006841061444957614449613c90565b60f89390931b835250506001019392505050565b6001600160601b0319606089811b821683526001600160f01b0319891660148401526001600160e81b0319881660168401526019830187905285901b16603982015282516000906144b581604d850160208801613b2e565b8351908301906144cc81604d840160208801613b2e565b01604d019998505050505050505050565b6040815260006144f06040830185613b52565b82810360208401526145028185613b52565b95945050505050565b80516136ae816138f1565b60006060828403121561452857600080fd5b6145306136e1565b90508151815260208201516020820152604082015161454e81613a9b565b604082015292915050565b600080600060a0848603121561456e57600080fd5b8351614579816138f1565b60208501519093506001600160401b038082111561459657600080fd5b9085019060e082880312156145aa57600080fd5b6145b2613709565b8251828111156145c157600080fd5b6145cd89828601613f4d565b8252506020830151828111156145e257600080fd5b6145ee89828601613f4d565b60208301525060408301518281111561460657600080fd5b61461289828601613f4d565b60408301525060608301518281111561462a57600080fd5b61463689828601613f4d565b60608301525060808301518281111561464e57600080fd5b61465a89828601613f4d565b60808301525061466c60a0840161450b565b60a082015260c08301518281111561468357600080fd5b61468f89828601613f4d565b60c0830152508094505050506146a88560408601614516565b90509250925092565b6000606082840312156146c357600080fd5b6146cb6136e1565b905081516001600160401b03808211156146e457600080fd5b6146f085838601613f4d565b8352602084015191508082111561470657600080fd5b5061471384828501613f4d565b602083015250604082015161454e816138f1565b600080600060a0848603121561473c57600080fd5b8351614747816138f1565b60208501519093506001600160401b0381111561476357600080fd5b61476f868287016146b1565b9250506146a88560408601614516565b60008251614791818460208701613b2e565b919091019291505056fea2646970667358221220793272c4fc26ed544467b9a0e4108636b24c33b1ef6c123736cabd9942cc7a0c64736f6c63430008180033",
  "devdoc": {
    "errors": {
      "AccessControlBadConfirmation()": [
        {
          "details": "The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."
        }
      ],
      "AccessControlUnauthorizedAccount(address,bytes32)": [
        {
          "details": "The `account` is missing a role."
        }
      ]
    },
    "events": {
      "RoleAdminChanged(bytes32,bytes32,bytes32)": {
        "details": "Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."
      },
      "RoleGranted(bytes32,address,address)": {
        "details": "Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."
      },
      "RoleRevoked(bytes32,address,address)": {
        "details": "Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call:   - if using `revokeRole`, it is the admin role bearer   - if using `renounceRole`, it is the role bearer (i.e. `account`)"
      }
    },
    "kind": "dev",
    "methods": {
      "getRoleAdmin(bytes32)": {
        "details": "Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."
      },
      "grantRole(bytes32,address)": {
        "details": "Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."
      },
      "hasRole(bytes32,address)": {
        "details": "Returns `true` if `account` has been granted `role`."
      },
      "renounceRole(bytes32,address)": {
        "details": "Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."
      },
      "revokeRole(bytes32,address)": {
        "details": "Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."
      },
      "supportsInterface(bytes4)": {
        "details": "See {IERC165-supportsInterface}."
      }
    },
    "version": 1
  },
  "userdoc": {
    "kind": "user",
    "methods": {},
    "version": 1
  },
  "storageLayout": {
    "storage": [
      {
        "astId": 26,
        "contract": "contracts/OcnRegistry.sol:OcnRegistry",
        "label": "_roles",
        "offset": 0,
        "slot": "0",
        "type": "t_mapping(t_bytes32,t_struct(RoleData)21_storage)"
      },
      {
        "astId": 639,
        "contract": "contracts/OcnRegistry.sol:OcnRegistry",
        "label": "prefix",
        "offset": 0,
        "slot": "1",
        "type": "t_string_storage"
      },
      {
        "astId": 643,
        "contract": "contracts/OcnRegistry.sol:OcnRegistry",
        "label": "nodeOf",
        "offset": 0,
        "slot": "2",
        "type": "t_mapping(t_address,t_string_storage)"
      },
      {
        "astId": 647,
        "contract": "contracts/OcnRegistry.sol:OcnRegistry",
        "label": "uniqueDomains",
        "offset": 0,
        "slot": "3",
        "type": "t_mapping(t_string_memory_ptr,t_bool)"
      },
      {
        "astId": 651,
        "contract": "contracts/OcnRegistry.sol:OcnRegistry",
        "label": "uniqueOperators",
        "offset": 0,
        "slot": "4",
        "type": "t_mapping(t_address,t_bool)"
      },
      {
        "astId": 654,
        "contract": "contracts/OcnRegistry.sol:OcnRegistry",
        "label": "operators",
        "offset": 0,
        "slot": "5",
        "type": "t_array(t_address)dyn_storage"
      },
      {
        "astId": 698,
        "contract": "contracts/OcnRegistry.sol:OcnRegistry",
        "label": "uniqueParties",
        "offset": 0,
        "slot": "6",
        "type": "t_mapping(t_bytes2,t_mapping(t_bytes3,t_address))"
      },
      {
        "astId": 702,
        "contract": "contracts/OcnRegistry.sol:OcnRegistry",
        "label": "uniquePartyAddresses",
        "offset": 0,
        "slot": "7",
        "type": "t_mapping(t_address,t_bool)"
      },
      {
        "astId": 707,
        "contract": "contracts/OcnRegistry.sol:OcnRegistry",
        "label": "partyOf",
        "offset": 0,
        "slot": "8",
        "type": "t_mapping(t_address,t_struct(PartyDetails)692_storage)"
      },
      {
        "astId": 711,
        "contract": "contracts/OcnRegistry.sol:OcnRegistry",
        "label": "operatorOf",
        "offset": 0,
        "slot": "9",
        "type": "t_mapping(t_address,t_address)"
      },
      {
        "astId": 715,
        "contract": "contracts/OcnRegistry.sol:OcnRegistry",
        "label": "allowedCertificateVerifiers",
        "offset": 0,
        "slot": "10",
        "type": "t_mapping(t_address,t_bool)"
      },
      {
        "astId": 718,
        "contract": "contracts/OcnRegistry.sol:OcnRegistry",
        "label": "parties",
        "offset": 0,
        "slot": "11",
        "type": "t_array(t_address)dyn_storage"
      },
      {
        "astId": 721,
        "contract": "contracts/OcnRegistry.sol:OcnRegistry",
        "label": "paymentManager",
        "offset": 0,
        "slot": "12",
        "type": "t_contract(IOcnPaymentManager)625"
      },
      {
        "astId": 724,
        "contract": "contracts/OcnRegistry.sol:OcnRegistry",
        "label": "certificateVerifier",
        "offset": 0,
        "slot": "13",
        "type": "t_contract(ICertificateVerifier)2522"
      },
      {
        "astId": 730,
        "contract": "contracts/OcnRegistry.sol:OcnRegistry",
        "label": "roleOracle",
        "offset": 0,
        "slot": "14",
        "type": "t_mapping(t_enum(Role)661,t_contract(IProviderOracle)2544)"
      }
    ],
    "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_enum(Role)661)dyn_storage": {
        "base": "t_enum(Role)661",
        "encoding": "dynamic_array",
        "label": "enum OcnRegistry.Role[]",
        "numberOfBytes": "32"
      },
      "t_bool": {
        "encoding": "inplace",
        "label": "bool",
        "numberOfBytes": "1"
      },
      "t_bytes2": {
        "encoding": "inplace",
        "label": "bytes2",
        "numberOfBytes": "2"
      },
      "t_bytes3": {
        "encoding": "inplace",
        "label": "bytes3",
        "numberOfBytes": "3"
      },
      "t_bytes32": {
        "encoding": "inplace",
        "label": "bytes32",
        "numberOfBytes": "32"
      },
      "t_contract(ICertificateVerifier)2522": {
        "encoding": "inplace",
        "label": "contract ICertificateVerifier",
        "numberOfBytes": "20"
      },
      "t_contract(IOcnPaymentManager)625": {
        "encoding": "inplace",
        "label": "contract IOcnPaymentManager",
        "numberOfBytes": "20"
      },
      "t_contract(IProviderOracle)2544": {
        "encoding": "inplace",
        "label": "contract IProviderOracle",
        "numberOfBytes": "20"
      },
      "t_enum(CvStatus)528": {
        "encoding": "inplace",
        "label": "enum IOcnCvManager.CvStatus",
        "numberOfBytes": "1"
      },
      "t_enum(PaymentStatus)538": {
        "encoding": "inplace",
        "label": "enum IOcnPaymentManager.PaymentStatus",
        "numberOfBytes": "1"
      },
      "t_enum(Role)661": {
        "encoding": "inplace",
        "label": "enum OcnRegistry.Role",
        "numberOfBytes": "1"
      },
      "t_mapping(t_address,t_address)": {
        "encoding": "mapping",
        "key": "t_address",
        "label": "mapping(address => address)",
        "numberOfBytes": "32",
        "value": "t_address"
      },
      "t_mapping(t_address,t_bool)": {
        "encoding": "mapping",
        "key": "t_address",
        "label": "mapping(address => bool)",
        "numberOfBytes": "32",
        "value": "t_bool"
      },
      "t_mapping(t_address,t_string_storage)": {
        "encoding": "mapping",
        "key": "t_address",
        "label": "mapping(address => string)",
        "numberOfBytes": "32",
        "value": "t_string_storage"
      },
      "t_mapping(t_address,t_struct(PartyDetails)692_storage)": {
        "encoding": "mapping",
        "key": "t_address",
        "label": "mapping(address => struct OcnRegistry.PartyDetails)",
        "numberOfBytes": "32",
        "value": "t_struct(PartyDetails)692_storage"
      },
      "t_mapping(t_bytes2,t_mapping(t_bytes3,t_address))": {
        "encoding": "mapping",
        "key": "t_bytes2",
        "label": "mapping(bytes2 => mapping(bytes3 => address))",
        "numberOfBytes": "32",
        "value": "t_mapping(t_bytes3,t_address)"
      },
      "t_mapping(t_bytes3,t_address)": {
        "encoding": "mapping",
        "key": "t_bytes3",
        "label": "mapping(bytes3 => address)",
        "numberOfBytes": "32",
        "value": "t_address"
      },
      "t_mapping(t_bytes32,t_struct(RoleData)21_storage)": {
        "encoding": "mapping",
        "key": "t_bytes32",
        "label": "mapping(bytes32 => struct AccessControl.RoleData)",
        "numberOfBytes": "32",
        "value": "t_struct(RoleData)21_storage"
      },
      "t_mapping(t_enum(Role)661,t_contract(IProviderOracle)2544)": {
        "encoding": "mapping",
        "key": "t_enum(Role)661",
        "label": "mapping(enum OcnRegistry.Role => contract IProviderOracle)",
        "numberOfBytes": "32",
        "value": "t_contract(IProviderOracle)2544"
      },
      "t_mapping(t_string_memory_ptr,t_bool)": {
        "encoding": "mapping",
        "key": "t_string_memory_ptr",
        "label": "mapping(string => bool)",
        "numberOfBytes": "32",
        "value": "t_bool"
      },
      "t_string_memory_ptr": {
        "encoding": "bytes",
        "label": "string",
        "numberOfBytes": "32"
      },
      "t_string_storage": {
        "encoding": "bytes",
        "label": "string",
        "numberOfBytes": "32"
      },
      "t_struct(PartyDetails)692_storage": {
        "encoding": "inplace",
        "label": "struct OcnRegistry.PartyDetails",
        "members": [
          {
            "astId": 671,
            "contract": "contracts/OcnRegistry.sol:OcnRegistry",
            "label": "countryCode",
            "offset": 0,
            "slot": "0",
            "type": "t_bytes2"
          },
          {
            "astId": 673,
            "contract": "contracts/OcnRegistry.sol:OcnRegistry",
            "label": "partyId",
            "offset": 2,
            "slot": "0",
            "type": "t_bytes3"
          },
          {
            "astId": 677,
            "contract": "contracts/OcnRegistry.sol:OcnRegistry",
            "label": "roles",
            "offset": 0,
            "slot": "1",
            "type": "t_array(t_enum(Role)661)dyn_storage"
          },
          {
            "astId": 679,
            "contract": "contracts/OcnRegistry.sol:OcnRegistry",
            "label": "name",
            "offset": 0,
            "slot": "2",
            "type": "t_string_storage"
          },
          {
            "astId": 681,
            "contract": "contracts/OcnRegistry.sol:OcnRegistry",
            "label": "url",
            "offset": 0,
            "slot": "3",
            "type": "t_string_storage"
          },
          {
            "astId": 684,
            "contract": "contracts/OcnRegistry.sol:OcnRegistry",
            "label": "paymentStatus",
            "offset": 0,
            "slot": "4",
            "type": "t_enum(PaymentStatus)538"
          },
          {
            "astId": 687,
            "contract": "contracts/OcnRegistry.sol:OcnRegistry",
            "label": "cvStatus",
            "offset": 1,
            "slot": "4",
            "type": "t_enum(CvStatus)528"
          },
          {
            "astId": 689,
            "contract": "contracts/OcnRegistry.sol:OcnRegistry",
            "label": "active",
            "offset": 2,
            "slot": "4",
            "type": "t_bool"
          },
          {
            "astId": 691,
            "contract": "contracts/OcnRegistry.sol:OcnRegistry",
            "label": "partyIndex",
            "offset": 0,
            "slot": "5",
            "type": "t_uint256"
          }
        ],
        "numberOfBytes": "192"
      },
      "t_struct(RoleData)21_storage": {
        "encoding": "inplace",
        "label": "struct AccessControl.RoleData",
        "members": [
          {
            "astId": 18,
            "contract": "contracts/OcnRegistry.sol:OcnRegistry",
            "label": "hasRole",
            "offset": 0,
            "slot": "0",
            "type": "t_mapping(t_address,t_bool)"
          },
          {
            "astId": 20,
            "contract": "contracts/OcnRegistry.sol:OcnRegistry",
            "label": "adminRole",
            "offset": 0,
            "slot": "1",
            "type": "t_bytes32"
          }
        ],
        "numberOfBytes": "64"
      },
      "t_uint256": {
        "encoding": "inplace",
        "label": "uint256",
        "numberOfBytes": "32"
      }
    }
  }
}